You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
8.9 KiB
234 lines
8.9 KiB
/*
|
|
* 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"
|
|
|
|
/** @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 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 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";
|
|
|
|
@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 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
|
|
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;
|
|
// No default case so that we get a compiler warning if a new value was added to the enum.
|
|
}
|
|
}
|
|
|
|
+ (FIRGetOOBConfirmationCodeRequest *)
|
|
passwordResetRequestWithEmail:(NSString *)email
|
|
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
|
|
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
|
|
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypePasswordReset
|
|
email:email
|
|
accessToken:nil
|
|
actionCodeSettings:actionCodeSettings
|
|
requestConfiguration:requestConfiguration];
|
|
}
|
|
|
|
+ (FIRGetOOBConfirmationCodeRequest *)
|
|
verifyEmailRequestWithAccessToken:(NSString *)accessToken
|
|
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
|
|
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
|
|
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyEmail
|
|
email:nil
|
|
accessToken:accessToken
|
|
actionCodeSettings:actionCodeSettings
|
|
requestConfiguration:requestConfiguration];
|
|
}
|
|
|
|
+ (FIRGetOOBConfirmationCodeRequest *)
|
|
signInWithEmailLinkRequest:(NSString *)email
|
|
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
|
|
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
|
|
return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeEmailLink
|
|
email:email
|
|
accessToken:nil
|
|
actionCodeSettings:actionCodeSettings
|
|
requestConfiguration:requestConfiguration];
|
|
}
|
|
|
|
- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
|
|
email:(nullable NSString *)email
|
|
accessToken:(nullable NSString *)accessToken
|
|
actionCodeSettings:(nullable FIRActionCodeSettings *)actionCodeSettings
|
|
requestConfiguration:(FIRAuthRequestConfiguration *)requestConfiguration {
|
|
self = [super initWithEndpoint:kGetOobConfirmationCodeEndpoint
|
|
requestConfiguration:requestConfiguration];
|
|
if (self) {
|
|
_requestType = requestType;
|
|
_email = email;
|
|
_accessToken = accessToken;
|
|
_continueURL = actionCodeSettings.URL.absoluteString;
|
|
_iOSBundleID = actionCodeSettings.iOSBundleID;
|
|
_androidPackageName = actionCodeSettings.androidPackageName;
|
|
_androidMinimumVersion = actionCodeSettings.androidMinimumVersion;
|
|
_androidInstallApp = actionCodeSettings.androidInstallIfNotAvailable;
|
|
_handleCodeInApp = actionCodeSettings.handleCodeInApp;
|
|
}
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
return body;
|
|
}
|
|
|
|
@end
|