Explorar o código

Merge branch 'develop'

Marino Faggiana %!s(int64=7) %!d(string=hai) anos
pai
achega
ef145a9af8
Modificáronse 67 ficheiros con 604 adicións e 501 borrados
  1. 0 2
      Nextcloud.xcodeproj/project.pbxproj
  2. 1 12
      iOSClient/AppDelegate.m
  3. 2 2
      iOSClient/AutoUpload/NCAutoUpload.m
  4. 0 3
      iOSClient/Brand/CustomSwift.h
  5. 9 7
      iOSClient/Brand/NCBridgeSwift.h
  6. 2 2
      iOSClient/Brand/Picker.plist
  7. 2 2
      iOSClient/Brand/PickerFileProvider.plist
  8. 2 2
      iOSClient/Brand/Share.plist
  9. 2 2
      iOSClient/Brand/iOSClient.plist
  10. 5 0
      iOSClient/CCGlobal.h
  11. 3 0
      iOSClient/CCGlobal.m
  12. 13 1
      iOSClient/Database/NCDatabase.swift
  13. 104 80
      iOSClient/Database/NCManageDatabase.swift
  14. 6 0
      iOSClient/Library/SwiftWebVC/SwiftModalWebVC.swift
  15. 8 1
      iOSClient/Library/SwiftWebVC/SwiftWebVC.swift
  16. 89 67
      iOSClient/Login/CCLogin.m
  17. 4 0
      iOSClient/Login/CCLoginWeb.swift
  18. 24 16
      iOSClient/Main/CCMain.m
  19. 4 0
      iOSClient/Main/CCMore.swift
  20. 15 2
      iOSClient/Main/CCSection.m
  21. 5 0
      iOSClient/Networking/CCNetworking.h
  22. 50 3
      iOSClient/Networking/CCNetworking.m
  23. 200 217
      iOSClient/Networking/NCNetworkingSync.m
  24. 31 41
      iOSClient/Networking/OCNetworking.m
  25. 1 1
      iOSClient/Settings/CCSettings.m
  26. BIN=BIN
      iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings
  27. BIN=BIN
      iOSClient/Supporting Files/de.lproj/Localizable.strings
  28. BIN=BIN
      iOSClient/Supporting Files/en-GB.lproj/Localizable.strings
  29. 1 0
      iOSClient/Supporting Files/en.lproj/Localizable.strings
  30. BIN=BIN
      iOSClient/Supporting Files/es-419.lproj/Localizable.strings
  31. BIN=BIN
      iOSClient/Supporting Files/es-CL.lproj/Localizable.strings
  32. BIN=BIN
      iOSClient/Supporting Files/es-CO.lproj/Localizable.strings
  33. BIN=BIN
      iOSClient/Supporting Files/es-CR.lproj/Localizable.strings
  34. BIN=BIN
      iOSClient/Supporting Files/es-DO.lproj/Localizable.strings
  35. BIN=BIN
      iOSClient/Supporting Files/es-EC.lproj/Localizable.strings
  36. BIN=BIN
      iOSClient/Supporting Files/es-GT.lproj/Localizable.strings
  37. BIN=BIN
      iOSClient/Supporting Files/es-HN.lproj/Localizable.strings
  38. BIN=BIN
      iOSClient/Supporting Files/es-MX.lproj/Localizable.strings
  39. BIN=BIN
      iOSClient/Supporting Files/es-NI.lproj/Localizable.strings
  40. BIN=BIN
      iOSClient/Supporting Files/es-PA.lproj/Localizable.strings
  41. BIN=BIN
      iOSClient/Supporting Files/es-PE.lproj/Localizable.strings
  42. BIN=BIN
      iOSClient/Supporting Files/es-PR.lproj/Localizable.strings
  43. BIN=BIN
      iOSClient/Supporting Files/es-PY.lproj/Localizable.strings
  44. BIN=BIN
      iOSClient/Supporting Files/es-SV.lproj/Localizable.strings
  45. BIN=BIN
      iOSClient/Supporting Files/es-UY.lproj/Localizable.strings
  46. BIN=BIN
      iOSClient/Supporting Files/es.lproj/Localizable.strings
  47. BIN=BIN
      iOSClient/Supporting Files/fr.lproj/Localizable.strings
  48. BIN=BIN
      iOSClient/Supporting Files/hu.lproj/Localizable.strings
  49. BIN=BIN
      iOSClient/Supporting Files/is.lproj/Localizable.strings
  50. BIN=BIN
      iOSClient/Supporting Files/it.lproj/Localizable.strings
  51. BIN=BIN
      iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings
  52. BIN=BIN
      iOSClient/Supporting Files/ko.lproj/Localizable.strings
  53. BIN=BIN
      iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings
  54. BIN=BIN
      iOSClient/Supporting Files/nl.lproj/Localizable.strings
  55. BIN=BIN
      iOSClient/Supporting Files/pl.lproj/Localizable.strings
  56. BIN=BIN
      iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings
  57. BIN=BIN
      iOSClient/Supporting Files/pt_PT.lproj/Localizable.strings
  58. BIN=BIN
      iOSClient/Supporting Files/ru.lproj/Localizable.strings
  59. BIN=BIN
      iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings
  60. BIN=BIN
      iOSClient/Supporting Files/sr.lproj/Localizable.strings
  61. BIN=BIN
      iOSClient/Supporting Files/sv.lproj/Localizable.strings
  62. BIN=BIN
      iOSClient/Supporting Files/tr.lproj/Localizable.strings
  63. BIN=BIN
      iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings
  64. BIN=BIN
      iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings
  65. 2 10
      iOSClient/Synchronize/CCSynchronize.m
  66. 10 27
      iOSClient/Transfers/CCTransfers.m
  67. 9 1
      iOSClient/Utility/CCUtility.m

+ 0 - 2
Nextcloud.xcodeproj/project.pbxproj

@@ -991,7 +991,6 @@
 		F7540F2A1D5B238600C3FFA8 /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = "<group>"; };
 		F7540F2B1D5B238600C3FFA8 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = "<group>"; };
 		F7540F2C1D5B238600C3FFA8 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = "<group>"; };
-		F755D43C1FC44E7B00801AE4 /* CustomSwift.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSwift.h; sourceTree = "<group>"; };
 		F75797AD1E81356C00187A1B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/CTAssetsPicker.strings; sourceTree = "<group>"; };
 		F75AC2421F1F62450073EC19 /* NCManageAutoUploadFileName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCManageAutoUploadFileName.swift; sourceTree = "<group>"; };
 		F75ADF441DC75FFE008A7347 /* CCLogin.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = CCLogin.storyboard; sourceTree = "<group>"; };
@@ -2718,7 +2717,6 @@
 				F710E80C1EF95C9C00DC2427 /* Intro */,
 				F700222B1EC479840080073F /* Custom.xcassets */,
 				F73CB5771ED46807005F2A5A /* NCBridgeSwift.h */,
-				F755D43C1FC44E7B00801AE4 /* CustomSwift.h */,
 				F76B3CCD1EAE01BD00921AC9 /* NCBrand.swift */,
 				F76F23331ED4603700C40023 /* LaunchScreen.xib */,
 			);

+ 1 - 12
iOSClient/AppDelegate.m

@@ -836,19 +836,8 @@
     
     NSInteger total = 0;
     
-    NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count];
-    
-    for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUpload]) {
-        if (record.e2eEncrypted == false)
-            total++;
-    }
-    for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUploadWWan]) {
-        if (record.e2eEncrypted == false)
-            total++;
-    }
-    
     // Total
-    total = total + queueDownload + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:nil] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:nil];
+    total = [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:NO] + [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:YES] + [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:NO] + [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:YES];
     
     [UIApplication sharedApplication].applicationIconBadgeNumber = total;
     

+ 2 - 2
iOSClient/AutoUpload/NCAutoUpload.m

@@ -485,7 +485,7 @@
         
         tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", appDelegate.activeAccount, folderPhotos]];
         if (!tableDirectory)
-            (void)[[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:folderPhotos fileID:fileID permissions:nil encrypted:encrypted];
+            (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:encrypted favorite:false fileID:fileID permissions:nil serverUrl:folderPhotos];
         
     } else {
         
@@ -509,7 +509,7 @@
             
             if ( error == nil) {
                 
-                (void)[[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:folderPathName fileID:fileID permissions:nil encrypted:encrypted];
+                (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:encrypted favorite:false fileID:fileID permissions:nil serverUrl:folderPathName];
                 
             } else {
                 

+ 0 - 3
iOSClient/Brand/CustomSwift.h

@@ -1,3 +0,0 @@
-
-#import "Custom-Swift.h"
-

+ 9 - 7
iOSClient/Brand/NCBridgeSwift.h

@@ -21,14 +21,16 @@
 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //
 
-// Nextcloud App
+//
+// App bridge swift
+//
+// change 
+// from   : Nextcloud-Swift.h
+// to     : brand-Swift.h
+//
 #if !defined(EXTENSION)
 
-    #if defined(CUSTOM_BUILD)
-        #import "CustomSwift.h"
-    #else
-        #import "Nextcloud-Swift.h"
-    #endif
+    #import "Nextcloud-Swift.h"
 
 #endif
 
@@ -49,6 +51,6 @@
 // Nextcloud Extension Document Provider Picker File Provider
 #if defined(EXTENSION_PICKER_FILE_PROVIDER)
 
-#import "PickerFileProvider-Swift.h"
+    #import "PickerFileProvider-Swift.h"
 
 #endif

+ 2 - 2
iOSClient/Brand/Picker.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.3</string>
+	<string>2.20.4</string>
 	<key>CFBundleVersion</key>
-	<string>00001</string>
+	<string>00005</string>
 	<key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>

+ 2 - 2
iOSClient/Brand/PickerFileProvider.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.3</string>
+	<string>2.20.4</string>
 	<key>CFBundleVersion</key>
-	<string>00001</string>
+	<string>00005</string>
 	<key>NSExtension</key>
 	<dict>
 		<key>NSExtensionFileProviderDocumentGroup</key>

+ 2 - 2
iOSClient/Brand/Share.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.3</string>
+	<string>2.20.4</string>
 	<key>CFBundleVersion</key>
-	<string>00001</string>
+	<string>00005</string>
 	<key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>

+ 2 - 2
iOSClient/Brand/iOSClient.plist

@@ -46,7 +46,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.3</string>
+	<string>2.20.4</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleURLTypes</key>
@@ -69,7 +69,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>00001</string>
+	<string>00005</string>
 	<key>Fabric</key>
 	<dict>
 		<key>APIKey</key>

+ 5 - 0
iOSClient/CCGlobal.h

@@ -27,6 +27,8 @@ extern NSString *const appApplicationSupport;
 extern NSString *const appDatabaseNextcloud;
 extern NSString *const appCertificates;
 
+extern NSString *const serverStatus;
+
 extern NSString *const webDAV;
 extern NSString *const dav;
 
@@ -265,6 +267,9 @@ extern NSString *const flowEndpoint;
 // E2EE
 #define k_max_filesize_E2E                              524288000   // 500 MB
 
+// Flow Version
+#define k_flow_version_available                        12
+
 // -----------------------------------------------------------------------------------------------------------
 // -----------------------------------------------------------------------------------------------------------
 

+ 3 - 0
iOSClient/CCGlobal.m

@@ -28,6 +28,9 @@ NSString *const appApplicationSupport = @"Library/Application Support";
 NSString *const appDatabaseNextcloud = @"Library/Application Support/Nextcloud";
 NSString *const appCertificates = @"Library/Application Support/Certificates";
 
+// Server Status
+NSString *const serverStatus = @"/status.php";
+
 // webDAV & DAV
 NSString *const webDAV = @"/remote.php/webdav";
 NSString *const dav = @"/remote.php/dav";

+ 13 - 1
iOSClient/Database/NCDatabase.swift

@@ -108,7 +108,6 @@ class tableDirectory: Object {
     @objc dynamic var favorite: Bool = false
     @objc dynamic var fileID = ""
     @objc dynamic var lock: Bool = false
-    @objc dynamic var e2eTokenLock = ""
     @objc dynamic var permissions = ""
     @objc dynamic var serverUrl = ""
     
@@ -137,6 +136,19 @@ class tableE2eEncryption: Object {
     }
 }
 
+class tableE2eEncryptionLock: Object {
+
+    @objc dynamic var account = ""
+    @objc dynamic var date = NSDate()
+    @objc dynamic var fileID = ""
+    @objc dynamic var serverUrl = ""
+    @objc dynamic var token = ""
+    
+    override static func primaryKey() -> String {
+        return "fileID"
+    }
+}
+
 class tableExternalSites: Object {
     
     @objc dynamic var account = ""

+ 104 - 80
iOSClient/Database/NCManageDatabase.swift

@@ -57,7 +57,7 @@ class NCManageDatabase: NSObject {
         let config = Realm.Configuration(
         
             fileURL: dirGroup?.appendingPathComponent("\(appDatabaseNextcloud)/\(k_databaseDefault)"),
-            schemaVersion: 16,
+            schemaVersion: 17,
             
             // 10 : Version 2.18.0
             // 11 : Version 2.18.2
@@ -66,6 +66,7 @@ class NCManageDatabase: NSObject {
             // 14 : Version 2.19.0.xx
             // 15 : Version 2.19.2
             // 16 : Version 2.20.2
+            // 17 : Version 2.20.4
             
             migrationBlock: { migration, oldSchemaVersion in
                 // We haven’t migrated anything yet, so oldSchemaVersion == 0
@@ -404,10 +405,10 @@ class NCManageDatabase: NSObject {
         }
     }
     
-    @objc func setAccountsUserProfile(_ userProfile: OCUserProfile) {
+    @objc func setAccountsUserProfile(_ userProfile: OCUserProfile) -> tableAccount? {
      
-        guard let tblAccount = self.getAccountActive() else {
-            return
+        guard let activeAccount = self.getAccountActive() else {
+            return nil
         }
         
         let realm = try! Realm()
@@ -415,7 +416,7 @@ class NCManageDatabase: NSObject {
         do {
             try realm.write {
                 
-                guard let result = realm.objects(tableAccount.self).filter("account = %@", tblAccount.account).first else {
+                guard let result = realm.objects(tableAccount.self).filter("account = %@", activeAccount.account).first else {
                     return
                 }
                 
@@ -443,6 +444,8 @@ class NCManageDatabase: NSObject {
         } catch let error {
             print("[LOG] Could not write to database: ", error)
         }
+        
+        return activeAccount
     }
     
     //MARK: -
@@ -698,42 +701,41 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Directory
     
-    @objc func addDirectory(serverUrl: String, fileID: String?, permissions: String?, encrypted: Bool) -> String {
+    @objc func addDirectory(encrypted: Bool, favorite: Bool, fileID: String?, permissions: String?, serverUrl: String) -> tableDirectory? {
         
         guard let tableAccount = self.getAccountActive() else {
-            return ""
+            return nil
         }
         
+        var result :tableDirectory?
         let realm = try! Realm()
 
-        var directoryID: String = ""
-
         do {
             try realm.write {
             
-                let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first
+                result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first
             
                 if result == nil || (result?.isInvalidated)! {
                 
-                    let addObject = tableDirectory()
-                    addObject.account = tableAccount.account
+                    result = tableDirectory()
+                    result!.account = tableAccount.account
                 
-                    directoryID = NSUUID().uuidString
-                    addObject.directoryID = directoryID
-                    addObject.e2eEncrypted = encrypted
+                    result!.directoryID = NSUUID().uuidString.replacingOccurrences(of: "-", with: "").lowercased()
+                    result!.e2eEncrypted = encrypted
+                    result!.favorite = favorite
                     if let fileID = fileID {
-                        addObject.fileID = fileID
+                        result!.fileID = fileID
                     }
                     if let permissions = permissions {
-                        addObject.permissions = permissions
+                        result!.permissions = permissions
                     }
-                    addObject.serverUrl = serverUrl
-                    realm.add(addObject, update: true)
+                    result!.serverUrl = serverUrl
+                    realm.add(result!, update: true)
                 
                 } else {
                 
-                    directoryID = result!.directoryID
                     result!.e2eEncrypted = encrypted
+                    result!.favorite = favorite
                     if let fileID = fileID {
                         result!.fileID = fileID
                     }
@@ -745,10 +747,10 @@ class NCManageDatabase: NSObject {
             }
         } catch let error {
             print("[LOG] Could not write to database: ", error)
-            return ""
+            return nil
         }
         
-        return directoryID
+        return tableDirectory.init(value: result!)
     }
     
     @objc func deleteDirectoryAndSubDirectory(serverUrl: String) {
@@ -890,7 +892,7 @@ class NCManageDatabase: NSObject {
         let realm = try! Realm()
         
         guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account,serverUrl).first else {
-            return self.addDirectory(serverUrl: serverUrl, fileID: nil,permissions: nil, encrypted: false)
+            return self.addDirectory(encrypted: false, favorite: false, fileID: nil, permissions: nil, serverUrl: serverUrl)?.directoryID
         }
         
         return result.directoryID
@@ -915,26 +917,6 @@ class NCManageDatabase: NSObject {
         return result.serverUrl
     }
     
-    @objc func getDirectoryE2ETokenLock(serverUrl: String, completion: @escaping (String?) -> Void) {
-        
-        DispatchQueue.main.async {
-    
-            guard let tableAccount = self.getAccountActive() else {
-                completion(nil)
-                return
-            }
-            
-            let realm = try! Realm()
-        
-            guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@ AND e2eTokenLock != ''", tableAccount.account, serverUrl).first else {
-                completion(nil)
-                return
-            }
-        
-            completion(result.e2eTokenLock)
-        }
-    }
-    
     @objc func setDateReadDirectory(directoryID: String) {
         
         guard let tableAccount = self.getAccountActive() else {
@@ -1033,36 +1015,27 @@ class NCManageDatabase: NSObject {
         }
     }
 
-    @objc func setDirectoryE2ETokenLock(serverUrl: String, token: String?) {
+    /*
+    @objc func getDirectoryE2ETokenLock(serverUrl: String, completion: @escaping (String?) -> Void) {
         
         DispatchQueue.main.async {
             
             guard let tableAccount = self.getAccountActive() else {
+                completion(nil)
                 return
             }
             
             let realm = try! Realm()
-        
-            realm.beginWrite()
-        
-            guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first else {
-                realm.cancelWrite()
+            
+            guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@ AND e2eTokenLock != ''", tableAccount.account, serverUrl).first else {
+                completion(nil)
                 return
             }
-        
-            if (token == nil) {
-                result.e2eTokenLock = ""
-            } else {
-                result.e2eTokenLock = token!
-            }
-    
-            do {
-                try realm.commitWrite()
-            } catch let error {
-                print("[LOG] Could not write to database: ", error)
-            }
+            
+            completion(result.e2eTokenLock)
         }
     }
+    */
     
     //MARK: -
     //MARK: Table e2e Encryption
@@ -1175,6 +1148,76 @@ class NCManageDatabase: NSObject {
         return
     }
     
+    //MARK: -
+    //MARK: Table e2e Encryption Lock
+    
+    @objc func getE2ETokenLock(serverUrl: String) -> tableE2eEncryptionLock? {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return nil
+        }
+        
+        let realm = try! Realm()
+        realm.refresh()
+            
+        guard let result = realm.objects(tableE2eEncryptionLock.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first else {
+            return nil
+        }
+        
+        return tableE2eEncryptionLock.init(value: result)
+    }
+    
+    @objc func setE2ETokenLock(serverUrl: String, fileID: String, token: String) {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return
+        }
+            
+        let realm = try! Realm()
+        realm.refresh()
+
+        realm.beginWrite()
+        
+        let addObject = tableE2eEncryptionLock()
+                
+        addObject.account = tableAccount.account
+        addObject.fileID = fileID
+        addObject.serverUrl = serverUrl
+        addObject.token = token
+                
+        realm.add(addObject, update: true)
+        
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
+    @objc func deteleE2ETokenLock(serverUrl: String) {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return
+        }
+            
+        let realm = try! Realm()
+        realm.refresh()
+
+        realm.beginWrite()
+
+        guard let result = realm.objects(tableE2eEncryptionLock.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first else {
+            return
+        }
+            
+        realm.delete(result)
+            
+        do {
+            try realm.commitWrite()
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+
     //MARK: -
     //MARK: Table External Sites
     
@@ -2231,25 +2274,6 @@ class NCManageDatabase: NSObject {
         }
     }
     
-    @objc func countQueueUpload(session: String?) -> Int {
-        
-        guard let tableAccount = self.getAccountActive() else {
-            return 0
-        }
-        
-        let realm = try! Realm()
-
-        let results : Results<tableQueueUpload>
-        
-        if let session = session {
-            results = realm.objects(tableQueueUpload.self).filter("account = %@ AND session = %@", tableAccount.account, session)
-        } else {
-            results = realm.objects(tableQueueUpload.self).filter("account = %@", tableAccount.account)
-        }
-        
-        return results.count
-    }
-
     //MARK: -
     //MARK: Table Share
     

+ 6 - 0
iOSClient/Library/SwiftWebVC/SwiftModalWebVC.swift

@@ -13,6 +13,7 @@ public protocol SwiftModalWebVCDelegate: class {
     func didReceiveServerRedirectForProvisionalNavigation(url: URL)
     func didFinishLoading(success: Bool, url: URL)
     func loginWebClose()
+    func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
 }
 
 public class SwiftModalWebVC: UINavigationController {
@@ -139,4 +140,9 @@ extension SwiftModalWebVC: SwiftWebVCDelegate {
     public func loginWebClose() {
         self.delegateWeb?.loginWebClose()
     }
+    
+    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        
+        self.delegateWeb?.decidePolicyForNavigationAction(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)        
+    }
 }

+ 8 - 1
iOSClient/Library/SwiftWebVC/SwiftWebVC.swift

@@ -14,6 +14,7 @@ public protocol SwiftWebVCDelegate: class {
     func didFinishLoading(success: Bool)
     func didFinishLoading(success: Bool, url: URL)
     func loginWebClose()
+    func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
 }
 
 public class SwiftWebVC: UIViewController {
@@ -332,6 +333,11 @@ extension SwiftWebVC: WKNavigationDelegate {
     
     public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
         
+        self.delegate?.decidePolicyForNavigationAction(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
+        
+        /*
+        let url = navigationAction.request.url
+        
         if #available(iOS 9.0, *) {
             decisionHandler(.allow)
         } else {
@@ -347,6 +353,7 @@ extension SwiftWebVC: WKNavigationDelegate {
                 webView.load(newRequest as URLRequest)
             }
         }
+        */
     }
     
     public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
@@ -366,5 +373,5 @@ extension SwiftWebVC: WKNavigationDelegate {
             print("unknown state. error: \(String(describing: challenge.error))")
         }
     }
-
+    
 }

+ 89 - 67
iOSClient/Login/CCLogin.m

@@ -31,6 +31,14 @@
 {
     AppDelegate *appDelegate;
     UIView *rootView;
+    
+    NSString *serverProductName;
+    NSString *serverVersion;
+    NSString *serverVersionString;
+    
+    NSInteger versionMajor;
+    NSInteger versionMicro;
+    NSInteger versionMinor;
 }
 @end
 
@@ -224,6 +232,13 @@
       self.baseUrl.text = [NSString stringWithFormat:@"https://%@",self.baseUrl.text];
     }
     
+    // Remove trailing slash
+    if ([self.baseUrl.text hasSuffix:@"/"])
+        self.baseUrl.text = [self.baseUrl.text substringToIndex:[self.baseUrl.text length] - 1];
+    
+    // add status.php for valid test url
+    NSString *urlTest = [self.baseUrl.text stringByAppendingString:serverStatus];
+    
     // Remove stored cookies
     NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
     for (NSHTTPCookie *cookie in [storage cookies])
@@ -231,93 +246,75 @@
         [storage deleteCookie:cookie];
     }
     
-    // Test Login Flow
-    if ([self.baseUrl.text length] > 0 && _user.hidden && _password.hidden) {
-        
-        NSString *urlBase = self.baseUrl.text;
-        // Remove trailing slash
-        if ([self.baseUrl.text hasSuffix:@"/"])
-            urlBase = [self.baseUrl.text substringToIndex:[self.baseUrl.text length] - 1];
-        
-        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlBase] cachePolicy:0 timeoutInterval:20.0];
-        [request addValue:[CCUtility getUserAgent] forHTTPHeaderField:@"User-Agent"];
-        [request addValue:@"true" forHTTPHeaderField:@"OCS-APIRequest"];
+    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlTest] cachePolicy:0 timeoutInterval:20.0];
+    [request addValue:[CCUtility getUserAgent] forHTTPHeaderField:@"User-Agent"];
+    [request addValue:@"true" forHTTPHeaderField:@"OCS-APIRequest"];
 
-        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
-        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
+    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
+    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
         
-        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
+    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
             
-            dispatch_async(dispatch_get_main_queue(), ^{
-                
-                self.login.enabled = YES;
-                self.loadingBaseUrl.hidden = YES;
+        dispatch_async(dispatch_get_main_queue(), ^{
                 
-                if (error) {
+            self.loadingBaseUrl.hidden = YES;
+            self.login.enabled = YES;
+            
+            if (error) {
                     
-                    if ([error code] == NSURLErrorServerCertificateUntrusted) {
+                if ([error code] == NSURLErrorServerCertificateUntrusted) {
                         
-                        [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:self delegate:self];
+                    [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:self delegate:self];
                         
-                    } else {
+                } else {
                         
-                        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"_connection_error_", nil) message:[error localizedDescription] preferredStyle:UIAlertControllerStyleAlert];
-                        UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"_ok_", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
+                    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"_connection_error_", nil) message:[error localizedDescription] preferredStyle:UIAlertControllerStyleAlert];
+                    UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"_ok_", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
                         
-                        [alertController addAction:okAction];
-                        [self presentViewController:alertController animated:YES completion:nil];
-                    }
+                    [alertController addAction:okAction];
+                    [self presentViewController:alertController animated:YES completion:nil];
+                }
 
-                } else {
+            } else {
+                    
+                if (![self serverStatus:data]) {
+                        
+                    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"_serverstatus_error_", nil) message:[error localizedDescription] preferredStyle:UIAlertControllerStyleAlert];
+                    UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"_ok_", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
+                        
+                    [alertController addAction:okAction];
+                    [self presentViewController:alertController animated:YES completion:nil];
+                    return;
+                }
+                
+                // Login Flow
+                if (_user.hidden && _password.hidden && versionMajor >= k_flow_version_available) {
                     
                     appDelegate.activeLoginWeb = [CCLoginWeb new];
                     appDelegate.activeLoginWeb.loginType = _loginType;
                     appDelegate.activeLoginWeb.delegate = self;
-                    appDelegate.activeLoginWeb.urlBase = urlBase;
+                    appDelegate.activeLoginWeb.urlBase = self.baseUrl.text;
                     
                     [appDelegate.activeLoginWeb presentModalWithDefaultTheme:self];
                 }
-            });
-        }];
-        
-        [task resume];
-        
-    } else {
-    
-        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.baseUrl.text] cachePolicy:0 timeoutInterval:20.0];
-        [request addValue:[CCUtility getUserAgent] forHTTPHeaderField:@"User-Agent"];
-    
-        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
-        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
-    
-        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
-        
-            dispatch_async(dispatch_get_main_queue(), ^{
-            
-                self.login.enabled = YES;
-                self.loadingBaseUrl.hidden = YES;
-        
-                if (error != nil) {
-        
-                    // self signed certificate
-                    if ([error code] == NSURLErrorServerCertificateUntrusted) {
-                        
-                        [[CCCertificate sharedManager] presentViewControllerCertificateWithTitle:[error localizedDescription] viewController:self delegate:self];
                 
-                    } else {
+                // NO Login Flow available
+                if (versionMajor < k_flow_version_available) {
                     
-                        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"_connection_error_", nil) message:[error localizedDescription] preferredStyle:UIAlertControllerStyleAlert];
-                        UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"_ok_", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {}];
+                    [self.loginTypeView setHidden:YES];
+
+                    _imageUser.hidden = NO;
+                    _user.hidden = NO;
+                    _imagePassword.hidden = NO;
+                    _password.hidden = NO;
                     
-                        [alertController addAction:okAction];
-                        [self presentViewController:alertController animated:YES completion:nil];
-                    }
+                    [_user becomeFirstResponder];
                 }
-            });
-        }];
-    
-        [task resume];
-    }
+            }
+        });
+    }];
+        
+    [task resume];
 }
 
 - (void)trustedCerticateAccepted
@@ -342,6 +339,31 @@
     }
 }
 
+- (BOOL)serverStatus:(NSData *)data
+{
+    NSError *error;
+    NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
+    
+    if (error) {
+        return false;
+    }
+    
+    serverProductName = [jsongParsed valueForKey:@"productname"];
+    serverVersion = [jsongParsed valueForKey:@"version"];
+    serverVersionString = [jsongParsed valueForKey:@"versionstring"];
+
+    NSArray *arrayVersion = [serverVersionString componentsSeparatedByString:@"."];
+    if (arrayVersion.count >= 3) {
+        versionMajor = [arrayVersion[0] integerValue];
+        versionMicro = [arrayVersion[1] integerValue];
+        versionMinor = [arrayVersion[2] integerValue];
+    } else {
+        return false;
+    }
+    
+    return true;
+}
+
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark == Login ==
 #pragma --------------------------------------------------------------------------------------------
@@ -445,7 +467,7 @@
     if (account) {
     
         // Update User (+ userProfile.id)
-        [[NCManageDatabase sharedInstance] setAccountsUserProfile:userProfile];
+        (void)[[NCManageDatabase sharedInstance] setAccountsUserProfile:userProfile];
         
         // Set this account as default
         tableAccount *account = [[NCManageDatabase sharedInstance] setAccountActive:metadataNet.account];

+ 4 - 0
iOSClient/Login/CCLoginWeb.swift

@@ -141,6 +141,10 @@ extension CCLoginWeb: SwiftModalWebVCDelegate {
     public func loginWebClose() {
         self.delegate?.loginWebClose()
     }
+    
+    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        decisionHandler(.allow)
+    }
 }
 
 

+ 24 - 16
iOSClient/Main/CCMain.m

@@ -1129,8 +1129,15 @@
     if (![metadataNet.account isEqualToString:appDelegate.activeAccount])
         return;
     
-    // Update User (+ userProfile.id)
-    [[NCManageDatabase sharedInstance] setAccountsUserProfile:userProfile];
+    // Update User (+ userProfile.id) & active account & account network
+    tableAccount *tableAccount = [[NCManageDatabase sharedInstance] setAccountsUserProfile:userProfile];
+    if (tableAccount) {
+        [[CCNetworking sharedNetworking] settingAccount];
+        [appDelegate settingActiveAccount:tableAccount.account activeUrl:tableAccount.url activeUser:tableAccount.user activeUserID:tableAccount.userID activePassword:tableAccount.password];
+    } else {
+        
+        [appDelegate messageNotification:@"Account" description:@"Internal error : account not found" visible:true delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:0];
+    }
 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
         
@@ -2134,19 +2141,19 @@
             }
                 
             // Unlock
-            [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:self.serverUrl completion:^(NSString * _Nullable token) {
-                if (token != nil) {
-                    NSError *error = [[NCNetworkingSync sharedManager] unlockEndToEndFolderEncrypted:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl serverUrl:self.serverUrl fileID:_metadataFolder.fileID token:token];
-                    if (error) {
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            [appDelegate messageNotification:@"_e2e_error_unlock_" description:error.localizedDescription visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:error.code];
-                        });
-                    }
+            tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:self.serverUrl];
+
+            if (tableLock != nil) {
+                NSError *error = [[NCNetworkingSync sharedManager] unlockEndToEndFolderEncrypted:appDelegate.activeUser userID:appDelegate.activeUserID password:appDelegate.activePassword url:appDelegate.activeUrl serverUrl:self.serverUrl fileID:_metadataFolder.fileID token:tableLock.token];
+                if (error) {
+                    dispatch_async(dispatch_get_main_queue(), ^{
+                        [appDelegate messageNotification:@"_e2e_error_unlock_" description:error.localizedDescription visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:error.code];
+                    });
                 }
-                dispatch_async(dispatch_get_main_queue(), ^{
-                    [self reloadDatasource];
-                });
-            }];
+            }
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [self reloadDatasource];
+            });
         });
         
     } else  {
@@ -2205,7 +2212,7 @@
             
             // Add new directory
             NSString *newDirectory = [NSString stringWithFormat:@"%@/%@", serverUrlTo, fileName];
-            (void)[[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:newDirectory fileID:nil permissions:nil encrypted:false];
+            (void) [[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:false favorite:false fileID:nil permissions:nil serverUrl:newDirectory];
         }
     
         // next
@@ -4391,7 +4398,8 @@
     // Controllo data lettura Data Source
     tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", appDelegate.activeAccount, serverUrl]];
     // Get MetadataFolder
-    _metadataFolder = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND fileID = %@", appDelegate.activeAccount, tableDirectory.fileID]];
+    if (![serverUrl isEqualToString:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]])
+        _metadataFolder = [[NCManageDatabase sharedInstance] getMetadataWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND fileID = %@", appDelegate.activeAccount, tableDirectory.fileID]];
     
     NSDate *dateDateRecordDirectory = tableDirectory.dateReadDirectory;
     

+ 4 - 0
iOSClient/Main/CCMore.swift

@@ -441,6 +441,10 @@ extension CCMore: SwiftModalWebVCDelegate, SwiftWebVCDelegate{
     public func didFinishLoading(success: Bool, url: URL) {
         print("Finished loading. Success: \(success).")
     }
+    
+    public func decidePolicyForNavigationAction(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        decisionHandler(.allow)
+    }
 }
 
 class CCCellMore: UITableViewCell {

+ 15 - 2
iOSClient/Main/CCSection.m

@@ -69,7 +69,9 @@
     */
     
     NSInteger numDirectory = 0;
+    NSInteger numDirectoryFavorite = 0;
     BOOL directoryOnTop = [CCUtility getDirectoryOnTop];
+    NSMutableArray *metadataFilesFavorite = [NSMutableArray new];
     
     for (tableMetadata* metadata in records) {
         
@@ -80,12 +82,23 @@
         } else {
             
             if (metadata.directory && directoryOnTop) {
-                [copyRecords insertObject:metadata atIndex:numDirectory++];
+                if (metadata.favorite) {
+                    [copyRecords insertObject:metadata atIndex:numDirectoryFavorite++];
+                    numDirectory++;
+                } else {
+                    [copyRecords insertObject:metadata atIndex:numDirectory++];
+                }
             } else {
-                [copyRecords addObject:metadata];
+                if (metadata.favorite && directoryOnTop) {
+                    [metadataFilesFavorite addObject:metadata];
+                } else {
+                    [copyRecords addObject:metadata];
+                }
             }
         }
     }
+    if (directoryOnTop && metadataFilesFavorite.count > 0)
+        [copyRecords insertObjects:metadataFilesFavorite atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(numDirectoryFavorite, metadataFilesFavorite.count)]]; // Add Favorite files at end of favorite folders
     
     /*
      sectionArrayRow

+ 5 - 0
iOSClient/Networking/CCNetworking.h

@@ -64,6 +64,11 @@
 - (void)uploadFile:(NSString *)fileName serverUrl:(NSString *)serverUrl session:(NSString *)session taskStatus:(NSInteger)taskStatus selector:(NSString *)selector selectorPost:(NSString *)selectorPost errorCode:(NSInteger)errorCode delegate:(id)delegate;
 - (void)uploadFileMetadata:(tableMetadata *)metadata taskStatus:(NSInteger)taskStatus;
 
+// Utility
+
+- (NSInteger)getNumDownloadInProgressWWan:(BOOL)WWan;
+- (NSInteger)getNumUploadInProgressWWan:(BOOL)WWan;
+
 @end
 
 @protocol CCNetworkingDelegate <NSObject>

+ 50 - 3
iOSClient/Networking/CCNetworking.m

@@ -1183,12 +1183,12 @@
     // E2EE : UNLOCK
     if ([CCUtility isFolderEncrypted:serverUrl account:_activeAccount] && [CCUtility isEndToEndEnabled:_activeAccount]) {
         
-        tableDirectory *directory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", _activeAccount, serverUrl]];
+        tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
 
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
             
-            if (directory.e2eTokenLock.length > 0 && directory.e2eTokenLock) {
-                NSError *error = [[NCNetworkingSync sharedManager] unlockEndToEndFolderEncrypted:_activeUser userID:_activeUserID password:_activePassword url:_activeUrl serverUrl:serverUrl fileID:directory.fileID token:directory.e2eTokenLock];
+            if (tableLock) {
+                NSError *error = [[NCNetworkingSync sharedManager] unlockEndToEndFolderEncrypted:_activeUser userID:_activeUserID password:_activePassword url:_activeUrl serverUrl:serverUrl fileID:tableLock.fileID token:tableLock.token];
                 if (error) {
 #ifndef EXTENSION
                     dispatch_async(dispatch_get_main_queue(), ^{
@@ -1334,6 +1334,53 @@
     }
 }
 
+#pragma --------------------------------------------------------------------------------------------
+#pragma mark ===== Utility =====
+#pragma --------------------------------------------------------------------------------------------
+
+- (NSInteger)getNumDownloadInProgressWWan:(BOOL)WWan
+{
+    NSInteger numTableMetadataDownload, numTableQueueDownload;
+    
+    if (WWan) {
+        numTableMetadataDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count];
+        numTableQueueDownload = [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_wwan];
+    } else {
+        numTableMetadataDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count];
+        numTableQueueDownload = [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_foreground];
+    }
+    
+    return numTableMetadataDownload + numTableQueueDownload;
+}
+
+- (NSInteger)getNumUploadInProgressWWan:(BOOL)WWan
+{
+    NSMutableArray *recordsInUpload = [NSMutableArray new];
+    
+    if (WWan) {
+        
+        for (tableQueueUpload *record in [[NCManageDatabase sharedInstance] getQueueUploadWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND session = %@", _activeAccount, k_upload_session_wwan]]) {
+            [recordsInUpload addObject:[record.fileName stringByAppendingString:record.assetLocalIdentifier]];
+        }
+        for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUploadWWan]) {
+            if (![recordsInUpload containsObject:[record.fileNameView stringByAppendingString:record.assetLocalIdentifier]])
+                [recordsInUpload addObject:[record.fileNameView stringByAppendingString:record.assetLocalIdentifier]];
+        }
+        
+    } else {
+        
+        for (tableQueueUpload *record in [[NCManageDatabase sharedInstance] getQueueUploadWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND (session = %@ OR session = %@)", _activeAccount, k_upload_session, k_upload_session_foreground]]) {
+            [recordsInUpload addObject:[record.fileName stringByAppendingString:record.assetLocalIdentifier]];
+        }
+        for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUpload]) {
+            if (![recordsInUpload containsObject:[record.fileNameView stringByAppendingString:record.assetLocalIdentifier]])
+                [recordsInUpload addObject:[record.fileNameView stringByAppendingString:record.assetLocalIdentifier]];
+        }
+    }
+    
+    return recordsInUpload.count;
+}
+
 @end
 
 #pragma --------------------------------------------------------------------------------------------

+ 200 - 217
iOSClient/Networking/NCNetworkingSync.m

@@ -11,6 +11,15 @@
 #import "CCCertificate.h"
 #import "NCBridgeSwift.h"
 
+/*********************************************************************************
+ 
+ Netwok call synchronous mode, use this only from :
+ 
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ });
+ 
+*********************************************************************************/
+
 @implementation NCNetworkingSync
 
 + (NCNetworkingSync *)sharedManager {
@@ -228,67 +237,66 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
 
-        // Read Folder
-        [communication readFolder:serverUrl depth:@"1" withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *tokenReadFolder) {
+    // Read Folder
+    [communication readFolder:serverUrl depth:@"1" withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *tokenReadFolder) {
     
-            if (items.count > 1) {
+        if (items.count > 1) {
             
-                returnError = [NSError errorWithDomain:@"com.nextcloud.nextcloud" code:999 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"_e2e_error_directory_not_empty_", nil) forKey:NSLocalizedDescriptionKey]];
-                dispatch_semaphore_signal(semaphore);
-                return;
-            }
+            returnError = [NSError errorWithDomain:@"com.nextcloud.nextcloud" code:999 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"_e2e_error_directory_not_empty_", nil) forKey:NSLocalizedDescriptionKey]];
+            dispatch_semaphore_signal(semaphore);
+            return;
+        }
         
-            // LOCK
-            [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+        // LOCK
+        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
         
-                [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
+            [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
             
-                // REMOVE METADATA
-                [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                    NSLog(@"[LOG] Found metadata and delete");
-                } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                    NSLog(@"[LOG] %@", [NSString stringWithFormat:@"Remove metadata error %d", (int)response.statusCode]);
-                }];
+            // REMOVE METADATA
+            [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                NSLog(@"[LOG] Found metadata and delete");
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                NSLog(@"[LOG] %@", [NSString stringWithFormat:@"Remove metadata error %d", (int)response.statusCode]);
+            }];
         
-                // MARK
-                [communication markEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-            
-                    // UNLOCK
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
+            // MARK
+            [communication markEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
             
+                // UNLOCK
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
                 } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                    dispatch_semaphore_signal(semaphore);
+                }];
             
-                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_mark_folder_"];
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+            
+                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_mark_folder_"];
 
-                    // UNLOCK
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
+                // UNLOCK
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
+                } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                    dispatch_semaphore_signal(semaphore);
                 }];
-        
-            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-        
-                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-                dispatch_semaphore_signal(semaphore);
             }];
         
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
+        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
-            returnError = [self getError:response error:error descriptionDefault:@"_error_"];
+            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
             dispatch_semaphore_signal(semaphore);
         }];
+        
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
+        
+        returnError = [self getError:response error:error descriptionDefault:@"_error_"];
+        dispatch_semaphore_signal(semaphore);
     }];
     
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
@@ -308,69 +316,68 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
 
-        // Read Folder
-        [communication readFolder:serverUrl depth:@"1" withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *tokenReadFolder) {
+    // Read Folder
+    [communication readFolder:serverUrl depth:@"1" withUserSessionToken:nil onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSArray *items, NSString *redirectedServer, NSString *tokenReadFolder) {
         
-            if (items.count > 1) {
+        if (items.count > 1) {
             
-                returnError = [NSError errorWithDomain:@"com.nextcloud.nextcloud" code:999 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"_e2e_error_directory_not_empty_", nil) forKey:NSLocalizedDescriptionKey]];
-                dispatch_semaphore_signal(semaphore);
-                return;
-            }
+            returnError = [NSError errorWithDomain:@"com.nextcloud.nextcloud" code:999 userInfo:[NSDictionary dictionaryWithObject:NSLocalizedString(@"_e2e_error_directory_not_empty_", nil) forKey:NSLocalizedDescriptionKey]];
+            dispatch_semaphore_signal(semaphore);
+            return;
+        }
         
-            // LOCK
-            [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+        // LOCK
+        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+        
+            [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
+            
+            // DELETE METADATA
+            [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                NSLog(@"[LOG] Found metadata and delete");
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                NSLog(@"[LOG] %@", [NSString stringWithFormat:@"Remove metadata error %d", (int)response.statusCode]);
+            }];
         
-                [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
+            // DELETE MARK
+            [communication deletemarkEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
             
-                // DELETE METADATA
-                [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                    NSLog(@"[LOG] Found metadata and delete");
+                // UNLOCK
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
                 } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                    NSLog(@"[LOG] %@", [NSString stringWithFormat:@"Remove metadata error %d", (int)response.statusCode]);
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                    dispatch_semaphore_signal(semaphore);
                 }];
-        
-                // DELETE MARK
-                [communication deletemarkEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
             
-                    // UNLOCK
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
             
+                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_delete_mark_folder_"];
+
+                // UNLOCK
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
                 } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-            
-                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_delete_mark_folder_"];
-
-                    // UNLOCK
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                    dispatch_semaphore_signal(semaphore);
                 }];
+            }];
         
-            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
-                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-                dispatch_semaphore_signal(semaphore);
-            }];
-    
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
-    
-            returnError = [self getError:response error:error descriptionDefault:@"_error_"];
+            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
             dispatch_semaphore_signal(semaphore);
         }];
-    }];
+    
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
         
+        returnError = [self getError:response error:error descriptionDefault:@"_error_"];
+        dispatch_semaphore_signal(semaphore);
+    }];
+    
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
         [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:k_timeout_webdav]];
     
@@ -418,54 +425,47 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
-        
-        // LOCK
-        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
+
+    // LOCK
+    [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
             
-            [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
+        [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
             
-            // DELETE METADATA
-            [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+        // DELETE METADATA
+        [communication deleteEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
                 
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
+            // UNLOCK
+            if (unlock) {
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
                     dispatch_semaphore_signal(semaphore);
-                }
+                } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                    dispatch_semaphore_signal(semaphore);
+                }];
+            } else {
+                dispatch_semaphore_signal(semaphore);
+            }
                 
-            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
                 
-                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_delete_metadata_"];
+            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_delete_metadata_"];
 
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
-                    dispatch_semaphore_signal(semaphore);
-                }
+            // UNLOCK
+            [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                dispatch_semaphore_signal(semaphore);
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                dispatch_semaphore_signal(semaphore);
             }];
-            
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-            
-            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-            dispatch_semaphore_signal(semaphore);
         }];
+            
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+        
+        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
+        dispatch_semaphore_signal(semaphore);
     }];
     
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
@@ -485,54 +485,47 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
 
-        // LOCK
-        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+    // LOCK
+    [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
         
-            [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
+        [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
         
-            // STORE METADATA
-            [communication storeEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID encryptedMetadata:metadata onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *encryptedMetadata, NSString *redirectedServer) {
+        // STORE METADATA
+        [communication storeEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID encryptedMetadata:metadata onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *encryptedMetadata, NSString *redirectedServer) {
             
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
+            // UNLOCK
+            if (unlock) {
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
+                } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
                     dispatch_semaphore_signal(semaphore);
-                }
+                }];
+            } else {
+                dispatch_semaphore_signal(semaphore);
+            }
                 
-            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
             
-                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_store_metadata_"];
+            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_store_metadata_"];
 
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
-                    dispatch_semaphore_signal(semaphore);
-                }
+            // UNLOCK
+            [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                dispatch_semaphore_signal(semaphore);
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                dispatch_semaphore_signal(semaphore);
             }];
+        }];
         
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
-            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-            dispatch_semaphore_signal(semaphore);
-        }];
+        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
+        dispatch_semaphore_signal(semaphore);
     }];
 
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
@@ -552,54 +545,47 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
 
-        // LOCK
-        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+    // LOCK
+    [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
         
-            [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
+        [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
         
-            // UPDATA METADATA
-            [communication updateEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID encryptedMetadata:metadata token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *encryptedMetadata, NSString *redirectedServer) {
+        // UPDATA METADATA
+        [communication updateEndToEndMetadata:[url stringByAppendingString:@"/"] fileID:fileID encryptedMetadata:metadata token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *encryptedMetadata, NSString *redirectedServer) {
             
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
+            // UNLOCK
+            if (unlock) {
+                [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                    [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                    dispatch_semaphore_signal(semaphore);
+                } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                    returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
                     dispatch_semaphore_signal(semaphore);
-                }
+                }];
+            } else {
+                dispatch_semaphore_signal(semaphore);
+            }
                 
-            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-            
-                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_update_metadata_"];
+        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+        
+            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_update_metadata_"];
 
-                // UNLOCK
-                if (unlock) {
-                    [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
-                        // Write DB token ""
-                        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
-                        dispatch_semaphore_signal(semaphore);
-                    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
-                        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
-                        dispatch_semaphore_signal(semaphore);
-                    }];
-                } else {
-                    dispatch_semaphore_signal(semaphore);
-                }
+            // UNLOCK
+            [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
+                [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
+                dispatch_semaphore_signal(semaphore);
+            } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+                returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_unlock_"];
+                dispatch_semaphore_signal(semaphore);
             }];
+        }];
         
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
-            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-            dispatch_semaphore_signal(semaphore);
-        }];
+        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
+        dispatch_semaphore_signal(semaphore);
     }];
 
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
@@ -619,20 +605,18 @@
     [communication setCredentialsWithUser:user andUserID:userID andPassword:password];
     [communication setUserAgent:[CCUtility getUserAgent]];
     
-    [[NCManageDatabase sharedInstance] getDirectoryE2ETokenLockWithServerUrl:serverUrl completion:^(NSString * _Nullable tokenDatabase) {
-
-        // LOCK
-        [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tokenDatabase onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
+    tableE2eEncryptionLock *tableLock = [[NCManageDatabase sharedInstance] getE2ETokenLockWithServerUrl:serverUrl];
+    
+    // LOCK
+    [communication lockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:tableLock.token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *token, NSString *redirectedServer) {
         
-            // Write DB token
-            [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:token];
-            dispatch_semaphore_signal(semaphore);
+        [[NCManageDatabase sharedInstance] setE2ETokenLockWithServerUrl:serverUrl fileID:fileID token:token];
+        dispatch_semaphore_signal(semaphore);
         
-        } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
+    } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
-            returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
-            dispatch_semaphore_signal(semaphore);
-        }];
+        returnError = [self getError:response error:error descriptionDefault:@"_e2e_error_lock_"];
+        dispatch_semaphore_signal(semaphore);
     }];
 
     while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER))
@@ -655,8 +639,7 @@
     // UNLOCK
     [communication unlockEndToEndFolderEncrypted:[url stringByAppendingString:@"/"] fileID:fileID token:token onCommunication:communication successRequest:^(NSHTTPURLResponse *response, NSString *redirectedServer) {
         
-        // Write DB token ""
-        [[NCManageDatabase sharedInstance] setDirectoryE2ETokenLockWithServerUrl:serverUrl token:@""];
+        [[NCManageDatabase sharedInstance] deteleE2ETokenLockWithServerUrl:serverUrl];
         dispatch_semaphore_signal(semaphore);
         
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {

+ 31 - 41
iOSClient/Networking/OCNetworking.m

@@ -56,7 +56,7 @@
         _activeUser = withUser;
         _activeUserID = withUserID;
         _activePassword = withPassword;
-        _activeUrl = withUrl;        
+        _activeUrl = withUrl;
     }
     
     return self;
@@ -242,7 +242,8 @@
             OCFileDto *itemDtoFolder = [items objectAtIndex:0];
             //NSDate *date = [NSDate dateWithTimeIntervalSince1970:itemDtoDirectory.date];
         
-            NSString *directoryID = [[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:_metadataNet.serverUrl fileID:itemDtoFolder.ocId permissions:itemDtoFolder.permissions encrypted:itemDtoFolder.isEncrypted];
+            NSString *directoryID = [[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDtoFolder.isEncrypted favorite:itemDtoFolder.isFavorite fileID:itemDtoFolder.ocId permissions:itemDtoFolder.permissions serverUrl:_metadataNet.serverUrl].directoryID;
+            
             _metadataNet.directoryID = directoryID;
 
             NSString *autoUploadFileName = [[NCManageDatabase sharedInstance] getAccountAutoUploadFileName];
@@ -289,7 +290,7 @@
                 
                 OCFileDto *itemDto = [itemsSortedArray objectAtIndex:i];
                 
-                NSString *fileName = [itemDto.fileName  stringByReplacingOccurrencesOfString:@"/" withString:@""];
+                NSString *fileName = [itemDto.fileName stringByReplacingOccurrencesOfString:@"/" withString:@""];
                 
                 // Skip hidden files
                 if (fileName.length > 0) {
@@ -302,7 +303,7 @@
                         
                     serverUrl = [CCUtility stringAppendServerUrl:_metadataNet.serverUrl addFileName:fileName];
                         
-                    (void)[[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:serverUrl fileID:itemDtoFolder.ocId permissions:itemDtoFolder.permissions encrypted:itemDto.isEncrypted];
+                    (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDto.isEncrypted favorite:itemDto.isFavorite fileID:itemDto.ocId permissions:itemDto.permissions serverUrl:serverUrl];
                 }
                 
                 // ----- BUG #942 ---------
@@ -391,9 +392,10 @@
         
             for(OCFileDto *itemDto in items) {
             
-                NSString *serverUrl;
+                NSString *serverUrl, *directoryID;
+                BOOL isFolderEncrypted;
 
-                NSString *fileName = [itemDto.fileName  stringByReplacingOccurrencesOfString:@"/" withString:@""];
+                NSString *fileName = [itemDto.fileName stringByReplacingOccurrencesOfString:@"/" withString:@""];
 
                 // Skip hidden files
                 if (fileName.length > 0) {
@@ -413,27 +415,21 @@
                 }
                 // ------------------------
             
-                NSRange firstInstance = [itemDto.filePath rangeOfString:[NSString stringWithFormat:@"%@/files/%@", dav, _activeUser]];
-                NSRange finalRange = NSMakeRange(firstInstance.location + firstInstance.length, itemDto.filePath.length-(firstInstance.location + firstInstance.length));
-                if (finalRange.location != NSNotFound && finalRange.location + finalRange.length <= itemDto.filePath.length) {
-                    // It's safe to use range on str
-                    serverUrl = [itemDto.filePath substringWithRange:finalRange];
-                } else {
-                    continue;
-                }
-                
-                /* TRIM */
+                serverUrl = [itemDto.filePath stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@/files/%@", dav, _activeUserID] withString:@""];
                 if ([serverUrl hasPrefix:@"/"])
                     serverUrl = [serverUrl substringFromIndex:1];
                 if ([serverUrl hasSuffix:@"/"])
                     serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
-                /* ---- */
-            
                 serverUrl = [CCUtility stringAppendServerUrl:[_activeUrl stringByAppendingString:webDAV] addFileName:serverUrl];
-
-                NSString *directoryID = [[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:serverUrl fileID:itemDto.ocId permissions:itemDto.permissions encrypted:itemDto.isEncrypted];
-                BOOL isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:_metadataNet.account];
-
+                
+                if (itemDto.isDirectory) {
+                    // Add / update Directory
+                    (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDto.isEncrypted favorite:itemDto.isFavorite fileID:itemDto.ocId permissions:itemDto.permissions serverUrl:[NSString stringWithFormat:@"%@/%@", serverUrl, fileName]].directoryID;
+                }
+                
+                isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:_metadataNet.account];
+                directoryID = [[NCManageDatabase sharedInstance] getDirectoryID:serverUrl];
+                
                 [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileName:itemDto.fileName serverUrl:serverUrl directoryID:directoryID autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:_metadataNet.account directoryUser:directoryUser isFolderEncrypted:isFolderEncrypted]];
             }
     
@@ -550,9 +546,10 @@
         
         for(OCFileDto *itemDto in items) {
             
-            NSString *serverUrl, *fileName;
+            NSString *serverUrl, *directoryID;
+            BOOL isFolderEncrypted;
             
-            fileName = [itemDto.fileName  stringByReplacingOccurrencesOfString:@"/" withString:@""];
+            NSString *fileName = [itemDto.fileName stringByReplacingOccurrencesOfString:@"/" withString:@""];
             
             // Skip hidden files
             if (fileName.length > 0) {
@@ -572,28 +569,21 @@
             }
             // ------------------------
             
-            NSRange firstInstance = [itemDto.filePath rangeOfString:[NSString stringWithFormat:@"%@/files/%@", dav, _activeUser]];
-            NSRange finalRange = NSMakeRange(firstInstance.location + firstInstance.length, itemDto.filePath.length-(firstInstance.location + firstInstance.length));
-            
-            if (finalRange.location != NSNotFound && finalRange.location + finalRange.length <= itemDto.filePath.length) {
-                // It's safe to use range on str
-                serverUrl = [itemDto.filePath substringWithRange:finalRange];
-            } else {
-                continue;
-            }
-
-            /* TRIM */
+            serverUrl = [itemDto.filePath stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@/files/%@", dav, _activeUserID] withString:@""];
             if ([serverUrl hasPrefix:@"/"])
                 serverUrl = [serverUrl substringFromIndex:1];
             if ([serverUrl hasSuffix:@"/"])
                 serverUrl = [serverUrl substringToIndex:[serverUrl length] - 1];
-            /*      */
-            
             serverUrl = [CCUtility stringAppendServerUrl:[_activeUrl stringByAppendingString:webDAV] addFileName:serverUrl];
-
-            NSString *directoryID = [[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:serverUrl fileID:itemDto.ocId permissions:itemDto.permissions encrypted:itemDto.isEncrypted];
-            BOOL isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:_metadataNet.account];
-
+            
+            if (itemDto.isDirectory) {
+                // Add / update Directory
+                (void)[[NCManageDatabase sharedInstance] addDirectoryWithEncrypted:itemDto.isEncrypted favorite:itemDto.isFavorite fileID:itemDto.ocId permissions:itemDto.permissions serverUrl:[NSString stringWithFormat:@"%@/%@", serverUrl, fileName]].directoryID;
+            }
+            
+            isFolderEncrypted = [CCUtility isFolderEncrypted:serverUrl account:_metadataNet.account];
+            directoryID = [[NCManageDatabase sharedInstance] getDirectoryID:serverUrl];
+            
             [metadatas addObject:[CCUtility trasformedOCFileToCCMetadata:itemDto fileName:itemDto.fileName serverUrl:serverUrl directoryID:directoryID autoUploadFileName:autoUploadFileName autoUploadDirectory:autoUploadDirectory activeAccount:_metadataNet.account directoryUser:directoryUser isFolderEncrypted:isFolderEncrypted]];
         }
         

+ 1 - 1
iOSClient/Settings/CCSettings.m

@@ -438,7 +438,7 @@
             
             NSString *nameSlogan = [NSString stringWithFormat:@"%@ - %@", capabilities.themingName, capabilities.themingSlogan];
             
-            sectionName = [NSString stringWithFormat:@"%@\n\n%@\n%@", versionNextcloudiOS, versionNextcloud,nameSlogan];
+            sectionName = [NSString stringWithFormat:@"%@\n\n%@\n%@", versionNextcloudiOS, versionNextcloud, nameSlogan];
         }
         break;
     }

BIN=BIN
iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/de.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/en-GB.lproj/Localizable.strings


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

@@ -220,6 +220,7 @@
 
 "_connect_server_anyway_"       = "Do you want to connect to the server anyway?";
 "_connection_error_"            = "Connection error";
+"_serverstatus_error_"          = "Connection to server failure, verify your server address or network status";
 "_add_your_nextcloud_"          = "Add your Nextcloud account";
 "_login_url_"                   = "Server address https://…";
 "_login_bottom_label_"          = "Don't have a server yet?\nChoose one of the providers.";

BIN=BIN
iOSClient/Supporting Files/es-419.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-CL.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-CO.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-CR.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-DO.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-EC.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-GT.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-HN.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-MX.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-NI.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-PA.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-PE.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-PR.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-PY.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-SV.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es-UY.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/es.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/fr.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/hu.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/is.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/it.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/ko.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/nl.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/pl.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/pt_PT.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/ru.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/sk-SK.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/sr.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/sv.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/tr.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/zh-Hans.lproj/Localizable.strings


BIN=BIN
iOSClient/Supporting Files/zh-Hant-TW.lproj/Localizable.strings


+ 2 - 10
iOSClient/Synchronize/CCSynchronize.m

@@ -304,19 +304,11 @@
         // Selector : selectorReadFileReloadFolder, selectorReadFileFolderWithDownload
         if ([metadataNet.selector isEqualToString:selectorReadFileFolder] || [metadataNet.selector isEqualToString:selectorReadFileFolderWithDownload]) {
             
-            tableDirectory *tableDirectory;
             NSString *serverUrl = [CCUtility stringAppendServerUrl:metadataNet.serverUrl addFileName:metadataNet.fileName];
-            
-            // Add Directory if do not exists
-            tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", metadataNet.account, serverUrl]];
-            
-            if (!tableDirectory) {
-                (void) [[NCManageDatabase sharedInstance] addDirectoryWithServerUrl:serverUrl fileID:nil permissions:nil encrypted:metadata.e2eEncrypted];
-                tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", metadataNet.account, serverUrl]];
-            }
+            tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", metadataNet.account, serverUrl]];
             
             // Verify changed etag
-            if (![tableDirectory.etag isEqualToString:metadata.etag]) {
+            if (![tableDirectory.etag isEqualToString:metadata.etag] && tableDirectory) {
                 
                 if ([metadataNet.selector isEqualToString:selectorReadFileFolder])
                     [self readFolder:serverUrl selector:selectorReadFolder];

+ 10 - 27
iOSClient/Transfers/CCTransfers.m

@@ -355,20 +355,11 @@
     NSString *titleSection, *numberTitle;
     NSInteger typeOfSession = 0;
     
-    NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session];
-    NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_wwan];
-    
-    NSInteger queueUpload = [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session];
-    for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUpload]) {
-        if (record.e2eEncrypted == false)
-            queueUpload++;
-    }
-    
-    NSInteger queueUploadWWan = [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session_wwan];
-    for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUploadWWan]) {
-        if (record.e2eEncrypted == false)
-            queueUploadWWan++;
-    }
+    NSInteger queueDownload = [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:NO];
+    NSInteger queueDownloadWWan = [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:YES];
+
+    NSInteger queueUpload = [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:NO];
+    NSInteger queueUploadWWan = [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:YES];
     
     if ([[_sectionDataSource.sections objectAtIndex:section] isKindOfClass:[NSString class]]) titleSection = [_sectionDataSource.sections objectAtIndex:section];
     if ([[_sectionDataSource.sections objectAtIndex:section] isKindOfClass:[NSDate class]]) titleSection = [CCUtility getTitleSectionDate:[_sectionDataSource.sections objectAtIndex:section]];
@@ -450,7 +441,7 @@
     // Footer Download
     if ([titleSection containsString:@"download"] && ![titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session];
+        NSInteger queueDownload = [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:NO];
         
         // element or elements ?
         if (queueDownload > 1) element_s = NSLocalizedString(@"_elements_",nil);
@@ -467,7 +458,7 @@
     // Footer Download WWAN
     if ([titleSection containsString:@"download"] && [titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_wwan];
+        NSInteger queueDownloadWWan = [[CCNetworking sharedNetworking] getNumDownloadInProgressWWan:YES];
         
         // element or elements ?
         if (queueDownloadWWan > 1) element_s = NSLocalizedString(@"_elements_",nil);
@@ -488,11 +479,7 @@
     // Footer Upload
     if ([titleSection containsString:@"upload"] && ![titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueUpload = [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session];
-        for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUpload]) {
-            if (record.e2eEncrypted == false)
-                queueUpload++;
-        }
+        NSInteger queueUpload = [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:NO];
         
         // element or elements ?
         if (queueUpload > 1) element_s = NSLocalizedString(@"_elements_",nil);
@@ -509,12 +496,8 @@
     // Footer Upload WWAN
     if ([titleSection containsString:@"upload"] && [titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueUploadWWan = [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session_wwan];
-        for (tableMetadata *record in [[NCManageDatabase sharedInstance] getTableMetadataUploadWWan]) {
-            if (record.e2eEncrypted == false)
-                queueUploadWWan++;
-        }
-        
+        NSInteger queueUploadWWan = [[CCNetworking sharedNetworking] getNumUploadInProgressWWan:YES];
+       
         // element or elements ?
         if (queueUploadWWan > 1) element_s = NSLocalizedString(@"_elements_",nil);
         else element_s = NSLocalizedString(@"_element_",nil);

+ 9 - 1
iOSClient/Utility/CCUtility.m

@@ -346,7 +346,15 @@
 
 + (BOOL)getDirectoryOnTop
 {
-    return [[UICKeyChainStore stringForKey:@"directoryOnTop" service:k_serviceShareKeyChain] boolValue];
+    NSString *valueString = [UICKeyChainStore stringForKey:@"directoryOnTop" service:k_serviceShareKeyChain];
+    
+    // Default TRUE
+    if (valueString == nil) {
+        [self setDirectoryOnTop:YES];
+        return true;
+    }
+    
+    return [valueString boolValue];
 }
 
 + (void)setDirectoryOnTop:(BOOL)directoryOnTop