Files
firebase-ios-sdk/FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver.m
T
Nick Cooke 025ef90376 [FirebaseAuth] Expose non-public headers to Swift and build on iOS (#10755)
* Private header exposed to internal Swift impl via private module

* Include all non-public headers in private module map

* Add TODO and #if out import

* Prefer <...> imports and fix API visibility. See more...

- The private module map enables us to selectively expose non-public
  headers to Swift. Now, the internal APIs that were made public for the
  sake of exposing to Swift can be made internal again. Swift files that
  need access to non-public API should do the following:

    @_implementationOnly import FirebaseAuth_Private

- Additionally, any public header imported into a non-public header
  needs to use <...> syntax because the header is technically coming
  from a different module (FirebaseAuth rather than FirebaseAuth_Private).

* Fix import typo

* Style

* More progress. Building for CocoaPods. Not for SPM

* Remove 'MyPrivateClass.h'

* Generate private module map

* Generate private module map followup

* Re-enable testing spec

* Style

* Remove unneeded module.modulemap

* Revert "Remove unneeded module.modulemap"

This reverts commit 3ac44c3570.

* Adjust header import since FIRAuthBackend was moved

* Get library building on iOS

* Builds on iOS

* Revert private module map and update gitignore

* Add TODO

* Wrap FirebaseAuth_Private import with #if COCOAPODS

* Modularize script with arg[0] for podspec name

* Generalize script more and remove private module map

* Revert unintentionally checked in changes

* re-style @objc(...) qualifier

* Fix check

* Fix SPM build

* Change API back to what it was originally

* Fix copyright

* Better error handling in script
2023-07-11 16:09:03 -07:00

105 lines
4.8 KiB
Objective-C

/*
* Copyright 2019 Google
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <TargetConditionals.h>
#if TARGET_OS_IOS
#import "FirebaseAuth/Sources/Public/FirebaseAuth/FIRAdditionalUserInfo.h"
#import "FirebaseAuth/Sources/Public/FirebaseAuth/FIRMultiFactorResolver.h"
#import "FirebaseAuth/Sources/Auth/FIRAuthDataResult_Internal.h"
#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h"
#import "FirebaseAuth/Sources/Backend/FIRAuthBackend+MultiFactor.h"
#import "FirebaseAuth/Sources/MultiFactor/FIRMultiFactorResolver+Internal.h"
#import "FirebaseAuth-Swift.h"
NS_ASSUME_NONNULL_BEGIN
@implementation FIRMultiFactorResolver
- (instancetype)initWithMFAPendingCredential:(NSString *_Nullable)MFAPendingCredential
hints:(NSArray<FIRMultiFactorInfo *> *)hints
auth:(FIRAuth *)auth {
self = [super init];
if (self) {
_MFAPendingCredential = MFAPendingCredential;
_hints = hints;
_auth = auth;
_session = [[FIRMultiFactorSession alloc] init];
_session.MFAPendingCredential = MFAPendingCredential;
}
return self;
}
- (void)resolveSignInWithAssertion:(nonnull FIRMultiFactorAssertion *)assertion
completion:(nullable FIRAuthDataResultCallback)completion {
#if TARGET_OS_IOS
NSObject<FIRAuthProto> *finalizedMFARequestInfo;
if ([assertion isKindOfClass:[FIRPhoneMultiFactorAssertion class]]) {
FIRPhoneMultiFactorAssertion *phoneAssertion = (FIRPhoneMultiFactorAssertion *)assertion;
finalizedMFARequestInfo = [[FIRAuthProtoFinalizeMFAPhoneRequestInfo alloc]
initWithSessionInfo:phoneAssertion.authCredential.verificationID
verificationCode:phoneAssertion.authCredential.verificationCode];
} else if ([assertion isKindOfClass:[FIRTOTPMultiFactorAssertion class]]) {
FIRTOTPMultiFactorAssertion *totpAssertion = (FIRTOTPMultiFactorAssertion *)assertion;
finalizedMFARequestInfo = [[FIRAuthProtoFinalizeMFATOTPSignInRequestInfo alloc]
initWithMfaEnrollmentID:totpAssertion.enrollmentID
verificationCode:totpAssertion.oneTimePassword];
}
if (finalizedMFARequestInfo != nil) {
FIRFinalizeMFASignInRequest *request = [[FIRFinalizeMFASignInRequest alloc]
initWithMFAPendingCredential:self.MFAPendingCredential
verificationInfo:finalizedMFARequestInfo
requestConfiguration:self.auth.requestConfiguration];
[FIRAuthBackend
finalizeMultiFactorSignIn:request
callback:^(FIRFinalizeMFASignInResponse *_Nullable response,
NSError *_Nullable error) {
if (error) {
if (completion) {
completion(nil, error);
}
} else {
[FIRAuth.auth
completeSignInWithAccessToken:response.IDToken
accessTokenExpirationDate:nil
refreshToken:response.refreshToken
anonymous:NO
callback:^(FIRUser *_Nullable user,
NSError *_Nullable error) {
FIRAuthDataResult *result =
[[FIRAuthDataResult alloc]
initWithUser:user
additionalUserInfo:nil];
FIRAuthDataResultCallback
decoratedCallback = [FIRAuth.auth
signInFlowAuthDataResultCallbackByDecoratingCallback:
completion];
decoratedCallback(result, error);
}];
}
}];
}
#endif
}
@end
NS_ASSUME_NONNULL_END
#endif