ソースを参照

coding

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
Marino Faggiana 2 年 前
コミット
f3c97ef8a2

+ 1 - 1
Brand/Database.swift

@@ -26,4 +26,4 @@ import Foundation
 // Database Realm
 // Database Realm
 //
 //
 let databaseName                    = "nextcloud.realm"
 let databaseName                    = "nextcloud.realm"
-let databaseSchemaVersion: UInt64   = 267
+let databaseSchemaVersion: UInt64   = 268

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

@@ -41,7 +41,6 @@ class tableE2eEncryption: Object {
     @objc dynamic var metadataVersion: Double = 0
     @objc dynamic var metadataVersion: Double = 0
     @objc dynamic var mimeType = ""
     @objc dynamic var mimeType = ""
     @objc dynamic var serverUrl = ""
     @objc dynamic var serverUrl = ""
-    @objc dynamic var version: Double = 1.2
 
 
     override static func primaryKey() -> String {
     override static func primaryKey() -> String {
         return "fileNamePath"
         return "fileNamePath"

+ 1 - 1
iOSClient/Extensions/UIAlertController+Extension.swift

@@ -38,7 +38,7 @@ extension UIAlertController {
             guard let fileNameFolder = alertController.textFields?.first?.text else { return }
             guard let fileNameFolder = alertController.textFields?.first?.text else { return }
             if markE2ee {
             if markE2ee {
                 Task {
                 Task {
-                    let error = await NCNetworkingE2EECreateFolder.shared.createFolderAndMarkE2EE(fileName: fileNameFolder, serverUrl: serverUrl)
+                    let error = await NCNetworkingE2EECreateFolder.shared.createFolderAndMarkE2EE(fileName: fileNameFolder, serverUrl: serverUrl, account: urlBase.account)
                     if error != .success {
                     if error != .success {
                         NCContentPresenter.shared.showError(error: error)
                         NCContentPresenter.shared.showError(error: error)
                     }
                     }

+ 1 - 1
iOSClient/NCGlobal.swift

@@ -127,7 +127,7 @@ class NCGlobal: NSObject {
     //
     //
     let e2eeMaxFileSize: UInt64                     = 500000000     // 500 MB
     let e2eeMaxFileSize: UInt64                     = 500000000     // 500 MB
     let e2eePassphraseTest                          = "more over television factory tendency independence international intellectual impress interest sentence pony"
     let e2eePassphraseTest                          = "more over television factory tendency independence international intellectual impress interest sentence pony"
-    @objc let e2eeVersion                           = ["1.1", "1.2", "2"]
+    @objc let e2eeReadVersions                      = ["1.1", "1.2"]
 
 
     // Video
     // Video
     //
     //

+ 5 - 7
iOSClient/Networking/E2EE/NCEndToEndMetadata.swift

@@ -37,7 +37,6 @@ class NCEndToEndMetadata: NSObject {
             let key: String
             let key: String
             let filename: String
             let filename: String
             let mimetype: String
             let mimetype: String
-            let version: Double
         }
         }
 
 
         struct Files: Codable {
         struct Files: Codable {
@@ -62,7 +61,6 @@ class NCEndToEndMetadata: NSObject {
             let key: String
             let key: String
             let filename: String
             let filename: String
             let mimetype: String
             let mimetype: String
-            let version: Double
         }
         }
 
 
         struct Files: Codable {
         struct Files: Codable {
@@ -111,7 +109,7 @@ class NCEndToEndMetadata: NSObject {
             // files
             // files
             //
             //
             if item.blob == "files" {
             if item.blob == "files" {
-                let encrypted = E2eeV12.Encrypted(key: item.key, filename: item.fileName, mimetype: item.mimeType, version: item.version)
+                let encrypted = E2eeV12.Encrypted(key: item.key, filename: item.fileName, mimetype: item.mimeType)
                 do {
                 do {
                     // Create "encrypted"
                     // Create "encrypted"
                     let json = try encoder.encode(encrypted)
                     let json = try encoder.encode(encrypted)
@@ -130,7 +128,7 @@ class NCEndToEndMetadata: NSObject {
             // filedrop
             // filedrop
             //
             //
             if item.blob == "filedrop" {
             if item.blob == "filedrop" {
-                let encrypted = E2eeV12.Encrypted(key: item.key, filename: item.fileName, mimetype: item.mimeType, version: item.version)
+                let encrypted = E2eeV12.Encrypted(key: item.key, filename: item.fileName, mimetype: item.mimeType)
                 do {
                 do {
                     // Create "encrypted"
                     // Create "encrypted"
                     let json = try encoder.encode(encrypted)
                     let json = try encoder.encode(encrypted)
@@ -170,6 +168,7 @@ class NCEndToEndMetadata: NSObject {
     func decoderMetadata(_ json: String, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> Bool {
     func decoderMetadata(_ json: String, serverUrl: String, account: String, urlBase: String, userId: String, ownerId: String?) -> Bool {
         guard let data = json.data(using: .utf8) else { return false }
         guard let data = json.data(using: .utf8) else { return false }
 
 
+        let versionE2EE = NCManageDatabase.shared.getCapabilitiesServerString(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEApiVersion) ?? ""
         data.printJson()
         data.printJson()
 
 
         let decoder = JSONDecoder()
         let decoder = JSONDecoder()
@@ -179,6 +178,8 @@ class NCEndToEndMetadata: NSObject {
         } else if (try? decoder.decode(E2eeV12.self, from: data)) != nil {
         } else if (try? decoder.decode(E2eeV12.self, from: data)) != nil {
             return decoderMetadataV12(json, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: ownerId)
             return decoderMetadataV12(json, serverUrl: serverUrl, account: account, urlBase: urlBase, userId: userId, ownerId: ownerId)
         } else {
         } else {
+            let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "Server E2EE version " + versionE2EE + ", not compatible")
+            NCContentPresenter.shared.showError(error: error)
             return false
             return false
         }
         }
     }
     }
@@ -250,7 +251,6 @@ class NCEndToEndMetadata: NSObject {
                                 object.metadataVersion = metadataVersion
                                 object.metadataVersion = metadataVersion
                                 object.mimeType = encrypted.mimetype
                                 object.mimeType = encrypted.mimetype
                                 object.serverUrl = serverUrl
                                 object.serverUrl = serverUrl
-                                object.version = encrypted.version
 
 
                                 // If exists remove records
                                 // 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 fileNamePath == %@", object.account, object.fileNamePath))
@@ -353,7 +353,6 @@ class NCEndToEndMetadata: NSObject {
                                 object.metadataVersion = metadataVersion
                                 object.metadataVersion = metadataVersion
                                 object.mimeType = encrypted.mimetype
                                 object.mimeType = encrypted.mimetype
                                 object.serverUrl = serverUrl
                                 object.serverUrl = serverUrl
-                                object.version = encrypted.version
 
 
                                 // If exists remove records
                                 // 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 fileNamePath == %@", object.account, object.fileNamePath))
@@ -424,7 +423,6 @@ class NCEndToEndMetadata: NSObject {
                                 object.metadataVersion = metadataVersion
                                 object.metadataVersion = metadataVersion
                                 object.mimeType = encrypted.mimetype
                                 object.mimeType = encrypted.mimetype
                                 object.serverUrl = serverUrl
                                 object.serverUrl = serverUrl
-                                object.version = encrypted.version
 
 
                                 // If exists remove records
                                 // 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 fileNamePath == %@", object.account, object.fileNamePath))

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

@@ -31,6 +31,17 @@ class NCNetworkingE2EE: NSObject {
         return instance
         return instance
     }()
     }()
 
 
+    func isE2EEVersionWriteable(account: String) -> NKError? {
+
+        let versionE2EE = NCManageDatabase.shared.getCapabilitiesServerString(account: account, elements: NCElementsJSON.shared.capabilitiesE2EEApiVersion) ?? ""
+
+        if NCGlobal.shared.e2eeReadVersions.last == versionE2EE {
+            return nil
+        }
+        
+        return NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_e2e_error_not_versionwriteable_")
+    }
+
     func generateRandomIdentifier() -> String {
     func generateRandomIdentifier() -> String {
 
 
         var UUID = NSUUID().uuidString
         var UUID = NSUUID().uuidString

+ 9 - 2
iOSClient/Networking/E2EE/NCNetworkingE2EECreateFolder.swift

@@ -32,7 +32,11 @@ class NCNetworkingE2EECreateFolder: NSObject {
         return instance
         return instance
     }()
     }()
 
 
-    func createFolderAndMarkE2EE(fileName: String, serverUrl: String) async -> NKError {
+    func createFolderAndMarkE2EE(fileName: String, serverUrl: String, account: String) async -> NKError {
+
+        if let error = NCNetworkingE2EE.shared.isE2EEVersionWriteable(account: account) {
+            return error
+        }
 
 
         let serverUrlFileName = serverUrl + "/" + fileName
         let serverUrlFileName = serverUrl + "/" + fileName
         var error = NKError()
         var error = NKError()
@@ -63,6 +67,10 @@ class NCNetworkingE2EECreateFolder: NSObject {
 
 
     func createFolder(fileName: String, serverUrl: String, account: String, urlBase: String, userId: String, withPush: Bool) async -> (NKError) {
     func createFolder(fileName: String, serverUrl: String, account: String, urlBase: String, userId: String, withPush: Bool) async -> (NKError) {
 
 
+        if let error = NCNetworkingE2EE.shared.isE2EEVersionWriteable(account: account) {
+            return error
+        }
+        
         var fileNameFolder = CCUtility.removeForbiddenCharactersServer(fileName)!
         var fileNameFolder = CCUtility.removeForbiddenCharactersServer(fileName)!
         var serverUrlFileName = ""
         var serverUrlFileName = ""
         var fileNameIdentifier = ""
         var fileNameIdentifier = ""
@@ -136,7 +144,6 @@ class NCNetworkingE2EECreateFolder: NSObject {
         }
         }
         object.mimeType = "httpd/unix-directory"
         object.mimeType = "httpd/unix-directory"
         object.serverUrl = serverUrl
         object.serverUrl = serverUrl
-        object.version = 1
         NCManageDatabase.shared.addE2eEncryption(object)
         NCManageDatabase.shared.addE2eEncryption(object)
 
 
         // Rebuild metadata for send it
         // Rebuild metadata for send it

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

@@ -34,6 +34,10 @@ class NCNetworkingE2EEDelete: NSObject {
 
 
     func delete(metadata: tableMetadata) async -> (NKError) {
     func delete(metadata: tableMetadata) async -> (NKError) {
 
 
+        if let error = NCNetworkingE2EE.shared.isE2EEVersionWriteable(account: metadata.account) {
+            return error
+        }
+
         var error = NKError()
         var error = NKError()
 
 
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {

+ 4 - 0
iOSClient/Networking/E2EE/NCNetworkingE2EERename.swift

@@ -34,6 +34,10 @@ class NCNetworkingE2EERename: NSObject {
 
 
     func rename(metadata: tableMetadata, fileNameNew: String) async -> (NKError) {
     func rename(metadata: tableMetadata, fileNameNew: String) async -> (NKError) {
 
 
+        if let error = NCNetworkingE2EE.shared.isE2EEVersionWriteable(account: metadata.account) {
+            return error
+        }
+        
         var error = NKError()
         var error = NKError()
 
 
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {
         func sendE2EMetadata(e2eToken: String, fileId: String) async -> (NKError) {

+ 6 - 0
iOSClient/Networking/E2EE/NCNetworkingE2EEUpload.swift

@@ -44,6 +44,12 @@ class NCNetworkingE2EEUpload: NSObject {
 
 
     func upload(metadata: tableMetadata, uploadE2EEDelegate: uploadE2EEDelegate? = nil) async -> (NKError) {
     func upload(metadata: tableMetadata, uploadE2EEDelegate: uploadE2EEDelegate? = nil) async -> (NKError) {
 
 
+        if let error = NCNetworkingE2EE.shared.isE2EEVersionWriteable(account: metadata.account) {
+            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+            NCContentPresenter.shared.showError(error: error)
+            return error
+        }
+
         var metadata = tableMetadata.init(value: metadata)
         var metadata = tableMetadata.init(value: metadata)
         let ocIdTemp = metadata.ocId
         let ocIdTemp = metadata.ocId
         let errorCreateEncrypted = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_e2e_error_create_encrypted_")
         let errorCreateEncrypted = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_e2e_error_create_encrypted_")

+ 1 - 1
iOSClient/Settings/NCSettings.m

@@ -120,7 +120,7 @@
     BOOL isE2EEEnabled = [[NCManageDatabase shared] getCapabilitiesServerBoolWithAccount:appDelegate.account elements:NCElementsJSON.shared.capabilitiesE2EEEnabled exists:false];
     BOOL isE2EEEnabled = [[NCManageDatabase shared] getCapabilitiesServerBoolWithAccount:appDelegate.account elements:NCElementsJSON.shared.capabilitiesE2EEEnabled exists:false];
     NSString *versionE2EE = [[NCManageDatabase shared] getCapabilitiesServerStringWithAccount:appDelegate.account elements:NCElementsJSON.shared.capabilitiesE2EEApiVersion];
     NSString *versionE2EE = [[NCManageDatabase shared] getCapabilitiesServerStringWithAccount:appDelegate.account elements:NCElementsJSON.shared.capabilitiesE2EEApiVersion];
 
 
-    if (isE2EEEnabled == YES && [NCGlobal.shared.e2eeVersion containsObject:versionE2EE]) {
+    if (isE2EEEnabled == YES && [NCGlobal.shared.e2eeReadVersions containsObject:versionE2EE]) {
 
 
         section = [XLFormSectionDescriptor formSectionWithTitle:NSLocalizedString(@"_e2e_settings_title_", nil)];
         section = [XLFormSectionDescriptor formSectionWithTitle:NSLocalizedString(@"_e2e_settings_title_", nil)];
         [form addFormSection:section];
         [form addFormSection:section];

+ 1 - 0
iOSClient/Supporting Files/en.lproj/Localizable.strings

@@ -721,6 +721,7 @@
 "_e2e_error_mark_folder_"           = "Encrypt folder";
 "_e2e_error_mark_folder_"           = "Encrypt folder";
 "_e2e_error_directory_not_empty_"   = "The directory is not empty";
 "_e2e_error_directory_not_empty_"   = "The directory is not empty";
 "_e2e_error_not_move_"              = "It is not possible move files to encrypted directory";
 "_e2e_error_not_move_"              = "It is not possible move files to encrypted directory";
+"_e2e_error_not_versionwriteable_"  = "The server e2ee version is not compatible with this client";
 "_scans_document_"                  = "Scan document";
 "_scans_document_"                  = "Scan document";
 "_scanned_images_"                  = "Scanned images";
 "_scanned_images_"                  = "Scanned images";
 "_scan_document_pdf_page_"          = "Page";
 "_scan_document_pdf_page_"          = "Page";

+ 1 - 1
iOSClient/Utility/CCUtility.m

@@ -372,7 +372,7 @@
     NSString *privateKey = [self getEndToEndPrivateKey:account];
     NSString *privateKey = [self getEndToEndPrivateKey:account];
     NSString *passphrase = [self getEndToEndPassphrase:account];
     NSString *passphrase = [self getEndToEndPassphrase:account];
             
             
-    if (passphrase.length > 0 && privateKey.length > 0 && certificate.length > 0 && publicKey.length > 0 && isE2EEEnabled && [NCGlobal.shared.e2eeVersion containsObject:versionE2EE]) {
+    if (passphrase.length > 0 && privateKey.length > 0 && certificate.length > 0 && publicKey.length > 0 && isE2EEEnabled && [NCGlobal.shared.e2eeReadVersions containsObject:versionE2EE]) {
         return YES;
         return YES;
     } else {
     } else {
         return NO;
         return NO;