Переглянути джерело

Fix (#2675)

* biometry type test 2,3

Signed-off-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>

* 4.9.3 build 0

Signed-off-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>

* improved / fix forbidden charactes

Signed-off-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>

* fix media deleteFile

Signed-off-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>

---------

Signed-off-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>
Co-authored-by: Marino Faggiana <8616947+marinofaggiana@users.noreply.github.com>
Marino Faggiana 1 рік тому
батько
коміт
625688f047

+ 4 - 4
Nextcloud.xcodeproj/project.pbxproj

@@ -4885,7 +4885,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 20;
+				CURRENT_PROJECT_VERSION = 0;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -4911,7 +4911,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.9.2;
+				MARKETING_VERSION = 4.9.3;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;
@@ -4950,7 +4950,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 20;
+				CURRENT_PROJECT_VERSION = 0;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -4973,7 +4973,7 @@
 					"@executable_path/Frameworks",
 					"@executable_path/../../Frameworks",
 				);
-				MARKETING_VERSION = 4.9.2;
+				MARKETING_VERSION = 4.9.3;
 				ONLY_ACTIVE_ARCH = YES;
 				OTHER_LDFLAGS = "";
 				SDKROOT = iphoneos;

+ 12 - 7
iOSClient/AppDelegate.swift

@@ -685,7 +685,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     func requestAccount() {
 
-        if isPasscodePresented() { return }
+        if isPasscodePresented { return }
         if !NCKeychain().accountRequest { return }
 
         let accounts = NCManageDatabase.shared.getAllAccount()
@@ -727,6 +727,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         return passcodeCounterFail > 0 && passcodeCounterFail.isMultiple(of: 3)
     }
 
+    var isPasscodePresented: Bool {
+        return privacyProtectionWindow?.rootViewController?.presentedViewController is TOPasscodeViewController
+    }
+
     func presentPasscode(completion: @escaping () -> Void) {
 
         var error: NSError?
@@ -760,10 +764,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         })
     }
 
-    func isPasscodePresented() -> Bool {
-        return privacyProtectionWindow?.rootViewController?.presentedViewController is TOPasscodeViewController
-    }
-
     func enableTouchFaceID() {
         guard !account.isEmpty,
               NCKeychain().touchFaceID,
@@ -790,8 +790,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
                     if let error = evaluateError {
                         switch error._code {
                         case LAError.userFallback.rawValue, LAError.authenticationFailed.rawValue:
-                            NCKeychain().passcodeCounterFail = 3
-                            NCKeychain().passcodeCounterFailReset += 1
+                            if LAContext().biometryType == .faceID {
+                                NCKeychain().passcodeCounterFail = 2
+                                NCKeychain().passcodeCounterFailReset += 2
+                            } else {
+                                NCKeychain().passcodeCounterFail = 3
+                                NCKeychain().passcodeCounterFailReset += 3
+                            }
                             self.openAlert(passcodeViewController: passcodeViewController)
                         case LAError.biometryLockout.rawValue:
                             LAContext().evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: NSLocalizedString("_deviceOwnerAuthentication_", comment: ""), reply: { success, _ in

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

@@ -74,7 +74,7 @@ extension UIAlertController {
             object: alertController.textFields?.first,
             queue: .main) { _ in
                 guard let text = alertController.textFields?.first?.text else { return }
-                let folderName = NCUtility().removeForbiddenCharacters(text).trimmingCharacters(in: .whitespaces)
+                let folderName = text.trimmingCharacters(in: .whitespaces)
                 okAction.isEnabled = !folderName.isEmpty && folderName != "." && folderName != ".."
             }
 

+ 3 - 12
iOSClient/Media/NCMedia.swift

@@ -160,22 +160,13 @@ class NCMedia: UIViewController, NCEmptyDataSetDelegate, NCSelectDelegate {
 
         guard let userInfo = notification.userInfo as NSDictionary?,
               let error = userInfo["error"] as? NKError else { return }
-        let onlyLocalCache: Bool = userInfo["onlyLocalCache"] as? Bool ?? false
 
         NCImageCache.shared.getMediaMetadatas(account: appDelegate.account, predicate: getPredicate())
 
-        if error == .success, let indexPath = userInfo["indexPath"] as? [IndexPath], !indexPath.isEmpty, !onlyLocalCache {
-            collectionView?.performBatchUpdates({
-                collectionView?.deleteItems(at: indexPath)
-            }, completion: { _ in
-                self.collectionView?.reloadData()
-            })
-        } else {
-            if error != .success {
-                NCContentPresenter().showError(error: error)
-            }
-            self.collectionView?.reloadData()
+        if error != .success {
+            NCContentPresenter().showError(error: error)
         }
+        self.collectionView?.reloadData()
 
         if let hud = userInfo["hud"] as? JGProgressHUD {
             hud.dismiss()

+ 5 - 1
iOSClient/NCGlobal.swift

@@ -253,7 +253,6 @@ class NCGlobal: NSObject {
     @objc let errorE2EENoUserFound: Int             = -98015
     @objc let errorE2EEUploadInProgress: Int        = -98016
 
-
     // Constants to identify the different permissions of a file
     //
     @objc let permissionShared                      = "S"
@@ -482,5 +481,10 @@ class NCGlobal: NSObject {
     let moreAppsUrl                                             = "itms-apps://search.itunes.apple.com/WebObjects/MZSearch.woa/wa/search?media=software&term=nextcloud"
 
     // SNAPSHOT PREVIEW
+    //
     let defaultSnapshotConfiguration = "DefaultPreviewConfiguration"
+
+    // FORBIDDEN CHARACTERS
+    //
+    let forbiddenCharacters = ["/", "\\", ":", "\"", "|", "?", "*", "<", ">"]
 }

+ 7 - 1
iOSClient/Networking/E2EE/NCNetworkingE2EECreateFolder.swift

@@ -34,9 +34,15 @@ class NCNetworkingE2EECreateFolder: NSObject {
 
     func createFolder(fileName: String, serverUrl: String, account: String, urlBase: String, userId: String, withPush: Bool) async -> NKError {
 
+        var fileNameFolder = utility.removeForbiddenCharacters(fileName)
+        if fileName != fileNameFolder {
+            let errorDescription = String(format: NSLocalizedString("_forbidden_characters_", comment: ""), NCGlobal.shared.forbiddenCharacters.joined(separator: " "))
+            let error = NKError(errorCode: NCGlobal.shared.errorConflict, errorDescription: errorDescription)
+            return error
+        }
         let fileNameIdentifier = networkingE2EE.generateRandomIdentifier()
         let serverUrlFileName = serverUrl + "/" + fileNameIdentifier
-        let fileNameFolder = utilityFileSystem.createFileName(utility.removeForbiddenCharacters(fileName), serverUrl: serverUrl, account: account)
+        fileNameFolder = utilityFileSystem.createFileName(fileNameFolder, serverUrl: serverUrl, account: account)
         if fileNameFolder.isEmpty {
             return NKError(errorCode: NCGlobal.shared.errorUnexpectedResponseFromDB, errorDescription: NSLocalizedString("_e2e_error_", comment: ""))
         }

+ 12 - 1
iOSClient/Networking/NCNetworking.swift

@@ -1253,6 +1253,11 @@ class NCNetworking: NSObject, NKCommonDelegate {
     private func createFolderPlain(fileName: String, serverUrl: String, account: String, urlBase: String, overwrite: Bool, withPush: Bool, completion: @escaping (_ error: NKError) -> Void) {
 
         var fileNameFolder = utility.removeForbiddenCharacters(fileName)
+        if fileName != fileNameFolder {
+            let errorDescription = String(format: NSLocalizedString("_forbidden_characters_", comment: ""), NCGlobal.shared.forbiddenCharacters.joined(separator: " "))
+            let error = NKError(errorCode: NCGlobal.shared.errorConflict, errorDescription: errorDescription)
+            return completion(error)
+        }
 
         if !overwrite {
             fileNameFolder = utilityFileSystem.createFileName(fileNameFolder, serverUrl: serverUrl, account: account)
@@ -1545,7 +1550,13 @@ class NCNetworking: NSObject, NKCommonDelegate {
         if !metadata.permissions.isEmpty && !permission {
             return completion(NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_no_permission_modify_file_"))
         }
-        let fileNameNew = utility.removeForbiddenCharacters(fileNameNew)
+        let fileName = utility.removeForbiddenCharacters(fileNameNew)
+        if fileName != fileNameNew {
+            let errorDescription = String(format: NSLocalizedString("_forbidden_characters_", comment: ""), NCGlobal.shared.forbiddenCharacters.joined(separator: " "))
+            let error = NKError(errorCode: NCGlobal.shared.errorConflict, errorDescription: errorDescription)
+            return completion(error)
+        }
+        let fileNameNew = fileName
         if fileNameNew.isEmpty || fileNameNew == metadata.fileNameView {
             return completion(NKError())
         }

+ 3 - 2
iOSClient/Networking/NCNetworkingProcessUpload.swift

@@ -101,6 +101,7 @@ class NCNetworkingProcessUpload: NSObject {
         let queue = DispatchQueue.global()
         var maxConcurrentOperationUpload = NCBrandOptions.shared.maxConcurrentOperationUpload
         let viewController = appDelegate.window?.rootViewController
+        let hudView = viewController?.view
         let hud = JGProgressHUD()
 
         queue.async {
@@ -174,7 +175,7 @@ class NCNetworkingProcessUpload: NSObject {
                                 }
 
                                 if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
-                                    NCNetworking.shared.upload(metadata: metadata, hudView: self.appDelegate.window?.rootViewController?.view)
+                                    NCNetworking.shared.upload(metadata: metadata, hudView: hudView)
                                     if isInDirectoryE2EE || metadata.chunk > 0 {
                                         maxConcurrentOperationUpload = 1
                                     }
@@ -224,7 +225,7 @@ class NCNetworkingProcessUpload: NSObject {
 
         DispatchQueue.main.async {
 
-            guard !self.appDelegate.isPasscodePresented() else {
+            guard !self.appDelegate.isPasscodePresented else {
                 return completition()
             }
 

+ 3 - 2
iOSClient/Settings/NCManageAutoUploadFileName.swift

@@ -144,7 +144,7 @@ class NCManageAutoUploadFileName: XLFormViewController {
         super.formRowDescriptorValueHasChanged(formRow, oldValue: oldValue, newValue: newValue)
 
         if formRow.tag == "addFileNameType" {
-            NCKeychain().setFileNameType(key: NCGlobal.shared.keyFileNameAutoUploadType, prefix: (formRow.value! as AnyObject).boolValue) 
+            NCKeychain().setFileNameType(key: NCGlobal.shared.keyFileNameAutoUploadType, prefix: (formRow.value! as AnyObject).boolValue)
             self.reloadForm()
         } else if formRow.tag == "maintainOriginalFileName" {
             NCKeychain().setOriginalFileName(key: NCGlobal.shared.keyFileNameOriginalAutoUpload, value: (formRow.value! as AnyObject).boolValue)
@@ -171,7 +171,8 @@ class NCManageAutoUploadFileName: XLFormViewController {
 
                     self.reloadFormRow(formRow)
 
-                    let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_forbidden_characters_")
+                    let errorDescription = String(format: NSLocalizedString("_forbidden_characters_", comment: ""), NCGlobal.shared.forbiddenCharacters.joined(separator: " "))
+                    let error = NKError(errorCode: NCGlobal.shared.errorConflict, errorDescription: errorDescription)
                     NCContentPresenter().showInfo(error: error)
                 }
             }

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

@@ -477,7 +477,7 @@
 "_connection_internet_offline_" = "The internet connection appears to be offline or Wi-Fi is required";
 "_insert_password_"             = "Enter password";
 "_update_in_progress_"          = "Version upgrade, please wait …";
-"_forbidden_characters_"        = "The file or folder name contains invalid characters";
+"_forbidden_characters_"        = "Forbidden characters: %@";
 "_cannot_send_mail_error_"      = "No account set up, or wrong email address entered";
 "_open_url_error_"              = "Cannot open the URL for this action";
 "_photo_camera_"                = "Photos";
@@ -686,7 +686,6 @@
 "_filename_"                        = "Filename";
 "_enter_filename_"                  = "Enter filename …";
 "_preview_filename_"                = "Example preview of filename. You can use the mask %@ for date/time";
-"_forbidden_characters_"            = "Invalid character in filename";
 "_add_filenametype_"                = "Specify type in filename";
 "_filenametype_photo_video_"        = "Photo/Video";
 "_maintain_original_filename_"      = "Maintain original filename";

+ 1 - 3
iOSClient/Utility/NCUtility.swift

@@ -349,9 +349,7 @@ class NCUtility: NSObject {
     func removeForbiddenCharacters(_ fileName: String) -> String {
 
         var fileName = fileName
-        let arrayForbiddenCharacters = ["/"]
-
-        for character in arrayForbiddenCharacters {
+        for character in NCGlobal.shared.forbiddenCharacters {
             fileName = fileName.replacingOccurrences(of: character, with: "")
         }
         return fileName