Make ncAccount in FileProviderExtension an optional, make state of FileProviderDomainAccountData immediately on init

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2023-01-04 21:40:30 +01:00
parent a8dfafabde
commit 9095df2482
No known key found for this signature in database
GPG Key ID: C839200C384636B0
2 changed files with 35 additions and 40 deletions

View File

@ -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)
}
}

View File

@ -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
}
}