Skip to content

Commit 5c1ec8f

Browse files
committed
Session > SessionManager
1 parent 2953b58 commit 5c1ec8f

File tree

2 files changed

+94
-59
lines changed

2 files changed

+94
-59
lines changed

WooCommerce/Classes/System/Session.swift

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import Foundation
2+
import Networking
3+
import KeychainAccess
4+
5+
6+
7+
/// SessionManager provides persistent storage for Session-Y Properties.
8+
///
9+
struct SessionManager {
10+
11+
/// Reference to the UserDefaults Instance that should be used.
12+
///
13+
private let defaults: UserDefaults
14+
15+
/// KeychainAccess Wrapper.
16+
///
17+
private let keychain: Keychain
18+
19+
/// Active Credentials.
20+
///
21+
var credentials: Credentials? {
22+
get {
23+
return loadCredentials()
24+
}
25+
set {
26+
guard let credentials = newValue else {
27+
removeCredentials()
28+
return
29+
}
30+
31+
saveCredentials(credentials)
32+
}
33+
}
34+
35+
/// Active Store's Site ID.
36+
///
37+
var storeID: Int? {
38+
get {
39+
return defaults[.defaultStoreID]
40+
}
41+
set {
42+
defaults[.defaultStoreID] = storeID
43+
}
44+
}
45+
46+
47+
/// Designated Initializer.
48+
///
49+
init(defaults: UserDefaults, keychainServiceName: String) {
50+
self.defaults = defaults
51+
self.keychain = Keychain(service: keychainServiceName).accessibility(.afterFirstUnlock)
52+
}
53+
54+
/// Nukes all of the known Session's properties.
55+
///
56+
mutating func reset() {
57+
credentials = nil
58+
storeID = nil
59+
}
60+
}
61+
62+
63+
// MARK: - Private Methods
64+
//
65+
private extension SessionManager {
66+
67+
/// Returns the Default Credentials, if any.
68+
///
69+
func loadCredentials() -> Credentials? {
70+
guard let username = defaults[.defaultUsername] as? String, let authToken = keychain[username] else {
71+
return nil
72+
}
73+
74+
return Credentials(username: username, authToken: authToken)
75+
}
76+
77+
/// Persists the Credentials's authToken in the keychain, and username in User Settings.
78+
///
79+
func saveCredentials(_ credentials: Credentials) {
80+
defaults[.defaultUsername] = credentials.username
81+
keychain[credentials.username] = credentials.authToken
82+
}
83+
84+
/// Nukes both, the AuthToken and Default Username.
85+
///
86+
func removeCredentials() {
87+
guard let username = defaults[.defaultUsername] as? String else {
88+
return
89+
}
90+
91+
keychain[username] = nil
92+
defaults[.defaultUsername] = nil
93+
}
94+
}

0 commit comments

Comments
 (0)