Browse Source

clear code json metadata

Marino Faggiana 7 years ago
parent
commit
5482404c1e
1 changed files with 43 additions and 30 deletions
  1. 43 30
      iOSClient/Security/NCEndToEndMetadata.swift

+ 43 - 30
iOSClient/Security/NCEndToEndMetadata.swift

@@ -27,18 +27,18 @@ class NCEndToEndMetadata : NSObject  {
 
     struct e2eMetadata: Codable {
         
-        struct metadataKey: Codable {
+        struct metadataKeyCodable: Codable {
             
             let metadataKeys: [String: String]
             let version: Int
         }
         
-        struct sharingKey: Codable {
+        struct sharingCodable: Codable {
             
             let recipient: [String: String]
         }
         
-        struct encrypted: Codable {
+        struct encryptedFileAttributes: Codable {
             
             let key: String
             let filename: String
@@ -46,17 +46,17 @@ class NCEndToEndMetadata : NSObject  {
             let version: Int
         }
         
-        struct filesKey: Codable {
+        struct filesCodable: Codable {
             
             let initializationVector: String
             let authenticationTag: String
             let metadataKey: Int
-            let encrypted: String
+            let encrypted: String // encryptedFile
         }
         
-        let files: [String: filesKey]
-        let metadata: metadataKey
-        let sharing: sharingKey?
+        let files: [String: filesCodable]
+        let metadata: metadataKeyCodable
+        let sharing: sharingCodable?
     }
 
     @objc static let sharedInstance: NCEndToEndMetadata = {
@@ -71,26 +71,41 @@ class NCEndToEndMetadata : NSObject  {
     @objc func encoderMetadata(_ recordsE2eEncryption: [tableE2eEncryption], publicKey: String) -> String? {
         
         let jsonEncoder = JSONEncoder.init()
-        var files = [String: e2eMetadata.filesKey]()
+        var files = [String: e2eMetadata.filesCodable]()
         var version = 1
         
         // Create "files"
         for recordE2eEncryption in recordsE2eEncryption {
             
-            let plainEncrypted = recordE2eEncryption.key+"|"+recordE2eEncryption.fileName+"|"+recordE2eEncryption.mimeType+"|"+",\(recordE2eEncryption.version)"
-            guard let encryptedData = NCEndToEndEncryption.sharedManager().encryptAsymmetricString(plainEncrypted, publicKey: publicKey) else {
-                print("Serious internal error in encoding metadata")
+            let encrypted = e2eMetadata.encryptedFileAttributes(key: recordE2eEncryption.key, filename: recordE2eEncryption.fileName, mimetype: recordE2eEncryption.mimeType, version: recordE2eEncryption.version)
+            
+            do {
+                
+                // Create "encrypted"
+                let encryptedJsonData = try jsonEncoder.encode(encrypted)
+                let encryptedJsonString = String(data: encryptedJsonData, encoding: .utf8)
+                
+                guard let encryptedEncryptionData = NCEndToEndEncryption.sharedManager().encryptAsymmetricString(encryptedJsonString, publicKey: publicKey) else {
+                    print("Serious internal error in encoding metadata")
+                    return nil
+                }
+                
+                let encryptedEncryptionBase64 = encryptedEncryptionData.base64EncodedString()
+                
+                let e2eMetadataFilesKey = e2eMetadata.filesCodable(initializationVector: recordE2eEncryption.initializationVector, authenticationTag: recordE2eEncryption.authenticationTag, metadataKey: 0, encrypted: encryptedEncryptionBase64)
+                
+                files.updateValue(e2eMetadataFilesKey, forKey: recordE2eEncryption.fileNameIdentifier)
+                
+            } catch let error {
+                print("Serious internal error in encoding metadata ("+error.localizedDescription+")")
                 return nil
             }
             
-            let e2eMetadataFilesKey = e2eMetadata.filesKey(initializationVector: recordE2eEncryption.initializationVector, authenticationTag: recordE2eEncryption.authenticationTag, metadataKey: 0, encrypted: String(data: encryptedData, encoding: .utf8)!)
-            files.updateValue(e2eMetadataFilesKey, forKey: recordE2eEncryption.fileNameIdentifier)
-            
             version = recordE2eEncryption.version
         }
         
-        // Create "metadata"
-        let e2eMetadataKey = e2eMetadata.metadataKey(metadataKeys: ["0":"dcccecfvdfvfvsfdvefvefvefvefvefv"], version: version)
+        // Create "metadataKey" with encrypted publicKey
+        let e2eMetadataKey = e2eMetadata.metadataKeyCodable(metadataKeys: ["0":"dcccecfvdfvfvsfdvefvefvefvefvefv"], version: version)
         
         // Create final Json e2emetadata
         let e2emetadata = e2eMetadata(files: files, metadata: e2eMetadataKey, sharing: nil)
@@ -144,10 +159,10 @@ class NCEndToEndMetadata : NSObject  {
             for file in files {
                 
                 let fileNameIdentifier = file.key
-                let elementOfFile = file.value as e2eMetadata.filesKey
+                let filesCodable = file.value as e2eMetadata.filesCodable
                 
-                let encrypted = elementOfFile.encrypted
-                let key = decodeMetadataKeys["\(elementOfFile.metadataKey)"]
+                let encrypted = filesCodable.encrypted
+                let key = decodeMetadataKeys["\(filesCodable.metadataKey)"]
                 
                 guard let decyptedMetadata = NCEndToEndEncryption.sharedManager().decryptMetadata(encrypted, key: key) else {
                     return false
@@ -155,22 +170,20 @@ class NCEndToEndMetadata : NSObject  {
                 
                 do {
                     
-                    let decode = try jsonDecoder.decode(e2eMetadata.encrypted.self, from: decyptedMetadata.data(using: .utf8)!)
+                    let encryptedFileAttributes = try jsonDecoder.decode(e2eMetadata.encryptedFileAttributes.self, from: decyptedMetadata.data(using: .utf8)!)
                     
                     let object = tableE2eEncryption()
                     
                     object.account = account
-                    object.authenticationTag = elementOfFile.authenticationTag
-                    object.fileName = decode.filename
+                    object.authenticationTag = filesCodable.authenticationTag
+                    object.fileName = encryptedFileAttributes.filename
                     object.fileNameIdentifier = fileNameIdentifier
-                    object.fileNamePath = CCUtility.returnFileNamePath(fromFileName: decode.filename, serverUrl: serverUrl, activeUrl: url)
-                    object.key = decode.key
-                    object.initializationVector = elementOfFile.initializationVector
-                    object.mimeType = decode.mimetype
+                    object.fileNamePath = CCUtility.returnFileNamePath(fromFileName: encryptedFileAttributes.filename, serverUrl: serverUrl, activeUrl: url)
+                    object.key = encryptedFileAttributes.key
+                    object.initializationVector = filesCodable.initializationVector
+                    object.mimeType = encryptedFileAttributes.mimetype
                     object.serverUrl = serverUrl
-                    object.version = decode.version
-                    
-                    // [CCUtility returnFileNamePathFromFileName:fileName serverUrl:serverUrl activeUrl:_activeUrl];
+                    object.version = encryptedFileAttributes.version
                     
                     // Write file parameter for decrypted on DB
                     if NCManageDatabase.sharedInstance.addE2eEncryption(object) == false {