From 9095df248287c8258fc0bb923e3d477dcd3d942e Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 4 Jan 2023 21:40:30 +0100 Subject: [PATCH] Make ncAccount in FileProviderExtension an optional, make state of FileProviderDomainAccountData immediately on init Signed-off-by: Claudio Cambra --- .../FileProviderExtension.swift | 4 +- ...countData.swift => NextcloudAccount.swift} | 71 +++++++++---------- 2 files changed, 35 insertions(+), 40 deletions(-) rename shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/{FileProviderDomainNextcloudAccountData.swift => NextcloudAccount.swift} (74%) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift index dc0a83f734..5cd2136a82 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift @@ -21,7 +21,7 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension { let domain: NSFileProviderDomain let appGroupIdentifier: String? = Bundle.main.object(forInfoDictionaryKey: "SocketApiPrefix") as? String - var ncAccount: FileProviderDomainNextcloudAccountData = FileProviderDomainNextcloudAccountData() + var ncAccount: NextcloudAccount? lazy var socketClient: LocalSocketClient? = { guard let fileProviderSocketApiPrefix = appGroupIdentifier else { NSLog("Could not start file provider socket client properly as SocketApiPrefix is missing") @@ -113,6 +113,6 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension { } func setupDomainAccount(keychainAccount:String) { - ncAccount = FileProviderDomainNextcloudAccountData(withKeychainAccount:keychainAccount) + ncAccount = NextcloudAccount(withKeychainAccount:keychainAccount) } } diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderDomainNextcloudAccountData.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudAccount.swift similarity index 74% rename from shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderDomainNextcloudAccountData.swift rename to shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudAccount.swift index c1eab448d0..365bcfe624 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderDomainNextcloudAccountData.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/NextcloudAccount.swift @@ -15,28 +15,48 @@ import Foundation import FileProvider -class FileProviderDomainNextcloudAccountData: NSObject { +class NextcloudAccount: NSObject { let webDavUrlSuffix: String = "/remote.php/dav" - - private(set) var username: String? - private(set) var password: String? - private(set) var serverUrl: URL? - private(set) var davUrl: URL? + let username, password: String? + let serverUrl, davUrl: URL? var isNull: Bool { return username?.isEmpty ?? false || serverUrl?.absoluteString.isEmpty ?? false } - override init() { + init?(withKeychainAccount account:String) { + // The client sets the account field in the keychain entry as a colon-separated string consisting of + // an account's username, its homeserver url, and the id of the account + guard let passwordData = NextcloudAccount.getUserPasswordFromKeychain(accountString: account), + let passwordString = String(data: passwordData, encoding: .utf8) else { + + return nil + } + + let keychainAccountSplit = account.split(separator: ":") + let usernameSubstring = keychainAccountSplit[0] + let serverUrlSubstring = keychainAccountSplit[1] + let clientAccountIdSubstring = keychainAccountSplit[2] + + let usernameString = String(usernameSubstring) + let serverUrlString = String(serverUrlSubstring) + let clientAccountIdString = String(clientAccountIdSubstring) + + guard let serverUrlUrl = URL(string: String(serverUrlString)) else { + return nil + } + + let davUrlUrl = serverUrlUrl.appendingPathComponent(webDavUrlSuffix) + + username = usernameString + password = passwordString + serverUrl = serverUrlUrl + davUrl = davUrlUrl + super.init() } - init(withKeychainAccount account:String) { - super.init() - getAccountDetails(keychainAccount: account) - } - - static func getUserPasswordFromKeychain(accountString:String) -> Data? { + private static func getUserPasswordFromKeychain(accountString:String) -> Data? { let query = [ kSecClass as String : kSecClassGenericPassword, kSecAttrAccount as String : accountString, @@ -54,30 +74,5 @@ class FileProviderDomainNextcloudAccountData: NSObject { return nil } } - - private func getAccountDetails(keychainAccount: String) { - // The client sets the account field in the keychain entry as a colon-separated string consisting of - // an account's username, its homeserver url, and the id of the account - guard let passwordData = FileProviderDomainNextcloudAccountData.getUserPasswordFromKeychain(accountString: keychainAccount), - let passwordString = String(data: passwordData, encoding: .utf8) - else { return } - - let keychainAccountSplit = keychainAccount.split(separator: ":") - let usernameSubstring = keychainAccountSplit[0] - let serverUrlSubstring = keychainAccountSplit[1] - let clientAccountIdSubstring = keychainAccountSplit[2] - - let usernameString = String(usernameSubstring) - let serverUrlString = String(serverUrlSubstring) - let clientAccountIdString = String(clientAccountIdSubstring) - - guard let serverUrlUrl = URL(string: String(serverUrlString)) else { return } - let davUrlUrl = serverUrlUrl.appendingPathComponent(webDavUrlSuffix) - - username = usernameString - password = passwordString - serverUrl = serverUrlUrl - davUrl = davUrlUrl - } }