Login Procedure updated (login via in-app browser)
This commit is contained in:
Binary file not shown.
@@ -1018,6 +1018,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Done" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Downloads" : {
|
"Downloads" : {
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import WebKit
|
||||||
|
|
||||||
enum V2LoginStage: LoginStage {
|
enum V2LoginStage: LoginStage {
|
||||||
case login, validate
|
case login, validate
|
||||||
@@ -34,6 +35,7 @@ struct V2LoginView: View {
|
|||||||
|
|
||||||
@State var loginStage: V2LoginStage = .login
|
@State var loginStage: V2LoginStage = .login
|
||||||
@State var loginRequest: LoginV2Request? = nil
|
@State var loginRequest: LoginV2Request? = nil
|
||||||
|
@State var presentBrowser = false
|
||||||
|
|
||||||
// TextField handling
|
// TextField handling
|
||||||
enum Field {
|
enum Field {
|
||||||
@@ -84,7 +86,8 @@ struct V2LoginView: View {
|
|||||||
showAlert = true
|
showAlert = true
|
||||||
}
|
}
|
||||||
if let loginRequest = loginRequest {
|
if let loginRequest = loginRequest {
|
||||||
await UIApplication.shared.open(URL(string: loginRequest.login)!)
|
presentBrowser = true
|
||||||
|
//await UIApplication.shared.open(URL(string: loginRequest.login)!)
|
||||||
} else {
|
} else {
|
||||||
alertMessage = "Unable to reach server. Please check your server address and internet connection."
|
alertMessage = "Unable to reach server. Please check your server address and internet connection."
|
||||||
showAlert = true
|
showAlert = true
|
||||||
@@ -110,26 +113,7 @@ struct V2LoginView: View {
|
|||||||
// fetch login v2 response
|
// fetch login v2 response
|
||||||
Task {
|
Task {
|
||||||
let (response, error) = await fetchLoginV2Response()
|
let (response, error) = await fetchLoginV2Response()
|
||||||
|
checkLogin(response: response, error: error)
|
||||||
if let error = error {
|
|
||||||
alertMessage = "Login failed. Please login via the browser and try again. (\(error.rawValue))"
|
|
||||||
showAlert = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
guard let response = response else {
|
|
||||||
alertMessage = "Login failed. Please login via the browser and try again."
|
|
||||||
showAlert = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
print("Login successful for user \(response.loginName)!")
|
|
||||||
UserSettings.shared.username = response.loginName
|
|
||||||
UserSettings.shared.token = response.appPassword
|
|
||||||
let loginString = "\(UserSettings.shared.username):\(UserSettings.shared.token)"
|
|
||||||
let loginData = loginString.data(using: String.Encoding.utf8)!
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
UserSettings.shared.authString = loginData.base64EncodedString()
|
|
||||||
}
|
|
||||||
UserSettings.shared.onboarding = false
|
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Text("Validate")
|
Text("Validate")
|
||||||
@@ -148,6 +132,16 @@ struct V2LoginView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sheet(isPresented: $presentBrowser, onDismiss: {
|
||||||
|
Task {
|
||||||
|
let (response, error) = await fetchLoginV2Response()
|
||||||
|
checkLogin(response: response, error: error)
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
if let loginRequest = loginRequest {
|
||||||
|
WebViewSheet(url: loginRequest.login)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendLoginV2Request() async -> NetworkError? {
|
func sendLoginV2Request() async -> NetworkError? {
|
||||||
@@ -160,4 +154,58 @@ struct V2LoginView: View {
|
|||||||
guard let loginRequest = loginRequest else { return (nil, .parametersNil) }
|
guard let loginRequest = loginRequest else { return (nil, .parametersNil) }
|
||||||
return await NextcloudApi.loginV2Response(req: loginRequest)
|
return await NextcloudApi.loginV2Response(req: loginRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkLogin(response: LoginV2Response?, error: NetworkError?) {
|
||||||
|
if let error = error {
|
||||||
|
alertMessage = "Login failed. Please login via the browser and try again. (\(error.rawValue))"
|
||||||
|
showAlert = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard let response = response else {
|
||||||
|
alertMessage = "Login failed. Please login via the browser and try again."
|
||||||
|
showAlert = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
print("Login successful for user \(response.loginName)!")
|
||||||
|
UserSettings.shared.username = response.loginName
|
||||||
|
UserSettings.shared.token = response.appPassword
|
||||||
|
let loginString = "\(UserSettings.shared.username):\(UserSettings.shared.token)"
|
||||||
|
let loginData = loginString.data(using: String.Encoding.utf8)!
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
UserSettings.shared.authString = loginData.base64EncodedString()
|
||||||
|
}
|
||||||
|
UserSettings.shared.onboarding = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Login WebView logic
|
||||||
|
|
||||||
|
struct WebViewSheet: View {
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
|
@State var url: String
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
NavigationView {
|
||||||
|
WebView(url: URL(string: url)!)
|
||||||
|
.navigationBarTitle(Text("Nextcloud Login"), displayMode: .inline)
|
||||||
|
.navigationBarItems(trailing: Button("Done") {
|
||||||
|
dismiss()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WebView: UIViewRepresentable {
|
||||||
|
let url: URL
|
||||||
|
|
||||||
|
func makeUIView(context: Context) -> WKWebView {
|
||||||
|
return WKWebView()
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIView(_ uiView: WKWebView, context: Context) {
|
||||||
|
let request = URLRequest(url: url)
|
||||||
|
uiView.load(request)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user