Skip to content

Commit 6e89ddc

Browse files
authored
change email validation logic to allow international emaill address (#1427)
1 parent f970f9c commit 6e89ddc

File tree

4 files changed

+45
-12
lines changed

4 files changed

+45
-12
lines changed

packages/auth/src/rpchandler.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ goog.require('fireauth.object');
3131
goog.require('fireauth.util');
3232
goog.require('goog.Promise');
3333
goog.require('goog.Uri');
34-
goog.require('goog.format.EmailAddress');
3534
goog.require('goog.html.TrustedResourceUrl');
3635
goog.require('goog.json');
3736
goog.require('goog.net.CorsXmlHttpFactory');
@@ -803,7 +802,7 @@ fireauth.RpcHandler.prototype.requestFirebaseEndpoint = function(
803802
* @private
804803
*/
805804
fireauth.RpcHandler.validateRequestHasEmail_ = function(request) {
806-
if (!goog.format.EmailAddress.isValidAddrSpec(request['email'])) {
805+
if (!fireauth.util.isValidEmailAddress(request['email'])) {
807806
throw new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL);
808807
}
809808
};
@@ -815,7 +814,7 @@ fireauth.RpcHandler.validateRequestHasEmail_ = function(request) {
815814
* @private
816815
*/
817816
fireauth.RpcHandler.validateResponseHasEmail_ = function(response) {
818-
if (!goog.format.EmailAddress.isValidAddrSpec(response['email'])) {
817+
if (!fireauth.util.isValidEmailAddress(response['email'])) {
819818
throw new fireauth.AuthError(fireauth.authenum.Error.INTERNAL_ERROR);
820819
}
821820
};

packages/auth/src/utils.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,25 @@ fireauth.util.matchDomain = function(domainPattern, domain, scheme) {
467467
};
468468

469469

470+
/**
471+
* RegExp to detect if the email address given is valid.
472+
* @const {!RegExp}
473+
* @private
474+
*/
475+
fireauth.util.EMAIL_ADDRESS_REGEXP_ = /^[^@]+@[^@]+$/;
476+
477+
478+
/**
479+
* Determines if it is a valid email address.
480+
* @param {*} email The email address.
481+
* @return {boolean} Whether the email address is valid.
482+
*/
483+
fireauth.util.isValidEmailAddress = function(email) {
484+
return goog.isString(email) &&
485+
fireauth.util.EMAIL_ADDRESS_REGEXP_.test(email);
486+
};
487+
488+
470489
/**
471490
* @return {!goog.Promise<void>} A promise that resolves when DOM is ready.
472491
*/
@@ -1427,7 +1446,7 @@ fireauth.util.persistsStorageWithIndexedDB = function() {
14271446
// IE11, Edge when indexedDB is available (this is unavailable in InPrivate
14281447
// mode). (SDK, OAuth handler and iframe)
14291448
// Any environment where indexedDB is available (SDK only).
1430-
1449+
14311450
// In a browser environment, when an iframe and a popup web storage are not
14321451
// synchronized, use the indexedDB fireauth.storage.Storage implementation.
14331452
return (fireauth.util.isLocalStorageNotSynchronized() ||
@@ -1493,4 +1512,3 @@ fireauth.util.getActiveServiceWorker = function() {
14931512
}
14941513
return goog.Promise.resolve(/** @type {?ServiceWorker} */ (null));
14951514
};
1496-

packages/auth/test/rpchandler_test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2636,7 +2636,7 @@ function testEmailLinkSignIn_invalidEmailError() {
26362636
// Test when invalid email is passed in emailLinkSignIn request.
26372637
asyncTestCase.waitForSignals(1);
26382638
// Test when request is invalid.
2639-
rpcHandler.emailLinkSignIn('user@invalid', 'OTP_CODE')
2639+
rpcHandler.emailLinkSignIn('user.invalid', 'OTP_CODE')
26402640
.thenCatch(function(error) {
26412641
fireauth.common.testHelper.assertErrorEquals(
26422642
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),
@@ -2745,7 +2745,7 @@ function testVerifyPassword_invalidEmailError() {
27452745
// Test when invalid email is passed in verifyPassword request.
27462746
asyncTestCase.waitForSignals(1);
27472747
// Test when request is invalid.
2748-
rpcHandler.verifyPassword('uid123@invalid', 'mysupersecretpassword')
2748+
rpcHandler.verifyPassword('uid123.invalid', 'mysupersecretpassword')
27492749
.thenCatch(function(error) {
27502750
fireauth.common.testHelper.assertErrorEquals(
27512751
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),
@@ -2847,7 +2847,7 @@ function testCreateAccount_invalidEmailError() {
28472847
// Test when invalid email is passed in setAccountInfo request.
28482848
asyncTestCase.waitForSignals(1);
28492849
// Test when request is invalid.
2850-
rpcHandler.createAccount('uid123@invalid', 'mysupersecretpassword')
2850+
rpcHandler.createAccount('uid123.invalid', 'mysupersecretpassword')
28512851
.thenCatch(function(error) {
28522852
fireauth.common.testHelper.assertErrorEquals(
28532853
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),
@@ -4715,7 +4715,7 @@ function testSendSignInLinkToEmail_invalidEmailError() {
47154715
};
47164716
asyncTestCase.waitForSignals(1);
47174717
// Test when request is invalid.
4718-
rpcHandler.sendSignInLinkToEmail('user@invalid', additionalRequestData)
4718+
rpcHandler.sendSignInLinkToEmail('user.invalid', additionalRequestData)
47194719
.thenCatch(function(error) {
47204720
fireauth.common.testHelper.assertErrorEquals(
47214721
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),
@@ -4917,7 +4917,7 @@ function testSendPasswordResetEmail_invalidEmailError() {
49174917
// Test when invalid email is passed in getOobCode request.
49184918
asyncTestCase.waitForSignals(1);
49194919
// Test when request is invalid.
4920-
rpcHandler.sendPasswordResetEmail('user@exampl', {})
4920+
rpcHandler.sendPasswordResetEmail('user.invalid', {})
49214921
.thenCatch(function(error) {
49224922
fireauth.common.testHelper.assertErrorEquals(
49234923
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),
@@ -5803,7 +5803,7 @@ function testUpdateEmail_invalidEmail() {
58035803
var expectedError = new fireauth.AuthError(
58045804
fireauth.authenum.Error.INVALID_EMAIL);
58055805
asyncTestCase.waitForSignals(1);
5806-
rpcHandler.updateEmail('ID_TOKEN', 'newuser@exam')
5806+
rpcHandler.updateEmail('ID_TOKEN', 'newuser.invalid')
58075807
.thenCatch(function(error) {
58085808
fireauth.common.testHelper.assertErrorEquals(expectedError, error);
58095809
asyncTestCase.signal();
@@ -6000,7 +6000,7 @@ function testEmailLinkSignInForLinking_invalidEmailError() {
60006000
asyncTestCase.waitForSignals(1);
60016001
// Test when request is invalid.
60026002
rpcHandler.emailLinkSignInForLinking(
6003-
'ID_TOKEN', 'user@invalid', 'OTP_CODE')
6003+
'ID_TOKEN', 'user.invalid', 'OTP_CODE')
60046004
.thenCatch(function(error) {
60056005
fireauth.common.testHelper.assertErrorEquals(
60066006
new fireauth.AuthError(fireauth.authenum.Error.INVALID_EMAIL),

packages/auth/test/utils_test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,22 @@ function testMatchDomain_dotsInPatternEscaped() {
482482
}
483483

484484

485+
function testIsValidEmailAddress() {
486+
assertTrue(fireauth.util.isValidEmailAddress('[email protected]'));
487+
assertTrue(fireauth.util.isValidEmailAddress('abc@def'));
488+
// International email addresses.
489+
assertTrue(fireauth.util.isValidEmailAddress('Pelé@example.com'));
490+
assertTrue(fireauth.util.isValidEmailAddress('我買@屋企.香港'));
491+
// Invalid email addresses.
492+
assertFalse(fireauth.util.isValidEmailAddress('abcdef'));
493+
assertFalse(fireauth.util.isValidEmailAddress('abc.def'));
494+
// Non-string.
495+
assertFalse(fireauth.util.isValidEmailAddress(123));
496+
assertFalse(fireauth.util.isValidEmailAddress(null));
497+
assertFalse(fireauth.util.isValidEmailAddress(undefined));
498+
}
499+
500+
485501
function testOnDomReady() {
486502
return installAndRunTest('onDomReady', function() {
487503
// Should resolve immediately.

0 commit comments

Comments
 (0)