diff --git a/LeStorage/Services.swift b/LeStorage/Services.swift index 871dea9..d65c9d3 100644 --- a/LeStorage/Services.swift +++ b/LeStorage/Services.swift @@ -83,6 +83,10 @@ public class Services { var request = URLRequest(url: url) request.httpMethod = method.rawValue request.setValue("application/json", forHTTPHeaderField: "Content-Type") +// if let token = try? self.keychainStore.getToken() { +// request.addValue("Token \(token)", forHTTPHeaderField: "Authorization") +// } + return request } @@ -124,22 +128,31 @@ public class Services { let user = User(username: username, password: password, email: email) postRequest.httpBody = try jsonEncoder.encode(user) let _: User = try await self.runRequest(postRequest) - let _ = try await requestToken(user: user) + let _ = try await requestToken(username: username, password: password) } - func requestToken(user: User) async throws -> String { - var postRequest = try self._baseRequest(servicePath: "api-token-auth/", method: .post) - postRequest.httpBody = try jsonEncoder.encode(user) + func requestToken(username: String, password: String) async throws -> String { + var postRequest = try self._baseRequest(servicePath: "plus/api-token-auth/", method: .post) + let credentials = Credentials(username: username, password: password) + postRequest.httpBody = try jsonEncoder.encode(credentials) let response: AuthResponse = try await self.runRequest(postRequest) - try self.keychainStore.add(username: user.username, token: response.token) + do { + try self.keychainStore.add(username: username, token: response.token) + } catch { + Logger.error(error) + } return response.token } public func login(username: String, password: String) async throws -> User { - var postRequest = try self._baseRequest(servicePath: "users/", method: .post) - let credentials = Credentials(username: username, password: password) - postRequest.httpBody = try jsonEncoder.encode(credentials) - return try await self.runRequest(postRequest) + let token: String = try await requestToken(username: username, password: password) + Logger.log("token = \(token)") + var postRequest = try self._baseRequest(servicePath: "plus/user-by-token/", method: .post) + postRequest.httpBody = try jsonEncoder.encode(Token(token: token)) + let user: User = try await self.runRequest(postRequest) + Logger.log("user = \(user.username), id = \(user.id)") + Store.main.setUserUUID(uuidString: user.id) + return user } func forgotPassword(user: User) async throws { @@ -150,8 +163,6 @@ public class Services { // let _ = try await requestToken(credentials: credentials) // return response } - - } @@ -164,6 +175,10 @@ struct Credentials: Codable { var password: String } +struct Token: Codable { + var token: String +} + public struct User: Codable { var id: String = Store.randomId() var username: String diff --git a/LeStorage/Store.swift b/LeStorage/Store.swift index 75def72..fec4a6a 100644 --- a/LeStorage/Store.swift +++ b/LeStorage/Store.swift @@ -87,6 +87,12 @@ public class Store { } } + func setUserUUID(uuidString: String) { + self.settingsStorage.update { settings in + settings.userUUID = UUID(uuidString: uuidString) + } + } + /// The service instance public var service: Services? { return self._services diff --git a/LeStorage/Utils/KeychainStore.swift b/LeStorage/Utils/KeychainStore.swift index 5e0d8c4..db775cf 100644 --- a/LeStorage/Utils/KeychainStore.swift +++ b/LeStorage/Utils/KeychainStore.swift @@ -28,7 +28,7 @@ class KeychainStore { kSecAttrServer as String: self.serverId, kSecValueData as String: tokenData] - let status = SecItemAdd(query as CFDictionary, nil) + let status: OSStatus = SecItemAdd(query as CFDictionary, nil) guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) } } @@ -41,7 +41,7 @@ class KeychainStore { kSecReturnData as String: true] var item: CFTypeRef? - let status = SecItemCopyMatching(query as CFDictionary, &item) + let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &item) guard status != errSecItemNotFound else { throw KeychainError.noPassword } guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) } @@ -59,7 +59,7 @@ class KeychainStore { let query: [String: Any] = [kSecClass as String: kSecClassInternetPassword, kSecAttrServer as String: self.serverId] - let status = SecItemDelete(query as CFDictionary) + let status: OSStatus = SecItemDelete(query as CFDictionary) guard status == errSecSuccess || status == errSecItemNotFound else { throw KeychainError.unhandledError(status: status) } }