From 85cb35fdba23bfdfa7298d43f52abd5beea40953 Mon Sep 17 00:00:00 2001 From: Maximilian Bauer Date: Tue, 23 Feb 2021 23:52:56 +0100 Subject: [PATCH] LoginVC: detailed login error messages --- Amperfy/Api/Ampache/AmpacheXmlServerApi.swift | 5 ++ Amperfy/Api/BackendProxy.swift | 49 +++++++++++++++++-- Amperfy/Screens/ViewController/LoginVC.swift | 13 ++++- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/Amperfy/Api/Ampache/AmpacheXmlServerApi.swift b/Amperfy/Api/Ampache/AmpacheXmlServerApi.swift index 9b3f91c5..77bd6bde 100755 --- a/Amperfy/Api/Ampache/AmpacheXmlServerApi.swift +++ b/Amperfy/Api/Ampache/AmpacheXmlServerApi.swift @@ -102,6 +102,11 @@ class AmpacheXmlServerApi { let curDelegate = AuthParserDelegate() parser.delegate = curDelegate let success = parser.parse() + if let error = parser.parserError { + authHandshake = nil + os_log("Error during AuthPars: %s", log: log, type: .error, error.localizedDescription) + return + } if success && curDelegate.authHandshake != nil { authHandshake = curDelegate.authHandshake } else { diff --git a/Amperfy/Api/BackendProxy.swift b/Amperfy/Api/BackendProxy.swift index e8a00d53..16e35af5 100644 --- a/Amperfy/Api/BackendProxy.swift +++ b/Amperfy/Api/BackendProxy.swift @@ -15,8 +15,16 @@ enum BackenApiType: Int { } } -enum AuthenticationError: Error { - case notAbleToLogin +struct AuthenticationError: Error { + enum ErrorKind { + case notAbleToLogin + case invalidUrl + case requestStatusError + case downloadError + } + + var message: String = "" + let kind: ErrorKind } class BackendProxy { @@ -52,6 +60,7 @@ class BackendProxy { }() func login(credentials: LoginCredentials) throws -> BackenApiType { + try checkServerReachablity(credentials: credentials) ampacheApi.authenticate(credentials: credentials) if ampacheApi.isAuthenticated() { selectedApi = .ampache @@ -62,7 +71,41 @@ class BackendProxy { selectedApi = .subsonic return .subsonic } - throw AuthenticationError.notAbleToLogin + throw AuthenticationError(kind: .notAbleToLogin) + } + + private func checkServerReachablity(credentials: LoginCredentials) throws { + guard let serverUrl = URL(string: credentials.serverUrl) else { + throw AuthenticationError(kind: .invalidUrl) + } + + let group = DispatchGroup() + group.enter() + + let sessionConfig = URLSessionConfiguration.default + let session = URLSession(configuration: sessionConfig) + let request = URLRequest(url: serverUrl) + var downloadError: AuthenticationError? = nil + let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in + if let error = error { + downloadError = AuthenticationError(message: error.localizedDescription, kind: .downloadError) + } else { + if let statusCode = (response as? HTTPURLResponse)?.statusCode { + if statusCode > 400 { + downloadError = AuthenticationError(message: "\(statusCode)", kind: .requestStatusError) + } else { + os_log("Server url is reachable. Status code: %d", log: self.log, type: .info, statusCode) + } + } + } + group.leave() + } + task.resume() + group.wait() + + if let error = downloadError { + throw error + } } } diff --git a/Amperfy/Screens/ViewController/LoginVC.swift b/Amperfy/Screens/ViewController/LoginVC.swift index 55bbd000..4e3a7be0 100644 --- a/Amperfy/Screens/ViewController/LoginVC.swift +++ b/Amperfy/Screens/ViewController/LoginVC.swift @@ -52,8 +52,19 @@ class LoginVC: UIViewController { credentials.backendApi = authenticatedApi appDelegate.storage.saveLoginCredentials(credentials: credentials) performSegue(withIdentifier: "toSync", sender: self) + } catch let e as AuthenticationError { + switch e.kind { + case .notAbleToLogin: + showErrorMsg(message: "Not able to login, please check credentials!") + case .invalidUrl: + showErrorMsg(message: "Server url is invalid!") + case .requestStatusError: + showErrorMsg(message: "Requesting server url finished with status response error code '\(e.message)'!") + case .downloadError: + showErrorMsg(message: e.message) + } } catch { - showErrorMsg(message: "Not able to login, please check credentials!") + showErrorMsg(message: "Not able to login!") } }