Browse Source

refactoring

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
Marino Faggiana 2 years ago
parent
commit
e919bc7017

+ 1 - 0
.swiftlint.yml

@@ -78,6 +78,7 @@ excluded:
   - iOSClient/Data/NCManageDatabase+Account.swift
   - iOSClient/Data/NCManageDatabase+Activity.swift
   - iOSClient/Data/NCManageDatabase+Avatar.swift
+  - iOSClient/Data/NCManageDatabase+E2EE.swift
   - iOSClient/Data/NCManageDatabase.swift
   - iOSClient/Data/NCManageDatabase+Metadata.swift
   - iOSClient/Data/NCManageDatabase+Directory.swift

+ 19 - 5
Nextcloud.xcodeproj/project.pbxproj

@@ -174,6 +174,12 @@
 		F72EA95428B7BABA00C88F0C /* FilesWidgetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72EA95328B7BABA00C88F0C /* FilesWidgetProvider.swift */; };
 		F72EA95828B7BC4F00C88F0C /* FilesData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72EA95728B7BC4F00C88F0C /* FilesData.swift */; };
 		F72EA95A28B7BD0D00C88F0C /* FilesWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72EA95928B7BD0D00C88F0C /* FilesWidgetView.swift */; };
+		F72FD3B5297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
+		F72FD3B6297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
+		F72FD3B7297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
+		F72FD3B8297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
+		F72FD3B9297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
+		F72FD3BA297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */ = {isa = PBXBuildFile; fileRef = F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */; };
 		F732D23327CF8AED000B0F1B /* NCPlayerToolBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = F732D23227CF8AED000B0F1B /* NCPlayerToolBar.xib */; };
 		F733598125C1C188002ABA72 /* NCAskAuthorization.swift in Sources */ = {isa = PBXBuildFile; fileRef = F733598025C1C188002ABA72 /* NCAskAuthorization.swift */; };
 		F7346E1228B0EF5B006CE2D2 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7346E1128B0EF5B006CE2D2 /* WidgetKit.framework */; };
@@ -818,6 +824,7 @@
 		F72EA95328B7BABA00C88F0C /* FilesWidgetProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesWidgetProvider.swift; sourceTree = "<group>"; };
 		F72EA95728B7BC4F00C88F0C /* FilesData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesData.swift; sourceTree = "<group>"; };
 		F72EA95928B7BD0D00C88F0C /* FilesWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesWidgetView.swift; sourceTree = "<group>"; };
+		F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+E2EE.swift"; sourceTree = "<group>"; };
 		F7320934201B812F008A0888 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F732093B201B81E4008A0888 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		F732D23227CF8AED000B0F1B /* NCPlayerToolBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NCPlayerToolBar.xib; sourceTree = "<group>"; };
@@ -1897,19 +1904,20 @@
 		F7BAAD951ED5A63D00B7EAD4 /* Data */ = {
 			isa = PBXGroup;
 			children = (
-				F7C1EEA425053A9C00866ACC /* NCDataSource.swift */,
 				F7BAADB41ED5A87C00B7EAD4 /* NCDatabase.swift */,
+				F7C1EEA425053A9C00866ACC /* NCDataSource.swift */,
+				F73D5E46246DE09200DF6467 /* NCElementsJSON.swift */,
 				F7BAADB51ED5A87C00B7EAD4 /* NCManageDatabase.swift */,
-				F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */,
-				AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */,
-				F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */,
 				AF4BF613275629E20081CEEF /* NCManageDatabase+Account.swift */,
+				AF4BF61D27562B3F0081CEEF /* NCManageDatabase+Activity.swift */,
+				F749B650297B0F2400087535 /* NCManageDatabase+Avatar.swift */,
 				F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */,
 				F78A10BE29322E8A008499B8 /* NCManageDatabase+Directory.swift */,
+				F72FD3B4297ED49A00075D28 /* NCManageDatabase+E2EE.swift */,
 				F7BF9D812934CA21009EE9A6 /* NCManageDatabase+LayoutForView.swift */,
 				AF4BF61827562A4B0081CEEF /* NCManageDatabase+Metadata.swift */,
+				F749B649297B0CBB00087535 /* NCManageDatabase+Share.swift */,
 				F7E98C1527E0D0FC001F9F19 /* NCManageDatabase+Video.swift */,
-				F73D5E46246DE09200DF6467 /* NCElementsJSON.swift */,
 			);
 			path = Data;
 			sourceTree = "<group>";
@@ -2879,6 +2887,7 @@
 				F702F2D225EE5B5C008F8E80 /* NCGlobal.swift in Sources */,
 				F7707689263A896A00A1BA94 /* UIImage+Extension.swift in Sources */,
 				2C1D5D7523E2DE3300334ABB /* NCDatabase.swift in Sources */,
+				F72FD3BA297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7E98C1927E0D0FC001F9F19 /* NCManageDatabase+Video.swift in Sources */,
 				2C1D5D7623E2DE3300334ABB /* NCManageDatabase.swift in Sources */,
 				F7D68FD028CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */,
@@ -2957,6 +2966,7 @@
 				F75A9EE723796C6F0044CFCE /* NCNetworking.swift in Sources */,
 				AF730AFA27843E4C00B7520E /* NCShareExtension+NCDelegate.swift in Sources */,
 				F749B64D297B0CBB00087535 /* NCManageDatabase+Share.swift in Sources */,
+				F72FD3B8297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7EDE4E0262D7BAF00414FE6 /* NCGridCell.swift in Sources */,
 				F7A76DC8256A71CD00119AB3 /* UIImage+Extension.swift in Sources */,
 				F7B8CD96261AF401007C1359 /* NCNetworkingChunkedUpload.swift in Sources */,
@@ -3022,6 +3032,7 @@
 				F75DD766290ABB25002EB562 /* Intent.intentdefinition in Sources */,
 				F78302F628B4C3C500B84583 /* NCDatabase.swift in Sources */,
 				F7D68FCD28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */,
+				F72FD3B6297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				F783030128B4C49700B84583 /* UIImage+Extension.swift in Sources */,
 				F72EA95428B7BABA00C88F0C /* FilesWidgetProvider.swift in Sources */,
 			);
@@ -3067,6 +3078,7 @@
 				AF4BF62027562B3F0081CEEF /* NCManageDatabase+Activity.swift in Sources */,
 				F785EEA62461A4FB00B3F945 /* CCUtility.m in Sources */,
 				F73ADD2226554FD10069EA0D /* NCContentPresenter.swift in Sources */,
+				F72FD3B9297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3195,6 +3207,7 @@
 				F702F30125EE5D2C008F8E80 /* NYMnemonic.m in Sources */,
 				AF93474E27E3F212002537EE /* NCShareNewUserAddComment.swift in Sources */,
 				F7C30DFD291BD0B80017149B /* NCNetworkingE2EEDelete.swift in Sources */,
+				F72FD3B5297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				AF93471227E2341B002537EE /* NCShare+Menu.swift in Sources */,
 				F7EFA47825ADBA500083159A /* NCViewerProviderContextMenu.swift in Sources */,
 				F755BD9B20594AC7008C5FBB /* NCService.swift in Sources */,
@@ -3283,6 +3296,7 @@
 				F7A8D73A28F17E28008BBE1C /* NCManageDatabase+Video.swift in Sources */,
 				F7A8D73828F17E21008BBE1C /* NCManageDatabase+DashboardWidget.swift in Sources */,
 				F7A8D73928F17E25008BBE1C /* NCManageDatabase+Metadata.swift in Sources */,
+				F72FD3B7297ED49A00075D28 /* NCManageDatabase+E2EE.swift in Sources */,
 				F7A8D74128F18254008BBE1C /* UIColor+Extension.swift in Sources */,
 				F7A8D73428F17E12008BBE1C /* NCDatabase.swift in Sources */,
 				F7A8D74028F18212008BBE1C /* UIImage+Extension.swift in Sources */,

+ 0 - 33
iOSClient/Data/NCDatabase.swift

@@ -96,39 +96,6 @@ class tableDirectEditingEditors: Object {
     @objc dynamic var secure: Int = 0
 }
 
-class tableE2eEncryption: Object {
-
-    @objc dynamic var account = ""
-    @objc dynamic var authenticationTag: String?
-    @objc dynamic var fileName = ""
-    @objc dynamic var fileNameIdentifier = ""
-    @objc dynamic var fileNamePath = ""
-    @objc dynamic var key = ""
-    @objc dynamic var initializationVector = ""
-    @objc dynamic var metadataKey = ""
-    @objc dynamic var metadataKeyIndex: Int = 0
-    @objc dynamic var mimeType = ""
-    @objc dynamic var serverUrl = ""
-    @objc dynamic var version: Int = 1
-
-    override static func primaryKey() -> String {
-        return "fileNamePath"
-    }
-}
-
-class tableE2eEncryptionLock: Object {
-
-    @objc dynamic var account = ""
-    @objc dynamic var date = NSDate()
-    @objc dynamic var fileId = ""
-    @objc dynamic var serverUrl = ""
-    @objc dynamic var e2eToken = ""
-
-    override static func primaryKey() -> String {
-        return "fileId"
-    }
-}
-
 class tableExternalSites: Object {
 
     @objc dynamic var account = ""

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

@@ -0,0 +1,219 @@
+//
+//  NCManageDatabase+E2EE.swift
+//  Nextcloud
+//
+//  Created by Marino Faggiana on 23/01/23.
+//  Copyright © 2023 Marino Faggiana. All rights reserved.
+//
+//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//
+
+import Foundation
+import RealmSwift
+import NextcloudKit
+import SwiftyJSON
+
+class tableE2eEncryption: Object {
+
+    @objc dynamic var account = ""
+    @objc dynamic var authenticationTag: String?
+    @objc dynamic var blob = ""
+    @objc dynamic var fileName = ""
+    @objc dynamic var fileNameIdentifier = ""
+    @objc dynamic var fileNamePath = ""
+    @objc dynamic var key = ""
+    @objc dynamic var initializationVector = ""
+    @objc dynamic var metadataKey = ""
+    @objc dynamic var metadataKeyIndex: Int = 0
+    @objc dynamic var metadataVersion: Int = 0
+    @objc dynamic var mimeType = ""
+    @objc dynamic var serverUrl = ""
+    @objc dynamic var version: Int = 0
+
+    override static func primaryKey() -> String {
+        return "fileNamePath"
+    }
+}
+
+class tableE2eEncryptionLock: Object {
+
+    @objc dynamic var account = ""
+    @objc dynamic var date = NSDate()
+    @objc dynamic var fileId = ""
+    @objc dynamic var serverUrl = ""
+    @objc dynamic var e2eToken = ""
+
+    override static func primaryKey() -> String {
+        return "fileId"
+    }
+}
+
+extension NCManageDatabase {
+
+    // MARK: -
+    // MARK: Table e2e Encryption
+
+    @objc func addE2eEncryption(_ e2e: tableE2eEncryption) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+                realm.add(e2e, update: .all)
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    @objc func deleteE2eEncryption(predicate: NSPredicate) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+
+                let results = realm.objects(tableE2eEncryption.self).filter(predicate)
+                realm.delete(results)
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    @objc func getE2eEncryption(predicate: NSPredicate) -> tableE2eEncryption? {
+
+        let realm = try! Realm()
+
+        guard let result = realm.objects(tableE2eEncryption.self).filter(predicate).sorted(byKeyPath: "metadataKeyIndex", ascending: false).first else {
+            return nil
+        }
+
+        return tableE2eEncryption.init(value: result)
+    }
+
+    @objc func getE2eEncryptions(predicate: NSPredicate) -> [tableE2eEncryption]? {
+
+        guard self.getActiveAccount() != nil else {
+            return nil
+        }
+
+        let realm = try! Realm()
+
+        let results: Results<tableE2eEncryption>
+
+        results = realm.objects(tableE2eEncryption.self).filter(predicate)
+
+        if results.count > 0 {
+            return Array(results.map { tableE2eEncryption.init(value: $0) })
+        } else {
+            return nil
+        }
+    }
+
+    @objc func renameFileE2eEncryption(serverUrl: String, fileNameIdentifier: String, newFileName: String, newFileNamePath: String) {
+
+        guard let activeAccount = self.getActiveAccount() else {
+            return
+        }
+
+        let realm = try! Realm()
+
+        realm.beginWrite()
+
+        guard let result = realm.objects(tableE2eEncryption.self).filter("account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", activeAccount.account, serverUrl, fileNameIdentifier).first else {
+            realm.cancelWrite()
+            return
+        }
+
+        let object = tableE2eEncryption.init(value: result)
+
+        realm.delete(result)
+
+        object.fileName = newFileName
+        object.fileNamePath = newFileNamePath
+
+        realm.add(object)
+
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    // MARK: -
+    // MARK: Table e2e Encryption Lock
+
+    @objc func getE2ETokenLock(account: String, serverUrl: String) -> tableE2eEncryptionLock? {
+
+        let realm = try! Realm()
+
+        guard let result = realm.objects(tableE2eEncryptionLock.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first else {
+            return nil
+        }
+
+        return tableE2eEncryptionLock.init(value: result)
+    }
+
+    @objc func getE2EAllTokenLock(account: String) -> [tableE2eEncryptionLock] {
+
+        let realm = try! Realm()
+
+        let results = realm.objects(tableE2eEncryptionLock.self).filter("account == %@", account)
+
+        if results.count > 0 {
+            return Array(results.map { tableE2eEncryptionLock.init(value: $0) })
+        } else {
+            return []
+        }
+    }
+
+    @objc func setE2ETokenLock(account: String, serverUrl: String, fileId: String, e2eToken: String) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+                let addObject = tableE2eEncryptionLock()
+
+                addObject.account = account
+                addObject.fileId = fileId
+                addObject.serverUrl = serverUrl
+                addObject.e2eToken = e2eToken
+
+                realm.add(addObject, update: .all)
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+
+    @objc func deleteE2ETokenLock(account: String, serverUrl: String) {
+
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+                if let result = realm.objects(tableE2eEncryptionLock.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first {
+                    realm.delete(result)
+                }
+            }
+        } catch let error {
+            NKCommon.shared.writeLog("Could not write to database: \(error)")
+        }
+    }
+}

+ 0 - 154
iOSClient/Data/NCManageDatabase.swift

@@ -547,160 +547,6 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    // MARK: -
-    // MARK: Table e2e Encryption
-
-    @objc func addE2eEncryption(_ e2e: tableE2eEncryption) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-                realm.add(e2e, update: .all)
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @objc func deleteE2eEncryption(predicate: NSPredicate) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-
-                let results = realm.objects(tableE2eEncryption.self).filter(predicate)
-                realm.delete(results)
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @objc func getE2eEncryption(predicate: NSPredicate) -> tableE2eEncryption? {
-
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableE2eEncryption.self).filter(predicate).sorted(byKeyPath: "metadataKeyIndex", ascending: false).first else {
-            return nil
-        }
-
-        return tableE2eEncryption.init(value: result)
-    }
-
-    @objc func getE2eEncryptions(predicate: NSPredicate) -> [tableE2eEncryption]? {
-
-        guard self.getActiveAccount() != nil else {
-            return nil
-        }
-
-        let realm = try! Realm()
-
-        let results: Results<tableE2eEncryption>
-
-        results = realm.objects(tableE2eEncryption.self).filter(predicate)
-
-        if results.count > 0 {
-            return Array(results.map { tableE2eEncryption.init(value: $0) })
-        } else {
-            return nil
-        }
-    }
-
-    @objc func renameFileE2eEncryption(serverUrl: String, fileNameIdentifier: String, newFileName: String, newFileNamePath: String) {
-
-        guard let activeAccount = self.getActiveAccount() else {
-            return
-        }
-
-        let realm = try! Realm()
-
-        realm.beginWrite()
-
-        guard let result = realm.objects(tableE2eEncryption.self).filter("account == %@ AND serverUrl == %@ AND fileNameIdentifier == %@", activeAccount.account, serverUrl, fileNameIdentifier).first else {
-            realm.cancelWrite()
-            return
-        }
-
-        let object = tableE2eEncryption.init(value: result)
-
-        realm.delete(result)
-
-        object.fileName = newFileName
-        object.fileNamePath = newFileNamePath
-
-        realm.add(object)
-
-        do {
-            try realm.commitWrite()
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    // MARK: -
-    // MARK: Table e2e Encryption Lock
-
-    @objc func getE2ETokenLock(account: String, serverUrl: String) -> tableE2eEncryptionLock? {
-
-        let realm = try! Realm()
-
-        guard let result = realm.objects(tableE2eEncryptionLock.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first else {
-            return nil
-        }
-
-        return tableE2eEncryptionLock.init(value: result)
-    }
-
-    @objc func getE2EAllTokenLock(account: String) -> [tableE2eEncryptionLock] {
-
-        let realm = try! Realm()
-
-        let results = realm.objects(tableE2eEncryptionLock.self).filter("account == %@", account)
-
-        if results.count > 0 {
-            return Array(results.map { tableE2eEncryptionLock.init(value: $0) })
-        } else {
-            return []
-        }
-    }
-
-    @objc func setE2ETokenLock(account: String, serverUrl: String, fileId: String, e2eToken: String) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-                let addObject = tableE2eEncryptionLock()
-
-                addObject.account = account
-                addObject.fileId = fileId
-                addObject.serverUrl = serverUrl
-                addObject.e2eToken = e2eToken
-
-                realm.add(addObject, update: .all)
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
-    @objc func deleteE2ETokenLock(account: String, serverUrl: String) {
-
-        let realm = try! Realm()
-
-        do {
-            try realm.write {
-                if let result = realm.objects(tableE2eEncryptionLock.self).filter("account == %@ AND serverUrl == %@", account, serverUrl).first {
-                    realm.delete(result)
-                }
-            }
-        } catch let error {
-            NKCommon.shared.writeLog("Could not write to database: \(error)")
-        }
-    }
-
     // MARK: -
     // MARK: Table External Sites
 

+ 1 - 1
iOSClient/NCGlobal.swift

@@ -114,7 +114,7 @@ class NCGlobal: NSObject {
     // Database Realm
     //
     let databaseDefault                             = "nextcloud.realm"
-    let databaseSchemaVersion: UInt64               = 259
+    let databaseSchemaVersion: UInt64               = 261
     let fileAccounts: String                        = "accounts.json"
 
     // Intro selector

+ 137 - 77
iOSClient/Networking/E2EE/NCEndToEndMetadata.swift

@@ -23,6 +23,7 @@
 
 import UIKit
 import NextcloudKit
+import SwiftyJSON
 
 class NCEndToEndMetadata: NSObject {
 
@@ -140,96 +141,155 @@ class NCEndToEndMetadata: NSObject {
 
     @discardableResult
     @objc func decoderMetadata(_ e2eMetaDataJSON: String, privateKey: String, serverUrl: String, account: String, urlBase: String, userId: String) -> Bool {
-
-        let jsonDecoder = JSONDecoder()
-        let data = e2eMetaDataJSON.data(using: .utf8)
-        // let dataQuickLook = (data as! NSData)
+        guard let data = e2eMetaDataJSON.data(using: .utf8) else { return false }
 
         do {
-
-            // *** metadataKey ***
-
-            let decode = try jsonDecoder.decode(E2eMetadata.self, from: data!)
-
-            let files = decode.files
-            let metadata = decode.metadata
-            // let sharing = decode.sharing ---> V 2.0
-            var metadataKeysDictionary: [String: String] = [:]
-
-            for metadataKeyDictionaryEncrypted in metadata.metadataKeys {
-
-                guard let metadataKeyEncryptedData: NSData = NSData(base64Encoded: metadataKeyDictionaryEncrypted.value, options: NSData.Base64DecodingOptions(rawValue: 0)) else {
-                    return false
-                }
-
-                guard let metadataKeyBase64 = NCEndToEndEncryption.sharedManager().decryptAsymmetricData(metadataKeyEncryptedData as Data?, privateKey: privateKey) else {
-                    return false
+            let json = try JSON(data: data)
+
+            let metadata = json["metadata"]
+            var metadataKeys: [Int: String] = [:]
+
+            let files = json["files"]
+            let filedrop = json["filedrop"]
+
+            //
+            // ---[ metadata ]---
+            //
+            let metadataVersion = metadata["version"].intValue
+            // metadataKeys
+            let metadataMetadataKeys = metadata["metadataKeys"]
+            for (key, value): (String, JSON) in metadataMetadataKeys {
+                if let encryptedMetadataKey = value.string,
+                   let index = Int(key),
+                   let metadataKeyEncryptedData = NSData(base64Encoded: encryptedMetadataKey, options: NSData.Base64DecodingOptions(rawValue: 0)),
+                   let metadataKeyBase64 = NCEndToEndEncryption.sharedManager().decryptAsymmetricData(metadataKeyEncryptedData as Data?, privateKey: privateKey),
+                   let metadataKeyBase64Data = Data(base64Encoded: metadataKeyBase64, options: NSData.Base64DecodingOptions(rawValue: 0)),
+                   let metadataKey = String(data: metadataKeyBase64Data, encoding: .utf8) {
+                    metadataKeys[index] = metadataKey
                 }
-
-                // Initialize a `Data` from a Base-64 encoded String
-                let metadataKeyBase64Data = Data(base64Encoded: metadataKeyBase64, options: NSData.Base64DecodingOptions(rawValue: 0))!
-                let metadataKey = String(data: metadataKeyBase64Data, encoding: .utf8)
-
-                metadataKeysDictionary[metadataKeyDictionaryEncrypted.key] = metadataKey
             }
 
-            // *** File ***
-
-            for file in files {
-
-                let fileNameIdentifier = file.key
-                let filesCodable = file.value as E2eMetadata.FilesCodable
-
-                let encrypted = filesCodable.encrypted
-                let metadataKey = metadataKeysDictionary["\(filesCodable.metadataKey)"]
+            //
+            // ---[ files ]---
+            //
+            for (key, subJson): (String, JSON) in files {
+                let fileNameIdentifier = key
+                let initializationVector = subJson["initializationVector"].stringValue
+                let index = subJson["metadataKey"].intValue
+                let authenticationTag = subJson["authenticationTag"].stringValue
+                let encrypted = subJson["encrypted"].string
+                if let metadataKey = metadataKeys[index], let jsonString = NCEndToEndEncryption.sharedManager().decryptEncryptedJson(encrypted, key: metadataKey), let data = jsonString.data(using: .utf8) {
+                    do {
+                        let json = try JSON(data: data)
+                        let object = tableE2eEncryption()
 
-                guard let encryptedFileAttributesJson = NCEndToEndEncryption.sharedManager().decryptEncryptedJson(encrypted, key: metadataKey) else {
-                    return false
+                        if let key = json["key"].string,
+                           let filename = json["filename"].string,
+                           let mimetype = json["mimetype"].string,
+                           let version = json["version"].int,
+                           let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@", account, fileNameIdentifier)) {
+
+                            object.account = account
+                            object.authenticationTag = authenticationTag
+                            object.blob = "files"
+                            object.fileName = filename
+                            object.fileNameIdentifier = fileNameIdentifier
+                            object.fileNamePath = CCUtility.returnFileNamePath(fromFileName: filename, serverUrl: serverUrl, urlBase: urlBase, userId: userId, account: account)
+                            object.key = key
+                            object.initializationVector = initializationVector
+                            object.metadataKey = metadataKey
+                            object.metadataKeyIndex = index
+                            object.metadataVersion = metadataVersion
+                            object.mimeType = mimetype
+                            object.serverUrl = serverUrl
+                            object.version = version
+
+                            // If exists remove records
+                            NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNamePath == %@", object.account, object.fileNamePath))
+                            NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNameIdentifier == %@", object.account, object.fileNameIdentifier))
+
+                            // Write file parameter for decrypted on DB
+                            NCManageDatabase.shared.addE2eEncryption(object)
+
+                            // Update metadata on tableMetadata
+                            metadata.fileNameView = filename
+
+                            let results = NKCommon.shared.getInternalType(fileName: filename, mimeType: metadata.contentType, directory: metadata.directory)
+
+                            metadata.contentType = results.mimeType
+                            metadata.iconName = results.iconName
+                            metadata.classFile = results.classFile
+
+                            NCManageDatabase.shared.addMetadata(metadata)
+                        }
+                    } catch { }
                 }
+            }
 
+            //
+            // ---[ filedrop ]---
+            //
+            for (key, subJson): (String, JSON) in filedrop {
+                let fileNameIdentifier = key
+                let initializationVector = subJson["initializationVector"].stringValue
+                let index = subJson["metadataKey"].intValue
+                let authenticationTag = subJson["authenticationTag"].stringValue
                 do {
-                    let encryptedFileAttributes = try jsonDecoder.decode(E2eMetadata.EncryptedFileAttributes.self, from: encryptedFileAttributesJson.data(using: .utf8)!)
-                    if let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@", account, fileNameIdentifier)) {
-                        let metadata = tableMetadata.init(value: metadata)
+                    let encrypted = try subJson["encrypted"].rawData()
+                    let jsonString = NCEndToEndEncryption.sharedManager().decryptAsymmetricData(encrypted, privateKey: privateKey)
+                    print("")
+                } catch {
+                    print("Error \(error)")
+                }
 
+                /*
+                if let metadataKey = metadataKeys[index], let jsonString = NCEndToEndEncryption.sharedManager().decryptEncryptedJson(encrypted, key: metadataKey), let data = jsonString.data(using: .utf8) {
+                    do {
+                        let json = try JSON(data: data)
                         let object = tableE2eEncryption()
 
-                        object.account = account
-                        object.authenticationTag = filesCodable.authenticationTag ?? ""
-                        object.fileName = encryptedFileAttributes.filename
-                        object.fileNameIdentifier = fileNameIdentifier
-                        object.fileNamePath = CCUtility.returnFileNamePath(fromFileName: encryptedFileAttributes.filename, serverUrl: serverUrl, urlBase: urlBase, userId: userId, account: account)
-                        object.key = encryptedFileAttributes.key
-                        object.initializationVector = filesCodable.initializationVector
-                        object.metadataKey = metadataKey!
-                        object.metadataKeyIndex = filesCodable.metadataKey
-                        object.mimeType = encryptedFileAttributes.mimetype
-                        object.serverUrl = serverUrl
-                        object.version = encryptedFileAttributes.version
-
-                        // If exists remove records
-                        NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNamePath == %@", object.account, object.fileNamePath))
-                        NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNameIdentifier == %@", object.account, object.fileNameIdentifier))
-
-                        // Write file parameter for decrypted on DB
-                        NCManageDatabase.shared.addE2eEncryption(object)
-
-                        // Update metadata on tableMetadata
-                        metadata.fileNameView = encryptedFileAttributes.filename
-
-                        let results = NKCommon.shared.getInternalType(fileName: encryptedFileAttributes.filename, mimeType: metadata.contentType, directory: metadata.directory)
-
-                        metadata.contentType = results.mimeType
-                        metadata.iconName = results.iconName
-                        metadata.classFile = results.classFile
-
-                        NCManageDatabase.shared.addMetadata(metadata)
-                    }
-
-                } catch let error {
-                    print("Serious internal error in decoding metadata (" + error.localizedDescription + ")")
-                    return false
+                        if let key = json["key"].string,
+                           let filename = json["filename"].string,
+                           let mimetype = json["mimetype"].string,
+                           let version = json["version"].int,
+                           let metadata = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND fileName == %@", account, fileNameIdentifier)) {
+
+                            object.account = account
+                            object.authenticationTag = authenticationTag
+                            object.blob = "filedrop"
+                            object.fileName = filename
+                            object.fileNameIdentifier = fileNameIdentifier
+                            object.fileNamePath = CCUtility.returnFileNamePath(fromFileName: filename, serverUrl: serverUrl, urlBase: urlBase, userId: userId, account: account)
+                            object.key = key
+                            object.initializationVector = initializationVector
+                            object.metadataKey = metadataKey
+                            object.metadataKeyIndex = index
+                            object.metadataVersion = metadataVersion
+                            object.mimeType = mimetype
+                            object.serverUrl = serverUrl
+                            object.version = version
+
+                            // If exists remove records
+                            NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNamePath == %@", object.account, object.fileNamePath))
+                            NCManageDatabase.shared.deleteE2eEncryption(predicate: NSPredicate(format: "account == %@ AND fileNameIdentifier == %@", object.account, object.fileNameIdentifier))
+
+                            // Write file parameter for decrypted on DB
+                            NCManageDatabase.shared.addE2eEncryption(object)
+
+                            // Update metadata on tableMetadata
+                            metadata.fileNameView = filename
+
+                            let results = NKCommon.shared.getInternalType(fileName: filename, mimeType: metadata.contentType, directory: metadata.directory)
+
+                            metadata.contentType = results.mimeType
+                            metadata.iconName = results.iconName
+                            metadata.classFile = results.classFile
+
+                            NCManageDatabase.shared.addMetadata(metadata)
+                        }
+                    } catch { }
                 }
+                */
             }
 
         } catch let error {

+ 3 - 3
iOSClient/Settings/NCManageE2EE.swift

@@ -246,10 +246,10 @@ struct NCViewE2EE: View {
                         }
                         .contentShape(Rectangle())
                         .onTapGesture {
-                            if CCUtility.getPasscode().isEmpty {
-                                NCContentPresenter.shared.showInfo(error: NKError(errorCode: 0, errorDescription: "_e2e_settings_lock_not_active_"))
-                            } else {
+                            if let passcode = CCUtility.getPasscode(), !passcode.isEmpty {
                                 manageE2EE.requestPasscodeType("startE2E")
+                            } else {
+                                NCContentPresenter.shared.showInfo(error: NKError(errorCode: 0, errorDescription: "_e2e_settings_lock_not_active_"))
                             }
                         }
                     }