OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/signin/easy_unlock_service_signin_chromeos.h" | 5 #include "chrome/browser/signin/easy_unlock_service_signin_chromeos.h" |
6 | 6 |
7 #include "base/base64url.h" | 7 #include "base/base64url.h" |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 // Calculates the backoff interval that should be used next. | 39 // Calculates the backoff interval that should be used next. |
40 // |backoff| The last backoff interval used. | 40 // |backoff| The last backoff interval used. |
41 uint32 GetNextBackoffInterval(uint32 backoff) { | 41 uint32 GetNextBackoffInterval(uint32 backoff) { |
42 if (backoff == 0u) | 42 if (backoff == 0u) |
43 return kInitialCryptohomeBackoffIntervalMs; | 43 return kInitialCryptohomeBackoffIntervalMs; |
44 return backoff * 2; | 44 return backoff * 2; |
45 } | 45 } |
46 | 46 |
47 void LoadDataForUser( | 47 void LoadDataForUser( |
48 const std::string& user_id, | 48 const AccountId& account_id, |
49 uint32 backoff_ms, | 49 uint32 backoff_ms, |
50 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback); | 50 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback); |
51 | 51 |
52 // Callback passed to |LoadDataForUser()|. | 52 // Callback passed to |LoadDataForUser()|. |
53 // If |LoadDataForUser| function succeeded, it invokes |callback| with the | 53 // If |LoadDataForUser| function succeeded, it invokes |callback| with the |
54 // results. | 54 // results. |
55 // If |LoadDataForUser| failed and further retries are allowed, schedules new | 55 // If |LoadDataForUser| failed and further retries are allowed, schedules new |
56 // |LoadDataForUser| call with some backoff. If no further retires are allowed, | 56 // |LoadDataForUser| call with some backoff. If no further retires are allowed, |
57 // it invokes |callback| with the |LoadDataForUser| results. | 57 // it invokes |callback| with the |LoadDataForUser| results. |
58 void RetryDataLoadOnError( | 58 void RetryDataLoadOnError( |
59 const std::string& user_id, | 59 const AccountId& account_id, |
60 uint32 backoff_ms, | 60 uint32 backoff_ms, |
61 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback, | 61 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback, |
62 bool success, | 62 bool success, |
63 const chromeos::EasyUnlockDeviceKeyDataList& data_list) { | 63 const chromeos::EasyUnlockDeviceKeyDataList& data_list) { |
64 if (success) { | 64 if (success) { |
65 callback.Run(success, data_list); | 65 callback.Run(success, data_list); |
66 return; | 66 return; |
67 } | 67 } |
68 | 68 |
69 uint32 next_backoff_ms = GetNextBackoffInterval(backoff_ms); | 69 uint32 next_backoff_ms = GetNextBackoffInterval(backoff_ms); |
70 if (next_backoff_ms > kMaxCryptohomeBackoffIntervalMs) { | 70 if (next_backoff_ms > kMaxCryptohomeBackoffIntervalMs) { |
71 callback.Run(false, data_list); | 71 callback.Run(false, data_list); |
72 return; | 72 return; |
73 } | 73 } |
74 | 74 |
75 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 75 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
76 FROM_HERE, | 76 FROM_HERE, |
77 base::Bind(&LoadDataForUser, user_id, next_backoff_ms, callback), | 77 base::Bind(&LoadDataForUser, account_id, next_backoff_ms, callback), |
78 base::TimeDelta::FromMilliseconds(next_backoff_ms)); | 78 base::TimeDelta::FromMilliseconds(next_backoff_ms)); |
79 } | 79 } |
80 | 80 |
81 // Loads device data list associated with the user's Easy unlock keys. | 81 // Loads device data list associated with the user's Easy unlock keys. |
82 void LoadDataForUser( | 82 void LoadDataForUser( |
83 const std::string& user_id, | 83 const AccountId& account_id, |
84 uint32 backoff_ms, | 84 uint32 backoff_ms, |
85 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback) { | 85 const chromeos::EasyUnlockKeyManager::GetDeviceDataListCallback& callback) { |
86 chromeos::EasyUnlockKeyManager* key_manager = | 86 chromeos::EasyUnlockKeyManager* key_manager = |
87 chromeos::UserSessionManager::GetInstance()->GetEasyUnlockKeyManager(); | 87 chromeos::UserSessionManager::GetInstance()->GetEasyUnlockKeyManager(); |
88 DCHECK(key_manager); | 88 DCHECK(key_manager); |
89 | 89 |
90 key_manager->GetDeviceDataList( | 90 key_manager->GetDeviceDataList( |
91 chromeos::UserContext(AccountId::FromUserEmail(user_id)), | 91 chromeos::UserContext(account_id), |
92 base::Bind(&RetryDataLoadOnError, user_id, backoff_ms, callback)); | 92 base::Bind(&RetryDataLoadOnError, account_id, backoff_ms, callback)); |
93 } | 93 } |
94 | 94 |
95 } // namespace | 95 } // namespace |
96 | 96 |
97 EasyUnlockServiceSignin::UserData::UserData() | 97 EasyUnlockServiceSignin::UserData::UserData() |
98 : state(EasyUnlockServiceSignin::USER_DATA_STATE_INITIAL) { | 98 : state(EasyUnlockServiceSignin::USER_DATA_STATE_INITIAL) { |
99 } | 99 } |
100 | 100 |
101 EasyUnlockServiceSignin::UserData::~UserData() {} | 101 EasyUnlockServiceSignin::UserData::~UserData() {} |
102 | 102 |
103 EasyUnlockServiceSignin::EasyUnlockServiceSignin(Profile* profile) | 103 EasyUnlockServiceSignin::EasyUnlockServiceSignin(Profile* profile) |
104 : EasyUnlockService(profile), | 104 : EasyUnlockService(profile), |
105 allow_cryptohome_backoff_(true), | 105 account_id_(EmptyAccountId()), |
106 service_active_(false), | |
107 user_pod_last_focused_timestamp_(base::TimeTicks::Now()), | 106 user_pod_last_focused_timestamp_(base::TimeTicks::Now()), |
108 weak_ptr_factory_(this) { | 107 weak_ptr_factory_(this) {} |
109 } | |
110 | 108 |
111 EasyUnlockServiceSignin::~EasyUnlockServiceSignin() { | 109 EasyUnlockServiceSignin::~EasyUnlockServiceSignin() { |
112 } | 110 } |
113 | 111 |
114 void EasyUnlockServiceSignin::SetCurrentUser(const std::string& user_id) { | 112 void EasyUnlockServiceSignin::SetCurrentUser(const AccountId& account_id) { |
115 OnFocusedUserChanged(user_id); | 113 OnFocusedUserChanged(account_id); |
116 } | 114 } |
117 | 115 |
118 void EasyUnlockServiceSignin::WrapChallengeForUserAndDevice( | 116 void EasyUnlockServiceSignin::WrapChallengeForUserAndDevice( |
119 const std::string& user_id, | 117 const AccountId& account_id, |
120 const std::string& device_public_key, | 118 const std::string& device_public_key, |
121 const std::string& channel_binding_data, | 119 const std::string& channel_binding_data, |
122 base::Callback<void(const std::string& wraped_challenge)> callback) { | 120 base::Callback<void(const std::string& wraped_challenge)> callback) { |
123 std::map<std::string, UserData*>::const_iterator it = | 121 std::map<AccountId, UserData*>::const_iterator it = |
124 user_data_.find(user_id); | 122 user_data_.find(account_id); |
125 if (it == user_data_.end() || it->second->state != USER_DATA_STATE_LOADED) { | 123 if (it == user_data_.end() || it->second->state != USER_DATA_STATE_LOADED) { |
126 PA_LOG(ERROR) << "TPM data not loaded for " << user_id; | 124 PA_LOG(ERROR) << "TPM data not loaded for " << account_id.Serialize(); |
127 callback.Run(std::string()); | 125 callback.Run(std::string()); |
128 return; | 126 return; |
129 } | 127 } |
130 | 128 |
131 std::string device_public_key_base64; | 129 std::string device_public_key_base64; |
132 base::Base64UrlEncode(device_public_key, | 130 base::Base64UrlEncode(device_public_key, |
133 base::Base64UrlEncodePolicy::INCLUDE_PADDING, | 131 base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
134 &device_public_key_base64); | 132 &device_public_key_base64); |
135 for (const auto& device_data : it->second->devices) { | 133 for (const auto& device_data : it->second->devices) { |
136 if (device_data.public_key == device_public_key_base64) { | 134 if (device_data.public_key == device_public_key_base64) { |
137 PA_LOG(INFO) << "Wrapping challenge for " << user_id << "..."; | 135 PA_LOG(INFO) << "Wrapping challenge for " << account_id.Serialize() |
| 136 << "..."; |
138 challenge_wrapper_.reset(new chromeos::EasyUnlockChallengeWrapper( | 137 challenge_wrapper_.reset(new chromeos::EasyUnlockChallengeWrapper( |
139 device_data.challenge, channel_binding_data, user_id, | 138 device_data.challenge, channel_binding_data, account_id, |
140 EasyUnlockTpmKeyManagerFactory::GetInstance()->Get(profile()))); | 139 EasyUnlockTpmKeyManagerFactory::GetInstance()->Get(profile()))); |
141 challenge_wrapper_->WrapChallenge(callback); | 140 challenge_wrapper_->WrapChallenge(callback); |
142 return; | 141 return; |
143 } | 142 } |
144 } | 143 } |
145 | 144 |
146 PA_LOG(ERROR) << "Unable to find device record for " << user_id; | 145 PA_LOG(ERROR) << "Unable to find device record for " |
| 146 << account_id.Serialize(); |
147 callback.Run(std::string()); | 147 callback.Run(std::string()); |
148 } | 148 } |
149 | 149 |
150 EasyUnlockService::Type EasyUnlockServiceSignin::GetType() const { | 150 EasyUnlockService::Type EasyUnlockServiceSignin::GetType() const { |
151 return EasyUnlockService::TYPE_SIGNIN; | 151 return EasyUnlockService::TYPE_SIGNIN; |
152 } | 152 } |
153 | 153 |
154 std::string EasyUnlockServiceSignin::GetUserEmail() const { | 154 AccountId EasyUnlockServiceSignin::GetAccountId() const { |
155 return user_id_; | 155 return account_id_; |
156 } | 156 } |
157 | 157 |
158 void EasyUnlockServiceSignin::LaunchSetup() { | 158 void EasyUnlockServiceSignin::LaunchSetup() { |
159 NOTREACHED(); | 159 NOTREACHED(); |
160 } | 160 } |
161 | 161 |
162 const base::DictionaryValue* EasyUnlockServiceSignin::GetPermitAccess() const { | 162 const base::DictionaryValue* EasyUnlockServiceSignin::GetPermitAccess() const { |
163 return NULL; | 163 return nullptr; |
164 } | 164 } |
165 | 165 |
166 void EasyUnlockServiceSignin::SetPermitAccess( | 166 void EasyUnlockServiceSignin::SetPermitAccess( |
167 const base::DictionaryValue& permit) { | 167 const base::DictionaryValue& permit) { |
168 NOTREACHED(); | 168 NOTREACHED(); |
169 } | 169 } |
170 | 170 |
171 void EasyUnlockServiceSignin::ClearPermitAccess() { | 171 void EasyUnlockServiceSignin::ClearPermitAccess() { |
172 NOTREACHED(); | 172 NOTREACHED(); |
173 } | 173 } |
174 | 174 |
175 const base::ListValue* EasyUnlockServiceSignin::GetRemoteDevices() const { | 175 const base::ListValue* EasyUnlockServiceSignin::GetRemoteDevices() const { |
176 const UserData* data = FindLoadedDataForCurrentUser(); | 176 const UserData* data = FindLoadedDataForCurrentUser(); |
177 if (!data) | 177 if (!data) |
178 return NULL; | 178 return nullptr; |
179 return &data->remote_devices_value; | 179 return &data->remote_devices_value; |
180 } | 180 } |
181 | 181 |
182 void EasyUnlockServiceSignin::SetRemoteDevices( | 182 void EasyUnlockServiceSignin::SetRemoteDevices( |
183 const base::ListValue& devices) { | 183 const base::ListValue& devices) { |
184 NOTREACHED(); | 184 NOTREACHED(); |
185 } | 185 } |
186 | 186 |
187 void EasyUnlockServiceSignin::SetRemoteBleDevices( | 187 void EasyUnlockServiceSignin::SetRemoteBleDevices( |
188 const base::ListValue& devices) { | 188 const base::ListValue& devices) { |
(...skipping 25 matching lines...) Expand all Loading... |
214 std::string EasyUnlockServiceSignin::GetWrappedSecret() const { | 214 std::string EasyUnlockServiceSignin::GetWrappedSecret() const { |
215 const UserData* data = FindLoadedDataForCurrentUser(); | 215 const UserData* data = FindLoadedDataForCurrentUser(); |
216 // TODO(xiyuan): Use correct remote device instead of hard coded first one. | 216 // TODO(xiyuan): Use correct remote device instead of hard coded first one. |
217 uint32 device_index = 0; | 217 uint32 device_index = 0; |
218 if (!data || data->devices.size() <= device_index) | 218 if (!data || data->devices.size() <= device_index) |
219 return std::string(); | 219 return std::string(); |
220 return data->devices[device_index].wrapped_secret; | 220 return data->devices[device_index].wrapped_secret; |
221 } | 221 } |
222 | 222 |
223 void EasyUnlockServiceSignin::RecordEasySignInOutcome( | 223 void EasyUnlockServiceSignin::RecordEasySignInOutcome( |
224 const std::string& user_id, | 224 const AccountId& account_id, |
225 bool success) const { | 225 bool success) const { |
226 DCHECK_EQ(GetUserEmail(), user_id); | 226 DCHECK(GetAccountId() == account_id) |
| 227 << "GetAccountId()=" << GetAccountId().Serialize() |
| 228 << " != account_id=" << account_id.Serialize(); |
227 | 229 |
228 RecordEasyUnlockSigninEvent( | 230 RecordEasyUnlockSigninEvent( |
229 success ? EASY_UNLOCK_SUCCESS : EASY_UNLOCK_FAILURE); | 231 success ? EASY_UNLOCK_SUCCESS : EASY_UNLOCK_FAILURE); |
230 if (success) { | 232 if (success) { |
231 RecordEasyUnlockSigninDuration( | 233 RecordEasyUnlockSigninDuration( |
232 base::TimeTicks::Now() - user_pod_last_focused_timestamp_); | 234 base::TimeTicks::Now() - user_pod_last_focused_timestamp_); |
233 } | 235 } |
234 DVLOG(1) << "Easy sign-in " << (success ? "success" : "failure"); | 236 DVLOG(1) << "Easy sign-in " << (success ? "success" : "failure"); |
235 } | 237 } |
236 | 238 |
237 void EasyUnlockServiceSignin::RecordPasswordLoginEvent( | 239 void EasyUnlockServiceSignin::RecordPasswordLoginEvent( |
238 const std::string& user_id) const { | 240 const AccountId& account_id) const { |
239 // This happens during tests, where a user could log in without the user pod | 241 // This happens during tests, where a user could log in without the user pod |
240 // being focused. | 242 // being focused. |
241 if (GetUserEmail() != user_id) | 243 if (GetAccountId() != account_id) |
242 return; | 244 return; |
243 | 245 |
244 if (!IsEnabled()) | 246 if (!IsEnabled()) |
245 return; | 247 return; |
246 | 248 |
247 EasyUnlockAuthEvent event = GetPasswordAuthEvent(); | 249 EasyUnlockAuthEvent event = GetPasswordAuthEvent(); |
248 RecordEasyUnlockSigninEvent(event); | 250 RecordEasyUnlockSigninEvent(event); |
249 DVLOG(1) << "Easy Sign-in password login event, event=" << event; | 251 DVLOG(1) << "Easy Sign-in password login event, event=" << event; |
250 } | 252 } |
251 | 253 |
(...skipping 11 matching lines...) Expand all Loading... |
263 void EasyUnlockServiceSignin::InitializeInternal() { | 265 void EasyUnlockServiceSignin::InitializeInternal() { |
264 if (chromeos::LoginState::Get()->IsUserLoggedIn()) | 266 if (chromeos::LoginState::Get()->IsUserLoggedIn()) |
265 return; | 267 return; |
266 | 268 |
267 service_active_ = true; | 269 service_active_ = true; |
268 | 270 |
269 chromeos::LoginState::Get()->AddObserver(this); | 271 chromeos::LoginState::Get()->AddObserver(this); |
270 proximity_auth::ScreenlockBridge* screenlock_bridge = | 272 proximity_auth::ScreenlockBridge* screenlock_bridge = |
271 proximity_auth::ScreenlockBridge::Get(); | 273 proximity_auth::ScreenlockBridge::Get(); |
272 screenlock_bridge->AddObserver(this); | 274 screenlock_bridge->AddObserver(this); |
273 if (!screenlock_bridge->focused_user_id().empty()) | 275 if (screenlock_bridge->focused_account_id().is_valid()) |
274 OnFocusedUserChanged(screenlock_bridge->focused_user_id()); | 276 OnFocusedUserChanged(screenlock_bridge->focused_account_id()); |
275 } | 277 } |
276 | 278 |
277 void EasyUnlockServiceSignin::ShutdownInternal() { | 279 void EasyUnlockServiceSignin::ShutdownInternal() { |
278 if (!service_active_) | 280 if (!service_active_) |
279 return; | 281 return; |
280 service_active_ = false; | 282 service_active_ = false; |
281 | 283 |
282 weak_ptr_factory_.InvalidateWeakPtrs(); | 284 weak_ptr_factory_.InvalidateWeakPtrs(); |
283 proximity_auth::ScreenlockBridge::Get()->RemoveObserver(this); | 285 proximity_auth::ScreenlockBridge::Get()->RemoveObserver(this); |
284 chromeos::LoginState::Get()->RemoveObserver(this); | 286 chromeos::LoginState::Get()->RemoveObserver(this); |
285 STLDeleteContainerPairSecondPointers(user_data_.begin(), user_data_.end()); | 287 STLDeleteContainerPairSecondPointers(user_data_.begin(), user_data_.end()); |
286 user_data_.clear(); | 288 user_data_.clear(); |
287 } | 289 } |
288 | 290 |
289 bool EasyUnlockServiceSignin::IsAllowedInternal() const { | 291 bool EasyUnlockServiceSignin::IsAllowedInternal() const { |
290 return service_active_ && | 292 return service_active_ && account_id_.is_valid() && |
291 !user_id_.empty() && | |
292 !chromeos::LoginState::Get()->IsUserLoggedIn(); | 293 !chromeos::LoginState::Get()->IsUserLoggedIn(); |
293 } | 294 } |
294 | 295 |
295 void EasyUnlockServiceSignin::OnWillFinalizeUnlock(bool success) { | 296 void EasyUnlockServiceSignin::OnWillFinalizeUnlock(bool success) { |
296 // This code path should only be exercised for the lock screen, not for the | 297 // This code path should only be exercised for the lock screen, not for the |
297 // sign-in screen. | 298 // sign-in screen. |
298 NOTREACHED(); | 299 NOTREACHED(); |
299 } | 300 } |
300 | 301 |
301 void EasyUnlockServiceSignin::OnSuspendDoneInternal() { | 302 void EasyUnlockServiceSignin::OnSuspendDoneInternal() { |
(...skipping 19 matching lines...) Expand all Loading... |
321 // in tests, the screen type might be different. | 322 // in tests, the screen type might be different. |
322 if (screen_type != | 323 if (screen_type != |
323 proximity_auth::ScreenlockBridge::LockHandler::SIGNIN_SCREEN) | 324 proximity_auth::ScreenlockBridge::LockHandler::SIGNIN_SCREEN) |
324 return; | 325 return; |
325 | 326 |
326 DisableAppWithoutResettingScreenlockState(); | 327 DisableAppWithoutResettingScreenlockState(); |
327 | 328 |
328 Shutdown(); | 329 Shutdown(); |
329 } | 330 } |
330 | 331 |
331 void EasyUnlockServiceSignin::OnFocusedUserChanged(const std::string& user_id) { | 332 void EasyUnlockServiceSignin::OnFocusedUserChanged( |
332 if (user_id_ == user_id) | 333 const AccountId& account_id) { |
| 334 if (account_id_ == account_id) |
333 return; | 335 return; |
334 | 336 |
335 // Setting or clearing the user_id may changed |IsAllowed| value, so in these | 337 // Setting or clearing the account_id may changed |IsAllowed| value, so in |
| 338 // these |
336 // cases update the app state. Otherwise, it's enough to notify the app the | 339 // cases update the app state. Otherwise, it's enough to notify the app the |
337 // user data has been updated. | 340 // user data has been updated. |
338 bool should_update_app_state = user_id_.empty() != user_id.empty(); | 341 const bool should_update_app_state = |
339 user_id_ = user_id; | 342 account_id_.is_valid() != account_id.is_valid(); |
| 343 account_id_ = account_id; |
340 user_pod_last_focused_timestamp_ = base::TimeTicks::Now(); | 344 user_pod_last_focused_timestamp_ = base::TimeTicks::Now(); |
341 | 345 |
342 ResetScreenlockState(); | 346 ResetScreenlockState(); |
343 ShowInitialUserState(); | 347 ShowInitialUserState(); |
344 | 348 |
345 if (should_update_app_state) { | 349 if (should_update_app_state) { |
346 UpdateAppState(); | 350 UpdateAppState(); |
347 } else { | 351 } else { |
348 NotifyUserUpdated(); | 352 NotifyUserUpdated(); |
349 } | 353 } |
(...skipping 14 matching lines...) Expand all Loading... |
364 if (!chromeos::LoginState::Get()->IsUserLoggedIn()) | 368 if (!chromeos::LoginState::Get()->IsUserLoggedIn()) |
365 return; | 369 return; |
366 DisableAppWithoutResettingScreenlockState(); | 370 DisableAppWithoutResettingScreenlockState(); |
367 } | 371 } |
368 | 372 |
369 void EasyUnlockServiceSignin::LoadCurrentUserDataIfNeeded() { | 373 void EasyUnlockServiceSignin::LoadCurrentUserDataIfNeeded() { |
370 // TODO(xiyuan): Revisit this when adding tests. | 374 // TODO(xiyuan): Revisit this when adding tests. |
371 if (!base::SysInfo::IsRunningOnChromeOS()) | 375 if (!base::SysInfo::IsRunningOnChromeOS()) |
372 return; | 376 return; |
373 | 377 |
374 if (user_id_.empty() || !service_active_) | 378 if (account_id_.is_valid() || !service_active_) |
375 return; | 379 return; |
376 | 380 |
377 std::map<std::string, UserData*>::iterator it = user_data_.find(user_id_); | 381 const std::map<AccountId, UserData*>::const_iterator it = |
| 382 user_data_.find(account_id_); |
378 if (it == user_data_.end()) | 383 if (it == user_data_.end()) |
379 user_data_.insert(std::make_pair(user_id_, new UserData())); | 384 user_data_.insert(std::make_pair(account_id_, new UserData())); |
380 | 385 |
381 UserData* data = user_data_[user_id_]; | 386 UserData* data = user_data_[account_id_]; |
382 | 387 |
383 if (data->state != USER_DATA_STATE_INITIAL) | 388 if (data->state != USER_DATA_STATE_INITIAL) |
384 return; | 389 return; |
385 data->state = USER_DATA_STATE_LOADING; | 390 data->state = USER_DATA_STATE_LOADING; |
386 | 391 |
387 LoadDataForUser( | 392 LoadDataForUser( |
388 user_id_, | 393 account_id_, |
389 allow_cryptohome_backoff_ ? 0u : kMaxCryptohomeBackoffIntervalMs, | 394 allow_cryptohome_backoff_ ? 0u : kMaxCryptohomeBackoffIntervalMs, |
390 base::Bind(&EasyUnlockServiceSignin::OnUserDataLoaded, | 395 base::Bind(&EasyUnlockServiceSignin::OnUserDataLoaded, |
391 weak_ptr_factory_.GetWeakPtr(), | 396 weak_ptr_factory_.GetWeakPtr(), account_id_)); |
392 user_id_)); | |
393 } | 397 } |
394 | 398 |
395 void EasyUnlockServiceSignin::OnUserDataLoaded( | 399 void EasyUnlockServiceSignin::OnUserDataLoaded( |
396 const std::string& user_id, | 400 const AccountId& account_id, |
397 bool success, | 401 bool success, |
398 const chromeos::EasyUnlockDeviceKeyDataList& devices) { | 402 const chromeos::EasyUnlockDeviceKeyDataList& devices) { |
399 allow_cryptohome_backoff_ = false; | 403 allow_cryptohome_backoff_ = false; |
400 | 404 |
401 UserData* data = user_data_[user_id]; | 405 UserData* data = user_data_[account_id]; |
402 data->state = USER_DATA_STATE_LOADED; | 406 data->state = USER_DATA_STATE_LOADED; |
403 if (success) { | 407 if (success) { |
404 data->devices = devices; | 408 data->devices = devices; |
405 chromeos::EasyUnlockKeyManager::DeviceDataListToRemoteDeviceList( | 409 chromeos::EasyUnlockKeyManager::DeviceDataListToRemoteDeviceList( |
406 user_id, devices, &data->remote_devices_value); | 410 account_id, devices, &data->remote_devices_value); |
407 | 411 |
408 // User could have a NO_HARDLOCK state but has no remote devices if | 412 // User could have a NO_HARDLOCK state but has no remote devices if |
409 // previous user session shuts down before | 413 // previous user session shuts down before |
410 // CheckCryptohomeKeysAndMaybeHardlock finishes. Set NO_PAIRING state | 414 // CheckCryptohomeKeysAndMaybeHardlock finishes. Set NO_PAIRING state |
411 // and update UI to remove the confusing spinner in this case. | 415 // and update UI to remove the confusing spinner in this case. |
412 EasyUnlockScreenlockStateHandler::HardlockState hardlock_state; | 416 EasyUnlockScreenlockStateHandler::HardlockState hardlock_state; |
413 if (devices.empty() && | 417 if (devices.empty() && |
414 GetPersistedHardlockState(&hardlock_state) && | 418 GetPersistedHardlockState(&hardlock_state) && |
415 hardlock_state == EasyUnlockScreenlockStateHandler::NO_HARDLOCK) { | 419 hardlock_state == EasyUnlockScreenlockStateHandler::NO_HARDLOCK) { |
416 SetHardlockStateForUser(user_id, | 420 SetHardlockStateForUser(account_id, |
417 EasyUnlockScreenlockStateHandler::NO_PAIRING); | 421 EasyUnlockScreenlockStateHandler::NO_PAIRING); |
418 } | 422 } |
419 } | 423 } |
420 | 424 |
421 // If the fetched data belongs to the currently focused user, notify the app | 425 // If the fetched data belongs to the currently focused user, notify the app |
422 // that it has to refresh it's user data. | 426 // that it has to refresh it's user data. |
423 if (user_id == user_id_) | 427 if (account_id == account_id_) |
424 NotifyUserUpdated(); | 428 NotifyUserUpdated(); |
425 | 429 |
426 if (user_id != user_id || devices.empty()) | 430 if (account_id != account_id || devices.empty()) |
427 return; | 431 return; |
428 | 432 |
429 // TODO(tengs): Currently, ProximityAuthSystem only supports one device. Once | 433 // TODO(tengs): Currently, ProximityAuthSystem only supports one device. Once |
430 // multiple devices are supported, we need to load all devices. | 434 // multiple devices are supported, we need to load all devices. |
431 std::string decoded_public_key, decoded_psk, decoded_challenge; | 435 std::string decoded_public_key, decoded_psk, decoded_challenge; |
432 if (!base::Base64UrlDecode(devices[0].public_key, | 436 if (!base::Base64UrlDecode(devices[0].public_key, |
433 base::Base64UrlDecodePolicy::REQUIRE_PADDING, | 437 base::Base64UrlDecodePolicy::REQUIRE_PADDING, |
434 &decoded_public_key) || | 438 &decoded_public_key) || |
435 !base::Base64UrlDecode(devices[0].psk, | 439 !base::Base64UrlDecode(devices[0].psk, |
436 base::Base64UrlDecodePolicy::REQUIRE_PADDING, | 440 base::Base64UrlDecodePolicy::REQUIRE_PADDING, |
437 &decoded_psk) || | 441 &decoded_psk) || |
438 !base::Base64UrlDecode(devices[0].challenge, | 442 !base::Base64UrlDecode(devices[0].challenge, |
439 base::Base64UrlDecodePolicy::REQUIRE_PADDING, | 443 base::Base64UrlDecodePolicy::REQUIRE_PADDING, |
440 &decoded_challenge)) { | 444 &decoded_challenge)) { |
441 PA_LOG(ERROR) << "Unable to base64url decode the input data."; | 445 PA_LOG(ERROR) << "Unable to base64url decode the input data."; |
442 return; | 446 return; |
443 } | 447 } |
444 | 448 |
445 proximity_auth::RemoteDevice::BluetoothType bluetooth_type = | 449 proximity_auth::RemoteDevice::BluetoothType bluetooth_type = |
446 devices[0].bluetooth_type == | 450 devices[0].bluetooth_type == |
447 chromeos::EasyUnlockDeviceKeyData::BLUETOOTH_LE | 451 chromeos::EasyUnlockDeviceKeyData::BLUETOOTH_LE |
448 ? proximity_auth::RemoteDevice::BLUETOOTH_LE | 452 ? proximity_auth::RemoteDevice::BLUETOOTH_LE |
449 : proximity_auth::RemoteDevice::BLUETOOTH_CLASSIC; | 453 : proximity_auth::RemoteDevice::BLUETOOTH_CLASSIC; |
450 | 454 |
451 proximity_auth::RemoteDevice remote_device( | 455 proximity_auth::RemoteDevice remote_device( |
452 user_id, std::string(), decoded_public_key, bluetooth_type, | 456 account_id.GetUserEmail(), std::string(), decoded_public_key, |
453 devices[0].bluetooth_address, decoded_psk, decoded_challenge); | 457 bluetooth_type, devices[0].bluetooth_address, decoded_psk, |
| 458 decoded_challenge); |
454 PA_LOG(INFO) << "Loaded Remote Device:\n" | 459 PA_LOG(INFO) << "Loaded Remote Device:\n" |
455 << " user id: " << remote_device.user_id << "\n" | 460 << " user id: " << remote_device.user_id << "\n" |
456 << " name: " << remote_device.name << "\n" | 461 << " name: " << remote_device.name << "\n" |
457 << " public key" << devices[0].public_key << "\n" | 462 << " public key" << devices[0].public_key << "\n" |
458 << " bt_addr:" << remote_device.bluetooth_address; | 463 << " bt_addr:" << remote_device.bluetooth_address; |
459 OnRemoteDeviceChanged(&remote_device); | 464 OnRemoteDeviceChanged(&remote_device); |
460 } | 465 } |
461 | 466 |
462 const EasyUnlockServiceSignin::UserData* | 467 const EasyUnlockServiceSignin::UserData* |
463 EasyUnlockServiceSignin::FindLoadedDataForCurrentUser() const { | 468 EasyUnlockServiceSignin::FindLoadedDataForCurrentUser() const { |
464 if (user_id_.empty()) | 469 if (account_id_.is_valid()) |
465 return NULL; | 470 return nullptr; |
466 | 471 |
467 std::map<std::string, UserData*>::const_iterator it = | 472 const std::map<AccountId, UserData*>::const_iterator it = |
468 user_data_.find(user_id_); | 473 user_data_.find(account_id_); |
469 if (it == user_data_.end()) | 474 if (it == user_data_.end()) |
470 return NULL; | 475 return nullptr; |
471 if (it->second->state != USER_DATA_STATE_LOADED) | 476 if (it->second->state != USER_DATA_STATE_LOADED) |
472 return NULL; | 477 return nullptr; |
473 return it->second; | 478 return it->second; |
474 } | 479 } |
OLD | NEW |