diff --git a/Nextcloud.xcodeproj/project.pbxproj b/Nextcloud.xcodeproj/project.pbxproj index 910bbdeb9a..62e90bb6cb 100644 --- a/Nextcloud.xcodeproj/project.pbxproj +++ b/Nextcloud.xcodeproj/project.pbxproj @@ -6143,7 +6143,7 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/nextcloud/NextcloudKit"; requirement = { - branch = "declarative-ui"; + branch = main; kind = branch; }; }; diff --git a/iOSClient/Data/NCManageDatabase+E2EE.swift b/iOSClient/Data/NCManageDatabase+E2EE.swift index 8a9e4731dd..a757ca4e6f 100644 --- a/iOSClient/Data/NCManageDatabase+E2EE.swift +++ b/iOSClient/Data/NCManageDatabase+E2EE.swift @@ -82,7 +82,7 @@ class tableE2eMetadataV2: Object { @Persisted var keyChecksums = List() @Persisted var ocIdServerUrl: String = "" @Persisted var serverUrl: String = "" - @Persisted var version: String = NCGlobal.shared.e2eeVersionV20 + @Persisted var version: String = "2.0" convenience init(account: String, ocIdServerUrl: String) { self.init() diff --git a/iOSClient/Files/NCFiles.swift b/iOSClient/Files/NCFiles.swift index 842e13d3ea..c5e66b2ad7 100644 --- a/iOSClient/Files/NCFiles.swift +++ b/iOSClient/Files/NCFiles.swift @@ -325,9 +325,7 @@ class NCFiles: NCCollectionViewCommon { } } else { // show error - Task { - await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) - } + await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) } return(metadatas, error, reloadRequired) @@ -338,25 +336,21 @@ class NCFiles: NCCollectionViewCommon { if errorDecodeMetadata == .success { let capabilities = await NKCapabilities.shared.getCapabilities(for: self.session.account) - if version == "v1", capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if version == "v1", NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { NCContentPresenter().showInfo(description: "Conversion metadata v1 to v2 required, please wait...") nkLog(tag: self.global.logTagE2EE, message: "Conversion v1 to v2") NCActivityIndicator.shared.start() let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, updateVersionV1V2: true, account: account) if error != .success { - Task { - await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) - } + await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) } NCActivityIndicator.shared.stop() } } else { // Client Diagnostic await self.database.addDiagnosticAsync(account: account, issue: NCGlobal.shared.diagnosticIssueE2eeErrors) - Task { - await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) - } + await showErrorBanner(controller: self.controller, errorDescription: error.errorDescription) } return (metadatas, error, reloadRequired) diff --git a/iOSClient/Menu/NCShare+Menu.swift b/iOSClient/Menu/NCShare+Menu.swift index f4cc7a23fd..9ac9b5c5b9 100644 --- a/iOSClient/Menu/NCShare+Menu.swift +++ b/iOSClient/Menu/NCShare+Menu.swift @@ -75,7 +75,7 @@ extension NCShare { sender: sender, action: { _ in Task { - if share.shareType != NKShare.ShareType.publicLink.rawValue, let metadata = self.metadata, metadata.e2eEncrypted && capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if share.shareType != NKShare.ShareType.publicLink.rawValue, let metadata = self.metadata, metadata.e2eEncrypted && NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { if await NCNetworkingE2EE().isInUpload(account: metadata.account, serverUrl: metadata.serverUrlFileName) { let error = NKError(errorCode: NCGlobal.shared.errorE2EEUploadInProgress, errorDescription: NSLocalizedString("_e2e_in_upload_", comment: "")) return NCContentPresenter().showInfo(error: error) diff --git a/iOSClient/NCGlobal.swift b/iOSClient/NCGlobal.swift index 3edfec9c13..1b84d949ed 100644 --- a/iOSClient/NCGlobal.swift +++ b/iOSClient/NCGlobal.swift @@ -94,10 +94,14 @@ final class NCGlobal: Sendable { // E2EE // let e2eePassphraseTest = "more over television factory tendency independence international intellectual impress interest sentence pony" - let e2eeVersions = ["1.1", "1.2", "2.0"] - let e2eeVersionV11 = "1.1" - let e2eeVersionV12 = "1.2" - let e2eeVersionV20 = "2.0" + let e2eeCompatibleVersions = ["1.1", "1.2", "2.0", "2.1"] + + func isE2eeVersion2(_ version: String) -> Bool { + if version == "2.0" || version == "2.1" { + return true + } + return false + } // CHUNK let chunkSizeMBCellular = 10000000 diff --git a/iOSClient/Networking/E2EE/NCEndToEndMetadata.swift b/iOSClient/Networking/E2EE/NCEndToEndMetadata.swift index 5cf8d28061..245e16ff5e 100644 --- a/iOSClient/Networking/E2EE/NCEndToEndMetadata.swift +++ b/iOSClient/Networking/E2EE/NCEndToEndMetadata.swift @@ -20,9 +20,9 @@ class NCEndToEndMetadata: NSObject { } let capabilities = await NKCapabilities.shared.getCapabilities(for: session.account) - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV12 && NCGlobal.shared.e2eeVersions.contains(NCGlobal.shared.e2eeVersionV12) { + if capabilities.e2EEApiVersion == "1.2" { return await encodeMetadataV12(account: session.account, serverUrl: serverUrl, ocIdServerUrl: directory.ocId) - } else if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 && NCGlobal.shared.e2eeVersions.contains(NCGlobal.shared.e2eeVersionV20) { + } else if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { return await encodeMetadataV20(serverUrl: serverUrl, ocIdServerUrl: directory.ocId, addUserId: addUserId, addCertificate: addCertificate, removeUserId: removeUserId, session: session) } else { return (nil, nil, 0, NKError(errorCode: NCGlobal.shared.errorE2EEVersion, errorDescription: "Server E2EE version " + capabilities.e2EEApiVersion + ", not compatible")) @@ -40,11 +40,11 @@ class NCEndToEndMetadata: NSObject { data.printJson() - if (try? JSONDecoder().decode(E2eeV1.self, from: data)) != nil && NCGlobal.shared.e2eeVersions.contains(NCGlobal.shared.e2eeVersionV11) { + if (try? JSONDecoder().decode(E2eeV1.self, from: data)) != nil { return await decodeMetadataV1(metadata, serverUrl: serverUrl, ocIdServerUrl: directory.ocId, session: session) - } else if (try? JSONDecoder().decode(E2eeV12.self, from: data)) != nil && NCGlobal.shared.e2eeVersions.contains(NCGlobal.shared.e2eeVersionV12) { + } else if (try? JSONDecoder().decode(E2eeV12.self, from: data)) != nil { return await decodeMetadataV12(metadata, serverUrl: serverUrl, ocIdServerUrl: directory.ocId, session: session) - } else if (try? JSONDecoder().decode(E2eeV20.self, from: data)) != nil && NCGlobal.shared.e2eeVersions.contains(NCGlobal.shared.e2eeVersionV20) { + } else if (try? JSONDecoder().decode(E2eeV20.self, from: data)) != nil { return await decodeMetadataV20(metadata, signature: signature, serverUrl: serverUrl, ocIdServerUrl: directory.ocId, session: session) } else { return NKError(errorCode: NCGlobal.shared.errorE2EEVersion, errorDescription: "Unable to decode the metadata file") diff --git a/iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift b/iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift index ed002a7c9a..e19af4073a 100644 --- a/iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift +++ b/iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift @@ -186,12 +186,12 @@ extension NCEndToEndMetadata { ciphertextMetadata = ciphertextMetadata + "|" + initializationVector let metadataCodable = E2eeV20.Metadata(ciphertext: ciphertextMetadata, nonce: initializationVector, authenticationTag: authenticationTag) - let e2eeCodable = E2eeV20(metadata: metadataCodable, users: usersCodable, filedrop: nil, version: NCGlobal.shared.e2eeVersionV20) + let e2eeCodable = E2eeV20(metadata: metadataCodable, users: usersCodable, filedrop: nil, version: "2.0") let e2eeData = try JSONEncoder().encode(e2eeCodable) e2eeData.printJson() let e2eeJson = String(data: e2eeData, encoding: .utf8) - let signature = createSignature(metadata: metadataCodable, users: usersCodable, version: NCGlobal.shared.e2eeVersionV20, certificate: certificate, session: session) + let signature = createSignature(metadata: metadataCodable, users: usersCodable, version: "2.0", certificate: certificate, session: session) return (e2eeJson, signature, counter, NKError()) @@ -226,7 +226,7 @@ extension NCEndToEndMetadata { object.metadataKey = metadataKey object.mimeType = mimetype object.serverUrl = serverUrl - object.version = NCGlobal.shared.e2eeVersionV20 + object.version = "2.0" // Write file parameter for decrypted on DB await self.database.addE2eEncryptionAsync(object) @@ -250,7 +250,7 @@ extension NCEndToEndMetadata { let metadata = json.metadata let users = json.users let filesdrop = json.filedrop - let version = json.version as String? ?? NCGlobal.shared.e2eeVersionV20 + let version = json.version as String? ?? "2.0" if isDirectoryTop { diff --git a/iOSClient/Networking/E2EE/NCNetworkingE2EE.swift b/iOSClient/Networking/E2EE/NCNetworkingE2EE.swift index 9a489285aa..eee1ac3fee 100644 --- a/iOSClient/Networking/E2EE/NCNetworkingE2EE.swift +++ b/iOSClient/Networking/E2EE/NCNetworkingE2EE.swift @@ -29,7 +29,10 @@ class NCNetworkingE2EE: NSObject { } func getOptions(account: String, capabilities: NKCapabilities.Capabilities) -> NKRequestOptions { - let version = capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 ? e2EEApiVersion2 : e2EEApiVersion1 + var version = e2EEApiVersion1 + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { + version = e2EEApiVersion2 + } return NKRequestOptions(version: version) } @@ -44,7 +47,7 @@ class NCNetworkingE2EE: NSObject { let capabilities = await NKCapabilities.shared.getCapabilities(for: account) switch capabilities.e2EEApiVersion { - case NCGlobal.shared.e2eeVersionV11, NCGlobal.shared.e2eeVersionV12: + case "1.1", "1.2": let options = NKRequestOptions(version: e2EEApiVersion1) let results = await NextcloudKit.shared.getE2EEMetadataAsync(fileId: fileId, e2eToken: e2eToken, account: account, options: options) { task in Task { @@ -55,7 +58,7 @@ class NCNetworkingE2EE: NSObject { } } return (results.account, self.e2EEApiVersion1, results.e2eMetadata, results.signature, results.responseData, results.error) - case NCGlobal.shared.e2eeVersionV20: + case "2.0", "2.1": var options = NKRequestOptions(version: e2EEApiVersion2) let results = await NextcloudKit.shared.getE2EEMetadataAsync(fileId: fileId, e2eToken: e2eToken, account: account, options: options) { task in Task { @@ -204,7 +207,7 @@ class NCNetworkingE2EE: NSObject { // COUNTER // - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { await self.database.updateCounterE2eMetadataAsync(account: session.account, ocIdServerUrl: ocIdServerUrl, counter: resultsEncodeMetadata.counter) } @@ -247,7 +250,7 @@ class NCNetworkingE2EE: NSObject { e2eToken = tableLock.e2eToken } - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20, + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion), var counter = await self.database.getCounterE2eMetadataAsync(account: account, ocIdServerUrl: directory.ocId) { counter += 1 e2eCounter = "\(counter)" diff --git a/iOSClient/Networking/E2EE/NCNetworkingE2EEMarkFolder.swift b/iOSClient/Networking/E2EE/NCNetworkingE2EEMarkFolder.swift index e9778596e2..ae7e31f648 100644 --- a/iOSClient/Networking/E2EE/NCNetworkingE2EEMarkFolder.swift +++ b/iOSClient/Networking/E2EE/NCNetworkingE2EEMarkFolder.swift @@ -41,7 +41,7 @@ class NCNetworkingE2EEMarkFolder: NSObject { await self.database.createDirectory(metadata: metadata) await self.database.deleteE2eEncryptionAsync(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", metadata.account, serverUrlFileName)) - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { await self.database.updateCounterE2eMetadataAsync(account: account, ocIdServerUrl: metadata.ocId, counter: 0) } diff --git a/iOSClient/Settings/E2EE/NCManageE2EEModel.swift b/iOSClient/Settings/E2EE/NCManageE2EEModel.swift index 52c6be2c22..e62079b62d 100644 --- a/iOSClient/Settings/E2EE/NCManageE2EEModel.swift +++ b/iOSClient/Settings/E2EE/NCManageE2EEModel.swift @@ -32,7 +32,7 @@ class NCManageE2EE: NSObject, ObservableObject, ViewOnAppearHandling, NCEndToEnd /// Triggered when the view appears. func onViewAppear() { - if capabilities.e2EEEnabled && NCGlobal.shared.e2eeVersions.contains(capabilities.e2EEApiVersion) { + if capabilities.e2EEEnabled && NCGlobal.shared.e2eeCompatibleVersions.contains(capabilities.e2EEApiVersion) { isEndToEndEnabled = NCPreferences().isEndToEndEnabled(account: session.account) if isEndToEndEnabled { statusOfService = NSLocalizedString("_status_e2ee_configured_", comment: "") diff --git a/iOSClient/Settings/NCPreferences.swift b/iOSClient/Settings/NCPreferences.swift index 1b49efbae5..87810b4f66 100644 --- a/iOSClient/Settings/NCPreferences.swift +++ b/iOSClient/Settings/NCPreferences.swift @@ -450,7 +450,7 @@ final class NCPreferences: NSObject { let publicKey = getEndToEndPublicKey(account: account), !publicKey.isEmpty, let privateKey = getEndToEndPrivateKey(account: account), !privateKey.isEmpty, let passphrase = getEndToEndPassphrase(account: account), !passphrase.isEmpty, - NCGlobal.shared.e2eeVersions.contains(capabilities.e2EEApiVersion) else { + NCGlobal.shared.e2eeCompatibleVersions.contains(capabilities.e2EEApiVersion) else { return false } return true diff --git a/iOSClient/Settings/Settings/NCSettingsView.swift b/iOSClient/Settings/Settings/NCSettingsView.swift index 63a614357a..08ad3c3740 100644 --- a/iOSClient/Settings/Settings/NCSettingsView.swift +++ b/iOSClient/Settings/Settings/NCSettingsView.swift @@ -175,7 +175,7 @@ struct NCSettingsView: View { Text(NSLocalizedString("_users_footer_", comment: "")) }) // E2EEncryption` Section - if capabilities.e2EEEnabled && NCGlobal.shared.e2eeVersions.contains(capabilities.e2EEApiVersion) { + if capabilities.e2EEEnabled && NCGlobal.shared.e2eeCompatibleVersions.contains(capabilities.e2EEApiVersion) { E2EESection(model: model) } // `Advanced` Section diff --git a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift index f07ae37f0c..832a3ece53 100644 --- a/iOSClient/Share/Advanced/NCShareAdvancePermission.swift +++ b/iOSClient/Share/Advanced/NCShareAdvancePermission.swift @@ -245,7 +245,7 @@ class NCShareAdvancePermission: UITableViewController, NCShareAdvanceFotterDeleg let capabilities = await NKCapabilities.shared.getCapabilities(for: metadata.account) if share.shareType != NKShare.ShareType.publicLink.rawValue, metadata.e2eEncrypted, - capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { if await NCNetworkingE2EE().isInUpload(account: metadata.account, serverUrl: metadata.serverUrlFileName) { let error = NKError(errorCode: NCGlobal.shared.errorE2EEUploadInProgress, errorDescription: NSLocalizedString("_e2e_in_upload_", comment: "")) diff --git a/iOSClient/Share/Advanced/NCShareCells.swift b/iOSClient/Share/Advanced/NCShareCells.swift index 6915dd23c6..8072025a3a 100644 --- a/iOSClient/Share/Advanced/NCShareCells.swift +++ b/iOSClient/Share/Advanced/NCShareCells.swift @@ -83,7 +83,7 @@ enum NCUserPermission: CaseIterable, NCPermission { static func forDirectoryE2EE(account: String) -> [NCPermission] { let capabilities = NCNetworking.shared.capabilities[account] ?? NKCapabilities.Capabilities() - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { return NCUserPermission.allCases } return [] @@ -107,7 +107,7 @@ enum NCUserPermission: CaseIterable, NCPermission { enum NCLinkEmailPermission: CaseIterable, NCPermission { static func forDirectoryE2EE(account: String) -> [any NCPermission] { let capabilities = NCNetworking.shared.capabilities[account] ?? NKCapabilities.Capabilities() - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 { + if NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) { return NCUserPermission.allCases } return [] diff --git a/iOSClient/Share/NCShare.swift b/iOSClient/Share/NCShare.swift index f6d9be59c0..f4edbdd304 100644 --- a/iOSClient/Share/NCShare.swift +++ b/iOSClient/Share/NCShare.swift @@ -95,8 +95,8 @@ class NCShare: UIViewController, NCSharePagingContent { self.capabilities = await NKCapabilities.shared.getCapabilities(for: metadata.account) if metadata.e2eEncrypted { let metadataDirectory = await self.database.getMetadataDirectoryAsync(serverUrl: metadata.serverUrl, account: metadata.account) - if capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV12 || - (capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV20 && metadataDirectory?.e2eEncrypted ?? false) { + if capabilities.e2EEApiVersion == "1.2" || + (NCGlobal.shared.isE2eeVersion2(capabilities.e2EEApiVersion) && metadataDirectory?.e2eEncrypted ?? false) { searchFieldTopConstraint.constant = -50 searchField.alpha = 0 btnContact.alpha = 0 @@ -341,7 +341,7 @@ extension NCShare: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { var numRows = shares.share?.count ?? 0 if section == 0 { - if metadata.e2eEncrypted, capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV12 { + if metadata.e2eEncrypted, capabilities.e2EEApiVersion == "1.2" { numRows = 1 } else { // don't allow link creation if reshare is disabled @@ -357,7 +357,7 @@ extension NCShare: UITableViewDataSource { guard let cell = tableView.dequeueReusableCell(withIdentifier: "cellLink", for: indexPath) as? NCShareLinkCell else { return UITableViewCell() } cell.delegate = self - if metadata.e2eEncrypted, capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV12 { + if metadata.e2eEncrypted, capabilities.e2EEApiVersion == "1.2" { cell.tableShare = shares.firstShareLink } else { if indexPath.row == 0 { diff --git a/iOSClient/Share/TransientShare.swift b/iOSClient/Share/TransientShare.swift index 5276698339..e327c01a9b 100644 --- a/iOSClient/Share/TransientShare.swift +++ b/iOSClient/Share/TransientShare.swift @@ -30,7 +30,7 @@ class TransientShare: Shareable { private init(shareType: Int, metadata: tableMetadata, password: String?) { let capabilities = NCNetworking.shared.capabilities[metadata.account] ?? NKCapabilities.Capabilities() - if metadata.e2eEncrypted, capabilities.e2EEApiVersion == NCGlobal.shared.e2eeVersionV12 { + if metadata.e2eEncrypted, capabilities.e2EEApiVersion == "1.2" { self.permissions = NKShare.Permission.create.rawValue } else { self.permissions = capabilities.fileSharingDefaultPermission & metadata.sharePermissionsCollaborationServices