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 "chromeos/login/auth/cryptohome_authenticator.h" | 5 #include "chromeos/login/auth/cryptohome_authenticator.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 false)); // user_is_new | 543 false)); // user_is_new |
544 remove_user_data_on_failure_ = false; | 544 remove_user_data_on_failure_ = false; |
545 check_key_attempted_ = true; | 545 check_key_attempted_ = true; |
546 SystemSaltGetter::Get()->GetSystemSalt( | 546 SystemSaltGetter::Get()->GetSystemSalt( |
547 base::Bind(&CheckKey, current_state_->AsWeakPtr(), | 547 base::Bind(&CheckKey, current_state_->AsWeakPtr(), |
548 scoped_refptr<CryptohomeAuthenticator>(this))); | 548 scoped_refptr<CryptohomeAuthenticator>(this))); |
549 } | 549 } |
550 | 550 |
551 void CryptohomeAuthenticator::LoginAsSupervisedUser( | 551 void CryptohomeAuthenticator::LoginAsSupervisedUser( |
552 const UserContext& user_context) { | 552 const UserContext& user_context) { |
553 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 553 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
554 DCHECK_EQ(user_manager::USER_TYPE_SUPERVISED, user_context.GetUserType()); | 554 DCHECK_EQ(user_manager::USER_TYPE_SUPERVISED, user_context.GetUserType()); |
555 | 555 |
556 // TODO(nkostylev): Pass proper value for |user_is_new| or remove (not used). | 556 // TODO(nkostylev): Pass proper value for |user_is_new| or remove (not used). |
557 current_state_.reset(new AuthAttemptState(user_context, | 557 current_state_.reset(new AuthAttemptState(user_context, |
558 false, // unlock | 558 false, // unlock |
559 false, // online_complete | 559 false, // online_complete |
560 false)); // user_is_new | 560 false)); // user_is_new |
561 remove_user_data_on_failure_ = false; | 561 remove_user_data_on_failure_ = false; |
562 StartMount(current_state_->AsWeakPtr(), | 562 StartMount(current_state_->AsWeakPtr(), |
563 scoped_refptr<CryptohomeAuthenticator>(this), | 563 scoped_refptr<CryptohomeAuthenticator>(this), |
564 false /* ephemeral */, false /* create_if_nonexistent */); | 564 false /* ephemeral */, false /* create_if_nonexistent */); |
565 } | 565 } |
566 | 566 |
567 void CryptohomeAuthenticator::LoginOffTheRecord() { | 567 void CryptohomeAuthenticator::LoginOffTheRecord() { |
568 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 568 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
569 current_state_.reset( | 569 current_state_.reset( |
570 new AuthAttemptState(UserContext(user_manager::USER_TYPE_GUEST, | 570 new AuthAttemptState(UserContext(user_manager::USER_TYPE_GUEST, |
571 user_manager::GuestAccountId()), | 571 user_manager::GuestAccountId()), |
572 false, // unlock | 572 false, // unlock |
573 false, // online_complete | 573 false, // online_complete |
574 false)); // user_is_new | 574 false)); // user_is_new |
575 remove_user_data_on_failure_ = false; | 575 remove_user_data_on_failure_ = false; |
576 ephemeral_mount_attempted_ = true; | 576 ephemeral_mount_attempted_ = true; |
577 MountGuestAndGetHash(current_state_->AsWeakPtr(), | 577 MountGuestAndGetHash(current_state_->AsWeakPtr(), |
578 scoped_refptr<CryptohomeAuthenticator>(this)); | 578 scoped_refptr<CryptohomeAuthenticator>(this)); |
579 } | 579 } |
580 | 580 |
581 void CryptohomeAuthenticator::LoginAsPublicSession( | 581 void CryptohomeAuthenticator::LoginAsPublicSession( |
582 const UserContext& user_context) { | 582 const UserContext& user_context) { |
583 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 583 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
584 DCHECK_EQ(user_manager::USER_TYPE_PUBLIC_ACCOUNT, user_context.GetUserType()); | 584 DCHECK_EQ(user_manager::USER_TYPE_PUBLIC_ACCOUNT, user_context.GetUserType()); |
585 | 585 |
586 current_state_.reset( | 586 current_state_.reset( |
587 new AuthAttemptState(user_context, | 587 new AuthAttemptState(user_context, |
588 false, // unlock | 588 false, // unlock |
589 false, // online_complete | 589 false, // online_complete |
590 false)); // user_is_new | 590 false)); // user_is_new |
591 remove_user_data_on_failure_ = false; | 591 remove_user_data_on_failure_ = false; |
592 ephemeral_mount_attempted_ = true; | 592 ephemeral_mount_attempted_ = true; |
593 StartMount(current_state_->AsWeakPtr(), | 593 StartMount(current_state_->AsWeakPtr(), |
594 scoped_refptr<CryptohomeAuthenticator>(this), true /* ephemeral */, | 594 scoped_refptr<CryptohomeAuthenticator>(this), true /* ephemeral */, |
595 true /* create_if_nonexistent */); | 595 true /* create_if_nonexistent */); |
596 } | 596 } |
597 | 597 |
598 void CryptohomeAuthenticator::LoginAsKioskAccount( | 598 void CryptohomeAuthenticator::LoginAsKioskAccount( |
599 const AccountId& app_account_id, | 599 const AccountId& app_account_id, |
600 bool use_guest_mount) { | 600 bool use_guest_mount) { |
601 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 601 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
602 | 602 |
603 const AccountId& account_id = | 603 const AccountId& account_id = |
604 use_guest_mount ? user_manager::GuestAccountId() : app_account_id; | 604 use_guest_mount ? user_manager::GuestAccountId() : app_account_id; |
605 current_state_.reset(new AuthAttemptState( | 605 current_state_.reset(new AuthAttemptState( |
606 UserContext(user_manager::USER_TYPE_KIOSK_APP, account_id), | 606 UserContext(user_manager::USER_TYPE_KIOSK_APP, account_id), |
607 false, // unlock | 607 false, // unlock |
608 false, // online_complete | 608 false, // online_complete |
609 false)); // user_is_new | 609 false)); // user_is_new |
610 | 610 |
611 remove_user_data_on_failure_ = true; | 611 remove_user_data_on_failure_ = true; |
612 if (!use_guest_mount) { | 612 if (!use_guest_mount) { |
613 MountPublic(current_state_->AsWeakPtr(), | 613 MountPublic(current_state_->AsWeakPtr(), |
614 scoped_refptr<CryptohomeAuthenticator>(this), | 614 scoped_refptr<CryptohomeAuthenticator>(this), |
615 cryptohome::CREATE_IF_MISSING); | 615 cryptohome::CREATE_IF_MISSING); |
616 } else { | 616 } else { |
617 ephemeral_mount_attempted_ = true; | 617 ephemeral_mount_attempted_ = true; |
618 MountGuestAndGetHash(current_state_->AsWeakPtr(), | 618 MountGuestAndGetHash(current_state_->AsWeakPtr(), |
619 scoped_refptr<CryptohomeAuthenticator>(this)); | 619 scoped_refptr<CryptohomeAuthenticator>(this)); |
620 } | 620 } |
621 } | 621 } |
622 | 622 |
623 void CryptohomeAuthenticator::LoginAsArcKioskAccount( | 623 void CryptohomeAuthenticator::LoginAsArcKioskAccount( |
624 const AccountId& app_account_id) { | 624 const AccountId& app_account_id) { |
625 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 625 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
626 | 626 |
627 current_state_.reset(new AuthAttemptState( | 627 current_state_.reset(new AuthAttemptState( |
628 UserContext(user_manager::USER_TYPE_ARC_KIOSK_APP, app_account_id), | 628 UserContext(user_manager::USER_TYPE_ARC_KIOSK_APP, app_account_id), |
629 false, // unlock | 629 false, // unlock |
630 false, // online_complete | 630 false, // online_complete |
631 false)); // user_is_new | 631 false)); // user_is_new |
632 | 632 |
633 remove_user_data_on_failure_ = true; | 633 remove_user_data_on_failure_ = true; |
634 MountPublic(current_state_->AsWeakPtr(), | 634 MountPublic(current_state_->AsWeakPtr(), |
635 scoped_refptr<CryptohomeAuthenticator>(this), | 635 scoped_refptr<CryptohomeAuthenticator>(this), |
636 cryptohome::CREATE_IF_MISSING); | 636 cryptohome::CREATE_IF_MISSING); |
637 } | 637 } |
638 | 638 |
639 void CryptohomeAuthenticator::OnAuthSuccess() { | 639 void CryptohomeAuthenticator::OnAuthSuccess() { |
640 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 640 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
641 VLOG(1) << "Login success"; | 641 VLOG(1) << "Login success"; |
642 // Send notification of success | 642 // Send notification of success |
643 chromeos::LoginEventRecorder::Get()->RecordAuthenticationSuccess(); | 643 chromeos::LoginEventRecorder::Get()->RecordAuthenticationSuccess(); |
644 { | 644 { |
645 base::AutoLock for_this_block(success_lock_); | 645 base::AutoLock for_this_block(success_lock_); |
646 already_reported_success_ = true; | 646 already_reported_success_ = true; |
647 } | 647 } |
648 if (consumer_) | 648 if (consumer_) |
649 consumer_->OnAuthSuccess(current_state_->user_context); | 649 consumer_->OnAuthSuccess(current_state_->user_context); |
650 } | 650 } |
651 | 651 |
652 void CryptohomeAuthenticator::OnOffTheRecordAuthSuccess() { | 652 void CryptohomeAuthenticator::OnOffTheRecordAuthSuccess() { |
653 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 653 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
654 chromeos::LoginEventRecorder::Get()->RecordAuthenticationSuccess(); | 654 chromeos::LoginEventRecorder::Get()->RecordAuthenticationSuccess(); |
655 if (consumer_) | 655 if (consumer_) |
656 consumer_->OnOffTheRecordAuthSuccess(); | 656 consumer_->OnOffTheRecordAuthSuccess(); |
657 } | 657 } |
658 | 658 |
659 void CryptohomeAuthenticator::OnPasswordChangeDetected() { | 659 void CryptohomeAuthenticator::OnPasswordChangeDetected() { |
660 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 660 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
661 if (consumer_) | 661 if (consumer_) |
662 consumer_->OnPasswordChangeDetected(); | 662 consumer_->OnPasswordChangeDetected(); |
663 } | 663 } |
664 | 664 |
665 void CryptohomeAuthenticator::OnOldEncryptionDetected( | 665 void CryptohomeAuthenticator::OnOldEncryptionDetected( |
666 bool has_incomplete_migration) { | 666 bool has_incomplete_migration) { |
667 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 667 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
668 if (consumer_) { | 668 if (consumer_) { |
669 consumer_->OnOldEncryptionDetected(current_state_->user_context, | 669 consumer_->OnOldEncryptionDetected(current_state_->user_context, |
670 has_incomplete_migration); | 670 has_incomplete_migration); |
671 } | 671 } |
672 } | 672 } |
673 | 673 |
674 void CryptohomeAuthenticator::OnAuthFailure(const AuthFailure& error) { | 674 void CryptohomeAuthenticator::OnAuthFailure(const AuthFailure& error) { |
675 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 675 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
676 | 676 |
677 // OnAuthFailure will be called again with the same |error| | 677 // OnAuthFailure will be called again with the same |error| |
678 // after the cryptohome has been removed. | 678 // after the cryptohome has been removed. |
679 if (remove_user_data_on_failure_) { | 679 if (remove_user_data_on_failure_) { |
680 delayed_login_failure_ = &error; | 680 delayed_login_failure_ = &error; |
681 RemoveEncryptedData(); | 681 RemoveEncryptedData(); |
682 return; | 682 return; |
683 } | 683 } |
684 chromeos::LoginEventRecorder::Get()->RecordAuthenticationFailure(); | 684 chromeos::LoginEventRecorder::Get()->RecordAuthenticationFailure(); |
685 LOGIN_LOG(ERROR) << "Login failed: " << error.GetErrorString(); | 685 LOGIN_LOG(ERROR) << "Login failed: " << error.GetErrorString(); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 void CryptohomeAuthenticator::OnUnmount(DBusMethodCallStatus call_status, | 739 void CryptohomeAuthenticator::OnUnmount(DBusMethodCallStatus call_status, |
740 bool success) { | 740 bool success) { |
741 if (call_status != DBUS_METHOD_CALL_SUCCESS || !success) { | 741 if (call_status != DBUS_METHOD_CALL_SUCCESS || !success) { |
742 // Maybe we should reboot immediately here? | 742 // Maybe we should reboot immediately here? |
743 LOGIN_LOG(ERROR) << "Couldn't unmount users home!"; | 743 LOGIN_LOG(ERROR) << "Couldn't unmount users home!"; |
744 } | 744 } |
745 OnAuthFailure(AuthFailure(AuthFailure::OWNER_REQUIRED)); | 745 OnAuthFailure(AuthFailure(AuthFailure::OWNER_REQUIRED)); |
746 } | 746 } |
747 | 747 |
748 void CryptohomeAuthenticator::Resolve() { | 748 void CryptohomeAuthenticator::Resolve() { |
749 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 749 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
750 bool create_if_nonexistent = false; | 750 bool create_if_nonexistent = false; |
751 CryptohomeAuthenticator::AuthState state = ResolveState(); | 751 CryptohomeAuthenticator::AuthState state = ResolveState(); |
752 VLOG(1) << "Resolved state to: " << state; | 752 VLOG(1) << "Resolved state to: " << state; |
753 switch (state) { | 753 switch (state) { |
754 case CONTINUE: | 754 case CONTINUE: |
755 case POSSIBLE_PW_CHANGE: | 755 case POSSIBLE_PW_CHANGE: |
756 case NO_MOUNT: | 756 case NO_MOUNT: |
757 // These are intermediate states; we need more info from a request that | 757 // These are intermediate states; we need more info from a request that |
758 // is still pending. | 758 // is still pending. |
759 break; | 759 break; |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 default: | 882 default: |
883 NOTREACHED(); | 883 NOTREACHED(); |
884 break; | 884 break; |
885 } | 885 } |
886 } | 886 } |
887 | 887 |
888 CryptohomeAuthenticator::~CryptohomeAuthenticator() { | 888 CryptohomeAuthenticator::~CryptohomeAuthenticator() { |
889 } | 889 } |
890 | 890 |
891 CryptohomeAuthenticator::AuthState CryptohomeAuthenticator::ResolveState() { | 891 CryptohomeAuthenticator::AuthState CryptohomeAuthenticator::ResolveState() { |
892 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 892 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
893 // If we haven't mounted the user's home dir yet or | 893 // If we haven't mounted the user's home dir yet or |
894 // haven't got sanitized username value, we can't be done. | 894 // haven't got sanitized username value, we can't be done. |
895 // We never get past here if any of these two cryptohome ops is still pending. | 895 // We never get past here if any of these two cryptohome ops is still pending. |
896 // This is an important invariant. | 896 // This is an important invariant. |
897 if (!current_state_->cryptohome_complete() || | 897 if (!current_state_->cryptohome_complete() || |
898 !current_state_->username_hash_obtained()) { | 898 !current_state_->username_hash_obtained()) { |
899 return CONTINUE; | 899 return CONTINUE; |
900 } | 900 } |
901 | 901 |
902 AuthState state = CONTINUE; | 902 AuthState state = CONTINUE; |
(...skipping 25 matching lines...) Expand all Loading... |
928 return ResolveOnlineSuccessState(state); | 928 return ResolveOnlineSuccessState(state); |
929 } | 929 } |
930 NOTREACHED() << "Using obsolete ClientLogin code path."; | 930 NOTREACHED() << "Using obsolete ClientLogin code path."; |
931 } | 931 } |
932 // if online isn't complete yet, just return the offline result. | 932 // if online isn't complete yet, just return the offline result. |
933 return state; | 933 return state; |
934 } | 934 } |
935 | 935 |
936 CryptohomeAuthenticator::AuthState | 936 CryptohomeAuthenticator::AuthState |
937 CryptohomeAuthenticator::ResolveCryptohomeFailureState() { | 937 CryptohomeAuthenticator::ResolveCryptohomeFailureState() { |
938 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 938 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
939 if (remove_attempted_ || resync_attempted_) | 939 if (remove_attempted_ || resync_attempted_) |
940 return FAILED_REMOVE; | 940 return FAILED_REMOVE; |
941 if (ephemeral_mount_attempted_) | 941 if (ephemeral_mount_attempted_) |
942 return FAILED_TMPFS; | 942 return FAILED_TMPFS; |
943 if (migrate_attempted_) | 943 if (migrate_attempted_) |
944 return NEED_OLD_PW; | 944 return NEED_OLD_PW; |
945 if (check_key_attempted_) | 945 if (check_key_attempted_) |
946 return LOGIN_FAILED; | 946 return LOGIN_FAILED; |
947 | 947 |
948 if (current_state_->cryptohome_code() == | 948 if (current_state_->cryptohome_code() == |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 } | 980 } |
981 | 981 |
982 if (!current_state_->username_hash_valid()) | 982 if (!current_state_->username_hash_valid()) |
983 return FAILED_USERNAME_HASH; | 983 return FAILED_USERNAME_HASH; |
984 | 984 |
985 return FAILED_MOUNT; | 985 return FAILED_MOUNT; |
986 } | 986 } |
987 | 987 |
988 CryptohomeAuthenticator::AuthState | 988 CryptohomeAuthenticator::AuthState |
989 CryptohomeAuthenticator::ResolveCryptohomeSuccessState() { | 989 CryptohomeAuthenticator::ResolveCryptohomeSuccessState() { |
990 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 990 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
991 if (resync_attempted_) | 991 if (resync_attempted_) |
992 return CREATE_NEW; | 992 return CREATE_NEW; |
993 if (remove_attempted_) | 993 if (remove_attempted_) |
994 return REMOVED_DATA_AFTER_FAILURE; | 994 return REMOVED_DATA_AFTER_FAILURE; |
995 if (migrate_attempted_) | 995 if (migrate_attempted_) |
996 return RECOVER_MOUNT; | 996 return RECOVER_MOUNT; |
997 if (check_key_attempted_) | 997 if (check_key_attempted_) |
998 return UNLOCK; | 998 return UNLOCK; |
999 | 999 |
1000 const user_manager::UserType user_type = | 1000 const user_manager::UserType user_type = |
1001 current_state_->user_context.GetUserType(); | 1001 current_state_->user_context.GetUserType(); |
1002 if (user_type == user_manager::USER_TYPE_GUEST) | 1002 if (user_type == user_manager::USER_TYPE_GUEST) |
1003 return GUEST_LOGIN; | 1003 return GUEST_LOGIN; |
1004 if (user_type == user_manager::USER_TYPE_PUBLIC_ACCOUNT) | 1004 if (user_type == user_manager::USER_TYPE_PUBLIC_ACCOUNT) |
1005 return PUBLIC_ACCOUNT_LOGIN; | 1005 return PUBLIC_ACCOUNT_LOGIN; |
1006 if (user_type == user_manager::USER_TYPE_KIOSK_APP) | 1006 if (user_type == user_manager::USER_TYPE_KIOSK_APP) |
1007 return KIOSK_ACCOUNT_LOGIN; | 1007 return KIOSK_ACCOUNT_LOGIN; |
1008 if (user_type == user_manager::USER_TYPE_SUPERVISED) | 1008 if (user_type == user_manager::USER_TYPE_SUPERVISED) |
1009 return SUPERVISED_USER_LOGIN; | 1009 return SUPERVISED_USER_LOGIN; |
1010 | 1010 |
1011 if (!VerifyOwner()) | 1011 if (!VerifyOwner()) |
1012 return CONTINUE; | 1012 return CONTINUE; |
1013 return user_can_login_ ? OFFLINE_LOGIN : OWNER_REQUIRED; | 1013 return user_can_login_ ? OFFLINE_LOGIN : OWNER_REQUIRED; |
1014 } | 1014 } |
1015 | 1015 |
1016 CryptohomeAuthenticator::AuthState | 1016 CryptohomeAuthenticator::AuthState |
1017 CryptohomeAuthenticator::ResolveOnlineSuccessState( | 1017 CryptohomeAuthenticator::ResolveOnlineSuccessState( |
1018 CryptohomeAuthenticator::AuthState offline_state) { | 1018 CryptohomeAuthenticator::AuthState offline_state) { |
1019 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 1019 DCHECK(task_runner_->RunsTasksInCurrentSequence()); |
1020 switch (offline_state) { | 1020 switch (offline_state) { |
1021 case POSSIBLE_PW_CHANGE: | 1021 case POSSIBLE_PW_CHANGE: |
1022 return NEED_OLD_PW; | 1022 return NEED_OLD_PW; |
1023 case NO_MOUNT: | 1023 case NO_MOUNT: |
1024 return CREATE_NEW; | 1024 return CREATE_NEW; |
1025 case OFFLINE_LOGIN: | 1025 case OFFLINE_LOGIN: |
1026 return ONLINE_LOGIN; | 1026 return ONLINE_LOGIN; |
1027 default: | 1027 default: |
1028 NOTREACHED(); | 1028 NOTREACHED(); |
1029 return offline_state; | 1029 return offline_state; |
1030 } | 1030 } |
1031 } | 1031 } |
1032 | 1032 |
1033 void CryptohomeAuthenticator::ResolveLoginCompletionStatus() { | 1033 void CryptohomeAuthenticator::ResolveLoginCompletionStatus() { |
1034 // Shortcut online state resolution process. | 1034 // Shortcut online state resolution process. |
1035 current_state_->RecordOnlineLoginStatus(AuthFailure::AuthFailureNone()); | 1035 current_state_->RecordOnlineLoginStatus(AuthFailure::AuthFailureNone()); |
1036 Resolve(); | 1036 Resolve(); |
1037 } | 1037 } |
1038 | 1038 |
1039 void CryptohomeAuthenticator::SetOwnerState(bool owner_check_finished, | 1039 void CryptohomeAuthenticator::SetOwnerState(bool owner_check_finished, |
1040 bool check_result) { | 1040 bool check_result) { |
1041 owner_is_verified_ = owner_check_finished; | 1041 owner_is_verified_ = owner_check_finished; |
1042 user_can_login_ = check_result; | 1042 user_can_login_ = check_result; |
1043 } | 1043 } |
1044 | 1044 |
1045 } // namespace chromeos | 1045 } // namespace chromeos |
OLD | NEW |