Marino Faggiana 1 year ago
parent
commit
5d473f2237

+ 2 - 2
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -1073,9 +1073,9 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
                     self.metadataFolder = metadataFolder
                     // E2EE
                     if let metadataFolder = metadataFolder, metadataFolder.e2eEncrypted, CCUtility.isEnd(toEndEnabled: self.appDelegate.account) {
-                        NextcloudKit.shared.getE2EEMetadata(fileId: metadataFolder.ocId, e2eToken: nil) { account, e2eMetadata, _, data, error in
+                        NextcloudKit.shared.getE2EEMetadata(fileId: metadataFolder.ocId, e2eToken: nil) { account, e2eMetadata, signature, data, error in
                             if error == .success, let e2eMetadata = e2eMetadata {
-                                let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, serverUrl: self.serverUrl, account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId, ownerId: metadataFolder.ownerId)
+                                let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, signature: signature, serverUrl: self.serverUrl, account: self.appDelegate.account, urlBase: self.appDelegate.urlBase, userId: self.appDelegate.userId, ownerId: metadataFolder.ownerId)
                                 if error == .success {
                                     self.reloadDataSource()
                                 } else {

+ 3 - 3
iOSClient/Networking/E2EE/NCEndToEndMetadata.swift

@@ -96,7 +96,7 @@ class NCEndToEndMetadata: NSObject {
 
         struct ciphertext: Codable {
             let counter: Int
-            let deleted: Bool
+            let deleted: Bool?
             let keyChecksums: [String]?
             let files: [String: Files]?
             let folders: [String: String]?
@@ -155,7 +155,7 @@ class NCEndToEndMetadata: NSObject {
     // MARK: Decode JSON Metadata Bridge
     // --------------------------------------------------------------------------------------------
 
-    func decoderMetadata(_ json: String, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> NKError {
+    func decoderMetadata(_ json: String, signature: String?, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> NKError {
 
         guard let data = json.data(using: .utf8) else {
             return (NKError(errorCode: NCGlobal.shared.errorE2EE, errorDescription: "Error decoding JSON"))
@@ -170,7 +170,7 @@ class NCEndToEndMetadata: NSObject {
         } else if (try? decoder.decode(E2eeV12.self, from: data)) != nil {
             return decoderMetadataV12(json, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: ownerId)
         } else if (try? decoder.decode(E2eeV20.self, from: data)) != nil {
-            return decoderMetadataV20(json, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: ownerId)
+            return decoderMetadataV20(json, signature: signature, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: ownerId)
         } else {
             return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "Server E2EE version " + NCGlobal.shared.capabilityE2EEApiVersion + ", not compatible")
         }

+ 21 - 7
iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift

@@ -130,12 +130,17 @@ extension NCEndToEndMetadata {
     // MARK: Decode JSON Metadata V2.0
     // --------------------------------------------------------------------------------------------
 
-    func decoderMetadataV20(_ json: String, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> NKError {
+    func decoderMetadataV20(_ json: String, signature: String?, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> NKError {
 
         guard let data = json.data(using: .utf8) else {
             return NKError(errorCode: NCGlobal.shared.errorE2EE, errorDescription: "Error decoding JSON")
         }
 
+        guard let privateKey = CCUtility.getEndToEndPrivateKey(account),
+              let publicKey = CCUtility.getEndToEndPublicKey(account) else {
+            return NKError(errorCode: NCGlobal.shared.errorE2EE, errorDescription: "Error decoding JSON")
+        }
+
         func addE2eEncryption(fileNameIdentifier: String, filename: String, authenticationTag: String, key: String, initializationVector: String, metadataKey: String, mimetype: String) {
 
             if let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@", account, fileNameIdentifier)) {
@@ -170,17 +175,16 @@ extension NCEndToEndMetadata {
             }
         }
 
-        let decoder = JSONDecoder()
-        let privateKey = CCUtility.getEndToEndPrivateKey(account)
-
         do {
-            let json = try decoder.decode(E2eeV20.self, from: data)
+            let json = try JSONDecoder().decode(E2eeV20.self, from: data)
 
             let metadata = json.metadata
             let users = json.users
             let filedrop = json.filedrop
             let version = json.version as String? ?? "2.0"
 
+
+
             // DATA
             NCManageDatabase.shared.deleteE2eMetadataV2(account: account, serverUrl: serverUrl)
             NCManageDatabase.shared.deleteE2EUsersV2(account: account, serverUrl: serverUrl)
@@ -231,7 +235,17 @@ extension NCEndToEndMetadata {
                                 print(jsonText)
                             }
 
-                            let json = try decoder.decode(E2eeV20.ciphertext.self, from: data)  // JSONSerialization.jsonObject(with: data) as? [String: AnyObject] {
+                            let json = try JSONDecoder().decode(E2eeV20.ciphertext.self, from: data)
+
+                            // Signature
+
+                            let metadataCodable = E2eeV20.Metadata(ciphertext: metadata.ciphertext, nonce: metadata.nonce, authenticationTag: metadata.authenticationTag)
+                            let metadataData = try JSONEncoder().encode(metadataCodable)
+
+                            if let signatureData = NCEndToEndEncryption.sharedManager().generateSignatureCMS(metadataData, certificate: tableE2eUsersV2.certificate, privateKey: CCUtility.getEndToEndPrivateKey(account), publicKey: publicKey, userId: userId) {
+                                let signatureX = signatureData.base64EncodedString()
+                                print(signatureX)
+                            }
 
                             // Checksums
                             if let keyChecksums = json.keyChecksums,
@@ -240,7 +254,7 @@ extension NCEndToEndMetadata {
                                 return NKError(errorCode: NCGlobal.shared.errorE2EEKeyChecksums, errorDescription: NSLocalizedString("_e2ee_checksums_error_", comment: ""))
                             }
 
-                            NCManageDatabase.shared.addE2eMetadataV2(account: account, serverUrl: serverUrl, keyChecksums: json.keyChecksums, deleted: json.deleted, counter: json.counter, folders: json.folders, version: version)
+                            NCManageDatabase.shared.addE2eMetadataV2(account: account, serverUrl: serverUrl, keyChecksums: json.keyChecksums, deleted: json.deleted ?? false, counter: json.counter, folders: json.folders, version: version)
 
                             if let files = json.files {
                                 for file in files {

+ 3 - 3
iOSClient/Networking/E2EE/NCNetworkingE2EECreateFolder.swift

@@ -129,9 +129,9 @@ class NCNetworkingE2EECreateFolder: NSObject {
         var method = "POST"
 
         // Get last metadata
-        let getE2EEMetadataResults = await NextcloudKit.shared.getE2EEMetadata(fileId: fileIdLock, e2eToken: e2eToken)
-        if getE2EEMetadataResults.error == .success, let e2eMetadata = getE2EEMetadataResults.e2eMetadata {
-            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: nil)
+        let results = await NextcloudKit.shared.getE2EEMetadata(fileId: fileIdLock, e2eToken: e2eToken)
+        if results.error == .success, let e2eMetadata = results.e2eMetadata {
+            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, signature: results.signature, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: nil)
             if error != .success { return error }
             method = "PUT"
         }

+ 3 - 4
iOSClient/Networking/E2EE/NCNetworkingE2EEDelete.swift

@@ -41,13 +41,12 @@ class NCNetworkingE2EEDelete: NSObject {
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {
 
             // Get last metadata
-            let getE2EEMetadataResults = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
-
-            guard getE2EEMetadataResults.error == .success, let e2eMetadata = getE2EEMetadataResults.e2eMetadata else {
+            let results = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
+            guard results.error == .success, let e2eMetadata = results.e2eMetadata else {
                 return errorEncodeMetadata
             }
 
-            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
+            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, signature: results.signature, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
             if error != .success { return error }
 
             // delete

+ 3 - 3
iOSClient/Networking/E2EE/NCNetworkingE2EERename.swift

@@ -42,12 +42,12 @@ class NCNetworkingE2EERename: NSObject {
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {
 
             // Get last metadata
-            let getE2EEMetadataResults = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
-            guard getE2EEMetadataResults.error == .success, let e2eMetadata = getE2EEMetadataResults.e2eMetadata else {
+            let results = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
+            guard results.error == .success, let e2eMetadata = results.e2eMetadata else {
                 return errorEncodeMetadata
             }
 
-            error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
+            error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, signature: results.signature, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
             if error != .success { return error }
 
             // rename

+ 3 - 3
iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift

@@ -134,9 +134,9 @@ class NCNetworkingE2EEUpload: NSObject {
         }
 
         // Get last metadata
-        let getE2EEMetadataResults = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
-        if getE2EEMetadataResults.error == .success, let e2eMetadata = getE2EEMetadataResults.e2eMetadata {
-            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
+        let results = await NextcloudKit.shared.getE2EEMetadata(fileId: fileId, e2eToken: e2eToken)
+        if results.error == .success, let e2eMetadata = results.e2eMetadata {
+            let error = NCEndToEndMetadata().decoderMetadata(e2eMetadata, signature: results.signature, serverUrl: metadata.serverUrl, account: metadata.account, urlBase: metadata.urlBase, userId: metadata.userId, ownerId: metadata.ownerId)
             if error != .success { return error }
             method = "PUT"
         }