]> dgit.raspbian.org Git - nextcloud-desktop.git/commitdiff
Properly respond to errors in working set enumerateItems in FileProviderEnumerator
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 14 Mar 2023 15:06:20 +0000 (16:06 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:33 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index c7ef8d7b6b6a8b3bc209535b71536b09a0216fb4..22b096ada18257403fad56a2836336a2a93b5d09 100644 (file)
@@ -93,6 +93,7 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                 let directoryMetadatas = dbManager.directoryMetadatas(account: ncAccount.ncKitAccount)
                 var allMetadatas: [NextcloudItemMetadataTable] = []
 
+                var serverError: NKError?
                 let dispatchGroup = DispatchGroup()  // TODO: Maybe own thread?
 
                 for directoryMetadata in directoryMetadatas {
@@ -106,6 +107,13 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                     FileProviderEnumerator.readServerUrl(directoryMetadata.serverUrl, ncAccount: ncAccount, ncKit: ncKit) { metadatas, _, _, _, readError in
                         guard readError == nil else {
                             NSLog("Finishing enumeration of working set directory %@ with error %@", directoryMetadata.serverUrl, readError!.localizedDescription)
+
+                            let nkError = NKError(error: readError!)
+                            if nkError.isUnauthenticatedError || nkError.isCouldntConnectError {
+                                // If it is a critical error then stop, if not then continue
+                                serverError = nkError
+                            }
+
                             dispatchGroup.leave()
                             return
                         }
@@ -120,6 +128,11 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                     }
 
                     dispatchGroup.wait()
+                    
+                    guard serverError == nil else {
+                        observer.finishEnumeratingWithError(serverError!.error)
+                        return
+                    }
                 }
 
                 FileProviderEnumerator.completeEnumerationObserver(observer, ncKit: self.ncKit, numPage: 1, itemMetadatas: allMetadatas)