123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- /*
- * Copyright 2017 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/LICENSE-2.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 "FIRGetOOBConfirmationCodeRequest.h"
-
- #import "FIRActionCodeSettings.h"
-
- #import "FIRAuthErrorUtils.h"
- #import "FIRAuth_Internal.h"
-
- NS_ASSUME_NONNULL_BEGIN
-
- /** @var kEndpoint
- @brief The getOobConfirmationCode endpoint name.
- */
- static NSString *const kGetOobConfirmationCodeEndpoint = @"getOobConfirmationCode";
-
- /** @var kRequestTypeKey
- @brief The name of the required "requestType" property in the request.
- */
- static NSString *const kRequestTypeKey = @"requestType";
-
- /** @var kEmailKey
- @brief The name of the "email" property in the request.
- */
- static NSString *const kEmailKey = @"email";
-
- /** @var kNewEmailKey
- @brief The name of the "newEmail" property in the request.
- */
- static NSString *const kNewEmailKey = @"newEmail";
-
- /** @var kIDTokenKey
- @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
- despite it's confusing (backwards compatiable) parameter name.
- */
- static NSString *const kIDTokenKey = @"idToken";
-
- /** @var kContinueURLKey
- @brief The key for the "continue URL" value in the request.
- */
- static NSString *const kContinueURLKey = @"continueUrl";
-
- /** @var kIosBundeIDKey
- @brief The key for the "iOS Bundle Identifier" value in the request.
- */
- static NSString *const kIosBundleIDKey = @"iOSBundleId";
-
- /** @var kAndroidPackageNameKey
- @brief The key for the "Android Package Name" value in the request.
- */
- static NSString *const kAndroidPackageNameKey = @"androidPackageName";
-
- /** @var kAndroidInstallAppKey
- @brief The key for the request parameter indicating whether the android app should be installed
- or not.
- */
- static NSString *const kAndroidInstallAppKey = @"androidInstallApp";
-
- /** @var kAndroidMinimumVersionKey
- @brief The key for the "minimum Android version supported" value in the request.
- */
- static NSString *const kAndroidMinimumVersionKey = @"androidMinimumVersion";
-
- /** @var kCanHandleCodeInAppKey
- @brief The key for the request parameter indicating whether the action code can be handled in
- the app or not.
- */
- static NSString *const kCanHandleCodeInAppKey = @"canHandleCodeInApp";
-
- /** @var kDynamicLinkDomainKey
- @brief The key for the "dynamic link domain" value in the request.
- */
- static NSString *const kDynamicLinkDomainKey = @"dynamicLinkDomain";
-
- /** @var kPasswordResetRequestTypeValue
- @brief The value for the "PASSWORD_RESET" request type.
- */
- static NSString *const kPasswordResetRequestTypeValue = @"PASSWORD_RESET";
-
- /** @var kEmailLinkSignInTypeValue
- @brief The value for the "EMAIL_SIGNIN" request type.
- */
- static NSString *const kEmailLinkSignInTypeValue= @"EMAIL_SIGNIN";
-
- /** @var kVerifyEmailRequestTypeValue
- @brief The value for the "VERIFY_EMAIL" request type.
- */
- static NSString *const kVerifyEmailRequestTypeValue = @"VERIFY_EMAIL";
-
- /** @var kVerifyBeforeUpdateEmailRequestTypeValue
- @brief The value for the "VERIFY_AND_CHANGE_EMAIL" request type.
- */
- static NSString *const kVerifyBeforeUpdateEmailRequestTypeValue = @"VERIFY_AND_CHANGE_EMAIL";
-
- @interface FIRGetOOBConfirmationCodeRequest ()
-
- /** @fn initWithRequestType:email:APIKey:
- @brief Designated initializer.
- @param requestType The types of OOB Confirmation Code to request.
- @param email The email of the user.
- @param newEmail The email of the user to be updated.
- @param accessToken The STS Access Token of the currently signed in user.
- @param actionCodeSettings An object of FIRActionCodeSettings which specifies action code
- settings to be applied to the OOB code request.
- @param requestConfiguration An object containing configurations to be added to the request.
- */
- - (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
- email:(nullable NSString *)email
- newEmail:(nullable NSString *)newEmail
- accessToken:(nullable NSString *)accessToken
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration
- NS_DESIGNATED_INITIALIZER;
-
- @end
-
- @implementation FIRGetOOBConfirmationCodeRequest
-
- /** @var requestTypeStringValueForRequestType:
- @brief Returns the string equivilent for an @c FIRGetOOBConfirmationCodeRequestType value.
- */
- + (NSString *)requestTypeStringValueForRequestType:
- (FIRGetOOBConfirmationCodeRequestType)requestType {
- switch (requestType) {
- case FIRGetOOBConfirmationCodeRequestTypePasswordReset:
- return kPasswordResetRequestTypeValue;
- case FIRGetOOBConfirmationCodeRequestTypeVerifyEmail:
- return kVerifyEmailRequestTypeValue;
- case FIRGetOOBConfirmationCodeRequestTypeEmailLink:
- return kEmailLinkSignInTypeValue;
- case FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail:
- return kVerifyBeforeUpdateEmailRequestTypeValue;
- // No default case so that we get a compiler warning if a new value was added to the enum.
- }
- }
-
- + (nullable FIRGetOOBConfirmationCodeRequest *)
- passwordResetRequestWithEmail:(NSString *)email
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
- return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypePasswordReset
- email:email
- newEmail:nil
- accessToken:nil
- actionCodeSettings:actionCodeSettings
- requestConfiguration:requestConfiguration];
- }
-
- + (nullable FIRGetOOBConfirmationCodeRequest *)
- verifyEmailRequestWithAccessToken:(NSString *)accessToken
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
- return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyEmail
- email:nil
- newEmail:nil
- accessToken:accessToken
- actionCodeSettings:actionCodeSettings
- requestConfiguration:requestConfiguration];
- }
-
- + (nullable FIRGetOOBConfirmationCodeRequest *)
- signInWithEmailLinkRequest:(NSString *)email
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
- return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeEmailLink
- email:email
- newEmail:nil
- accessToken:nil
- actionCodeSettings:actionCodeSettings
- requestConfiguration:requestConfiguration];
- }
-
- + (nullable FIRGetOOBConfirmationCodeRequest *)
- verifyBeforeUpdateEmailWithAccessToken:(NSString *)accessToken
- newEmail:(NSString *)newEmail
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
- return [[self alloc]
- initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail
- email:nil
- newEmail:newEmail
- accessToken:accessToken
- actionCodeSettings:actionCodeSettings
- requestConfiguration:requestConfiguration];
- }
-
- - (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
- email:(nullable NSString *)email
- newEmail:(nullable NSString *)newEmail
- accessToken:(nullable NSString *)accessToken
- actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
- requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
- self = [super initWithEndpoint:kGetOobConfirmationCodeEndpoint
- requestConfiguration:requestConfiguration];
- if (self) {
- _requestType = requestType;
- _email = email;
- _updatedEmail = newEmail;
- _accessToken = accessToken;
- _continueURL = actionCodeSettings.URL.absoluteString;
- _iOSBundleID = actionCodeSettings.iOSBundleID;
- _androidPackageName = actionCodeSettings.androidPackageName;
- _androidMinimumVersion = actionCodeSettings.androidMinimumVersion;
- _androidInstallApp = actionCodeSettings.androidInstallIfNotAvailable;
- _handleCodeInApp = actionCodeSettings.handleCodeInApp;
- _dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;
- }
- return self;
- }
-
- - (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
- NSMutableDictionary *body = [@{
- kRequestTypeKey : [[self class] requestTypeStringValueForRequestType:_requestType]
- } mutableCopy];
-
- // For password reset requests, we only need an email address in addition to the already required
- // fields.
- if (_requestType == FIRGetOOBConfirmationCodeRequestTypePasswordReset) {
- body[kEmailKey] = _email;
- }
-
- // For verify email requests, we only need an STS Access Token in addition to the already required
- // fields.
- if (_requestType == FIRGetOOBConfirmationCodeRequestTypeVerifyEmail) {
- body[kIDTokenKey] = _accessToken;
- }
-
- // For email sign-in link requests, we only need an email address in addition to the already
- // required fields.
- if (_requestType == FIRGetOOBConfirmationCodeRequestTypeEmailLink) {
- body[kEmailKey] = _email;
- }
-
- // For email sign-in link requests, we only need an STS Access Token, a new email address in
- // addition to the already required fields.
- if (_requestType == FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail) {
- body[kNewEmailKey] = _updatedEmail;
- body[kIDTokenKey] = _accessToken;
- }
-
- if (_continueURL) {
- body[kContinueURLKey] = _continueURL;
- }
-
- if (_iOSBundleID) {
- body[kIosBundleIDKey] = _iOSBundleID;
- }
-
- if (_androidPackageName) {
- body[kAndroidPackageNameKey] = _androidPackageName;
- }
-
- if (_androidMinimumVersion) {
- body[kAndroidMinimumVersionKey] = _androidMinimumVersion;
- }
-
- if (_androidInstallApp) {
- body[kAndroidInstallAppKey] = @YES;
- }
-
- if (_handleCodeInApp) {
- body[kCanHandleCodeInAppKey] = @YES;
- }
-
- if (_dynamicLinkDomain) {
- body[kDynamicLinkDomainKey] = _dynamicLinkDomain;
- }
-
- return body;
- }
-
- @end
-
- NS_ASSUME_NONNULL_END
|