Skip to content

Commit 788be30

Browse files
MBL-1382: Log more detailed errors when keychain fails (#2631)
1 parent 305c87c commit 788be30

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

Library/AppEnvironment.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,14 @@ public struct AppEnvironment: AppEnvironmentType {
335335
)
336336
}
337337

338+
private static func logKeychainError(_ error: KeychainError) {
339+
Crashlytics.crashlytics().record(error: error.nsError)
340+
}
341+
342+
private static func logUnknownError(_ error: Error) {
343+
Crashlytics.crashlytics().record(error: error)
344+
}
345+
338346
internal static let accountNameForKeychain = "kickstarter_currently_logged_in_user"
339347

340348
private static func storeOAuthTokenToKeychain(_ oauthToken: String) -> Bool {
@@ -346,8 +354,10 @@ public struct AppEnvironment: AppEnvironmentType {
346354
do {
347355
try Keychain.storePassword(oauthToken, forAccount: self.accountNameForKeychain)
348356
return true
357+
} catch let error as KeychainError {
358+
logKeychainError(error)
349359
} catch {
350-
Crashlytics.crashlytics().record(error: error)
360+
self.logUnknownError(error)
351361
}
352362

353363
return false
@@ -361,8 +371,10 @@ public struct AppEnvironment: AppEnvironmentType {
361371

362372
do {
363373
return try Keychain.fetchPassword(forAccount: self.accountNameForKeychain)
374+
} catch let error as KeychainError {
375+
logKeychainError(error)
364376
} catch {
365-
Crashlytics.crashlytics().record(error: error)
377+
self.logUnknownError(error)
366378
}
367379

368380
return nil
@@ -374,8 +386,10 @@ public struct AppEnvironment: AppEnvironmentType {
374386
do {
375387
try Keychain.deletePassword(forAccount: self.accountNameForKeychain)
376388
return true
389+
} catch let error as KeychainError {
390+
logKeychainError(error)
377391
} catch {
378-
Crashlytics.crashlytics().record(error: error)
392+
self.logUnknownError(error)
379393
}
380394

381395
return false

Library/Keychain.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public enum KeychainError: Error {
55
case unexpectedStatus(OSStatus)
66
case unableToDecodePasswordData
77

8-
public var errorMessage: String {
8+
private var errorMessage: String {
99
switch self {
1010
case let .unexpectedStatus(status):
1111
let errString = SecCopyErrorMessageString(status, nil) as String?
@@ -14,6 +14,25 @@ public enum KeychainError: Error {
1414
return "Unable to decode password data from keychain."
1515
}
1616
}
17+
18+
private var errorCode: Int {
19+
switch self {
20+
case let .unexpectedStatus(status):
21+
return Int(status)
22+
case .unableToDecodePasswordData:
23+
return -999
24+
}
25+
}
26+
27+
public var nsError: NSError {
28+
return NSError(
29+
domain: "Library.KeychainError",
30+
code: self.errorCode,
31+
userInfo: [
32+
NSLocalizedDescriptionKey: self.errorMessage
33+
]
34+
)
35+
}
1736
}
1837

1938
public struct Keychain {

0 commit comments

Comments
 (0)