Skip to content

Commit d06bd8a

Browse files
committed
checkpoint
1 parent b2dda3a commit d06bd8a

File tree

4 files changed

+204
-404
lines changed

4 files changed

+204
-404
lines changed

FirebaseAuth/Sources/Swift/Auth/Auth.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ extension Auth: AuthInterop {
11601160
@available(iOS 13, tvOS 13, macOS 10.15, macCatalyst 13, watchOS 7, *)
11611161
open func revokeToken(withAuthorizationCode authorizationCode: String) async throws {
11621162
if let currentUser {
1163-
let idToken = try await currentUser.internalGetTokenAsync()
1163+
let idToken = try await currentUser.internalGetToken()
11641164
let request = RevokeTokenRequest(withToken: authorizationCode,
11651165
idToken: idToken,
11661166
requestConfiguration: requestConfiguration)

FirebaseAuth/Sources/Swift/Auth/AuthWorker.swift

+138-13
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ actor AuthWorker {
6363
guard let currentUser = auth.currentUser else {
6464
return nil
6565
}
66-
return try await currentUser.internalGetTokenAsync(forceRefresh: forceRefresh)
66+
return try await currentUser.internalGetToken(forceRefresh: forceRefresh)
6767
}
6868

6969
/// Only for testing
@@ -342,7 +342,7 @@ actor AuthWorker {
342342
return
343343
}
344344
// The list of providers need to be updated for the newly added email-password provider.
345-
let accessToken = try await user.internalGetTokenAsync()
345+
let accessToken = try await user.internalGetToken()
346346
let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
347347
requestConfiguration: requestConfiguration)
348348
do {
@@ -386,7 +386,7 @@ actor AuthWorker {
386386
/// operation.
387387
func updateOrLinkPhoneNumber(user: User, credential: PhoneAuthCredential,
388388
isLinkOperation: Bool) async throws {
389-
let accessToken = try await user.internalGetTokenAsync()
389+
let accessToken = try await user.internalGetToken()
390390

391391
guard let configuration = user.auth?.requestConfiguration else {
392392
fatalError("Auth Internal Error: nil value for VerifyPhoneNumberRequest initializer")
@@ -436,7 +436,7 @@ actor AuthWorker {
436436
SetAccountInfoRequest)
437437
-> Void) async throws {
438438
let userAccountInfo = try await getAccountInfoRefreshingCache(user)
439-
let accessToken = try await user.internalGetTokenAsync()
439+
let accessToken = try await user.internalGetToken()
440440

441441
// Mutate setAccountInfoRequest in block
442442
let setAccountInfoRequest = SetAccountInfoRequest(requestConfiguration: requestConfiguration)
@@ -465,7 +465,7 @@ actor AuthWorker {
465465
/// error has been detected. Invoked asynchronously on the auth global work queue in the future.
466466
func getAccountInfoRefreshingCache(_ user: User) async throws
467467
-> GetAccountInfoResponseUser {
468-
let token = try await user.internalGetTokenAsync()
468+
let token = try await user.internalGetToken()
469469
let request = GetAccountInfoRequest(accessToken: token,
470470
requestConfiguration: requestConfiguration)
471471
do {
@@ -511,7 +511,7 @@ actor AuthWorker {
511511

512512
func getIDTokenResult(user: User,
513513
forcingRefresh forceRefresh: Bool) async throws -> AuthTokenResult {
514-
let token = try await user.internalGetTokenAsync(forceRefresh: forceRefresh)
514+
let token = try await user.internalGetToken(forceRefresh: forceRefresh)
515515
let tokenResult = try AuthTokenResult.tokenResult(token: token)
516516
AuthLog.logDebug(code: "I-AUT000017", message: "Actual token expiration date: " +
517517
"\(String(describing: tokenResult.expirationDate))," +
@@ -537,7 +537,7 @@ actor AuthWorker {
537537
}
538538
#endif
539539

540-
let accessToken = try await user.internalGetTokenAsync()
540+
let accessToken = try await user.internalGetToken()
541541
let request = VerifyAssertionRequest(providerID: credential.provider,
542542
requestConfiguration: requestConfiguration)
543543
credential.prepare(request)
@@ -572,6 +572,131 @@ actor AuthWorker {
572572
return try await link(user: user, with: credential)
573573
}
574574

575+
func unlink(user: User, fromProvider provider: String) async throws -> User {
576+
let accessToken = try await user.internalGetToken()
577+
let request = SetAccountInfoRequest(requestConfiguration: requestConfiguration)
578+
request.accessToken = accessToken
579+
580+
if user.providerDataRaw[provider] == nil {
581+
throw AuthErrorUtils.noSuchProviderError()
582+
}
583+
request.deleteProviders = [provider]
584+
do {
585+
let response = try await AuthBackend.call(with: request)
586+
587+
// We can't just use the provider info objects in SetAccountInfoResponse
588+
// because they don't have localID and email fields. Remove the specific
589+
// provider manually.
590+
user.providerDataRaw.removeValue(forKey: provider)
591+
592+
if provider == EmailAuthProvider.id {
593+
user.hasEmailPasswordCredential = false
594+
}
595+
#if os(iOS)
596+
// After successfully unlinking a phone auth provider, remove the phone number
597+
// from the cached user info.
598+
if provider == PhoneAuthProvider.id {
599+
user.phoneNumber = nil
600+
}
601+
#endif
602+
if let idToken = response.idToken,
603+
let refreshToken = response.refreshToken {
604+
let tokenService = SecureTokenService(
605+
withRequestConfiguration: requestConfiguration,
606+
accessToken: idToken,
607+
accessTokenExpirationDate: response.approximateExpirationDate,
608+
refreshToken: refreshToken
609+
)
610+
try await user.setTokenService(tokenService: tokenService)
611+
return user
612+
}
613+
} catch {
614+
user.signOutIfTokenIsInvalid(withError: error)
615+
throw error
616+
}
617+
618+
if let error = user.updateKeychain() {
619+
throw error
620+
}
621+
return user
622+
}
623+
624+
func sendEmailVerification(user: User,
625+
with actionCodeSettings: ActionCodeSettings?) async throws {
626+
let accessToken = try await user.internalGetToken()
627+
let request = GetOOBConfirmationCodeRequest.verifyEmailRequest(
628+
accessToken: accessToken,
629+
actionCodeSettings: actionCodeSettings,
630+
requestConfiguration: requestConfiguration
631+
)
632+
do {
633+
_ = try await AuthBackend.call(with: request)
634+
} catch {
635+
user.signOutIfTokenIsInvalid(withError: error)
636+
throw error
637+
}
638+
}
639+
640+
func sendEmailVerification(user: User,
641+
beforeUpdatingEmail newEmail: String,
642+
actionCodeSettings: ActionCodeSettings?) async throws {
643+
let accessToken = try await user.internalGetToken()
644+
let request = GetOOBConfirmationCodeRequest.verifyBeforeUpdateEmail(
645+
accessToken: accessToken,
646+
newEmail: newEmail,
647+
actionCodeSettings: actionCodeSettings,
648+
requestConfiguration: requestConfiguration
649+
)
650+
do {
651+
_ = try await AuthBackend.call(with: request)
652+
} catch {
653+
user.signOutIfTokenIsInvalid(withError: error)
654+
throw error
655+
}
656+
}
657+
658+
func delete(user: User) async throws {
659+
let accessToken = try await user.internalGetToken()
660+
let request = DeleteAccountRequest(localID: user.uid, accessToken: accessToken,
661+
requestConfiguration: requestConfiguration)
662+
_ = try await AuthBackend.call(with: request)
663+
try user.auth?.signOutByForce(withUserID: user.uid)
664+
}
665+
666+
func commitChanges(changeRequest: UserProfileChangeRequest) async throws {
667+
if changeRequest.consumed {
668+
fatalError("Internal Auth Error: commitChanges should only be called once.")
669+
}
670+
changeRequest.consumed = true
671+
672+
// Return fast if there is nothing to update:
673+
if !changeRequest.photoURLWasSet, !changeRequest.displayNameWasSet {
674+
return
675+
}
676+
let displayName = changeRequest.displayName
677+
let displayNameWasSet = changeRequest.displayNameWasSet
678+
let photoURL = changeRequest.photoURL
679+
let photoURLWasSet = changeRequest.photoURLWasSet
680+
681+
try await executeUserUpdateWithChanges(user: changeRequest.user) { _, request in
682+
if photoURLWasSet {
683+
request.photoURL = photoURL
684+
}
685+
if displayNameWasSet {
686+
request.displayName = displayName
687+
}
688+
}
689+
if displayNameWasSet {
690+
changeRequest.user.displayName = displayName
691+
}
692+
if photoURLWasSet {
693+
changeRequest.user.photoURL = photoURL
694+
}
695+
if let error = changeRequest.user.updateKeychain() {
696+
throw error
697+
}
698+
}
699+
575700
private func link(user: User,
576701
withEmailCredential emailCredential: EmailAuthCredential) async throws
577702
-> AuthDataResult {
@@ -588,7 +713,7 @@ actor AuthWorker {
588713
authResult: result
589714
)
590715
case let .link(link):
591-
let accessToken = try? await user.internalGetTokenAsync()
716+
let accessToken = try? await user.internalGetToken()
592717
var queryItems = AuthWebUtils.parseURL(link)
593718
if link.count == 0 {
594719
if let urlComponents = URLComponents(string: link),
@@ -622,7 +747,7 @@ actor AuthWorker {
622747
withEmail email: String,
623748
password: String,
624749
authResult: AuthDataResult) async throws -> AuthDataResult {
625-
let accessToken = try await user.internalGetTokenAsync()
750+
let accessToken = try await user.internalGetToken()
626751
do {
627752
let request = SignUpNewUserRequest(email: email,
628753
password: password,
@@ -647,7 +772,7 @@ actor AuthWorker {
647772
refreshToken: refreshToken
648773
)
649774

650-
let accessToken = try await user.internalGetTokenAsync()
775+
let accessToken = try await user.internalGetToken()
651776
let getAccountInfoRequest = GetAccountInfoRequest(
652777
accessToken: accessToken,
653778
requestConfiguration: requestConfiguration
@@ -670,7 +795,7 @@ actor AuthWorker {
670795
private func link(user: User,
671796
withGameCenterCredential gameCenterCredential: GameCenterAuthCredential) async throws
672797
-> AuthDataResult {
673-
let accessToken = try await user.internalGetTokenAsync()
798+
let accessToken = try await user.internalGetToken()
674799
guard let publicKeyURL = gameCenterCredential.publicKeyURL,
675800
let signature = gameCenterCredential.signature,
676801
let salt = gameCenterCredential.salt else {
@@ -721,7 +846,7 @@ actor AuthWorker {
721846
accessTokenExpirationDate: expirationDate,
722847
refreshToken: refreshToken
723848
)
724-
let accessToken = try await user.internalGetTokenAsync()
849+
let accessToken = try await user.internalGetToken()
725850
let getAccountInfoRequest = GetAccountInfoRequest(accessToken: accessToken,
726851
requestConfiguration: requestConfiguration)
727852
do {
@@ -821,7 +946,7 @@ actor AuthWorker {
821946
}
822947
let uid = currentUser.uid
823948
do {
824-
_ = try await currentUser.internalGetTokenAsync(forceRefresh: true)
949+
_ = try await currentUser.internalGetToken(forceRefresh: true)
825950
if auth.currentUser?.uid != uid {
826951
return
827952
}

0 commit comments

Comments
 (0)