@@ -41,8 +41,6 @@ public class Client {
4141 . eraseToAnyPublisher ( )
4242 }
4343 . flatMap { ( serviceKey, hashcash, srpInit) -> AnyPublisher < URLSession . DataTaskPublisher . Output , Swift . Error > in
44- print ( " SRP INIT REsponse: \( srpInit) " )
45-
4644 guard let decodedB = Data ( base64Encoded: srpInit. b) else {
4745 return Fail ( error: AuthenticationError . srpInvalidPublicKey)
4846 . eraseToAnyPublisher ( )
@@ -56,27 +54,20 @@ public class Client {
5654 let iterations = srpInit. iteration
5755
5856 do {
59-
6057 guard let encryptedPassword = self . pbkdf2 ( password: password, saltData: decodedSalt, keyByteCount: 32 , prf: CCPseudoRandomAlgorithm ( kCCPRFHmacAlgSHA256) , rounds: iterations) else {
6158 return Fail ( error: AuthenticationError . srpInvalidPublicKey)
6259 . eraseToAnyPublisher ( )
6360 }
6461
65- // let m1 = try client.processChallenge(salt: decodedSalt, publicKey: decodedB, isEncryptedPassword: true, encryptedPassword: encryptedPassword.hexEncodedString())
66- let encryptedPasswordString = encryptedPassword. base64EncodedString ( )
6762 let sharedSecret = try client. calculateSharedSecret ( password: encryptedPassword, salt: [ UInt8] ( decodedSalt) , clientKeys: clientKeys, serverPublicKey: . init( [ UInt8] ( decodedB) ) )
68- // let m1 = try client.processChallenge(salt: decodedSalt, publicKey: decodedB, encryptedPassword: encryptedPasswordString)
6963
7064 let m1 = client. calculateClientProof ( username: accountName, salt: [ UInt8] ( decodedSalt) , clientPublicKey: a, serverPublicKey: . init( [ UInt8] ( decodedB) ) , sharedSecret: . init( sharedSecret. bytes) )
7165 let m2 = client. calculateServerProof ( clientPublicKey: a, clientProof: m1, sharedSecret: . init( [ UInt8] ( sharedSecret. bytes) ) )
72- print ( " m1: \( Data ( m1) . base64EncodedString ( ) ) " )
73- print ( " m2: \( Data ( m2) . base64EncodedString ( ) ) " )
7466
7567 return Current . network. dataTask ( with: URLRequest . SRPComplete ( serviceKey: serviceKey, hashcash: hashcash, accountName: accountName, c: srpInit. c, m1: Data ( m1) . base64EncodedString ( ) , m2: Data ( m2) . base64EncodedString ( ) ) )
7668 . mapError { $0 as Swift . Error }
7769 . eraseToAnyPublisher ( )
7870 } catch {
79- print ( " Error: calculateSharedSecret \( error) " )
8071 return Fail ( error: AuthenticationError . srpInvalidPublicKey)
8172 . eraseToAnyPublisher ( )
8273 }
@@ -114,79 +105,6 @@ public class Client {
114105 }
115106 . eraseToAnyPublisher ( )
116107 }
117- // .map(\.data)
118- // .decode(type: ServerSRPInitResponse.self, decoder: JSONDecoder())
119- //
120- //
121- //
122- // .flatMap { result -> AnyPublisher<AuthenticationState, Swift.Error> in
123- // return ("")
124- // }
125- // .flatMap { serverResponse -> AnyPublisher<AuthenticationState, Error> in
126- // print(serverResponse)
127- // return Fail(error: AuthenticationError.accountUsesTwoStepAuthentication)
128- // .eraseToAnyPublisher()
129- // }
130- . mapError { $0 as Swift . Error }
131- . eraseToAnyPublisher ( )
132- }
133-
134-
135- public func login( accountName: String , password: String ) -> AnyPublisher < AuthenticationState , Swift . Error > {
136- var serviceKey : String !
137-
138- return Current . network. dataTask ( with: URLRequest . itcServiceKey)
139- . map ( \. data)
140- . decode ( type: ServiceKeyResponse . self, decoder: JSONDecoder ( ) )
141- . flatMap { serviceKeyResponse -> AnyPublisher < ( String , String ) , Swift . Error > in
142- serviceKey = serviceKeyResponse. authServiceKey
143-
144- // Fixes issue https://github.com/RobotsAndPencils/XcodesApp/issues/360
145- // On 2023-02-23, Apple added a custom implementation of hashcash to their auth flow
146- // Without this addition, Apple ID's would get set to locked
147- return self . loadHashcash ( accountName: accountName, serviceKey: serviceKey)
148- . map { return ( serviceKey, $0) }
149- . eraseToAnyPublisher ( )
150- }
151- . flatMap { ( serviceKey, hashcash) -> AnyPublisher < URLSession . DataTaskPublisher . Output , Swift . Error > in
152-
153- return Current . network. dataTask ( with: URLRequest . signIn ( serviceKey: serviceKey, accountName: accountName, password: password, hashcash: hashcash) )
154- . mapError { $0 as Swift . Error }
155- . eraseToAnyPublisher ( )
156- }
157- . flatMap { result -> AnyPublisher < AuthenticationState , Swift . Error > in
158- let ( data, response) = result
159- return Just ( data)
160- . decode ( type: SignInResponse . self, decoder: JSONDecoder ( ) )
161- . flatMap { responseBody -> AnyPublisher < AuthenticationState , Swift . Error > in
162- let httpResponse = response as! HTTPURLResponse
163-
164- switch httpResponse. statusCode {
165- case 200 :
166- return Current . network. dataTask ( with: URLRequest . olympusSession)
167- . map { _ in AuthenticationState . authenticated }
168- . mapError { $0 as Swift . Error }
169- . eraseToAnyPublisher ( )
170- case 401 :
171- return Fail ( error: AuthenticationError . invalidUsernameOrPassword ( username: accountName) )
172- . eraseToAnyPublisher ( )
173- case 403 :
174- let errorMessage = responseBody. serviceErrors? . first? . description. replacingOccurrences ( of: " -20209: " , with: " " ) ?? " "
175- return Fail ( error: AuthenticationError . accountLocked ( errorMessage) )
176- . eraseToAnyPublisher ( )
177- case 409 :
178- return self . handleTwoStepOrFactor ( data: data, response: response, serviceKey: serviceKey)
179- case 412 where Client . authTypes. contains ( responseBody. authType ?? " " ) :
180- return Fail ( error: AuthenticationError . appleIDAndPrivacyAcknowledgementRequired)
181- . eraseToAnyPublisher ( )
182- default :
183- return Fail ( error: AuthenticationError . unexpectedSignInResponse ( statusCode: httpResponse. statusCode,
184- message: responseBody. serviceErrors? . map { $0. description } . joined ( separator: " , " ) ) )
185- . eraseToAnyPublisher ( )
186- }
187- }
188- . eraseToAnyPublisher ( )
189- }
190108 . mapError { $0 as Swift . Error }
191109 . eraseToAnyPublisher ( )
192110 }
0 commit comments