Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 61 additions & 40 deletions iOSClient/Login/NCLogin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate {

private var p12Data: Data?
private var p12Password: String?
private var QRCodeCheck: Bool = false

// MARK: - View Life Cycle

Expand Down Expand Up @@ -221,12 +222,16 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate {

// AppConfig
if let url = configServerUrl {
if let user = self.configUsername, let password = configAppPassword {
return createAccount(urlBase: url, user: user, password: password)
} else if let user = self.configUsername, let password = configPassword {
return getAppPassword(urlBase: url, user: user, password: password)
} else {
urlBase = url
Task {
if let user = self.configUsername, let password = configAppPassword {
await createAccount(urlBase: url, user: user, password: password)
return
} else if let user = self.configUsername, let password = configPassword {
await getAppPassword(urlBase: url, user: user, password: password)
return
} else {
urlBase = url
}
}
}
}
Expand Down Expand Up @@ -375,45 +380,63 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate {
// MARK: - QRCode

func dismissQRCode(_ value: String?, metadataType: String?) {
guard var value = value else { return }
let protocolLogin = NCBrandOptions.shared.webLoginAutenticationProtocol + "login/"
if value.hasPrefix(protocolLogin) && value.contains("user:") && value.contains("password:") && value.contains("server:") {
value = value.replacingOccurrences(of: protocolLogin, with: "")
let valueArray = value.components(separatedBy: "&")
if valueArray.count == 3 {
let user = valueArray[0].replacingOccurrences(of: "user:", with: "")
let password = valueArray[1].replacingOccurrences(of: "password:", with: "")
let urlBase = valueArray[2].replacingOccurrences(of: "server:", with: "")
let serverUrl = urlBase + "/remote.php/dav"
loginButton.isEnabled = false
NextcloudKit.shared.checkServer(serverUrl: serverUrl) { _, error in
self.loginButton.isEnabled = true
if error == .success {
self.createAccount(urlBase: urlBase, user: user, password: password)
} else {
let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: error.errorDescription, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default, handler: { _ in }))
self.present(alertController, animated: true)
}
}
}
guard let value, !QRCodeCheck else {
return
}
}
QRCodeCheck = true

private func getAppPassword(urlBase: String, user: String, password: String) {
NextcloudKit.shared.getAppPassword(url: urlBase, user: user, password: password) { token, _, error in
if error == .success, let password = token {
self.createAccount(urlBase: urlBase, user: user, password: password)
Task { @MainActor in
let protocolLogin = NCBrandOptions.shared.webLoginAutenticationProtocol + "login/"
let protocolLoginOneTime = NCBrandOptions.shared.webLoginAutenticationProtocol + "onetime-login/"
var parameters: String = ""

if value.hasPrefix(protocolLoginOneTime) {
parameters = value.replacingOccurrences(of: protocolLoginOneTime, with: "")
} else if value.hasPrefix(protocolLogin) {
parameters = value.replacingOccurrences(of: protocolLogin, with: "")
} else {
Task {
await showErrorBanner(controller: self.controller, text: error.errorDescription, errorCode: error.errorCode)
QRCodeCheck = false
return
}

guard parameters.contains("user:"),
parameters.contains("password:"),
parameters.contains("server:") else {
QRCodeCheck = false
return
}
let parametersArray = parameters.components(separatedBy: "&")
let user = parametersArray[0].replacingOccurrences(of: "user:", with: "")
let password = parametersArray[1].replacingOccurrences(of: "password:", with: "")
let server = parametersArray[2].replacingOccurrences(of: "server:", with: "")

if value.hasPrefix(protocolLoginOneTime) {
let results = await NextcloudKit.shared.getAppPasswordOnetimeAsync(url: server, user: user, onetimeToken: password)
if results.error == .success, let token = results.token {
await createAccount(urlBase: server, user: user, password: token)
} else {
await showErrorBanner(controller: self.controller, text: results.error.errorDescription, errorCode: results.error.errorCode)
dismiss(animated: true, completion: nil)
}
self.dismiss(animated: true, completion: nil)
} else if value.hasPrefix(protocolLogin) {
await self.createAccount(urlBase: server, user: user, password: password)
}
}
}

private func createAccount(urlBase: String, user: String, password: String) {
private func getAppPassword(urlBase: String, user: String, password: String) async {
let results = await NextcloudKit.shared.getAppPasswordAsync(url: urlBase, user: user, password: password)

if results.error == .success, let password = results.token {
await self.createAccount(urlBase: urlBase, user: user, password: password)
} else {
await showErrorBanner(controller: self.controller, text: results.error.errorDescription, errorCode: results.error.errorCode)
dismiss(animated: true, completion: nil)
}
}

@MainActor
private func createAccount(urlBase: String, user: String, password: String) async {
if self.controller == nil {
self.controller = UIApplication.shared.mainAppWindow?.rootViewController as? NCMainTabBarController
}
Expand All @@ -422,9 +445,7 @@ class NCLogin: UIViewController, UITextFieldDelegate, NCLoginQRCodeDelegate {
NCNetworking.shared.writeCertificate(host: host)
}

Task {
await NCAccount().createAccount(viewController: self, urlBase: urlBase, user: user, password: password, controller: self.controller)
}
await NCAccount().createAccount(viewController: self, urlBase: urlBase, user: user, password: password, controller: self.controller)
}
}

Expand Down
Loading