aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.m
blob: 653edddfc473fd060ccd404af779f171b124dba1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
 * 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 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;
    // 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];
}

- (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;
  }

  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