Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(660)

Unified Diff: components/signin/core/account_id/account_id.cc

Issue 2529103002: Add account_type into AccountId (Closed)
Patch Set: Fix MultiUserWindowManagerChromeOSTest.* Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/signin/core/account_id/account_id.h ('k') | components/user_manager/known_user.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/signin/core/account_id/account_id.cc
diff --git a/components/signin/core/account_id/account_id.cc b/components/signin/core/account_id/account_id.cc
index 00ceb2e2f52bf9f5225ca76c4af50f99e0f58105..1ffac80db1e42f94aaeb864a4fffdaef3c82b056 100644
--- a/components/signin/core/account_id/account_id.cc
+++ b/components/signin/core/account_id/account_id.cc
@@ -16,25 +16,20 @@
namespace {
-// Known account types.
-const char kGoogle[] = "google";
-
// Serialization keys
const char kGaiaIdKey[] = "gaia_id";
const char kEmailKey[] = "email";
+const char kObjGuid[] = "obj_guid";
+const char kAccountTypeKey[] = "account_type";
+
+// Serialization values for account type.
+const char kGoogle[] = "google";
+const char kAd[] = "ad";
+const char kUnknown[] = "unknown";
// Prefix for GetAccountIdKey().
const char kKeyGaiaIdPrefix[] = "g-";
-
-struct GoogleStringSingleton {
- GoogleStringSingleton() : google(kGoogle) {}
-
- static GoogleStringSingleton* GetInstance() {
- return base::Singleton<GoogleStringSingleton>::get();
- }
-
- const std::string google;
-};
+const char kKeyAdIdPrefix[] = "a-";
} // anonymous namespace
@@ -49,26 +44,46 @@ struct AccountId::EmptyAccountId {
AccountId::AccountId() {}
-AccountId::AccountId(const std::string& gaia_id, const std::string& user_email)
- : gaia_id_(gaia_id), user_email_(user_email) {
+AccountId::AccountId(const std::string& id,
+ const std::string& user_email,
+ const AccountType& account_type)
+ : id_(id), user_email_(user_email), account_type_(account_type) {
+ DCHECK(account_type != AccountType::UNKNOWN || id.empty());
+ DCHECK(account_type != AccountType::ACTIVE_DIRECTORY || !id.empty());
// Fail if e-mail looks similar to GaiaIdKey.
LOG_ASSERT(!base::StartsWith(user_email, kKeyGaiaIdPrefix,
base::CompareCase::SENSITIVE) ||
user_email.find('@') != std::string::npos)
- << "Bad e-mail: '" << user_email << "' with gaia_id='" << gaia_id << "'";
+ << "Bad e-mail: '" << user_email << "' with gaia_id='" << id << "'";
// TODO(alemate): DCHECK(!email.empty());
// TODO(alemate): check gaia_id is not empty once it is required.
}
AccountId::AccountId(const AccountId& other)
- : gaia_id_(other.gaia_id_), user_email_(other.user_email_) {}
+ : id_(other.id_),
+ user_email_(other.user_email_),
+ account_type_(other.account_type_) {}
bool AccountId::operator==(const AccountId& other) const {
- return (this == &other) ||
- (gaia_id_ == other.gaia_id_ && user_email_ == other.user_email_) ||
- (!gaia_id_.empty() && gaia_id_ == other.gaia_id_) ||
- (!user_email_.empty() && user_email_ == other.user_email_);
+ if (this == &other)
+ return true;
+ if (account_type_ == AccountType::UNKNOWN ||
+ other.account_type_ == AccountType::UNKNOWN)
+ return user_email_ == other.user_email_;
+ if (account_type_ != other.account_type_)
+ return false;
+ switch (account_type_) {
+ case AccountType::GOOGLE:
+ return (id_ == other.id_ && user_email_ == other.user_email_) ||
+ (!id_.empty() && id_ == other.id_) ||
+ (!user_email_.empty() && user_email_ == other.user_email_);
+ case AccountType::ACTIVE_DIRECTORY:
+ return id_ == other.id_ && user_email_ == other.user_email_;
+ default:
+ NOTREACHED() << "Unknown account type";
+ }
+ return false;
}
bool AccountId::operator!=(const AccountId& other) const {
@@ -81,45 +96,70 @@ bool AccountId::operator<(const AccountId& right) const {
}
bool AccountId::empty() const {
- return gaia_id_.empty() && user_email_.empty();
+ return id_.empty() && user_email_.empty() &&
+ account_type_ == AccountType::UNKNOWN;
}
bool AccountId::is_valid() const {
- return /* !gaia_id_.empty() && */ !user_email_.empty();
+ switch (account_type_) {
+ case AccountType::GOOGLE:
+ return /* !id_.empty() && */ !user_email_.empty();
+ case AccountType::ACTIVE_DIRECTORY:
+ return !id_.empty() && !user_email_.empty();
+ case AccountType::UNKNOWN:
+ return id_.empty() && !user_email_.empty();
+ }
+ NOTREACHED();
+ return false;
}
void AccountId::clear() {
- gaia_id_.clear();
+ id_.clear();
user_email_.clear();
+ account_type_ = AccountType::UNKNOWN;
}
-const std::string& AccountId::GetAccountType() const {
- return GoogleStringSingleton::GetInstance()->google;
+AccountType AccountId::GetAccountType() const {
+ return account_type_;
}
const std::string& AccountId::GetGaiaId() const {
- return gaia_id_;
+ if (account_type_ != AccountType::GOOGLE)
+ NOTIMPLEMENTED() << "Failed to get gaia_id for non-Google account.";
+ return id_;
+}
+
+const std::string& AccountId::GetObjGuid() const {
+ if (account_type_ != AccountType::ACTIVE_DIRECTORY)
+ NOTIMPLEMENTED()
+ << "Failed to get obj_guid for non-Active Directory account.";
+ return id_;
}
const std::string& AccountId::GetUserEmail() const {
return user_email_;
}
+bool AccountId::HasAccountIdKey() const {
+ return account_type_ != AccountType::UNKNOWN && !id_.empty();
+}
+
const std::string AccountId::GetAccountIdKey() const {
#ifdef NDEBUG
- if (gaia_id_.empty())
- LOG(FATAL) << "GetAccountIdKey(): no gaia id for " << Serialize();
-
+ if (id_.empty())
+ LOG(FATAL) << "GetAccountIdKey(): no id for " << Serialize();
#else
- CHECK(!gaia_id_.empty());
+ CHECK(!id_.empty());
#endif
-
- return std::string(kKeyGaiaIdPrefix) + gaia_id_;
-}
-
-void AccountId::SetGaiaId(const std::string& gaia_id) {
- DCHECK(!gaia_id.empty());
- gaia_id_ = gaia_id;
+ switch (GetAccountType()) {
+ case AccountType::GOOGLE:
+ return std::string(kKeyGaiaIdPrefix) + id_;
+ case AccountType::ACTIVE_DIRECTORY:
+ return std::string(kKeyAdIdPrefix) + id_;
+ default:
+ NOTREACHED() << "Unknown account type";
+ }
+ return std::string();
}
void AccountId::SetUserEmail(const std::string& email) {
@@ -130,24 +170,75 @@ void AccountId::SetUserEmail(const std::string& email) {
// static
AccountId AccountId::FromUserEmail(const std::string& email) {
// TODO(alemate): DCHECK(!email.empty());
- return AccountId(std::string() /* gaia_id */, email);
+ return AccountId(std::string() /* id */, email, AccountType::UNKNOWN);
}
+// static
AccountId AccountId::FromGaiaId(const std::string& gaia_id) {
DCHECK(!gaia_id.empty());
- return AccountId(gaia_id, std::string() /* email */);
+ return AccountId(gaia_id, std::string() /* email */, AccountType::GOOGLE);
}
// static
AccountId AccountId::FromUserEmailGaiaId(const std::string& email,
const std::string& gaia_id) {
DCHECK(!(email.empty() && gaia_id.empty()));
- return AccountId(gaia_id, email);
+ return AccountId(gaia_id, email, AccountType::GOOGLE);
+}
+
+// static
+AccountId AccountId::AdFromUserEmailObjGuid(const std::string& email,
+ const std::string& obj_guid) {
+ DCHECK(!email.empty() && !obj_guid.empty());
+ return AccountId(obj_guid, email, AccountType::ACTIVE_DIRECTORY);
+}
+
+// static
+AccountId AccountId::AdFromObjGuid(const std::string& obj_guid) {
+ DCHECK(!obj_guid.empty());
+ return AccountId(obj_guid, std::string() /* email */,
+ AccountType::ACTIVE_DIRECTORY);
+}
+
+// static
+AccountType AccountId::StringToAccountType(
+ const std::string& account_type_string) {
+ if (account_type_string == kGoogle)
+ return AccountType::GOOGLE;
+ if (account_type_string == kAd)
+ return AccountType::ACTIVE_DIRECTORY;
+ if (account_type_string == kUnknown)
+ return AccountType::UNKNOWN;
+ NOTREACHED() << "Unknown account type " << account_type_string;
+ return AccountType::UNKNOWN;
+}
+
+// static
+std::string AccountId::AccountTypeToString(const AccountType& account_type) {
+ switch (account_type) {
+ case AccountType::GOOGLE:
+ return kGoogle;
+ case AccountType::ACTIVE_DIRECTORY:
+ return kAd;
+ case AccountType::UNKNOWN:
+ return kUnknown;
+ }
+ return std::string();
}
std::string AccountId::Serialize() const {
base::DictionaryValue value;
- value.SetString(kGaiaIdKey, gaia_id_);
+ switch (GetAccountType()) {
+ case AccountType::GOOGLE:
+ value.SetString(kGaiaIdKey, id_);
+ break;
+ case AccountType::ACTIVE_DIRECTORY:
+ value.SetString(kObjGuid, id_);
+ break;
+ case AccountType::UNKNOWN:
+ break;
+ }
+ value.SetString(kAccountTypeKey, AccountTypeToString(GetAccountType()));
value.SetString(kEmailKey, user_email_);
std::string serialized;
@@ -167,23 +258,65 @@ bool AccountId::Deserialize(const std::string& serialized,
std::string gaia_id;
std::string user_email;
+ std::string obj_guid;
+ std::string account_type_string;
+ AccountType account_type = AccountType::GOOGLE;
const bool found_gaia_id = dictionary_value->GetString(kGaiaIdKey, &gaia_id);
const bool found_user_email =
dictionary_value->GetString(kEmailKey, &user_email);
-
- if (!found_gaia_id)
- LOG(ERROR) << "gaia_id is not found in '" << serialized << "'";
-
- if (!found_user_email)
- LOG(ERROR) << "user_email is not found in '" << serialized << "'";
-
- if (!found_gaia_id && !found_user_email)
- return false;
-
- *account_id = FromUserEmailGaiaId(user_email, gaia_id);
-
- return true;
+ const bool found_obj_guid = dictionary_value->GetString(kObjGuid, &obj_guid);
+ const bool found_account_type =
+ dictionary_value->GetString(kAccountTypeKey, &account_type_string);
+ if (found_account_type)
+ account_type = StringToAccountType(account_type_string);
+
+ switch (account_type) {
+ case AccountType::GOOGLE:
+ if (found_obj_guid)
+ DLOG(ERROR) << "AccountType is 'google' but obj_guid is found in '"
+ << serialized << "'";
+
+ if (!found_gaia_id)
+ DLOG(ERROR) << "gaia_id is not found in '" << serialized << "'";
+
+ if (!found_user_email)
+ DLOG(ERROR) << "user_email is not found in '" << serialized << "'";
+
+ if (!found_gaia_id && !found_user_email)
+ return false;
+
+ *account_id = FromUserEmailGaiaId(user_email, gaia_id);
+ return true;
+
+ case AccountType::ACTIVE_DIRECTORY:
+ if (found_gaia_id)
+ DLOG(ERROR)
+ << "AccountType is 'active directory' but gaia_id is found in '"
+ << serialized << "'";
+
+ if (!found_obj_guid) {
+ DLOG(ERROR) << "obj_guid is not found in '" << serialized << "'";
+ return false;
+ }
+
+ if (!found_user_email) {
+ DLOG(ERROR) << "user_email is not found in '" << serialized << "'";
+ }
+
+ if (!found_obj_guid || !found_user_email)
+ return false;
+
+ *account_id = AdFromUserEmailObjGuid(user_email, obj_guid);
+ return true;
+
+ case AccountType::UNKNOWN:
+ if (!found_user_email)
+ return false;
+ *account_id = FromUserEmail(user_email);
+ return true;
+ }
+ return false;
}
const AccountId& EmptyAccountId() {
« no previous file with comments | « components/signin/core/account_id/account_id.h ('k') | components/user_manager/known_user.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698