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

Side by Side Diff: components/user_manager/known_user.cc

Issue 1693383003: ChromeOS cryptohome should be able to use gaia id as user identifier. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed unit tests. Created 4 years, 9 months 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 unified diff | Download patch
« no previous file with comments | « components/user_manager/known_user.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/user_manager/known_user.h" 5 #include "components/user_manager/known_user.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 28 matching lines...) Expand all
39 // Key of GAPS cookie. 39 // Key of GAPS cookie.
40 const char kGAPSCookie[] = "gaps_cookie"; 40 const char kGAPSCookie[] = "gaps_cookie";
41 41
42 // Key of the reason for re-auth. 42 // Key of the reason for re-auth.
43 const char kReauthReasonKey[] = "reauth_reason"; 43 const char kReauthReasonKey[] = "reauth_reason";
44 44
45 // Key for the GaiaId migration status. 45 // Key for the GaiaId migration status.
46 const char kGaiaIdMigration[] = "gaia_id_migration"; 46 const char kGaiaIdMigration[] = "gaia_id_migration";
47 47
48 PrefService* GetLocalState() { 48 PrefService* GetLocalState() {
49 UserManager* user_manager = UserManager::Get(); 49 if (!UserManager::IsInitialized())
50 if (user_manager) 50 return nullptr;
51 return user_manager->GetLocalState();
52 51
53 return nullptr; 52 return UserManager::Get()->GetLocalState();
54 } 53 }
55 54
56 // Checks if values in |dict| correspond with |account_id| identity. 55 // Checks if values in |dict| correspond with |account_id| identity.
57 bool UserMatches(const AccountId& account_id, 56 bool UserMatches(const AccountId& account_id,
58 const base::DictionaryValue& dict) { 57 const base::DictionaryValue& dict) {
59 std::string value; 58 std::string value;
60 59
61 // TODO(alemate): update code once user id is really a struct. 60 // TODO(alemate): update code once user id is really a struct.
62 bool has_gaia_id = dict.GetString(kGAIAIdKey, &value); 61 bool has_gaia_id = dict.GetString(kGAIAIdKey, &value);
63 if (has_gaia_id && account_id.GetGaiaId() == value) 62 if (has_gaia_id && account_id.GetGaiaId() == value)
64 return true; 63 return true;
65 64
66 bool has_email = dict.GetString(kCanonicalEmail, &value); 65 bool has_email = dict.GetString(kCanonicalEmail, &value);
67 if (has_email && account_id.GetUserEmail() == value) 66 if (has_email && account_id.GetUserEmail() == value)
68 return true; 67 return true;
69 68
70 return false; 69 return false;
71 } 70 }
72 71
73 // Fills relevant |dict| values based on |account_id|. 72 // Fills relevant |dict| values based on |account_id|.
74 void UpdateIdentity(const AccountId& account_id, base::DictionaryValue& dict) { 73 void UpdateIdentity(const AccountId& account_id, base::DictionaryValue& dict) {
75 dict.SetString(kCanonicalEmail, account_id.GetUserEmail()); 74 if (!account_id.GetUserEmail().empty())
75 dict.SetString(kCanonicalEmail, account_id.GetUserEmail());
76
77 if (!account_id.GetGaiaId().empty())
78 dict.SetString(kGAIAIdKey, account_id.GetGaiaId());
76 } 79 }
77 80
78 } // namespace 81 } // namespace
79 82
80 bool FindPrefs(const AccountId& account_id, 83 bool FindPrefs(const AccountId& account_id,
81 const base::DictionaryValue** out_value) { 84 const base::DictionaryValue** out_value) {
82 PrefService* local_state = GetLocalState(); 85 PrefService* local_state = GetLocalState();
83 86
84 // Local State may not be initialized in tests. 87 // Local State may not be initialized in tests.
85 if (!local_state) 88 if (!local_state)
86 return false; 89 return false;
87 90
88 // UserManager is usually NULL in unit tests. 91 // UserManager is usually NULL in unit tests.
89 UserManager* user_manager = UserManager::Get(); 92 if (UserManager::IsInitialized() &&
90 if (user_manager && 93 UserManager::Get()->IsUserNonCryptohomeDataEphemeral(account_id))
91 user_manager->IsUserNonCryptohomeDataEphemeral(account_id))
92 return false; 94 return false;
93 95
94 const base::ListValue* known_users = local_state->GetList(kKnownUsers); 96 const base::ListValue* known_users = local_state->GetList(kKnownUsers);
95 for (size_t i = 0; i < known_users->GetSize(); ++i) { 97 for (size_t i = 0; i < known_users->GetSize(); ++i) {
96 const base::DictionaryValue* element = nullptr; 98 const base::DictionaryValue* element = nullptr;
97 if (known_users->GetDictionary(i, &element)) { 99 if (known_users->GetDictionary(i, &element)) {
98 if (UserMatches(account_id, *element)) { 100 if (UserMatches(account_id, *element)) {
99 known_users->GetDictionary(i, out_value); 101 known_users->GetDictionary(i, out_value);
100 return true; 102 return true;
101 } 103 }
102 } 104 }
103 } 105 }
104 return false; 106 return false;
105 } 107 }
106 108
107 void UpdatePrefs(const AccountId& account_id, 109 void UpdatePrefs(const AccountId& account_id,
108 const base::DictionaryValue& values, 110 const base::DictionaryValue& values,
109 bool clear) { 111 bool clear) {
110 PrefService* local_state = GetLocalState(); 112 PrefService* local_state = GetLocalState();
111 113
112 // Local State may not be initialized in tests. 114 // Local State may not be initialized in tests.
113 if (!local_state) 115 if (!local_state)
114 return; 116 return;
115 117
116 // UserManager is usually NULL in unit tests. 118 // UserManager is usually NULL in unit tests.
117 UserManager* user_manager = UserManager::Get(); 119 if (UserManager::IsInitialized() &&
118 if (user_manager && 120 UserManager::Get()->IsUserNonCryptohomeDataEphemeral(account_id))
119 user_manager->IsUserNonCryptohomeDataEphemeral(account_id))
120 return; 121 return;
121 122
122 ListPrefUpdate update(local_state, kKnownUsers); 123 ListPrefUpdate update(local_state, kKnownUsers);
123 for (size_t i = 0; i < update->GetSize(); ++i) { 124 for (size_t i = 0; i < update->GetSize(); ++i) {
124 base::DictionaryValue* element = nullptr; 125 base::DictionaryValue* element = nullptr;
125 if (update->GetDictionary(i, &element)) { 126 if (update->GetDictionary(i, &element)) {
126 if (UserMatches(account_id, *element)) { 127 if (UserMatches(account_id, *element)) {
127 if (clear) 128 if (clear)
128 element->Clear(); 129 element->Clear();
129 element->MergeDictionary(&values); 130 element->MergeDictionary(&values);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 UpdatePrefs(account_id, dict, false); 213 UpdatePrefs(account_id, dict, false);
213 } 214 }
214 215
215 AccountId GetAccountId(const std::string& user_email, 216 AccountId GetAccountId(const std::string& user_email,
216 const std::string& gaia_id) { 217 const std::string& gaia_id) {
217 // In tests empty accounts are possible. 218 // In tests empty accounts are possible.
218 if (user_email.empty() && gaia_id.empty()) 219 if (user_email.empty() && gaia_id.empty())
219 return EmptyAccountId(); 220 return EmptyAccountId();
220 221
221 AccountId result(EmptyAccountId()); 222 AccountId result(EmptyAccountId());
222 UserManager* user_manager = UserManager::Get(); 223 // UserManager is usually NULL in unit tests.
223 if (user_manager && 224 if (UserManager::IsInitialized() &&
224 user_manager->GetPlatformKnownUserId(user_email, gaia_id, &result)) { 225 UserManager::Get()->GetPlatformKnownUserId(user_email, gaia_id,
226 &result)) {
225 return result; 227 return result;
226 } 228 }
227 229
228 // We can have several users with the same gaia_id but different e-mails. 230 // We can have several users with the same gaia_id but different e-mails.
229 // The opposite case is not possible. 231 // The opposite case is not possible.
230 std::string stored_gaia_id; 232 std::string stored_gaia_id;
231 const std::string sanitized_email = 233 const std::string sanitized_email =
232 user_email.empty() 234 user_email.empty()
233 ? std::string() 235 ? std::string()
234 : gaia::CanonicalizeEmail(gaia::SanitizeEmail(user_email)); 236 : gaia::CanonicalizeEmail(gaia::SanitizeEmail(user_email));
(...skipping 14 matching lines...) Expand all
249 if (!gaia_id.empty() && GetStringPref(AccountId::FromGaiaId(gaia_id), 251 if (!gaia_id.empty() && GetStringPref(AccountId::FromGaiaId(gaia_id),
250 kCanonicalEmail, &stored_email)) { 252 kCanonicalEmail, &stored_email)) {
251 return AccountId::FromUserEmailGaiaId(stored_email, gaia_id); 253 return AccountId::FromUserEmailGaiaId(stored_email, gaia_id);
252 } 254 }
253 255
254 return (gaia_id.empty() 256 return (gaia_id.empty()
255 ? AccountId::FromUserEmail(user_email) 257 ? AccountId::FromUserEmail(user_email)
256 : AccountId::FromUserEmailGaiaId(user_email, gaia_id)); 258 : AccountId::FromUserEmailGaiaId(user_email, gaia_id));
257 } 259 }
258 260
261 std::vector<AccountId> GetKnownAccountIds() {
262 std::vector<AccountId> result;
263 PrefService* local_state = GetLocalState();
264
265 // Local State may not be initialized in tests.
266 if (!local_state)
267 return result;
268
269 const base::ListValue* known_users = local_state->GetList(kKnownUsers);
270 for (size_t i = 0; i < known_users->GetSize(); ++i) {
271 const base::DictionaryValue* element = nullptr;
272 if (known_users->GetDictionary(i, &element)) {
273 std::string email;
274 std::string gaia_id;
275 const bool has_email = element->GetString(kCanonicalEmail, &email);
276 const bool has_gaia_id = element->GetString(kGAIAIdKey, &gaia_id);
277 if (has_email || has_gaia_id)
278 result.push_back(AccountId::FromUserEmailGaiaId(email, gaia_id));
279 }
280 }
281 return result;
282 }
283
259 bool GetGaiaIdMigrationStatus(const AccountId& account_id, 284 bool GetGaiaIdMigrationStatus(const AccountId& account_id,
260 const std::string& subsystem) { 285 const std::string& subsystem) {
261 bool migrated = false; 286 bool migrated = false;
262 287
263 if (GetBooleanPref(account_id, 288 if (GetBooleanPref(account_id,
264 std::string(kGaiaIdMigration) + "." + subsystem, 289 std::string(kGaiaIdMigration) + "." + subsystem,
265 &migrated)) { 290 &migrated)) {
266 return migrated; 291 return migrated;
267 } 292 }
268 293
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 } 374 }
350 } 375 }
351 } 376 }
352 377
353 void RegisterPrefs(PrefRegistrySimple* registry) { 378 void RegisterPrefs(PrefRegistrySimple* registry) {
354 registry->RegisterListPref(kKnownUsers); 379 registry->RegisterListPref(kKnownUsers);
355 } 380 }
356 381
357 } // namespace known_user 382 } // namespace known_user
358 } // namespace user_manager 383 } // namespace user_manager
OLDNEW
« no previous file with comments | « components/user_manager/known_user.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698