Marino Faggiana 1 year ago
parent
commit
47ad4cdfd3

+ 14 - 0
iOSClient/Data/NCManageDatabase+E2EE.swift

@@ -365,6 +365,20 @@ extension NCManageDatabase {
         return nil
     }
 
+    func incrementCounterE2eMetadataV2(account: String, serverUrl: String) {
+
+        do {
+            let realm = try Realm()
+            try realm.write {
+                if let result = realm.objects(tableE2eMetadataV2.self).filter("accountServerUrl == %@", account + serverUrl).first {
+                    result.counter += 1
+                }
+            }
+        } catch let error {
+            NextcloudKit.shared.nkCommonInstance.writeLog("Could not write to database: \(error)")
+        }
+    }
+
     func addE2eMetadataV2(account: String, serverUrl: String, keyChecksums: [String]?, deleted: Bool, counter: Int, folders: [String: String]?, version: String) {
 
         do {

+ 2 - 0
iOSClient/Data/NCManageDatabase.swift

@@ -202,6 +202,8 @@ class NCManageDatabase: NSObject {
         self.clearTable(tableE2eEncryption.self, account: account)
         self.clearTable(tableE2eEncryptionLock.self, account: account)
         self.clearTable(tableE2eMetadata.self, account: account)
+        self.clearTable(tableE2eMetadataV2.self, account: account)
+        self.clearTable(tableE2eUsersV2.self, account: account)
         self.clearTable(tableExternalSites.self, account: account)
         self.clearTable(tableGPS.self, account: nil)
         self.clearTable(TableGroupfolders.self, account: account)

+ 16 - 1
iOSClient/Networking/E2EE/NCEndToEndMetadata.swift

@@ -86,11 +86,26 @@ class NCEndToEndMetadata: NSObject {
 
     struct E2eeV20: Codable {
 
+        struct Files: Codable {
+            let authenticationTag: String
+            let filename: String
+            let key: String
+            let mimetype: String
+            let nonce: String
+        }
+
+        struct ciphertext: Codable {
+            let counter: Int
+            let deleted: Bool
+            let keyChecksums: [String]?
+            let files: [String: Files]?
+            let folders: [String: String]?
+        }
+
         struct Metadata: Codable {
             let ciphertext: String
             let nonce: String
             let authenticationTag: String
-            let counter: Double?
         }
 
         struct Users: Codable {

+ 39 - 33
iOSClient/Networking/E2EE/NCEndToEndMetadataV20.swift

@@ -40,10 +40,10 @@ extension NCEndToEndMetadata {
         }
 
         let e2eEncryptions = NCManageDatabase.shared.getE2eEncryptions(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", account, serverUrl))
-        let e2eMetadataV2 = NCManageDatabase.shared.getE2eMetadataV2(account: account, serverUrl: serverUrl)
+
 
         var usersCodable: [E2eeV20.Users] = []
-        var metadataCodable: E2eeV20.Metadata = E2eeV20.Metadata(ciphertext: "", nonce: "", authenticationTag: "", counter: 0)
+        var metadataCodable: E2eeV20.Metadata = E2eeV20.Metadata(ciphertext: "", nonce: "", authenticationTag: "")
         var filedropCodable: [String: E2eeV20.Filedrop] = [:]
 
         var encryptedMetadataKey: String?
@@ -69,6 +69,24 @@ extension NCEndToEndMetadata {
             }
         }
 
+        // Counter
+        if NCManageDatabase.shared.getE2eMetadataV2(account: account, serverUrl: serverUrl) == nil {
+            NCManageDatabase.shared.addE2eMetadataV2(account: account, serverUrl: serverUrl, keyChecksums: nil, deleted: false, counter: 1, folders: nil, version: "2.0nil")
+        } else {
+            NCManageDatabase.shared.incrementCounterE2eMetadataV2(account: account, serverUrl: serverUrl)
+        }
+
+        // Create ciphertext
+
+
+        for e2eEncryption in e2eEncryptions {
+
+            if e2eEncryption.blob == "files" {
+                let encrypted = E2eeV12.Encrypted(key: e2eEncryption.key, filename: e2eEncryption.fileName, mimetype: e2eEncryption.mimeType)
+
+            }
+        }
+
         let e2eeCodable = E2eeV20(metadata: metadataCodable, users: usersCodable, filedrop: filedropCodable, version: "2.0")
         do {
             let data = try JSONEncoder().encode(e2eeCodable)
@@ -101,14 +119,14 @@ extension NCEndToEndMetadata {
             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) {
+        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)) {
 
                 let object = tableE2eEncryption()
 
                 object.account = account
-                object.authenticationTag = authenticationTag ?? ""
+                object.authenticationTag = authenticationTag
                 object.blob = "files"
                 object.fileName = filename
                 object.fileNameIdentifier = fileNameIdentifier
@@ -195,42 +213,30 @@ extension NCEndToEndMetadata {
                             if let jsonText = String(data: data, encoding: .utf8) {
                                 print(jsonText)
                             }
-                            if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] {
 
-                                let keyChecksums = json["keyChecksums"] as? [String]
-                                let deleted = json["deleted"] as? Bool ?? false
-                                let counter = json["counter"] as? Int ?? 0
+                            let json = try decoder.decode(E2eeV20.ciphertext.self, from: data)  // JSONSerialization.jsonObject(with: data) as? [String: AnyObject] {
 
-                                // Checksums
-                                if let keyChecksums,
-                                   let hash = NCEndToEndEncryption.sharedManager().createSHA256(from: decryptedMetadataKey),
-                                   !keyChecksums.contains(hash) {
-                                    return NKError(errorCode: NCGlobal.shared.errorE2EEKeyChecksums, errorDescription: NSLocalizedString("_e2ee_checksums_error_", comment: ""))
-                                }
+                            // Checksums
+                            if let keyChecksums = json.keyChecksums,
+                                let hash = NCEndToEndEncryption.sharedManager().createSHA256(from: decryptedMetadataKey),
+                                !keyChecksums.contains(hash) {
+                                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: keyChecksums, deleted: deleted, counter: counter, folders: json["folders"] as? [String: String], version: version)
-
-                                if let files = json["files"] as? [String: Any] {
-                                    for file in files {
-                                        let uid = file.key
-                                        if let dic = file.value as? [String: String] {
-                                            if let authenticationTag = dic["authenticationTag"],
-                                               let nonce = dic["nonce"],
-                                               let mimetype = dic["mimetype"],
-                                               let key = dic["key"],
-                                               let filename = dic["filename"] {
-                                                addE2eEncryption(fileNameIdentifier: uid, filename: filename, authenticationTag: authenticationTag, key: key, initializationVector: nonce, metadataKey: metadataKey, mimetype: mimetype)
-                                            }
-                                        }
-                                    }
+                            if let files = json.files {
+                                for file in files {
+                                    addE2eEncryption(fileNameIdentifier: file.key, filename: file.value.filename, authenticationTag: file.value.authenticationTag, key: file.value.key, initializationVector: file.value.nonce, metadataKey: metadataKey, mimetype: file.value.mimetype)
                                 }
+                            }
 
-                                if let folders = json["folders"] as? [String: String] {
-                                    for folder in folders {
-                                        addE2eEncryption(fileNameIdentifier: folder.key, filename: folder.value, authenticationTag: metadata.authenticationTag, key: metadataKey, initializationVector: metadata.nonce, metadataKey: metadataKey, mimetype: "httpd/unix-directory")
-                                    }
+                            if let folders = json.folders {
+                                for folder in folders {
+                                    addE2eEncryption(fileNameIdentifier: folder.key, filename: folder.value, authenticationTag: metadata.authenticationTag, key: metadataKey, initializationVector: metadata.nonce, metadataKey: metadataKey, mimetype: "httpd/unix-directory")
                                 }
                             }
+
                         } catch let error {
                             return NKError(error: error)
                         }