Files
firebase-ios-sdk/FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.m
T

315 lines
12 KiB
Objective-C
Raw Normal View History

2017-05-15 12:27:07 -07:00
/*
* 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.
*/
2020-04-10 11:54:51 -07:00
#import "FirebaseAuth/Sources/Backend/RPC/FIRGetOOBConfirmationCodeRequest.h"
2017-05-15 12:27:07 -07:00
2020-07-27 15:21:19 -07:00
#import "FirebaseAuth/Sources/Public/FirebaseAuth/FIRActionCodeSettings.h"
2017-07-28 17:43:33 -07:00
2020-04-10 11:54:51 -07:00
#import "FirebaseAuth/Sources/Auth/FIRAuth_Internal.h"
#import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h"
2017-05-15 12:27:07 -07:00
2019-02-22 21:23:17 -08:00
NS_ASSUME_NONNULL_BEGIN
2017-05-15 12:27:07 -07:00
/** @var kEndpoint
@brief The getOobConfirmationCode endpoint name.
*/
2017-07-28 17:43:33 -07:00
static NSString *const kGetOobConfirmationCodeEndpoint = @"getOobConfirmationCode";
2017-05-15 12:27:07 -07:00
/** @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";
2019-04-17 13:44:32 -07:00
/** @var kNewEmailKey
@brief The name of the "newEmail" property in the request.
*/
static NSString *const kNewEmailKey = @"newEmail";
2017-05-15 12:27:07 -07:00
/** @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";
2017-07-28 17:43:33 -07:00
/** @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";
2018-11-26 22:19:29 -08:00
/** @var kDynamicLinkDomainKey
@brief The key for the "dynamic link domain" value in the request.
*/
static NSString *const kDynamicLinkDomainKey = @"dynamicLinkDomain";
2017-05-15 12:27:07 -07:00
/** @var kPasswordResetRequestTypeValue
@brief The value for the "PASSWORD_RESET" request type.
*/
static NSString *const kPasswordResetRequestTypeValue = @"PASSWORD_RESET";
2018-03-07 07:47:09 -08:00
/** @var kEmailLinkSignInTypeValue
@brief The value for the "EMAIL_SIGNIN" request type.
*/
2020-03-17 10:22:29 -07:00
static NSString *const kEmailLinkSignInTypeValue = @"EMAIL_SIGNIN";
2018-03-07 07:47:09 -08:00
2017-05-15 12:27:07 -07:00
/** @var kVerifyEmailRequestTypeValue
@brief The value for the "VERIFY_EMAIL" request type.
*/
static NSString *const kVerifyEmailRequestTypeValue = @"VERIFY_EMAIL";
2019-04-17 13:44:32 -07:00
/** @var kVerifyBeforeUpdateEmailRequestTypeValue
@brief The value for the "VERIFY_AND_CHANGE_EMAIL" request type.
2019-04-17 13:44:32 -07:00
*/
static NSString *const kVerifyBeforeUpdateEmailRequestTypeValue = @"VERIFY_AND_CHANGE_EMAIL";
2019-04-17 13:44:32 -07:00
2020-08-17 17:25:27 -07:00
/** @var kTenantIDKey
@brief The key for the tenant id value in the request.
*/
static NSString *const kTenantIDKey = @"tenantId";
2023-08-16 16:32:38 -07:00
/** @var kCaptchaResponseKey
@brief The key for the "captchaResponse" value in the request.
*/
static NSString *const kCaptchaResponseKey = @"captchaResp";
/** @var kClientType
@brief The key for the "clientType" value in the request.
*/
static NSString *const kClientType = @"clientType";
/** @var kRecaptchaVersion
@brief The key for the "recaptchaVersion" value in the request.
*/
static NSString *const kRecaptchaVersion = @"recaptchaVersion";
2017-05-15 12:27:07 -07:00
@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.
2019-04-17 13:44:32 -07:00
@param newEmail The email of the user to be updated.
2017-05-15 12:27:07 -07:00
@param accessToken The STS Access Token of the currently signed in user.
2017-07-28 17:43:33 -07:00
@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.
2017-05-15 12:27:07 -07:00
*/
- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
email:(nullable NSString *)email
2019-04-17 13:44:32 -07:00
newEmail:(nullable NSString *)newEmail
2017-05-15 12:27:07 -07:00
accessToken:(nullable NSString *)accessToken
2017-07-28 17:43:33 -07:00
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration
2020-03-17 10:22:29 -07:00
NS_DESIGNATED_INITIALIZER;
2017-05-15 12:27:07 -07:00
@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;
2018-03-07 07:47:09 -08:00
case FIRGetOOBConfirmationCodeRequestTypeEmailLink:
return kEmailLinkSignInTypeValue;
2019-04-17 13:44:32 -07:00
case FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail:
return kVerifyBeforeUpdateEmailRequestTypeValue;
2020-03-17 10:22:29 -07:00
// No default case so that we get a compiler warning if a new value was added to the enum.
2017-05-15 12:27:07 -07:00
}
}
2019-02-22 21:23:17 -08:00
+ (nullable FIRGetOOBConfirmationCodeRequest *)
2017-07-28 17:43:33 -07:00
passwordResetRequestWithEmail:(NSString *)email
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
2017-05-15 12:27:07 -07:00
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypePasswordReset
email:email
2019-04-17 13:44:32 -07:00
newEmail:nil
2017-05-15 12:27:07 -07:00
accessToken:nil
2017-07-28 17:43:33 -07:00
actionCodeSettings:actionCodeSettings
requestConfiguration:requestConfiguration];
2017-05-15 12:27:07 -07:00
}
2019-02-22 21:23:17 -08:00
+ (nullable FIRGetOOBConfirmationCodeRequest *)
2017-07-28 17:43:33 -07:00
verifyEmailRequestWithAccessToken:(NSString *)accessToken
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
2017-05-15 12:27:07 -07:00
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyEmail
email:nil
2019-04-17 13:44:32 -07:00
newEmail:nil
2017-05-15 12:27:07 -07:00
accessToken:accessToken
2017-07-28 17:43:33 -07:00
actionCodeSettings:actionCodeSettings
requestConfiguration:requestConfiguration];
2017-05-15 12:27:07 -07:00
}
2019-02-22 21:23:17 -08:00
+ (nullable FIRGetOOBConfirmationCodeRequest *)
2018-03-07 07:47:09 -08:00
signInWithEmailLinkRequest:(NSString *)email
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeEmailLink
email:email
2019-04-17 13:44:32 -07:00
newEmail:nil
2018-03-07 07:47:09 -08:00
accessToken:nil
actionCodeSettings:actionCodeSettings
requestConfiguration:requestConfiguration];
}
2019-04-17 13:44:32 -07:00
+ (nullable FIRGetOOBConfirmationCodeRequest *)
verifyBeforeUpdateEmailWithAccessToken:(NSString *)accessToken
newEmail:(NSString *)newEmail
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
2020-03-17 10:22:29 -07:00
return
[[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyBeforeUpdateEmail
email:nil
newEmail:newEmail
accessToken:accessToken
actionCodeSettings:actionCodeSettings
requestConfiguration:requestConfiguration];
2019-04-17 13:44:32 -07:00
}
2017-05-15 12:27:07 -07:00
- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
email:(nullable NSString *)email
2019-04-17 13:44:32 -07:00
newEmail:(nullable NSString *)newEmail
2017-05-15 12:27:07 -07:00
accessToken:(nullable NSString *)accessToken
2017-07-28 17:43:33 -07:00
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
self = [super initWithEndpoint:kGetOobConfirmationCodeEndpoint
requestConfiguration:requestConfiguration];
2017-05-15 12:27:07 -07:00
if (self) {
_requestType = requestType;
_email = email;
2019-04-17 13:44:32 -07:00
_updatedEmail = newEmail;
2017-05-15 12:27:07 -07:00
_accessToken = accessToken;
2017-07-28 17:43:33 -07:00
_continueURL = actionCodeSettings.URL.absoluteString;
_iOSBundleID = actionCodeSettings.iOSBundleID;
_androidPackageName = actionCodeSettings.androidPackageName;
_androidMinimumVersion = actionCodeSettings.androidMinimumVersion;
_androidInstallApp = actionCodeSettings.androidInstallIfNotAvailable;
_handleCodeInApp = actionCodeSettings.handleCodeInApp;
2018-11-26 22:19:29 -08:00
_dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;
2017-05-15 12:27:07 -07:00
}
return self;
}
- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
2020-03-17 10:22:29 -07:00
NSMutableDictionary *body =
[@{kRequestTypeKey : [[self class] requestTypeStringValueForRequestType:_requestType]}
mutableCopy];
2017-05-15 12:27:07 -07:00
// 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;
}
2018-03-07 07:47:09 -08:00
// 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;
}
2019-04-17 13:44:32 -07:00
// 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;
}
2017-07-28 17:43:33 -07:00
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;
}
2018-11-26 22:19:29 -08:00
if (_dynamicLinkDomain) {
body[kDynamicLinkDomainKey] = _dynamicLinkDomain;
}
2023-08-16 16:32:38 -07:00
if (_captchaResponse) {
body[kCaptchaResponseKey] = _captchaResponse;
}
if (self.clientType) {
body[kClientType] = self.clientType;
}
if (_recaptchaVersion) {
body[kRecaptchaVersion] = _recaptchaVersion;
}
2020-08-17 17:25:27 -07:00
if (self.tenantID) {
body[kTenantIDKey] = self.tenantID;
}
2018-11-26 22:19:29 -08:00
2017-05-15 12:27:07 -07:00
return body;
}
2023-08-16 16:32:38 -07:00
- (void)injectRecaptchaFields:(NSString *_Nullable)recaptchaResponse
recaptchaVersion:(NSString *)recaptchaVersion {
_captchaResponse = recaptchaResponse;
_recaptchaVersion = recaptchaVersion;
}
2017-05-15 12:27:07 -07:00
@end
2019-02-22 21:23:17 -08:00
NS_ASSUME_NONNULL_END