Commit 766926fd authored by Jialiu Lin's avatar Jialiu Lin Committed by Commit Bot

Refine gaia::CanonicalizeEmail(..)

1. Previously gaia::CanonicalizeEmail(..) didn't handle upper case gmail correctly.
e.g.:  CanonicalizeEmail("USER.NAME@GMAIL.COM") previously return
"user.name@gmail.com". Instead it should return "username@gmail.com".

2. When input is not a valid email, instead of triggering NOTREACHED,
it now returns the input in lower case. In this way, the downstream use of this
method can be more flexible.

Bug: 874050, 859622
Change-Id: I2aeeb30cb1cd69c65b96de0fdd3a8c00cb2f274e
Reviewed-on: https://chromium-review.googlesource.com/1174909Reviewed-by: default avatarRoger Tawa <rogerta@chromium.org>
Reviewed-by: default avatarJialiu Lin <jialiul@chromium.org>
Commit-Queue: Jialiu Lin <jialiul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#583754}
parent 93a98c25
......@@ -30,21 +30,19 @@ const void* const kURLRequestUserDataKey = &kURLRequestUserDataKey;
std::string CanonicalizeEmailImpl(const std::string& email_address,
bool change_googlemail_to_gmail) {
std::string lower_case_email = base::ToLowerASCII(email_address);
std::vector<std::string> parts = base::SplitString(
email_address, "@", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
if (parts.size() != 2U) {
NOTREACHED() << "expecting exactly one @, but got "
<< (parts.empty() ? 0 : parts.size() - 1)
<< " : " << email_address;
} else {
if (change_googlemail_to_gmail && parts[1] == kGooglemailDomain)
parts[1] = kGmailDomain;
if (parts[1] == kGmailDomain) // only strip '.' for gmail accounts.
base::RemoveChars(parts[0], ".", &parts[0]);
}
lower_case_email, "@", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
if (parts.size() != 2U)
return lower_case_email;
if (change_googlemail_to_gmail && parts[1] == kGooglemailDomain)
parts[1] = kGmailDomain;
if (parts[1] == kGmailDomain) // only strip '.' for gmail accounts.
base::RemoveChars(parts[0], ".", &parts[0]);
std::string new_email = base::ToLowerASCII(base::JoinString(parts, "@"));
std::string new_email = base::JoinString(parts, "@");
VLOG(1) << "Canonicalized " << email_address << " to " << new_email;
return new_email;
}
......
......@@ -36,6 +36,8 @@ struct ListedAccount {
// Perform basic canonicalization of |email_address|, taking into account that
// gmail does not consider '.' or caps inside a username to matter.
// If |email_address| is not a valid, returns it in lower case without
// additional canonicalization.
std::string CanonicalizeEmail(const std::string& email_address);
// Returns the canonical form of the given domain.
......
......@@ -14,6 +14,14 @@ TEST(GaiaAuthUtilTest, EmailAddressNoOp) {
EXPECT_EQ(lower_case, CanonicalizeEmail(lower_case));
}
TEST(GaiaAuthUtilTest, InvalidEmailAddress) {
const char invalid_email1[] = "user";
const char invalid_email2[] = "user@@what.com";
EXPECT_EQ(invalid_email1, CanonicalizeEmail(invalid_email1));
EXPECT_EQ(invalid_email2, CanonicalizeEmail(invalid_email2));
EXPECT_EQ("user", CanonicalizeEmail("USER"));
}
TEST(GaiaAuthUtilTest, EmailAddressIgnoreCaps) {
EXPECT_EQ(CanonicalizeEmail("user@what.com"),
CanonicalizeEmail("UsEr@what.com"));
......@@ -39,6 +47,11 @@ TEST(GaiaAuthUtilTest, EmailAddressIgnoreOneUsernameDot) {
CanonicalizeEmail("UsEr@gmail.com"));
}
TEST(GaiaAuthUtilTest, EmailAddressIgnoreOneUsernameDotAndIgnoreCaps) {
EXPECT_EQ(CanonicalizeEmail("user@gmail.com"),
CanonicalizeEmail("US.ER@GMAIL.COM"));
}
TEST(GaiaAuthUtilTest, EmailAddressIgnoreManyUsernameDots) {
EXPECT_EQ(CanonicalizeEmail("u.ser@gmail.com"),
CanonicalizeEmail("Us.E.r@gmail.com"));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment