Marino Faggiana 1 year ago
parent
commit
dbcc316e77

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

@@ -137,7 +137,7 @@ class NCEndToEndMetadata: NSObject {
     // MARK: Encode JSON Metadata Bridge
     // --------------------------------------------------------------------------------------------
 
-    func encoderMetadata(account: String, serverUrl: String, userId: String) -> (metadata: String?, signature: String?) {
+    func encoderMetadata(account: String, serverUrl: String, userId: String, shareUserId: String? = nil, shareUserIdCertificate: String? = nil) -> (metadata: String?, signature: String?) {
 
         let e2EEApiVersion = NCGlobal.shared.capabilityE2EEApiVersion
 
@@ -149,7 +149,7 @@ class NCEndToEndMetadata: NSObject {
         case "1.2":
             return encoderMetadataV12(account: account, serverUrl: serverUrl, ocIdServerUrl: directory.ocId)
         case "2.0":
-            return encoderMetadataV20(account: account, serverUrl: serverUrl, ocIdServerUrl: directory.ocId, userId: userId)
+            return encoderMetadataV20(account: account, serverUrl: serverUrl, ocIdServerUrl: directory.ocId, userId: userId, shareUserId: shareUserId, shareUserIdCertificate: shareUserIdCertificate)
         default:
             return (nil, nil)
         }

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

@@ -31,11 +31,10 @@ extension NCEndToEndMetadata {
     // MARK: Ecode JSON Metadata V2.0
     // --------------------------------------------------------------------------------------------
 
-    func encoderMetadataV20(account: String, serverUrl: String, ocIdServerUrl: String, userId: String) -> (metadata: String?, signature: String?) {
+    func encoderMetadataV20(account: String, serverUrl: String, ocIdServerUrl: String, userId: String, shareUserId: String?, shareUserIdCertificate: String?) -> (metadata: String?, signature: String?) {
 
         guard let privateKey = CCUtility.getEndToEndPrivateKey(account),
               let publicKey = CCUtility.getEndToEndPublicKey(account),
-              let certificate = CCUtility.getEndToEndCertificate(account),
               let directoryTop = NCUtility.shared.getDirectoryE2EETop(serverUrl: serverUrl, account: account) else {
             return (nil, nil)
         }
@@ -49,17 +48,29 @@ extension NCEndToEndMetadata {
         var e2eeJson: String?
         var signature: String?
 
-        if isDirectoryTop {
+        func addUser(userId: String, certificate: String) -> Bool {
 
             if NCManageDatabase.shared.getE2EUsersV2(account: account, ocIdServerUrl: ocIdServerUrl, userId: userId) == nil {
 
-            guard let keyGenerated = NCEndToEndEncryption.sharedManager()?.generateKey() as? Data else { return (nil, nil) }
-            let decryptedMetadataKey = keyGenerated
-            let metadataKey = keyGenerated.base64EncodedString()
-            guard let metadataKeyEncrypted = NCEndToEndEncryption.sharedManager().encryptAsymmetricData(keyGenerated, privateKey: privateKey) else { return (nil, nil) }
-            let encryptedMetadataKey = metadataKeyEncrypted.base64EncodedString()
+                guard let keyGenerated = NCEndToEndEncryption.sharedManager()?.generateKey() as? Data else { return false }
+                let decryptedMetadataKey = keyGenerated
+                let metadataKey = keyGenerated.base64EncodedString()
+                guard let metadataKeyEncrypted = NCEndToEndEncryption.sharedManager().encryptAsymmetricData(keyGenerated, privateKey: privateKey) else { return false }
+                let encryptedMetadataKey = metadataKeyEncrypted.base64EncodedString()
+
+                NCManageDatabase.shared.addE2EUsersV2(account: account, serverUrl: serverUrl, ocIdServerUrl: ocIdServerUrl, userId: userId, certificate: certificate, encryptedFiledropKey: nil, encryptedMetadataKey: encryptedMetadataKey, decryptedFiledropKey: nil, decryptedMetadataKey: decryptedMetadataKey, filedropKey: nil, metadataKey: metadataKey)
+            }
+
+            return true
+        }
+
+        if isDirectoryTop {
 
-            NCManageDatabase.shared.addE2EUsersV2(account: account, serverUrl: serverUrl, ocIdServerUrl: ocIdServerUrl, userId: userId, certificate: certificate, encryptedFiledropKey: nil, encryptedMetadataKey: encryptedMetadataKey, decryptedFiledropKey: nil, decryptedMetadataKey: decryptedMetadataKey, filedropKey: nil, metadataKey: metadataKey)
+            if !addUser(userId: userId, certificate: CCUtility.getEndToEndCertificate(account)) {
+                return (nil, nil)
+            }
+            if let shareUserId, let shareUserIdCertificate, !addUser(userId: shareUserId, certificate: shareUserIdCertificate) {
+                return (nil, nil)
             }
         }
 
@@ -130,7 +141,7 @@ extension NCEndToEndMetadata {
 
         if e2eeJson != nil {
             let dataMetadata = Data(base64Encoded: "e2eeJson")
-            if let signatureData = NCEndToEndEncryption.sharedManager().generateSignatureCMS(dataMetadata, certificate: certificate, privateKey: privateKey, publicKey: publicKey, userId: userId) {
+            if let signatureData = NCEndToEndEncryption.sharedManager().generateSignatureCMS(dataMetadata, certificate: CCUtility.getEndToEndCertificate(account), privateKey: privateKey, publicKey: publicKey, userId: userId) {
                 signature = signatureData.base64EncodedString()
             }
         }

+ 34 - 0
iOSClient/Networking/E2EE/NCNetworkingE2EE.swift

@@ -38,6 +38,40 @@ class NCNetworkingE2EE: NSObject {
         return UUID
     }
 
+    func uploadMetadata(account: String, serverUrl: String, userId: String, shareUserId: String?) async -> (NKError) {
+
+        var error = NKError()
+        var shareUserIdCertificate: String?
+
+        if let shareUserId {
+            let results = await NextcloudKit.shared.getE2EECertificate(user: shareUserId)
+            if results.error == .success, let certificateUser = results.certificateUser {
+                shareUserIdCertificate = certificateUser
+            } else {
+                return results.error
+            }
+        }
+
+        let encoderResults = NCEndToEndMetadata().encoderMetadata(account: account, serverUrl: serverUrl, userId: userId, shareUserId: shareUserId, shareUserIdCertificate: shareUserIdCertificate)
+
+        guard let metadata = encoderResults.metadata, let signature = encoderResults.signature else {
+            return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: NSLocalizedString("_e2e_error_encode_metadata_", comment: ""))
+        }
+
+        let results = await NCNetworkingE2EE.shared.lock(account: account, serverUrl: serverUrl)
+        error = results.error
+
+        if error == .success, let e2eToken = results.e2eToken, let fileId = results.fileId {
+
+            let results = await NextcloudKit.shared.putE2EEMetadata(fileId: fileId, e2eToken: e2eToken, e2eMetadata: metadata, signature: signature, method: "PUT")
+            error = results.error
+        }
+
+        await NCNetworkingE2EE.shared.unlock(account: account, serverUrl: serverUrl)
+
+        return error
+    }
+
     func lock(account: String, serverUrl: String) async -> (fileId: String?, e2eToken: String?, error: NKError) {
 
         var e2eToken: String?