From 58cddb88f6d48abc97d32aedc8ab83e350c7a217 Mon Sep 17 00:00:00 2001 From: Brandon Evans Date: Mon, 25 Jan 2021 19:17:44 -0700 Subject: [PATCH] Try to improve auth error messages --- Xcodes/AppleAPI/Sources/AppleAPI/Client.swift | 27 +++++++++++++------ Xcodes/Backend/AppState.swift | 3 ++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift b/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift index 18569b1..f04f069 100644 --- a/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift +++ b/Xcodes/AppleAPI/Sources/AppleAPI/Client.swift @@ -129,7 +129,7 @@ public class Client { case 400, 401: throw AuthenticationError.incorrectSecurityCode case let code: - throw AuthenticationError.badStatusCode(code, data, urlResponse) + throw AuthenticationError.badStatusCode(statusCode: code, data: data, response: urlResponse) } } .flatMap { (data, response) -> AnyPublisher in @@ -180,20 +180,31 @@ public enum AuthenticationError: Swift.Error, LocalizedError, Equatable { case appleIDAndPrivacyAcknowledgementRequired case accountUsesTwoStepAuthentication case accountUsesUnknownAuthenticationKind(String?) - case badStatusCode(Int, Data, HTTPURLResponse) + case badStatusCode(statusCode: Int, data: Data, response: HTTPURLResponse) public var errorDescription: String? { switch self { - case .invalidUsernameOrPassword(let username): - return "Invalid username and password combination. Attempted to sign in with username \(username)." + case .invalidSession: + return "Your authentication session is invalid. Try signing in again." + case .invalidUsernameOrPassword: + return "Invalid username and password combination." + case .incorrectSecurityCode: + return "The code that was entered is incorrect." + case let .unexpectedSignInResponse(statusCode, message): + return """ + Received an unexpected sign in response. If you continue to have problems, please submit a bug report in the Help menu and include the following information: + + Status code: \(statusCode) + \(message != nil ? ("Message: " + message!) : "") + """ case .appleIDAndPrivacyAcknowledgementRequired: return "You must sign in to https://appstoreconnect.apple.com and acknowledge the Apple ID & Privacy agreement." case .accountUsesTwoStepAuthentication: - return "Received a response from Apple that indicates this account has two-step authentication enabled. xcodes currently only supports the newer two-factor authentication, though. Please consider upgrading to two-factor authentication, or open an issue on GitHub explaining why this isn't an option for you here: https://github.com/RobotsAndPencils/xcodes/issues/new" + return "Received a response from Apple that indicates this account has two-step authentication enabled. xcodes currently only supports the newer two-factor authentication, though. Please consider upgrading to two-factor authentication, or explain why this isn't an option for you by making a new feature request in the Help menu." case .accountUsesUnknownAuthenticationKind: - return "Received a response from Apple that indicates this account has two-step or two-factor authentication enabled, but xcodes is unsure how to handle this response:" - default: - return String(describing: self) + return "Received a response from Apple that indicates this account has two-step or two-factor authentication enabled, but xcodes is unsure how to handle this response. If you continue to have problems, please submit a bug report in the Help menu." + case let .badStatusCode(statusCode, _, _): + return "Received an unexpected status code: \(statusCode). If you continue to have problems, please submit a bug report in the Help menu." } } } diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 087bb10..3bf6138 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -6,6 +6,7 @@ import LegibleError import KeychainAccess import Path import Version +import os.log class AppState: ObservableObject { private let client = AppleAPI.Client() @@ -181,7 +182,7 @@ class AppState: ObservableObject { try? Current.keychain.remove(username) } - // This error message is not user friendly... need to extract some meaningful data in the different cases + Logger.appState.error("Authentication error: \(error.legibleDescription)") self.authError = error case .finished: switch self.authenticationState {