Retry authentication if connection timed out

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2024-09-30 13:52:18 +08:00
parent ad2a2c40d8
commit 9f9bcf0045

View file

@ -19,6 +19,10 @@ import NextcloudKit
import NextcloudFileProviderKit
import OSLog
let AuthenticationTimeouts: [UInt64] = [ // Have progressively longer timeouts to not hammer server
3_000_000_000, 6_000_000_000, 30_000_000_000, 60_000_000_000, 120_000_000_000, 300_000_000_000
]
extension FileProviderExtension: NSFileProviderServicing, ChangeNotificationInterface {
/*
This FileProviderExtension extension contains everything needed to communicate with the client.
@ -120,7 +124,17 @@ extension FileProviderExtension: NSFileProviderServicing, ChangeNotificationInte
ncKit.setup(delegate: changeObserver)
Task {
switch (await ncKit.tryAuthenticationAttempt()) {
var authAttemptState = AuthenticationAttemptResultState.connectionError // default
for authTimeout in AuthenticationTimeouts { // Retry if we have a connection issue
authAttemptState = await ncKit.tryAuthenticationAttempt()
guard authAttemptState == .connectionError else { break }
Logger.fileProviderExtension.info(
"\(user, privacy: .public) authentication try timed out. Trying again soon."
)
try? await Task.sleep(nanoseconds: authTimeout)
}
switch (authAttemptState) {
case .authenticationError:
Logger.fileProviderExtension.info(
"\(user, privacy: .public) authentication failed due to bad creds, stopping"