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/chromeos/login/auth/parallel_authenticator.h" | 5 #include "chrome/browser/chromeos/login/auth/parallel_authenticator.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
14 #include "chrome/browser/chromeos/boot_times_loader.h" | 14 #include "chrome/browser/chromeos/boot_times_loader.h" |
15 #include "chrome/browser/chromeos/login/auth/authentication_notification_details
.h" | 15 #include "chrome/browser/chromeos/login/auth/authentication_notification_details
.h" |
16 #include "chrome/browser/chromeos/login/auth/login_status_consumer.h" | 16 #include "chrome/browser/chromeos/login/auth/login_status_consumer.h" |
17 #include "chrome/browser/chromeos/login/users/user.h" | 17 #include "chrome/browser/chromeos/login/users/user.h" |
18 #include "chrome/browser/chromeos/login/users/user_manager.h" | 18 #include "chrome/browser/chromeos/login/users/user_manager.h" |
19 #include "chrome/browser/chromeos/settings/cros_settings.h" | 19 #include "chrome/browser/chromeos/settings/cros_settings.h" |
20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
21 #include "chromeos/cryptohome/async_method_caller.h" | 21 #include "chromeos/cryptohome/async_method_caller.h" |
22 #include "chromeos/cryptohome/system_salt_getter.h" | 22 #include "chromeos/cryptohome/system_salt_getter.h" |
23 #include "chromeos/dbus/cryptohome_client.h" | 23 #include "chromeos/dbus/cryptohome_client.h" |
24 #include "chromeos/dbus/dbus_thread_manager.h" | 24 #include "chromeos/dbus/dbus_thread_manager.h" |
25 #include "chromeos/login/login_state.h" | 25 #include "chromeos/login/login_state.h" |
26 #include "content/public/browser/browser_thread.h" | 26 #include "content/public/browser/browser_thread.h" |
27 #include "content/public/browser/notification_service.h" | 27 #include "content/public/browser/notification_service.h" |
28 #include "crypto/sha2.h" | 28 #include "crypto/sha2.h" |
29 #include "google_apis/gaia/gaia_auth_util.h" | |
30 #include "third_party/cros_system_api/dbus/service_constants.h" | 29 #include "third_party/cros_system_api/dbus/service_constants.h" |
31 | 30 |
32 using content::BrowserThread; | 31 using content::BrowserThread; |
33 | 32 |
34 namespace chromeos { | 33 namespace chromeos { |
35 | 34 |
36 namespace { | 35 namespace { |
37 | 36 |
38 // Length of password hashed with SHA-256. | 37 // Length of password hashed with SHA-256. |
39 const int kPasswordHashLength = 32; | 38 const int kPasswordHashLength = 32; |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 already_reported_success_(false), | 218 already_reported_success_(false), |
220 owner_is_verified_(false), | 219 owner_is_verified_(false), |
221 user_can_login_(false), | 220 user_can_login_(false), |
222 remove_user_data_on_failure_(false), | 221 remove_user_data_on_failure_(false), |
223 delayed_login_failure_(NULL) { | 222 delayed_login_failure_(NULL) { |
224 } | 223 } |
225 | 224 |
226 void ParallelAuthenticator::AuthenticateToLogin( | 225 void ParallelAuthenticator::AuthenticateToLogin( |
227 Profile* profile, | 226 Profile* profile, |
228 const UserContext& user_context) { | 227 const UserContext& user_context) { |
229 std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID()); | |
230 authentication_profile_ = profile; | 228 authentication_profile_ = profile; |
231 current_state_.reset( | 229 current_state_.reset(new AuthAttemptState( |
232 new AuthAttemptState( | 230 user_context, |
233 UserContext(canonicalized, | 231 User::USER_TYPE_REGULAR, |
234 user_context.GetPassword(), | 232 false, // unlock |
235 user_context.GetAuthCode()), | 233 false, // online_complete |
236 std::string(), // login_token, not used. | 234 !UserManager::Get()->IsKnownUser(user_context.GetUserID()))); |
237 std::string(), // login_captcha, not used. | |
238 User::USER_TYPE_REGULAR, | |
239 !UserManager::Get()->IsKnownUser(canonicalized))); | |
240 // Reset the verified flag. | 235 // Reset the verified flag. |
241 owner_is_verified_ = false; | 236 owner_is_verified_ = false; |
242 | 237 |
243 SystemSaltGetter::Get()->GetSystemSalt( | 238 SystemSaltGetter::Get()->GetSystemSalt( |
244 base::Bind(&Mount, | 239 base::Bind(&Mount, |
245 current_state_.get(), | 240 current_state_.get(), |
246 scoped_refptr<ParallelAuthenticator>(this), | 241 scoped_refptr<ParallelAuthenticator>(this), |
247 cryptohome::MOUNT_FLAGS_NONE)); | 242 cryptohome::MOUNT_FLAGS_NONE)); |
248 } | 243 } |
249 | 244 |
250 void ParallelAuthenticator::CompleteLogin(Profile* profile, | 245 void ParallelAuthenticator::CompleteLogin(Profile* profile, |
251 const UserContext& user_context) { | 246 const UserContext& user_context) { |
252 std::string canonicalized = gaia::CanonicalizeEmail(user_context.GetUserID()); | |
253 authentication_profile_ = profile; | 247 authentication_profile_ = profile; |
254 current_state_.reset( | 248 current_state_.reset(new AuthAttemptState( |
255 new AuthAttemptState( | 249 user_context, |
256 UserContext(canonicalized, | 250 User::USER_TYPE_REGULAR, |
257 user_context.GetPassword(), | 251 true, // unlock |
258 user_context.GetAuthCode(), | 252 false, // online_complete |
259 user_context.GetUserIDHash(), | 253 !UserManager::Get()->IsKnownUser(user_context.GetUserID()))); |
260 user_context.IsUsingOAuth(), | |
261 user_context.GetAuthFlow()), | |
262 !UserManager::Get()->IsKnownUser(canonicalized))); | |
263 | 254 |
264 // Reset the verified flag. | 255 // Reset the verified flag. |
265 owner_is_verified_ = false; | 256 owner_is_verified_ = false; |
266 | 257 |
267 SystemSaltGetter::Get()->GetSystemSalt( | 258 SystemSaltGetter::Get()->GetSystemSalt( |
268 base::Bind(&Mount, | 259 base::Bind(&Mount, |
269 current_state_.get(), | 260 current_state_.get(), |
270 scoped_refptr<ParallelAuthenticator>(this), | 261 scoped_refptr<ParallelAuthenticator>(this), |
271 cryptohome::MOUNT_FLAGS_NONE)); | 262 cryptohome::MOUNT_FLAGS_NONE)); |
272 | 263 |
273 // For login completion from extension, we just need to resolve the current | 264 // For login completion from extension, we just need to resolve the current |
274 // auth attempt state, the rest of OAuth related tasks will be done in | 265 // auth attempt state, the rest of OAuth related tasks will be done in |
275 // parallel. | 266 // parallel. |
276 BrowserThread::PostTask( | 267 BrowserThread::PostTask( |
277 BrowserThread::UI, FROM_HERE, | 268 BrowserThread::UI, FROM_HERE, |
278 base::Bind(&ParallelAuthenticator::ResolveLoginCompletionStatus, this)); | 269 base::Bind(&ParallelAuthenticator::ResolveLoginCompletionStatus, this)); |
279 } | 270 } |
280 | 271 |
281 void ParallelAuthenticator::AuthenticateToUnlock( | 272 void ParallelAuthenticator::AuthenticateToUnlock( |
282 const UserContext& user_context) { | 273 const UserContext& user_context) { |
283 current_state_.reset( | 274 current_state_.reset(new AuthAttemptState(user_context, |
284 new AuthAttemptState( | 275 User::USER_TYPE_REGULAR, |
285 gaia::CanonicalizeEmail(user_context.GetUserID()), | 276 true, // unlock |
286 user_context.GetPassword())); | 277 true, // online_complete |
| 278 false)); // user_is_new |
287 remove_user_data_on_failure_ = false; | 279 remove_user_data_on_failure_ = false; |
288 check_key_attempted_ = true; | 280 check_key_attempted_ = true; |
289 SystemSaltGetter::Get()->GetSystemSalt( | 281 SystemSaltGetter::Get()->GetSystemSalt( |
290 base::Bind(&CheckKey, | 282 base::Bind(&CheckKey, |
291 current_state_.get(), | 283 current_state_.get(), |
292 scoped_refptr<ParallelAuthenticator>(this))); | 284 scoped_refptr<ParallelAuthenticator>(this))); |
293 } | 285 } |
294 | 286 |
295 void ParallelAuthenticator::LoginAsLocallyManagedUser( | 287 void ParallelAuthenticator::LoginAsLocallyManagedUser( |
296 const UserContext& user_context) { | 288 const UserContext& user_context) { |
297 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
298 // TODO(nkostylev): Pass proper value for |user_is_new| or remove (not used). | 290 // TODO(nkostylev): Pass proper value for |user_is_new| or remove (not used). |
299 current_state_.reset( | 291 current_state_.reset( |
300 new AuthAttemptState(user_context, | 292 new AuthAttemptState(user_context, |
301 "", // login_token | |
302 "", // login_captcha | |
303 User::USER_TYPE_LOCALLY_MANAGED, | 293 User::USER_TYPE_LOCALLY_MANAGED, |
304 false)); | 294 false, // unlock |
| 295 false, // online_complete |
| 296 false)); // user_is_new |
305 remove_user_data_on_failure_ = false; | 297 remove_user_data_on_failure_ = false; |
306 SystemSaltGetter::Get()->GetSystemSalt( | 298 SystemSaltGetter::Get()->GetSystemSalt( |
307 base::Bind(&Mount, | 299 base::Bind(&Mount, |
308 current_state_.get(), | 300 current_state_.get(), |
309 scoped_refptr<ParallelAuthenticator>(this), | 301 scoped_refptr<ParallelAuthenticator>(this), |
310 cryptohome::MOUNT_FLAGS_NONE)); | 302 cryptohome::MOUNT_FLAGS_NONE)); |
311 } | 303 } |
312 | 304 |
313 void ParallelAuthenticator::LoginRetailMode() { | 305 void ParallelAuthenticator::LoginRetailMode() { |
314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 306 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
315 // Note: |kRetailModeUserEMail| is used in other places to identify a retail | 307 // Note: |kRetailModeUserEMail| is used in other places to identify a retail |
316 // mode session. | 308 // mode session. |
317 current_state_.reset(new AuthAttemptState( | 309 current_state_.reset(new AuthAttemptState( |
318 UserContext(UserManager::kRetailModeUserName, | 310 UserContext(UserManager::kRetailModeUserName), |
319 std::string(), // password | 311 User::USER_TYPE_RETAIL_MODE, |
320 std::string()), // auth_code | 312 false, // unlock |
321 std::string(), // login_token | 313 false, // online_complete |
322 std::string(), // login_captcha | 314 false)); // user_is_new |
323 User::USER_TYPE_RETAIL_MODE, | |
324 false)); | |
325 remove_user_data_on_failure_ = false; | 315 remove_user_data_on_failure_ = false; |
326 ephemeral_mount_attempted_ = true; | 316 ephemeral_mount_attempted_ = true; |
327 MountGuest(current_state_.get(), | 317 MountGuest(current_state_.get(), |
328 scoped_refptr<ParallelAuthenticator>(this)); | 318 scoped_refptr<ParallelAuthenticator>(this)); |
329 } | 319 } |
330 | 320 |
331 void ParallelAuthenticator::LoginOffTheRecord() { | 321 void ParallelAuthenticator::LoginOffTheRecord() { |
332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 322 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
333 current_state_.reset(new AuthAttemptState( | 323 current_state_.reset(new AuthAttemptState( |
334 UserContext(UserManager::kGuestUserName, // username | 324 UserContext(UserManager::kGuestUserName), |
335 std::string(), // password | |
336 std::string()), // auth_code | |
337 std::string(), // login_token | |
338 std::string(), // login_captcha | |
339 User::USER_TYPE_GUEST, | 325 User::USER_TYPE_GUEST, |
340 false)); | 326 false, // unlock |
| 327 false, // online_complete |
| 328 false)); // user_is_new |
341 remove_user_data_on_failure_ = false; | 329 remove_user_data_on_failure_ = false; |
342 ephemeral_mount_attempted_ = true; | 330 ephemeral_mount_attempted_ = true; |
343 MountGuest(current_state_.get(), | 331 MountGuest(current_state_.get(), |
344 scoped_refptr<ParallelAuthenticator>(this)); | 332 scoped_refptr<ParallelAuthenticator>(this)); |
345 } | 333 } |
346 | 334 |
347 void ParallelAuthenticator::LoginAsPublicAccount(const std::string& username) { | 335 void ParallelAuthenticator::LoginAsPublicAccount(const std::string& username) { |
348 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 336 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
349 current_state_.reset(new AuthAttemptState( | 337 current_state_.reset(new AuthAttemptState(UserContext(username), |
350 UserContext(username, | 338 User::USER_TYPE_PUBLIC_ACCOUNT, |
351 std::string(), // password | 339 false, // unlock |
352 std::string()), // auth_code | 340 false, // online_complete |
353 std::string(), // login_token | 341 false)); // user_is_new |
354 std::string(), // login_captcha | |
355 User::USER_TYPE_PUBLIC_ACCOUNT, | |
356 false)); | |
357 remove_user_data_on_failure_ = false; | 342 remove_user_data_on_failure_ = false; |
358 ephemeral_mount_attempted_ = true; | 343 ephemeral_mount_attempted_ = true; |
359 SystemSaltGetter::Get()->GetSystemSalt( | 344 SystemSaltGetter::Get()->GetSystemSalt( |
360 base::Bind(&Mount, | 345 base::Bind(&Mount, |
361 current_state_.get(), | 346 current_state_.get(), |
362 scoped_refptr<ParallelAuthenticator>(this), | 347 scoped_refptr<ParallelAuthenticator>(this), |
363 cryptohome::CREATE_IF_MISSING | cryptohome::ENSURE_EPHEMERAL)); | 348 cryptohome::CREATE_IF_MISSING | cryptohome::ENSURE_EPHEMERAL)); |
364 } | 349 } |
365 | 350 |
366 void ParallelAuthenticator::LoginAsKioskAccount( | 351 void ParallelAuthenticator::LoginAsKioskAccount( |
367 const std::string& app_user_id, | 352 const std::string& app_user_id, |
368 bool use_guest_mount) { | 353 bool use_guest_mount) { |
369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 354 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
370 | 355 |
371 const std::string user_id = | 356 const std::string user_id = |
372 use_guest_mount ? UserManager::kGuestUserName : app_user_id; | 357 use_guest_mount ? UserManager::kGuestUserName : app_user_id; |
373 current_state_.reset(new AuthAttemptState( | 358 current_state_.reset(new AuthAttemptState(UserContext(user_id), |
374 UserContext(user_id, | 359 User::USER_TYPE_KIOSK_APP, |
375 std::string(), // password | 360 false, // unlock |
376 std::string()), // auth_code | 361 false, // online_complete |
377 std::string(), // login_token | 362 false)); // user_is_new |
378 std::string(), // login_captcha | |
379 User::USER_TYPE_KIOSK_APP, | |
380 false)); | |
381 | 363 |
382 remove_user_data_on_failure_ = true; | 364 remove_user_data_on_failure_ = true; |
383 if (!use_guest_mount) { | 365 if (!use_guest_mount) { |
384 MountPublic(current_state_.get(), | 366 MountPublic(current_state_.get(), |
385 scoped_refptr<ParallelAuthenticator>(this), | 367 scoped_refptr<ParallelAuthenticator>(this), |
386 cryptohome::CREATE_IF_MISSING); | 368 cryptohome::CREATE_IF_MISSING); |
387 } else { | 369 } else { |
388 ephemeral_mount_attempted_ = true; | 370 ephemeral_mount_attempted_ = true; |
389 MountGuestAndGetHash(current_state_.get(), | 371 MountGuestAndGetHash(current_state_.get(), |
390 scoped_refptr<ParallelAuthenticator>(this)); | 372 scoped_refptr<ParallelAuthenticator>(this)); |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 Resolve(); | 817 Resolve(); |
836 } | 818 } |
837 | 819 |
838 void ParallelAuthenticator::SetOwnerState(bool owner_check_finished, | 820 void ParallelAuthenticator::SetOwnerState(bool owner_check_finished, |
839 bool check_result) { | 821 bool check_result) { |
840 owner_is_verified_ = owner_check_finished; | 822 owner_is_verified_ = owner_check_finished; |
841 user_can_login_ = check_result; | 823 user_can_login_ = check_result; |
842 } | 824 } |
843 | 825 |
844 } // namespace chromeos | 826 } // namespace chromeos |
OLD | NEW |