Parcourir la source

Merge pull request #2328 from nextcloud/secureFileDrop

Secure file drop
Marino Faggiana il y a 2 ans
Parent
commit
d5f9b9a05f

+ 1 - 0
.swiftlint.yml

@@ -38,6 +38,7 @@ disabled_rules:
   - multiple_closures_with_trailing_closure
   - for_where
   - cyclomatic_complexity
+  - nesting
   
 excluded:
   - Carthage

+ 5 - 5
Nextcloud.xcodeproj/project.pbxproj

@@ -1982,10 +1982,13 @@
 		F7C30DF8291BCBF00017149B /* E2EE */ = {
 			isa = PBXGroup;
 			children = (
+				F70CAE381F8CF31A008125FD /* NCEndToEndEncryption.h */,
+				F70CAE391F8CF31A008125FD /* NCEndToEndEncryption.m */,
+				F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */,
 				F785EE9C246196DF00B3F945 /* NCNetworkingE2EE.swift */,
-				F7C30DFF291BD2610017149B /* NCNetworkingE2EERename.swift */,
-				F7C30DFC291BD0B80017149B /* NCNetworkingE2EEDelete.swift */,
 				F7C30DF9291BCF790017149B /* NCNetworkingE2EECreateFolder.swift */,
+				F7C30DFC291BD0B80017149B /* NCNetworkingE2EEDelete.swift */,
+				F7C30DFF291BD2610017149B /* NCNetworkingE2EERename.swift */,
 				F7C30DF5291BC0CA0017149B /* NCNetworkingE2EEUpload.swift */,
 			);
 			path = E2EE;
@@ -2335,9 +2338,6 @@
 		F7FE125B1BAC03FB0041924B /* Security */ = {
 			isa = PBXGroup;
 			children = (
-				F70CAE381F8CF31A008125FD /* NCEndToEndEncryption.h */,
-				F70CAE391F8CF31A008125FD /* NCEndToEndEncryption.m */,
-				F7F878AD1FB9E3B900599E4F /* NCEndToEndMetadata.swift */,
 				F72D1006210B6882009C96B7 /* NCPushNotificationEncryption.h */,
 				F72D1005210B6882009C96B7 /* NCPushNotificationEncryption.m */,
 				F7BC287D26663F6C004D46C5 /* NCViewCertificateDetails.storyboard */,

+ 10 - 13
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -112,7 +112,7 @@ extension tableMetadata {
     var fileNoExtension: String { (fileNameView as NSString).deletingPathExtension }
 
     var isRenameable: Bool {
-        if lock || isViewableOnly {
+        if lock {
             return false
         }
         if !isDirectoryE2EE && e2eEncrypted {
@@ -122,13 +122,10 @@ extension tableMetadata {
     }
     
     var isPrintable: Bool {
-        if classFile == NKCommon.typeClassFile.image.rawValue {
-            return true
-        }
-        if isViewableOnly {
+        if isDocumentViewableOnly {
             return false
         }
-        if ["application/pdf", "com.adobe.pdf"].contains(contentType) || contentType.hasPrefix("text/") {
+        if ["application/pdf", "com.adobe.pdf"].contains(contentType) || contentType.hasPrefix("text/") || classFile == NKCommon.typeClassFile.image.rawValue {
             return true
         }
         return false
@@ -138,7 +135,7 @@ extension tableMetadata {
         return (classFile == NKCommon.typeClassFile.image.rawValue && contentType != "image/svg+xml") || classFile == NKCommon.typeClassFile.video.rawValue
     }
 
-    var isViewableOnly: Bool {
+    var isDocumentViewableOnly: Bool {
         sharePermissionsCollaborationServices == NCGlobal.shared.permissionReadShare && classFile == NKCommon.typeClassFile.document.rawValue
     }
 
@@ -147,15 +144,15 @@ extension tableMetadata {
     }
 
     var isCopyableInPasteboard: Bool {
-        !isViewableOnly && !directory
+        !isDocumentViewableOnly && !directory
     }
 
     var isCopyableMovable: Bool {
-        !isViewableOnly && !isDirectoryE2EE && !e2eEncrypted
+        !isDocumentViewableOnly && !isDirectoryE2EE && !e2eEncrypted
     }
 
     var isModifiableWithQuickLook: Bool {
-        if directory || isViewableOnly || isDirectoryE2EE {
+        if directory || isDocumentViewableOnly || isDirectoryE2EE {
             return false
         }
         return contentType == "com.adobe.pdf" || contentType == "application/pdf" || classFile == NKCommon.typeClassFile.image.rawValue
@@ -169,11 +166,11 @@ extension tableMetadata {
     }
 
     var isSettableOnOffline: Bool {
-        return session.isEmpty && !isViewableOnly
+        return session.isEmpty && !isDocumentViewableOnly
     }
 
     var canOpenIn: Bool {
-        return session.isEmpty && !isViewableOnly && !directory && !NCBrandOptions.shared.disable_openin_file
+        return session.isEmpty && !isDocumentViewableOnly && !directory && !NCBrandOptions.shared.disable_openin_file
     }
 
     var isDirectoySettableE2EE: Bool {
@@ -185,7 +182,7 @@ extension tableMetadata {
     }
 
     var canOpenExternalEditor: Bool {
-        if isViewableOnly {
+        if isDocumentViewableOnly {
             return false
         }
 

+ 2 - 2
iOSClient/Menu/NCContextMenu.swift

@@ -189,7 +189,7 @@ class NCContextMenu: NSObject {
 
             if metadata.lock {
                 menu.append(favorite)
-                if metadata.isViewableOnly {
+                if metadata.isDocumentViewableOnly {
                     //
                 } else {
                     menu.append(openIn)
@@ -198,7 +198,7 @@ class NCContextMenu: NSObject {
                 }
             } else {
                 menu.append(favorite)
-                if metadata.isViewableOnly {
+                if metadata.isDocumentViewableOnly {
                     if viewController is NCMedia {
                         menu.append(viewInFolder)
                     }

+ 0 - 0
iOSClient/Security/NCEndToEndEncryption.h → iOSClient/Networking/E2EE/NCEndToEndEncryption.h


+ 0 - 0
iOSClient/Security/NCEndToEndEncryption.m → iOSClient/Networking/E2EE/NCEndToEndEncryption.m


+ 20 - 21
iOSClient/Security/NCEndToEndMetadata.swift → iOSClient/Networking/E2EE/NCEndToEndMetadata.swift

@@ -26,20 +26,19 @@ import NextcloudKit
 
 class NCEndToEndMetadata: NSObject {
 
-    struct e2eMetadata: Codable {
-
-        struct metadataKeyCodable: Codable {
+    struct E2eMetadata: Codable {
 
+        struct MetadataKeyCodable: Codable {
             let metadataKeys: [String: String]
             let version: Int
         }
 
-        struct sharingCodable: Codable {
+        struct SharingCodable: Codable {
 
             let recipient: [String: String]
         }
 
-        struct encryptedFileAttributes: Codable {
+        struct EncryptedFileAttributes: Codable {
 
             let key: String
             let filename: String
@@ -47,7 +46,7 @@ class NCEndToEndMetadata: NSObject {
             let version: Int
         }
 
-        struct filesCodable: Codable {
+        struct FilesCodable: Codable {
 
             let initializationVector: String
             let authenticationTag: String?
@@ -55,9 +54,9 @@ class NCEndToEndMetadata: NSObject {
             let encrypted: String               // encryptedFileAttributes
         }
 
-        let files: [String: filesCodable]
-        let metadata: metadataKeyCodable
-        let sharing: sharingCodable?
+        let files: [String: FilesCodable]
+        let metadata: MetadataKeyCodable
+        let sharing: SharingCodable?
     }
 
     @objc static let shared: NCEndToEndMetadata = {
@@ -72,7 +71,7 @@ class NCEndToEndMetadata: NSObject {
     @objc func encoderMetadata(_ recordsE2eEncryption: [tableE2eEncryption], privateKey: String, serverUrl: String) -> String? {
 
         let jsonEncoder = JSONEncoder()
-        var files: [String: e2eMetadata.filesCodable] = [:]
+        var files: [String: E2eMetadata.FilesCodable] = [:]
         var version = 1
         var metadataKeysDictionary: [String: String] = [:]
 
@@ -93,7 +92,7 @@ class NCEndToEndMetadata: NSObject {
 
             // *** File ***
 
-            let encrypted = e2eMetadata.encryptedFileAttributes(key: recordE2eEncryption.key, filename: recordE2eEncryption.fileName, mimetype: recordE2eEncryption.mimeType, version: recordE2eEncryption.version)
+            let encrypted = E2eMetadata.EncryptedFileAttributes(key: recordE2eEncryption.key, filename: recordE2eEncryption.fileName, mimetype: recordE2eEncryption.mimeType, version: recordE2eEncryption.version)
 
             do {
 
@@ -106,12 +105,12 @@ class NCEndToEndMetadata: NSObject {
                     return nil
                 }
 
-                let e2eMetadataFilesKey = e2eMetadata.filesCodable(initializationVector: recordE2eEncryption.initializationVector, authenticationTag: recordE2eEncryption.authenticationTag, metadataKey: 0, encrypted: encryptedEncryptedJson)
+                let e2eMetadataFilesKey = E2eMetadata.FilesCodable(initializationVector: recordE2eEncryption.initializationVector, authenticationTag: recordE2eEncryption.authenticationTag, metadataKey: 0, encrypted: encryptedEncryptedJson)
 
                 files.updateValue(e2eMetadataFilesKey, forKey: recordE2eEncryption.fileNameIdentifier)
 
             } catch let error {
-                print("Serious internal error in encoding metadata ("+error.localizedDescription+")")
+                print("Serious internal error in encoding metadata (" + error.localizedDescription + ")")
                 return nil
             }
 
@@ -120,10 +119,10 @@ class NCEndToEndMetadata: NSObject {
 
         // Create Json metadataKeys
         // e2eMetadataKey = e2eMetadata.metadataKeyCodable(metadataKeys: ["0":metadataKeyEncryptedBase64], version: version)
-        let e2eMetadataKey = e2eMetadata.metadataKeyCodable(metadataKeys: metadataKeysDictionary, version: version)
+        let e2eMetadataKey = E2eMetadata.MetadataKeyCodable(metadataKeys: metadataKeysDictionary, version: version)
 
         // Create final Json e2emetadata
-        let e2emetadata = e2eMetadata(files: files, metadata: e2eMetadataKey, sharing: nil)
+        let e2emetadata = E2eMetadata(files: files, metadata: e2eMetadataKey, sharing: nil)
 
         do {
 
@@ -134,7 +133,7 @@ class NCEndToEndMetadata: NSObject {
             return jsonString
 
         } catch let error {
-            print("Serious internal error in encoding metadata ("+error.localizedDescription+")")
+            print("Serious internal error in encoding metadata (" + error.localizedDescription + ")")
             return nil
         }
     }
@@ -150,7 +149,7 @@ class NCEndToEndMetadata: NSObject {
 
             // *** metadataKey ***
 
-            let decode = try jsonDecoder.decode(e2eMetadata.self, from: data!)
+            let decode = try jsonDecoder.decode(E2eMetadata.self, from: data!)
 
             let files = decode.files
             let metadata = decode.metadata
@@ -179,7 +178,7 @@ class NCEndToEndMetadata: NSObject {
             for file in files {
 
                 let fileNameIdentifier = file.key
-                let filesCodable = file.value as e2eMetadata.filesCodable
+                let filesCodable = file.value as E2eMetadata.FilesCodable
 
                 let encrypted = filesCodable.encrypted
                 let metadataKey = metadataKeysDictionary["\(filesCodable.metadataKey)"]
@@ -189,7 +188,7 @@ class NCEndToEndMetadata: NSObject {
                 }
 
                 do {
-                    let encryptedFileAttributes = try jsonDecoder.decode(e2eMetadata.encryptedFileAttributes.self, from: encryptedFileAttributesJson.data(using: .utf8)!)
+                    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)
 
@@ -228,13 +227,13 @@ class NCEndToEndMetadata: NSObject {
                     }
 
                 } catch let error {
-                    print("Serious internal error in decoding metadata ("+error.localizedDescription+")")
+                    print("Serious internal error in decoding metadata (" + error.localizedDescription + ")")
                     return false
                 }
             }
 
         } catch let error {
-            print("Serious internal error in decoding metadata ("+error.localizedDescription+")")
+            print("Serious internal error in decoding metadata (" + error.localizedDescription + ")")
             return false
         }