@firebase/auth 1.7.9-canary.aa6db78eb → 1.7.9-canary.b942e9e6e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +32 -1
  2. package/dist/auth-public.d.ts +22 -10
  3. package/dist/auth.d.ts +22 -10
  4. package/dist/browser-cjs/{index-8c4960c5.js → index-c1e3d4f9.js} +392 -175
  5. package/dist/browser-cjs/index-c1e3d4f9.js.map +1 -0
  6. package/dist/browser-cjs/index.js +1 -1
  7. package/dist/browser-cjs/internal.js +1 -1
  8. package/dist/browser-cjs/src/api/account_management/mfa.d.ts +5 -1
  9. package/dist/browser-cjs/src/api/authentication/mfa.d.ts +5 -1
  10. package/dist/browser-cjs/src/api/authentication/sms.d.ts +5 -1
  11. package/dist/browser-cjs/src/api/index.d.ts +7 -3
  12. package/dist/browser-cjs/src/platform_browser/providers/phone.d.ts +7 -5
  13. package/dist/browser-cjs/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  14. package/dist/browser-cjs/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  15. package/dist/browser-cjs/src/platform_browser/strategies/phone.d.ts +10 -6
  16. package/dist/browser-cjs/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  17. package/dist/cordova/auth-cordova-public.d.ts +7 -0
  18. package/dist/cordova/auth-cordova.d.ts +7 -0
  19. package/dist/cordova/index.js +2 -2
  20. package/dist/cordova/internal.js +168 -177
  21. package/dist/cordova/internal.js.map +1 -1
  22. package/dist/cordova/{popup_redirect-1e109c2a.js → popup_redirect-63b3580d.js} +285 -21
  23. package/dist/cordova/popup_redirect-63b3580d.js.map +1 -0
  24. package/dist/cordova/src/api/account_management/mfa.d.ts +5 -1
  25. package/dist/cordova/src/api/authentication/mfa.d.ts +5 -1
  26. package/dist/cordova/src/api/authentication/sms.d.ts +5 -1
  27. package/dist/cordova/src/api/index.d.ts +7 -3
  28. package/dist/cordova/src/platform_browser/providers/phone.d.ts +7 -5
  29. package/dist/cordova/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  30. package/dist/cordova/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  31. package/dist/cordova/src/platform_browser/strategies/phone.d.ts +10 -6
  32. package/dist/cordova/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  33. package/dist/esm2017/{index-6cb7b51a.js → index-c8d513e3.js} +392 -175
  34. package/dist/esm2017/index-c8d513e3.js.map +1 -0
  35. package/dist/esm2017/index.js +1 -1
  36. package/dist/esm2017/internal.js +2 -2
  37. package/dist/esm2017/src/api/account_management/mfa.d.ts +5 -1
  38. package/dist/esm2017/src/api/authentication/mfa.d.ts +5 -1
  39. package/dist/esm2017/src/api/authentication/sms.d.ts +5 -1
  40. package/dist/esm2017/src/api/index.d.ts +7 -3
  41. package/dist/esm2017/src/platform_browser/providers/phone.d.ts +7 -5
  42. package/dist/esm2017/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  43. package/dist/esm2017/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  44. package/dist/esm2017/src/platform_browser/strategies/phone.d.ts +10 -6
  45. package/dist/esm2017/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  46. package/dist/esm5/{index-262b3f24.js → index-82b3e33f.js} +450 -195
  47. package/dist/esm5/index-82b3e33f.js.map +1 -0
  48. package/dist/esm5/index.js +1 -1
  49. package/dist/esm5/internal.js +2 -2
  50. package/dist/esm5/src/api/account_management/mfa.d.ts +5 -1
  51. package/dist/esm5/src/api/authentication/mfa.d.ts +5 -1
  52. package/dist/esm5/src/api/authentication/sms.d.ts +5 -1
  53. package/dist/esm5/src/api/index.d.ts +7 -3
  54. package/dist/esm5/src/platform_browser/providers/phone.d.ts +7 -5
  55. package/dist/esm5/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  56. package/dist/esm5/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  57. package/dist/esm5/src/platform_browser/strategies/phone.d.ts +10 -6
  58. package/dist/esm5/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  59. package/dist/index.webworker.esm5.js +163 -19
  60. package/dist/index.webworker.esm5.js.map +1 -1
  61. package/dist/node/index.js +1 -1
  62. package/dist/node/internal.js +1 -1
  63. package/dist/node/src/api/account_management/mfa.d.ts +5 -1
  64. package/dist/node/src/api/authentication/mfa.d.ts +5 -1
  65. package/dist/node/src/api/authentication/sms.d.ts +5 -1
  66. package/dist/node/src/api/index.d.ts +7 -3
  67. package/dist/node/src/platform_browser/providers/phone.d.ts +7 -5
  68. package/dist/node/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  69. package/dist/node/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  70. package/dist/node/src/platform_browser/strategies/phone.d.ts +10 -6
  71. package/dist/node/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  72. package/dist/node/{totp-617e4db6.js → totp-c9a669c7.js} +164 -20
  73. package/dist/node/totp-c9a669c7.js.map +1 -0
  74. package/dist/node-esm/index.js +1 -1
  75. package/dist/node-esm/internal.js +2 -2
  76. package/dist/node-esm/src/api/account_management/mfa.d.ts +5 -1
  77. package/dist/node-esm/src/api/authentication/mfa.d.ts +5 -1
  78. package/dist/node-esm/src/api/authentication/sms.d.ts +5 -1
  79. package/dist/node-esm/src/api/index.d.ts +7 -3
  80. package/dist/node-esm/src/platform_browser/providers/phone.d.ts +7 -5
  81. package/dist/node-esm/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  82. package/dist/node-esm/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  83. package/dist/node-esm/src/platform_browser/strategies/phone.d.ts +10 -6
  84. package/dist/node-esm/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  85. package/dist/node-esm/{totp-98ba6f1f.js → totp-9698d31a.js} +168 -30
  86. package/dist/node-esm/totp-9698d31a.js.map +1 -0
  87. package/dist/rn/{index-198b1e87.js → index-dd6cc9b0.js} +450 -195
  88. package/dist/rn/index-dd6cc9b0.js.map +1 -0
  89. package/dist/rn/index.js +1 -1
  90. package/dist/rn/internal.js +1 -1
  91. package/dist/rn/src/api/account_management/mfa.d.ts +5 -1
  92. package/dist/rn/src/api/authentication/mfa.d.ts +5 -1
  93. package/dist/rn/src/api/authentication/sms.d.ts +5 -1
  94. package/dist/rn/src/api/index.d.ts +7 -3
  95. package/dist/rn/src/platform_browser/providers/phone.d.ts +7 -5
  96. package/dist/rn/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  97. package/dist/rn/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  98. package/dist/rn/src/platform_browser/strategies/phone.d.ts +10 -6
  99. package/dist/rn/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  100. package/dist/src/api/account_management/mfa.d.ts +5 -1
  101. package/dist/src/api/authentication/mfa.d.ts +5 -1
  102. package/dist/src/api/authentication/sms.d.ts +5 -1
  103. package/dist/src/api/index.d.ts +7 -3
  104. package/dist/src/platform_browser/providers/phone.d.ts +7 -5
  105. package/dist/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  106. package/dist/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  107. package/dist/src/platform_browser/strategies/phone.d.ts +10 -6
  108. package/dist/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  109. package/dist/web-extension-cjs/index.js +1 -1
  110. package/dist/web-extension-cjs/internal.js +115 -147
  111. package/dist/web-extension-cjs/internal.js.map +1 -1
  112. package/dist/web-extension-cjs/{register-0aa8e295.js → register-1a706c5a.js} +283 -30
  113. package/dist/web-extension-cjs/register-1a706c5a.js.map +1 -0
  114. package/dist/web-extension-cjs/src/api/account_management/mfa.d.ts +5 -1
  115. package/dist/web-extension-cjs/src/api/authentication/mfa.d.ts +5 -1
  116. package/dist/web-extension-cjs/src/api/authentication/sms.d.ts +5 -1
  117. package/dist/web-extension-cjs/src/api/index.d.ts +7 -3
  118. package/dist/web-extension-cjs/src/platform_browser/providers/phone.d.ts +7 -5
  119. package/dist/web-extension-cjs/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  120. package/dist/web-extension-cjs/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  121. package/dist/web-extension-cjs/src/platform_browser/strategies/phone.d.ts +10 -6
  122. package/dist/web-extension-cjs/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  123. package/dist/web-extension-esm2017/auth-web-extension-public.d.ts +7 -0
  124. package/dist/web-extension-esm2017/auth-web-extension.d.ts +7 -0
  125. package/dist/web-extension-esm2017/index.js +2 -2
  126. package/dist/web-extension-esm2017/internal.js +115 -147
  127. package/dist/web-extension-esm2017/internal.js.map +1 -1
  128. package/dist/web-extension-esm2017/{register-68ef89ff.js → register-3c017834.js} +280 -31
  129. package/dist/web-extension-esm2017/register-3c017834.js.map +1 -0
  130. package/dist/web-extension-esm2017/src/api/account_management/mfa.d.ts +5 -1
  131. package/dist/web-extension-esm2017/src/api/authentication/mfa.d.ts +5 -1
  132. package/dist/web-extension-esm2017/src/api/authentication/sms.d.ts +5 -1
  133. package/dist/web-extension-esm2017/src/api/index.d.ts +7 -3
  134. package/dist/web-extension-esm2017/src/platform_browser/providers/phone.d.ts +7 -5
  135. package/dist/web-extension-esm2017/src/platform_browser/recaptcha/recaptcha.d.ts +7 -0
  136. package/dist/web-extension-esm2017/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +4 -4
  137. package/dist/web-extension-esm2017/src/platform_browser/strategies/phone.d.ts +10 -6
  138. package/dist/web-extension-esm2017/test/integration/flows/recaptcha_enterprise.test.d.ts +17 -0
  139. package/package.json +6 -6
  140. package/dist/browser-cjs/index-8c4960c5.js.map +0 -1
  141. package/dist/cordova/popup_redirect-1e109c2a.js.map +0 -1
  142. package/dist/esm2017/index-6cb7b51a.js.map +0 -1
  143. package/dist/esm5/index-262b3f24.js.map +0 -1
  144. package/dist/node/totp-617e4db6.js.map +0 -1
  145. package/dist/node-esm/totp-98ba6f1f.js.map +0 -1
  146. package/dist/rn/index-198b1e87.js.map +0 -1
  147. package/dist/web-extension-cjs/register-0aa8e295.js.map +0 -1
  148. package/dist/web-extension-esm2017/register-68ef89ff.js.map +0 -1
@@ -1165,6 +1165,16 @@ var RecaptchaConfig = /** @class */ (function () {
1165
1165
  "ENFORCE" /* EnforcementState.ENFORCE */ ||
1166
1166
  this.getProviderEnforcementState(providerStr) === "AUDIT" /* EnforcementState.AUDIT */);
1167
1167
  };
1168
+ /**
1169
+ * Returns true if reCAPTCHA Enterprise protection is enabled in at least one provider, otherwise
1170
+ * returns false.
1171
+ *
1172
+ * @returns Whether or not reCAPTCHA Enterprise protection is enabled for at least one provider.
1173
+ */
1174
+ RecaptchaConfig.prototype.isAnyProviderEnabled = function () {
1175
+ return (this.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */) ||
1176
+ this.isProviderEnabled("PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */));
1177
+ };
1168
1178
  return RecaptchaConfig;
1169
1179
  }());
1170
1180
 
@@ -3834,6 +3844,180 @@ function _generateCallbackName(prefix) {
3834
3844
  return "__".concat(prefix).concat(Math.floor(Math.random() * 1000000));
3835
3845
  }
3836
3846
 
3847
+ /**
3848
+ * @license
3849
+ * Copyright 2020 Google LLC
3850
+ *
3851
+ * Licensed under the Apache License, Version 2.0 (the "License");
3852
+ * you may not use this file except in compliance with the License.
3853
+ * You may obtain a copy of the License at
3854
+ *
3855
+ * http://www.apache.org/licenses/LICENSE-2.0
3856
+ *
3857
+ * Unless required by applicable law or agreed to in writing, software
3858
+ * distributed under the License is distributed on an "AS IS" BASIS,
3859
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3860
+ * See the License for the specific language governing permissions and
3861
+ * limitations under the License.
3862
+ */
3863
+ var _SOLVE_TIME_MS = 500;
3864
+ var _EXPIRATION_TIME_MS = 60000;
3865
+ var _WIDGET_ID_START = 1000000000000;
3866
+ var MockReCaptcha = /** @class */ (function () {
3867
+ function MockReCaptcha(auth) {
3868
+ this.auth = auth;
3869
+ this.counter = _WIDGET_ID_START;
3870
+ this._widgets = new Map();
3871
+ }
3872
+ MockReCaptcha.prototype.render = function (container, parameters) {
3873
+ var id = this.counter;
3874
+ this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {}));
3875
+ this.counter++;
3876
+ return id;
3877
+ };
3878
+ MockReCaptcha.prototype.reset = function (optWidgetId) {
3879
+ var _a;
3880
+ var id = optWidgetId || _WIDGET_ID_START;
3881
+ void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete());
3882
+ this._widgets.delete(id);
3883
+ };
3884
+ MockReCaptcha.prototype.getResponse = function (optWidgetId) {
3885
+ var _a;
3886
+ var id = optWidgetId || _WIDGET_ID_START;
3887
+ return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || '';
3888
+ };
3889
+ MockReCaptcha.prototype.execute = function (optWidgetId) {
3890
+ var _a;
3891
+ return __awaiter(this, void 0, void 0, function () {
3892
+ var id;
3893
+ return __generator(this, function (_b) {
3894
+ id = optWidgetId || _WIDGET_ID_START;
3895
+ void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute());
3896
+ return [2 /*return*/, ''];
3897
+ });
3898
+ });
3899
+ };
3900
+ return MockReCaptcha;
3901
+ }());
3902
+ var MockGreCAPTCHATopLevel = /** @class */ (function () {
3903
+ function MockGreCAPTCHATopLevel() {
3904
+ this.enterprise = new MockGreCAPTCHA();
3905
+ }
3906
+ MockGreCAPTCHATopLevel.prototype.ready = function (callback) {
3907
+ callback();
3908
+ };
3909
+ MockGreCAPTCHATopLevel.prototype.execute = function (
3910
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3911
+ _siteKey, _options) {
3912
+ return Promise.resolve('token');
3913
+ };
3914
+ MockGreCAPTCHATopLevel.prototype.render = function (
3915
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3916
+ _container, _parameters) {
3917
+ return '';
3918
+ };
3919
+ return MockGreCAPTCHATopLevel;
3920
+ }());
3921
+ var MockGreCAPTCHA = /** @class */ (function () {
3922
+ function MockGreCAPTCHA() {
3923
+ }
3924
+ MockGreCAPTCHA.prototype.ready = function (callback) {
3925
+ callback();
3926
+ };
3927
+ MockGreCAPTCHA.prototype.execute = function (
3928
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3929
+ _siteKey, _options) {
3930
+ return Promise.resolve('token');
3931
+ };
3932
+ MockGreCAPTCHA.prototype.render = function (
3933
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3934
+ _container, _parameters) {
3935
+ return '';
3936
+ };
3937
+ return MockGreCAPTCHA;
3938
+ }());
3939
+ var MockWidget = /** @class */ (function () {
3940
+ function MockWidget(containerOrId, appName, params) {
3941
+ var _this = this;
3942
+ this.params = params;
3943
+ this.timerId = null;
3944
+ this.deleted = false;
3945
+ this.responseToken = null;
3946
+ this.clickHandler = function () {
3947
+ _this.execute();
3948
+ };
3949
+ var container = typeof containerOrId === 'string'
3950
+ ? document.getElementById(containerOrId)
3951
+ : containerOrId;
3952
+ _assert(container, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */, { appName: appName });
3953
+ this.container = container;
3954
+ this.isVisible = this.params.size !== 'invisible';
3955
+ if (this.isVisible) {
3956
+ this.execute();
3957
+ }
3958
+ else {
3959
+ this.container.addEventListener('click', this.clickHandler);
3960
+ }
3961
+ }
3962
+ MockWidget.prototype.getResponse = function () {
3963
+ this.checkIfDeleted();
3964
+ return this.responseToken;
3965
+ };
3966
+ MockWidget.prototype.delete = function () {
3967
+ this.checkIfDeleted();
3968
+ this.deleted = true;
3969
+ if (this.timerId) {
3970
+ clearTimeout(this.timerId);
3971
+ this.timerId = null;
3972
+ }
3973
+ this.container.removeEventListener('click', this.clickHandler);
3974
+ };
3975
+ MockWidget.prototype.execute = function () {
3976
+ var _this = this;
3977
+ this.checkIfDeleted();
3978
+ if (this.timerId) {
3979
+ return;
3980
+ }
3981
+ this.timerId = window.setTimeout(function () {
3982
+ _this.responseToken = generateRandomAlphaNumericString(50);
3983
+ var _a = _this.params, callback = _a.callback, expiredCallback = _a["expired-callback"];
3984
+ if (callback) {
3985
+ try {
3986
+ callback(_this.responseToken);
3987
+ }
3988
+ catch (e) { }
3989
+ }
3990
+ _this.timerId = window.setTimeout(function () {
3991
+ _this.timerId = null;
3992
+ _this.responseToken = null;
3993
+ if (expiredCallback) {
3994
+ try {
3995
+ expiredCallback();
3996
+ }
3997
+ catch (e) { }
3998
+ }
3999
+ if (_this.isVisible) {
4000
+ _this.execute();
4001
+ }
4002
+ }, _EXPIRATION_TIME_MS);
4003
+ }, _SOLVE_TIME_MS);
4004
+ };
4005
+ MockWidget.prototype.checkIfDeleted = function () {
4006
+ if (this.deleted) {
4007
+ throw new Error('reCAPTCHA mock was already deleted!');
4008
+ }
4009
+ };
4010
+ return MockWidget;
4011
+ }());
4012
+ function generateRandomAlphaNumericString(len) {
4013
+ var chars = [];
4014
+ var allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
4015
+ for (var i = 0; i < len; i++) {
4016
+ chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length)));
4017
+ }
4018
+ return chars.join('');
4019
+ }
4020
+
3837
4021
  /* eslint-disable @typescript-eslint/no-require-imports */
3838
4022
  var RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise';
3839
4023
  var FAKE_TOKEN = 'NO_RECAPTCHA';
@@ -3920,8 +4104,14 @@ var RecaptchaEnterpriseVerifier = /** @class */ (function () {
3920
4104
  reject(Error('No reCAPTCHA enterprise script loaded.'));
3921
4105
  }
3922
4106
  }
4107
+ var mockRecaptcha;
3923
4108
  var _this = this;
3924
4109
  return __generator(this, function (_a) {
4110
+ // Returns Promise for a mock token when appVerificationDisabledForTesting is true.
4111
+ if (this.auth.settings.appVerificationDisabledForTesting) {
4112
+ mockRecaptcha = new MockGreCAPTCHATopLevel();
4113
+ return [2 /*return*/, mockRecaptcha.execute('siteKey', { action: 'verify' })];
4114
+ }
3925
4115
  return [2 /*return*/, new Promise(function (resolve, reject) {
3926
4116
  retrieveSiteKey(_this.auth)
3927
4117
  .then(function (siteKey) {
@@ -3955,15 +4145,18 @@ var RecaptchaEnterpriseVerifier = /** @class */ (function () {
3955
4145
  };
3956
4146
  return RecaptchaEnterpriseVerifier;
3957
4147
  }());
3958
- function injectRecaptchaFields(auth, request, action, captchaResp) {
3959
- if (captchaResp === void 0) { captchaResp = false; }
4148
+ function injectRecaptchaFields(auth, request, action, isCaptchaResp, isFakeToken) {
4149
+ if (isCaptchaResp === void 0) { isCaptchaResp = false; }
4150
+ if (isFakeToken === void 0) { isFakeToken = false; }
3960
4151
  return __awaiter(this, void 0, void 0, function () {
3961
- var verifier, captchaResponse, newRequest;
4152
+ var verifier, captchaResponse, newRequest, phoneNumber, recaptchaToken, recaptchaToken;
3962
4153
  return __generator(this, function (_a) {
3963
4154
  switch (_a.label) {
3964
4155
  case 0:
3965
4156
  verifier = new RecaptchaEnterpriseVerifier(auth);
3966
- _a.label = 1;
4157
+ if (!isFakeToken) return [3 /*break*/, 1];
4158
+ captchaResponse = FAKE_TOKEN;
4159
+ return [3 /*break*/, 5];
3967
4160
  case 1:
3968
4161
  _a.trys.push([1, 3, , 5]);
3969
4162
  return [4 /*yield*/, verifier.verify(action)];
@@ -3978,7 +4171,35 @@ function injectRecaptchaFields(auth, request, action, captchaResp) {
3978
4171
  return [3 /*break*/, 5];
3979
4172
  case 5:
3980
4173
  newRequest = __assign({}, request);
3981
- if (!captchaResp) {
4174
+ if (action === "mfaSmsEnrollment" /* RecaptchaActionName.MFA_SMS_ENROLLMENT */ ||
4175
+ action === "mfaSmsSignIn" /* RecaptchaActionName.MFA_SMS_SIGNIN */) {
4176
+ if ('phoneEnrollmentInfo' in newRequest) {
4177
+ phoneNumber = newRequest.phoneEnrollmentInfo.phoneNumber;
4178
+ recaptchaToken = newRequest.phoneEnrollmentInfo.recaptchaToken;
4179
+ Object.assign(newRequest, {
4180
+ 'phoneEnrollmentInfo': {
4181
+ phoneNumber: phoneNumber,
4182
+ recaptchaToken: recaptchaToken,
4183
+ captchaResponse: captchaResponse,
4184
+ 'clientType': "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */,
4185
+ 'recaptchaVersion': "RECAPTCHA_ENTERPRISE" /* RecaptchaVersion.ENTERPRISE */
4186
+ }
4187
+ });
4188
+ }
4189
+ else if ('phoneSignInInfo' in newRequest) {
4190
+ recaptchaToken = newRequest.phoneSignInInfo.recaptchaToken;
4191
+ Object.assign(newRequest, {
4192
+ 'phoneSignInInfo': {
4193
+ recaptchaToken: recaptchaToken,
4194
+ captchaResponse: captchaResponse,
4195
+ 'clientType': "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */,
4196
+ 'recaptchaVersion': "RECAPTCHA_ENTERPRISE" /* RecaptchaVersion.ENTERPRISE */
4197
+ }
4198
+ });
4199
+ }
4200
+ return [2 /*return*/, newRequest];
4201
+ }
4202
+ if (!isCaptchaResp) {
3982
4203
  Object.assign(newRequest, { captchaResponse: captchaResponse });
3983
4204
  }
3984
4205
  else {
@@ -3993,19 +4214,20 @@ function injectRecaptchaFields(auth, request, action, captchaResp) {
3993
4214
  });
3994
4215
  });
3995
4216
  }
3996
- function handleRecaptchaFlow(authInstance, request, actionName, actionMethod) {
3997
- var _a;
4217
+ function handleRecaptchaFlow(authInstance, request, actionName, actionMethod, recaptchaAuthProvider) {
4218
+ var _a, _b;
3998
4219
  return __awaiter(this, void 0, void 0, function () {
3999
- var requestWithRecaptcha;
4220
+ var requestWithRecaptcha, requestWithRecaptcha, requestWithRecaptchaFields;
4000
4221
  var _this = this;
4001
- return __generator(this, function (_b) {
4002
- switch (_b.label) {
4222
+ return __generator(this, function (_c) {
4223
+ switch (_c.label) {
4003
4224
  case 0:
4225
+ if (!(recaptchaAuthProvider === "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */)) return [3 /*break*/, 4];
4004
4226
  if (!((_a = authInstance
4005
- ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */))) return [3 /*break*/, 2];
4227
+ ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */))) return [3 /*break*/, 2];
4006
4228
  return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName, actionName === "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */)];
4007
4229
  case 1:
4008
- requestWithRecaptcha = _b.sent();
4230
+ requestWithRecaptcha = _c.sent();
4009
4231
  return [2 /*return*/, actionMethod(authInstance, requestWithRecaptcha)];
4010
4232
  case 2: return [2 /*return*/, actionMethod(authInstance, request).catch(function (error) { return __awaiter(_this, void 0, void 0, function () {
4011
4233
  var requestWithRecaptcha;
@@ -4022,6 +4244,48 @@ function handleRecaptchaFlow(authInstance, request, actionName, actionMethod) {
4022
4244
  }
4023
4245
  });
4024
4246
  }); })];
4247
+ case 3: return [3 /*break*/, 10];
4248
+ case 4:
4249
+ if (!(recaptchaAuthProvider === "PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */)) return [3 /*break*/, 9];
4250
+ if (!((_b = authInstance
4251
+ ._getRecaptchaConfig()) === null || _b === void 0 ? void 0 : _b.isProviderEnabled("PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */))) return [3 /*break*/, 6];
4252
+ return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName)];
4253
+ case 5:
4254
+ requestWithRecaptcha = _c.sent();
4255
+ return [2 /*return*/, actionMethod(authInstance, requestWithRecaptcha).catch(function (error) { return __awaiter(_this, void 0, void 0, function () {
4256
+ var requestWithRecaptchaFields;
4257
+ var _a;
4258
+ return __generator(this, function (_b) {
4259
+ switch (_b.label) {
4260
+ case 0:
4261
+ if (!(((_a = authInstance
4262
+ ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.getProviderEnforcementState("PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */)) === "AUDIT" /* EnforcementState.AUDIT */)) return [3 /*break*/, 2];
4263
+ if (!(error.code === "auth/".concat("missing-recaptcha-token" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */) ||
4264
+ error.code === "auth/".concat("invalid-app-credential" /* AuthErrorCode.INVALID_APP_CREDENTIAL */))) return [3 /*break*/, 2];
4265
+ console.log("Failed to verify with reCAPTCHA Enterprise. Automatically triggering the reCAPTCHA v2 flow to complete the ".concat(actionName, " flow."));
4266
+ return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName, false, // isCaptchaResp
4267
+ true // isFakeToken
4268
+ )];
4269
+ case 1:
4270
+ requestWithRecaptchaFields = _b.sent();
4271
+ // This will call the PhoneApiCaller to fetch and inject reCAPTCHA v2 token.
4272
+ return [2 /*return*/, actionMethod(authInstance, requestWithRecaptchaFields)];
4273
+ case 2:
4274
+ // ENFORCE mode or AUDIT mode with any other error.
4275
+ return [2 /*return*/, Promise.reject(error)];
4276
+ }
4277
+ });
4278
+ }); })];
4279
+ case 6: return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName, false, // isCaptchaResp
4280
+ true // isFakeToken
4281
+ )];
4282
+ case 7:
4283
+ requestWithRecaptchaFields = _c.sent();
4284
+ // This will call the PhoneApiCaller to fetch and inject v2 token.
4285
+ return [2 /*return*/, actionMethod(authInstance, requestWithRecaptchaFields)];
4286
+ case 8: return [3 /*break*/, 10];
4287
+ case 9: return [2 /*return*/, Promise.reject(recaptchaAuthProvider + ' provider is not supported.')];
4288
+ case 10: return [2 /*return*/];
4025
4289
  }
4026
4290
  });
4027
4291
  });
@@ -4046,7 +4310,7 @@ function _initializeRecaptchaConfig(auth) {
4046
4310
  else {
4047
4311
  authInternal._tenantRecaptchaConfigs[authInternal.tenantId] = config;
4048
4312
  }
4049
- if (config.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) {
4313
+ if (config.isAnyProviderEnabled()) {
4050
4314
  verifier = new RecaptchaEnterpriseVerifier(authInternal);
4051
4315
  void verifier.verify();
4052
4316
  }
@@ -4532,7 +4796,7 @@ var EmailAuthCredential = /** @class */ (function (_super) {
4532
4796
  password: this._password,
4533
4797
  clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
4534
4798
  };
4535
- return [2 /*return*/, handleRecaptchaFlow(auth, request, "signInWithPassword" /* RecaptchaActionName.SIGN_IN_WITH_PASSWORD */, signInWithPassword)];
4799
+ return [2 /*return*/, handleRecaptchaFlow(auth, request, "signInWithPassword" /* RecaptchaActionName.SIGN_IN_WITH_PASSWORD */, signInWithPassword, "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */)];
4536
4800
  case "emailLink" /* SignInMethod.EMAIL_LINK */:
4537
4801
  return [2 /*return*/, signInWithEmailLink$1(auth, {
4538
4802
  email: this._email,
@@ -4559,7 +4823,7 @@ var EmailAuthCredential = /** @class */ (function (_super) {
4559
4823
  password: this._password,
4560
4824
  clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
4561
4825
  };
4562
- return [2 /*return*/, handleRecaptchaFlow(auth, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, linkEmailPassword)];
4826
+ return [2 /*return*/, handleRecaptchaFlow(auth, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, linkEmailPassword, "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */)];
4563
4827
  case "emailLink" /* SignInMethod.EMAIL_LINK */:
4564
4828
  return [2 /*return*/, signInWithEmailLinkForLinking(auth, {
4565
4829
  idToken: idToken,
@@ -6802,7 +7066,7 @@ function sendPasswordResetEmail(auth, email, actionCodeSettings) {
6802
7066
  if (actionCodeSettings) {
6803
7067
  _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings);
6804
7068
  }
6805
- return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendPasswordResetEmail$1)];
7069
+ return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendPasswordResetEmail$1, "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */)];
6806
7070
  case 1:
6807
7071
  _a.sent();
6808
7072
  return [2 /*return*/];
@@ -6978,7 +7242,7 @@ function createUserWithEmailAndPassword(auth, email, password) {
6978
7242
  password: password,
6979
7243
  clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
6980
7244
  };
6981
- signUpResponse = handleRecaptchaFlow(authInternal, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, signUp);
7245
+ signUpResponse = handleRecaptchaFlow(authInternal, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, signUp, "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */);
6982
7246
  return [4 /*yield*/, signUpResponse.catch(function (error) {
6983
7247
  if (error.code === "auth/".concat("password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */)) {
6984
7248
  void recachePasswordPolicy(auth);
@@ -7109,7 +7373,7 @@ function sendSignInLinkToEmail(auth, email, actionCodeSettings) {
7109
7373
  clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
7110
7374
  };
7111
7375
  setActionCodeSettings(request, actionCodeSettings);
7112
- return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendSignInLinkToEmail$1)];
7376
+ return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendSignInLinkToEmail$1, "EMAIL_PASSWORD_PROVIDER" /* RecaptchaAuthProvider.EMAIL_PASSWORD_PROVIDER */)];
7113
7377
  case 1:
7114
7378
  _a.sent();
7115
7379
  return [2 /*return*/];
@@ -9494,143 +9758,6 @@ function finalizeSignInTotpMfa(auth, request) {
9494
9758
  return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaSignIn:finalize" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request));
9495
9759
  }
9496
9760
 
9497
- /**
9498
- * @license
9499
- * Copyright 2020 Google LLC
9500
- *
9501
- * Licensed under the Apache License, Version 2.0 (the "License");
9502
- * you may not use this file except in compliance with the License.
9503
- * You may obtain a copy of the License at
9504
- *
9505
- * http://www.apache.org/licenses/LICENSE-2.0
9506
- *
9507
- * Unless required by applicable law or agreed to in writing, software
9508
- * distributed under the License is distributed on an "AS IS" BASIS,
9509
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9510
- * See the License for the specific language governing permissions and
9511
- * limitations under the License.
9512
- */
9513
- var _SOLVE_TIME_MS = 500;
9514
- var _EXPIRATION_TIME_MS = 60000;
9515
- var _WIDGET_ID_START = 1000000000000;
9516
- var MockReCaptcha = /** @class */ (function () {
9517
- function MockReCaptcha(auth) {
9518
- this.auth = auth;
9519
- this.counter = _WIDGET_ID_START;
9520
- this._widgets = new Map();
9521
- }
9522
- MockReCaptcha.prototype.render = function (container, parameters) {
9523
- var id = this.counter;
9524
- this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {}));
9525
- this.counter++;
9526
- return id;
9527
- };
9528
- MockReCaptcha.prototype.reset = function (optWidgetId) {
9529
- var _a;
9530
- var id = optWidgetId || _WIDGET_ID_START;
9531
- void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete());
9532
- this._widgets.delete(id);
9533
- };
9534
- MockReCaptcha.prototype.getResponse = function (optWidgetId) {
9535
- var _a;
9536
- var id = optWidgetId || _WIDGET_ID_START;
9537
- return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || '';
9538
- };
9539
- MockReCaptcha.prototype.execute = function (optWidgetId) {
9540
- var _a;
9541
- return __awaiter(this, void 0, void 0, function () {
9542
- var id;
9543
- return __generator(this, function (_b) {
9544
- id = optWidgetId || _WIDGET_ID_START;
9545
- void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute());
9546
- return [2 /*return*/, ''];
9547
- });
9548
- });
9549
- };
9550
- return MockReCaptcha;
9551
- }());
9552
- var MockWidget = /** @class */ (function () {
9553
- function MockWidget(containerOrId, appName, params) {
9554
- var _this = this;
9555
- this.params = params;
9556
- this.timerId = null;
9557
- this.deleted = false;
9558
- this.responseToken = null;
9559
- this.clickHandler = function () {
9560
- _this.execute();
9561
- };
9562
- var container = typeof containerOrId === 'string'
9563
- ? document.getElementById(containerOrId)
9564
- : containerOrId;
9565
- _assert(container, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */, { appName: appName });
9566
- this.container = container;
9567
- this.isVisible = this.params.size !== 'invisible';
9568
- if (this.isVisible) {
9569
- this.execute();
9570
- }
9571
- else {
9572
- this.container.addEventListener('click', this.clickHandler);
9573
- }
9574
- }
9575
- MockWidget.prototype.getResponse = function () {
9576
- this.checkIfDeleted();
9577
- return this.responseToken;
9578
- };
9579
- MockWidget.prototype.delete = function () {
9580
- this.checkIfDeleted();
9581
- this.deleted = true;
9582
- if (this.timerId) {
9583
- clearTimeout(this.timerId);
9584
- this.timerId = null;
9585
- }
9586
- this.container.removeEventListener('click', this.clickHandler);
9587
- };
9588
- MockWidget.prototype.execute = function () {
9589
- var _this = this;
9590
- this.checkIfDeleted();
9591
- if (this.timerId) {
9592
- return;
9593
- }
9594
- this.timerId = window.setTimeout(function () {
9595
- _this.responseToken = generateRandomAlphaNumericString(50);
9596
- var _a = _this.params, callback = _a.callback, expiredCallback = _a["expired-callback"];
9597
- if (callback) {
9598
- try {
9599
- callback(_this.responseToken);
9600
- }
9601
- catch (e) { }
9602
- }
9603
- _this.timerId = window.setTimeout(function () {
9604
- _this.timerId = null;
9605
- _this.responseToken = null;
9606
- if (expiredCallback) {
9607
- try {
9608
- expiredCallback();
9609
- }
9610
- catch (e) { }
9611
- }
9612
- if (_this.isVisible) {
9613
- _this.execute();
9614
- }
9615
- }, _EXPIRATION_TIME_MS);
9616
- }, _SOLVE_TIME_MS);
9617
- };
9618
- MockWidget.prototype.checkIfDeleted = function () {
9619
- if (this.deleted) {
9620
- throw new Error('reCAPTCHA mock was already deleted!');
9621
- }
9622
- };
9623
- return MockWidget;
9624
- }());
9625
- function generateRandomAlphaNumericString(len) {
9626
- var chars = [];
9627
- var allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
9628
- for (var i = 0; i < len; i++) {
9629
- chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length)));
9630
- }
9631
- return chars.join('');
9632
- }
9633
-
9634
9761
  /**
9635
9762
  * @license
9636
9763
  * Copyright 2020 Google LLC
@@ -10037,12 +10164,15 @@ var ConfirmationResultImpl = /** @class */ (function () {
10037
10164
  * provides the code sent to their phone, call {@link ConfirmationResult.confirm}
10038
10165
  * with the code to sign the user in.
10039
10166
  *
10040
- * For abuse prevention, this method also requires a {@link ApplicationVerifier}.
10041
- * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}.
10167
+ * For abuse prevention, this method requires a {@link ApplicationVerifier}.
10168
+ * This SDK includes an implementation based on reCAPTCHA v2, {@link RecaptchaVerifier}.
10042
10169
  * This function can work on other platforms that do not support the
10043
10170
  * {@link RecaptchaVerifier} (like React Native), but you need to use a
10044
10171
  * third-party {@link ApplicationVerifier} implementation.
10045
10172
  *
10173
+ * If you've enabled project-level reCAPTCHA Enterprise bot protection in
10174
+ * Enforce mode, you can omit the {@link ApplicationVerifier}.
10175
+ *
10046
10176
  * This method does not work in a Node.js environment or with {@link Auth} instances created with a
10047
10177
  * {@link @firebase/app#FirebaseServerApp}.
10048
10178
  *
@@ -10155,17 +10285,29 @@ function reauthenticateWithPhoneNumber(user, phoneNumber, appVerifier) {
10155
10285
  function _verifyPhoneNumber(auth, options, verifier) {
10156
10286
  var _a;
10157
10287
  return __awaiter(this, void 0, void 0, function () {
10158
- var recaptchaToken, phoneInfoOptions, session, response, mfaEnrollmentId, response, sessionInfo;
10288
+ var phoneInfoOptions, session, startPhoneMfaEnrollmentRequest, startEnrollPhoneMfaActionCallback, startPhoneMfaEnrollmentResponse, response, mfaEnrollmentId, startPhoneMfaSignInRequest, startSignInPhoneMfaActionCallback, startPhoneMfaSignInResponse, response, sendPhoneVerificationCodeRequest, sendPhoneVerificationCodeActionCallback, sendPhoneVerificationCodeResponse, response;
10289
+ var _this = this;
10159
10290
  return __generator(this, function (_b) {
10160
10291
  switch (_b.label) {
10161
- case 0: return [4 /*yield*/, verifier.verify()];
10292
+ case 0:
10293
+ if (!!auth._getRecaptchaConfig()) return [3 /*break*/, 4];
10294
+ _b.label = 1;
10162
10295
  case 1:
10163
- recaptchaToken = _b.sent();
10164
- _b.label = 2;
10296
+ _b.trys.push([1, 3, , 4]);
10297
+ return [4 /*yield*/, _initializeRecaptchaConfig(auth)];
10165
10298
  case 2:
10166
- _b.trys.push([2, , 10, 11]);
10167
- _assert(typeof recaptchaToken === 'string', auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10168
- _assert(verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10299
+ _b.sent();
10300
+ return [3 /*break*/, 4];
10301
+ case 3:
10302
+ _b.sent();
10303
+ // If an error occurs while fetching the config, there is no way to know the enablement state
10304
+ // of Phone provider, so we proceed with recaptcha V2 verification.
10305
+ // The error is likely "recaptchaKey undefined", as reCAPTCHA Enterprise is not
10306
+ // enabled for any provider.
10307
+ console.log('Failed to initialize reCAPTCHA Enterprise config. Triggering the reCAPTCHA v2 verification.');
10308
+ return [3 /*break*/, 4];
10309
+ case 4:
10310
+ _b.trys.push([4, , 12, 13]);
10169
10311
  phoneInfoOptions = void 0;
10170
10312
  if (typeof options === 'string') {
10171
10313
  phoneInfoOptions = {
@@ -10175,48 +10317,106 @@ function _verifyPhoneNumber(auth, options, verifier) {
10175
10317
  else {
10176
10318
  phoneInfoOptions = options;
10177
10319
  }
10178
- if (!('session' in phoneInfoOptions)) return [3 /*break*/, 7];
10320
+ if (!('session' in phoneInfoOptions)) return [3 /*break*/, 9];
10179
10321
  session = phoneInfoOptions.session;
10180
- if (!('phoneNumber' in phoneInfoOptions)) return [3 /*break*/, 4];
10322
+ if (!('phoneNumber' in phoneInfoOptions)) return [3 /*break*/, 6];
10181
10323
  _assert(session.type === "enroll" /* MultiFactorSessionType.ENROLL */, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */);
10182
- return [4 /*yield*/, startEnrollPhoneMfa(auth, {
10183
- idToken: session.credential,
10184
- phoneEnrollmentInfo: {
10185
- phoneNumber: phoneInfoOptions.phoneNumber,
10186
- recaptchaToken: recaptchaToken
10324
+ startPhoneMfaEnrollmentRequest = {
10325
+ idToken: session.credential,
10326
+ phoneEnrollmentInfo: {
10327
+ phoneNumber: phoneInfoOptions.phoneNumber,
10328
+ clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
10329
+ }
10330
+ };
10331
+ startEnrollPhoneMfaActionCallback = function (authInstance, request) { return __awaiter(_this, void 0, void 0, function () {
10332
+ var requestWithRecaptchaV2;
10333
+ return __generator(this, function (_a) {
10334
+ switch (_a.label) {
10335
+ case 0:
10336
+ if (!(request.phoneEnrollmentInfo.captchaResponse === FAKE_TOKEN)) return [3 /*break*/, 2];
10337
+ _assert((verifier === null || verifier === void 0 ? void 0 : verifier.type) === RECAPTCHA_VERIFIER_TYPE, authInstance, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10338
+ return [4 /*yield*/, injectRecaptchaV2Token(authInstance, request, verifier)];
10339
+ case 1:
10340
+ requestWithRecaptchaV2 = _a.sent();
10341
+ return [2 /*return*/, startEnrollPhoneMfa(authInstance, requestWithRecaptchaV2)];
10342
+ case 2: return [2 /*return*/, startEnrollPhoneMfa(authInstance, request)];
10187
10343
  }
10344
+ });
10345
+ }); };
10346
+ startPhoneMfaEnrollmentResponse = handleRecaptchaFlow(auth, startPhoneMfaEnrollmentRequest, "mfaSmsEnrollment" /* RecaptchaActionName.MFA_SMS_ENROLLMENT */, startEnrollPhoneMfaActionCallback, "PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */);
10347
+ return [4 /*yield*/, startPhoneMfaEnrollmentResponse.catch(function (error) {
10348
+ return Promise.reject(error);
10188
10349
  })];
10189
- case 3:
10350
+ case 5:
10190
10351
  response = _b.sent();
10191
10352
  return [2 /*return*/, response.phoneSessionInfo.sessionInfo];
10192
- case 4:
10353
+ case 6:
10193
10354
  _assert(session.type === "signin" /* MultiFactorSessionType.SIGN_IN */, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */);
10194
10355
  mfaEnrollmentId = ((_a = phoneInfoOptions.multiFactorHint) === null || _a === void 0 ? void 0 : _a.uid) ||
10195
10356
  phoneInfoOptions.multiFactorUid;
10196
10357
  _assert(mfaEnrollmentId, auth, "missing-multi-factor-info" /* AuthErrorCode.MISSING_MFA_INFO */);
10197
- return [4 /*yield*/, startSignInPhoneMfa(auth, {
10198
- mfaPendingCredential: session.credential,
10199
- mfaEnrollmentId: mfaEnrollmentId,
10200
- phoneSignInInfo: {
10201
- recaptchaToken: recaptchaToken
10358
+ startPhoneMfaSignInRequest = {
10359
+ mfaPendingCredential: session.credential,
10360
+ mfaEnrollmentId: mfaEnrollmentId,
10361
+ phoneSignInInfo: {
10362
+ clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
10363
+ }
10364
+ };
10365
+ startSignInPhoneMfaActionCallback = function (authInstance, request) { return __awaiter(_this, void 0, void 0, function () {
10366
+ var requestWithRecaptchaV2;
10367
+ return __generator(this, function (_a) {
10368
+ switch (_a.label) {
10369
+ case 0:
10370
+ if (!(request.phoneSignInInfo.captchaResponse === FAKE_TOKEN)) return [3 /*break*/, 2];
10371
+ _assert((verifier === null || verifier === void 0 ? void 0 : verifier.type) === RECAPTCHA_VERIFIER_TYPE, authInstance, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10372
+ return [4 /*yield*/, injectRecaptchaV2Token(authInstance, request, verifier)];
10373
+ case 1:
10374
+ requestWithRecaptchaV2 = _a.sent();
10375
+ return [2 /*return*/, startSignInPhoneMfa(authInstance, requestWithRecaptchaV2)];
10376
+ case 2: return [2 /*return*/, startSignInPhoneMfa(authInstance, request)];
10202
10377
  }
10378
+ });
10379
+ }); };
10380
+ startPhoneMfaSignInResponse = handleRecaptchaFlow(auth, startPhoneMfaSignInRequest, "mfaSmsSignIn" /* RecaptchaActionName.MFA_SMS_SIGNIN */, startSignInPhoneMfaActionCallback, "PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */);
10381
+ return [4 /*yield*/, startPhoneMfaSignInResponse.catch(function (error) {
10382
+ return Promise.reject(error);
10203
10383
  })];
10204
- case 5:
10384
+ case 7:
10205
10385
  response = _b.sent();
10206
10386
  return [2 /*return*/, response.phoneResponseInfo.sessionInfo];
10207
- case 6: return [3 /*break*/, 9];
10208
- case 7: return [4 /*yield*/, sendPhoneVerificationCode(auth, {
10387
+ case 8: return [3 /*break*/, 11];
10388
+ case 9:
10389
+ sendPhoneVerificationCodeRequest = {
10209
10390
  phoneNumber: phoneInfoOptions.phoneNumber,
10210
- recaptchaToken: recaptchaToken
10211
- })];
10212
- case 8:
10213
- sessionInfo = (_b.sent()).sessionInfo;
10214
- return [2 /*return*/, sessionInfo];
10215
- case 9: return [3 /*break*/, 11];
10391
+ clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */
10392
+ };
10393
+ sendPhoneVerificationCodeActionCallback = function (authInstance, request) { return __awaiter(_this, void 0, void 0, function () {
10394
+ var requestWithRecaptchaV2;
10395
+ return __generator(this, function (_a) {
10396
+ switch (_a.label) {
10397
+ case 0:
10398
+ if (!(request.captchaResponse === FAKE_TOKEN)) return [3 /*break*/, 2];
10399
+ _assert((verifier === null || verifier === void 0 ? void 0 : verifier.type) === RECAPTCHA_VERIFIER_TYPE, authInstance, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10400
+ return [4 /*yield*/, injectRecaptchaV2Token(authInstance, request, verifier)];
10401
+ case 1:
10402
+ requestWithRecaptchaV2 = _a.sent();
10403
+ return [2 /*return*/, sendPhoneVerificationCode(authInstance, requestWithRecaptchaV2)];
10404
+ case 2: return [2 /*return*/, sendPhoneVerificationCode(authInstance, request)];
10405
+ }
10406
+ });
10407
+ }); };
10408
+ sendPhoneVerificationCodeResponse = handleRecaptchaFlow(auth, sendPhoneVerificationCodeRequest, "sendVerificationCode" /* RecaptchaActionName.SEND_VERIFICATION_CODE */, sendPhoneVerificationCodeActionCallback, "PHONE_PROVIDER" /* RecaptchaAuthProvider.PHONE_PROVIDER */);
10409
+ return [4 /*yield*/, sendPhoneVerificationCodeResponse.catch(function (error) {
10410
+ return Promise.reject(error);
10411
+ })];
10216
10412
  case 10:
10217
- verifier._reset();
10413
+ response = _b.sent();
10414
+ return [2 /*return*/, response.sessionInfo];
10415
+ case 11: return [3 /*break*/, 13];
10416
+ case 12:
10417
+ verifier === null || verifier === void 0 ? void 0 : verifier._reset();
10218
10418
  return [7 /*endfinally*/];
10219
- case 11: return [2 /*return*/];
10419
+ case 13: return [2 /*return*/];
10220
10420
  }
10221
10421
  });
10222
10422
  });
@@ -10261,6 +10461,59 @@ function updatePhoneNumber(user, credential) {
10261
10461
  }
10262
10462
  });
10263
10463
  });
10464
+ }
10465
+ // Helper function that fetches and injects a reCAPTCHA v2 token into the request.
10466
+ function injectRecaptchaV2Token(auth, request, recaptchaV2Verifier) {
10467
+ return __awaiter(this, void 0, void 0, function () {
10468
+ var recaptchaV2Token, newRequest, phoneNumber, captchaResponse, clientType, recaptchaVersion, captchaResponse, clientType, recaptchaVersion;
10469
+ return __generator(this, function (_a) {
10470
+ switch (_a.label) {
10471
+ case 0:
10472
+ _assert(recaptchaV2Verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10473
+ return [4 /*yield*/, recaptchaV2Verifier.verify()];
10474
+ case 1:
10475
+ recaptchaV2Token = _a.sent();
10476
+ _assert(typeof recaptchaV2Token === 'string', auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */);
10477
+ newRequest = __assign({}, request);
10478
+ if ('phoneEnrollmentInfo' in newRequest) {
10479
+ phoneNumber = newRequest.phoneEnrollmentInfo.phoneNumber;
10480
+ captchaResponse = newRequest.phoneEnrollmentInfo.captchaResponse;
10481
+ clientType = newRequest
10482
+ .phoneEnrollmentInfo.clientType;
10483
+ recaptchaVersion = newRequest.phoneEnrollmentInfo.recaptchaVersion;
10484
+ Object.assign(newRequest, {
10485
+ 'phoneEnrollmentInfo': {
10486
+ phoneNumber: phoneNumber,
10487
+ recaptchaToken: recaptchaV2Token,
10488
+ captchaResponse: captchaResponse,
10489
+ clientType: clientType,
10490
+ recaptchaVersion: recaptchaVersion
10491
+ }
10492
+ });
10493
+ return [2 /*return*/, newRequest];
10494
+ }
10495
+ else if ('phoneSignInInfo' in newRequest) {
10496
+ captchaResponse = newRequest.phoneSignInInfo.captchaResponse;
10497
+ clientType = newRequest
10498
+ .phoneSignInInfo.clientType;
10499
+ recaptchaVersion = newRequest.phoneSignInInfo.recaptchaVersion;
10500
+ Object.assign(newRequest, {
10501
+ 'phoneSignInInfo': {
10502
+ recaptchaToken: recaptchaV2Token,
10503
+ captchaResponse: captchaResponse,
10504
+ clientType: clientType,
10505
+ recaptchaVersion: recaptchaVersion
10506
+ }
10507
+ });
10508
+ return [2 /*return*/, newRequest];
10509
+ }
10510
+ else {
10511
+ Object.assign(newRequest, { 'recaptchaToken': recaptchaV2Token });
10512
+ return [2 /*return*/, newRequest];
10513
+ }
10514
+ }
10515
+ });
10516
+ });
10264
10517
  }
10265
10518
 
10266
10519
  /**
@@ -10332,12 +10585,14 @@ var PhoneAuthProvider = /** @class */ (function () {
10332
10585
  *
10333
10586
  * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in
10334
10587
  * E.164 format (e.g. +16505550101).
10335
- * @param applicationVerifier - For abuse prevention, this method also requires a
10336
- * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation,
10337
- * {@link RecaptchaVerifier}.
10588
+ * @param applicationVerifier - An {@link ApplicationVerifier}, which prevents
10589
+ * requests from unauthorized clients. This SDK includes an implementation
10590
+ * based on reCAPTCHA v2, {@link RecaptchaVerifier}. If you've enabled
10591
+ * reCAPTCHA Enterprise bot protection in Enforce mode, this parameter is
10592
+ * optional; in all other configurations, the parameter is required.
10338
10593
  *
10339
10594
  * @returns A Promise for a verification ID that can be passed to
10340
- * {@link PhoneAuthProvider.credential} to identify this flow..
10595
+ * {@link PhoneAuthProvider.credential} to identify this flow.
10341
10596
  */
10342
10597
  PhoneAuthProvider.prototype.verifyPhoneNumber = function (phoneOptions, applicationVerifier) {
10343
10598
  return _verifyPhoneNumber(this.auth, phoneOptions, getModularInstance(applicationVerifier));
@@ -12451,7 +12706,7 @@ function _isEmptyString(input) {
12451
12706
  }
12452
12707
 
12453
12708
  var name = "@firebase/auth";
12454
- var version = "1.7.9-canary.aa6db78eb";
12709
+ var version = "1.7.9-canary.b942e9e6e";
12455
12710
 
12456
12711
  /**
12457
12712
  * @license
@@ -12738,4 +12993,4 @@ _setExternalJSProvider({
12738
12993
  registerAuth("Browser" /* ClientPlatform.BROWSER */);
12739
12994
 
12740
12995
  export { TwitterAuthProvider as $, ActionCodeOperation as A, updateCurrentUser as B, signOut as C, revokeAccessToken as D, deleteUser as E, FactorId as F, debugErrorMap as G, prodErrorMap as H, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as I, initializeAuth as J, connectAuthEmulator as K, AuthCredential as L, EmailAuthCredential as M, OAuthCredential as N, OperationType as O, PhoneAuthProvider as P, PhoneAuthCredential as Q, RecaptchaVerifier as R, SignInMethod as S, TotpMultiFactorGenerator as T, inMemoryPersistence as U, EmailAuthProvider as V, FacebookAuthProvider as W, GoogleAuthProvider as X, GithubAuthProvider as Y, OAuthProvider as Z, SAMLAuthProvider as _, browserSessionPersistence as a, signInAnonymously as a0, signInWithCredential as a1, linkWithCredential as a2, reauthenticateWithCredential as a3, signInWithCustomToken as a4, sendPasswordResetEmail as a5, confirmPasswordReset as a6, applyActionCode as a7, checkActionCode as a8, verifyPasswordResetCode as a9, _isIOS7Or8 as aA, _assert as aB, _createError as aC, AuthEventManager as aD, _getInstance as aE, _persistenceKeyName as aF, _clearRedirectOutcomes as aG, _getRedirectResult as aH, _overrideRedirectResult as aI, _castAuth as aJ, UserImpl as aK, AuthImpl as aL, _getClientVersion as aM, _generateEventId as aN, AuthPopup as aO, FetchProvider as aP, SAMLAuthCredential as aQ, createUserWithEmailAndPassword as aa, signInWithEmailAndPassword as ab, sendSignInLinkToEmail as ac, isSignInWithEmailLink as ad, signInWithEmailLink as ae, fetchSignInMethodsForEmail as af, sendEmailVerification as ag, verifyBeforeUpdateEmail as ah, ActionCodeURL as ai, parseActionCodeURL as aj, updateProfile as ak, updateEmail as al, updatePassword as am, getIdToken as an, getIdTokenResult as ao, unlink as ap, getAdditionalUserInfo as aq, reload as ar, getMultiFactorResolver as as, multiFactor as at, _isIOS as au, _isAndroid as av, _fail as aw, _getRedirectUrl as ax, debugAssert as ay, _getProjectConfig as az, browserLocalPersistence as b, signInWithPopup as c, linkWithPopup as d, reauthenticateWithPopup as e, signInWithRedirect as f, linkWithRedirect as g, reauthenticateWithRedirect as h, indexedDBLocalPersistence as i, getRedirectResult as j, browserPopupRedirectResolver as k, linkWithPhoneNumber as l, PhoneMultiFactorGenerator as m, TotpSecret as n, getAuth as o, ProviderId as p, setPersistence as q, reauthenticateWithPhoneNumber as r, signInWithPhoneNumber as s, initializeRecaptchaConfig as t, updatePhoneNumber as u, validatePassword as v, onIdTokenChanged as w, beforeAuthStateChanged as x, onAuthStateChanged as y, useDeviceLanguage as z };
12741
- //# sourceMappingURL=index-262b3f24.js.map
12996
+ //# sourceMappingURL=index-82b3e33f.js.map