Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/chromeos/arc/arc_auth_service.h" | 5 #include "chrome/browser/chromeos/arc/arc_auth_service.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "ash/common/shelf/shelf_delegate.h" | 9 #include "ash/common/shelf/shelf_delegate.h" |
| 10 #include "ash/common/wm_shell.h" | 10 #include "ash/common/wm_shell.h" |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 | 280 |
| 281 void ArcAuthService::OnInstanceReady() { | 281 void ArcAuthService::OnInstanceReady() { |
| 282 auto* instance = arc_bridge_service()->auth()->GetInstanceForMethod("Init"); | 282 auto* instance = arc_bridge_service()->auth()->GetInstanceForMethod("Init"); |
| 283 DCHECK(instance); | 283 DCHECK(instance); |
| 284 instance->Init(binding_.CreateInterfacePtrAndBind()); | 284 instance->Init(binding_.CreateInterfacePtrAndBind()); |
| 285 } | 285 } |
| 286 | 286 |
| 287 void ArcAuthService::OnBridgeStopped(ArcBridgeService::StopReason reason) { | 287 void ArcAuthService::OnBridgeStopped(ArcBridgeService::StopReason reason) { |
| 288 // TODO(crbug.com/625923): Use |reason| to report more detailed errors. | 288 // TODO(crbug.com/625923): Use |reason| to report more detailed errors. |
| 289 if (arc_sign_in_timer_.IsRunning()) { | 289 if (arc_sign_in_timer_.IsRunning()) { |
| 290 OnSignInFailedInternal(ProvisioningResult::ARC_STOPPED); | 290 OnProvisioningFinished(ProvisioningResult::ARC_STOPPED); |
| 291 } | 291 } |
| 292 | 292 |
| 293 if (clear_required_) { | 293 if (clear_required_) { |
| 294 // This should be always true, but just in case as this is looked at | 294 // This should be always true, but just in case as this is looked at |
| 295 // inside RemoveArcData() at first. | 295 // inside RemoveArcData() at first. |
| 296 DCHECK(arc_bridge_service()->stopped()); | 296 DCHECK(arc_bridge_service()->stopped()); |
| 297 RemoveArcData(); | 297 RemoveArcData(); |
| 298 } else { | 298 } else { |
| 299 // To support special "Stop and enable ARC" procedure for enterprise, | 299 // To support special "Stop and enable ARC" procedure for enterprise, |
| 300 // here call OnArcDataRemoved(true) as if the data removal is successfully | 300 // here call OnArcDataRemoved(true) as if the data removal is successfully |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 436 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 436 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 437 DCHECK(state_ == State::ACTIVE); | 437 DCHECK(state_ == State::ACTIVE); |
| 438 DCHECK(IsAuthCodeRequest()); | 438 DCHECK(IsAuthCodeRequest()); |
| 439 DCHECK(!IsArcKioskMode()); | 439 DCHECK(!IsArcKioskMode()); |
| 440 context_->PrepareContext(); | 440 context_->PrepareContext(); |
| 441 } | 441 } |
| 442 | 442 |
| 443 void ArcAuthService::OnSignInComplete() { | 443 void ArcAuthService::OnSignInComplete() { |
| 444 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 444 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 445 DCHECK_EQ(state_, State::ACTIVE); | 445 DCHECK_EQ(state_, State::ACTIVE); |
| 446 | 446 OnProvisioningFinished(ProvisioningResult::SUCCESS); |
| 447 if (!sign_in_time_.is_null()) { | |
| 448 arc_sign_in_timer_.Stop(); | |
| 449 UpdateProvisioningTiming(base::Time::Now() - sign_in_time_, true, | |
| 450 policy_util::IsAccountManaged(profile_)); | |
| 451 UpdateProvisioningResultUMA(ProvisioningResult::SUCCESS, | |
| 452 policy_util::IsAccountManaged(profile_)); | |
| 453 } | |
| 454 | |
| 455 if (support_host_) | |
| 456 support_host_->Close(); | |
| 457 | |
| 458 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) | |
| 459 return; | |
| 460 | |
| 461 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); | |
| 462 if (!IsOptInVerificationDisabled()) { | |
| 463 playstore_launcher_.reset( | |
| 464 new ArcAppLauncher(profile_, kPlayStoreAppId, true)); | |
| 465 } | |
| 466 | |
| 467 for (auto& observer : observer_list_) | |
| 468 observer.OnInitialStart(); | |
| 469 } | 447 } |
| 470 | 448 |
| 471 void ArcAuthService::OnSignInFailed(mojom::ArcSignInFailureReason reason) { | 449 void ArcAuthService::OnSignInFailed(mojom::ArcSignInFailureReason reason) { |
| 472 OnSignInFailedInternal( | 450 OnProvisioningFinished( |
| 473 ConvertArcSignInFailureReasonToProvisioningResult(reason)); | 451 ConvertArcSignInFailureReasonToProvisioningResult(reason)); |
| 474 } | 452 } |
| 475 | 453 |
| 476 void ArcAuthService::OnSignInFailedInternal(ProvisioningResult result) { | 454 void ArcAuthService::OnProvisioningFinished(ProvisioningResult result) { |
| 477 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 455 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 478 DCHECK_EQ(state_, State::ACTIVE); | 456 DCHECK_EQ(state_, State::ACTIVE); |
| 479 | 457 |
| 480 if (!sign_in_time_.is_null()) { | 458 if (result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { |
| 459 // For backword compatibility, use NETWORK_ERROR for | |
|
Luis Héctor Chávez
2016/11/15 23:40:50
nit: s/backword/backwards/
hidehiko
2016/11/17 11:04:54
Done.
| |
| 460 // CHROME_SERVER_COMMUNICATION_ERROR case. | |
| 461 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | |
| 462 } else if (!sign_in_time_.is_null()) { | |
| 481 arc_sign_in_timer_.Stop(); | 463 arc_sign_in_timer_.Stop(); |
| 482 | 464 |
| 483 UpdateProvisioningTiming(base::Time::Now() - sign_in_time_, false, | 465 UpdateProvisioningTiming(base::Time::Now() - sign_in_time_, |
| 466 result == ProvisioningResult::SUCCESS, | |
| 484 policy_util::IsAccountManaged(profile_)); | 467 policy_util::IsAccountManaged(profile_)); |
| 485 UpdateOptInCancelUMA(OptInCancelReason::CLOUD_PROVISION_FLOW_FAIL); | |
| 486 UpdateProvisioningResultUMA(result, | 468 UpdateProvisioningResultUMA(result, |
| 487 policy_util::IsAccountManaged(profile_)); | 469 policy_util::IsAccountManaged(profile_)); |
| 470 if (result != ProvisioningResult::SUCCESS) { | |
|
Luis Héctor Chávez
2016/11/15 23:40:50
nit: you can elide braces
hidehiko
2016/11/17 11:04:54
Done.
| |
| 471 UpdateOptInCancelUMA(OptInCancelReason::CLOUD_PROVISION_FLOW_FAIL); | |
| 472 } | |
| 473 } | |
| 474 | |
| 475 if (result == ProvisioningResult::SUCCESS) { | |
| 476 if (support_host_) | |
| 477 support_host_->Close(); | |
| 478 | |
| 479 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) | |
| 480 return; | |
| 481 | |
| 482 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); | |
| 483 if (!IsOptInVerificationDisabled()) { | |
| 484 playstore_launcher_.reset( | |
| 485 new ArcAppLauncher(profile_, kPlayStoreAppId, true)); | |
| 486 } | |
| 487 | |
| 488 for (auto& observer : observer_list_) | |
| 489 observer.OnInitialStart(); | |
| 490 return; | |
| 488 } | 491 } |
| 489 | 492 |
| 490 ArcSupportHost::Error error; | 493 ArcSupportHost::Error error; |
| 491 switch (result) { | 494 switch (result) { |
| 492 case ProvisioningResult::GMS_NETWORK_ERROR: | 495 case ProvisioningResult::GMS_NETWORK_ERROR: |
| 493 error = ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR; | 496 error = ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR; |
| 494 break; | 497 break; |
| 495 case ProvisioningResult::GMS_SERVICE_UNAVAILABLE: | 498 case ProvisioningResult::GMS_SERVICE_UNAVAILABLE: |
| 496 case ProvisioningResult::GMS_SIGN_IN_FAILED: | 499 case ProvisioningResult::GMS_SIGN_IN_FAILED: |
| 497 case ProvisioningResult::GMS_SIGN_IN_TIMEOUT: | 500 case ProvisioningResult::GMS_SIGN_IN_TIMEOUT: |
| 498 case ProvisioningResult::GMS_SIGN_IN_INTERNAL_ERROR: | 501 case ProvisioningResult::GMS_SIGN_IN_INTERNAL_ERROR: |
| 499 error = ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR; | 502 error = ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR; |
| 500 break; | 503 break; |
| 501 case ProvisioningResult::GMS_BAD_AUTHENTICATION: | 504 case ProvisioningResult::GMS_BAD_AUTHENTICATION: |
| 502 error = ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR; | 505 error = ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR; |
| 503 break; | 506 break; |
| 504 case ProvisioningResult::DEVICE_CHECK_IN_FAILED: | 507 case ProvisioningResult::DEVICE_CHECK_IN_FAILED: |
| 505 case ProvisioningResult::DEVICE_CHECK_IN_TIMEOUT: | 508 case ProvisioningResult::DEVICE_CHECK_IN_TIMEOUT: |
| 506 case ProvisioningResult::DEVICE_CHECK_IN_INTERNAL_ERROR: | 509 case ProvisioningResult::DEVICE_CHECK_IN_INTERNAL_ERROR: |
| 507 error = ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR; | 510 error = ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR; |
| 508 break; | 511 break; |
| 509 case ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED: | 512 case ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED: |
| 510 case ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT: | 513 case ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT: |
| 511 case ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR: | 514 case ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR: |
| 512 error = ArcSupportHost::Error::SIGN_IN_CLOUD_PROVISION_FLOW_FAIL_ERROR; | 515 error = ArcSupportHost::Error::SIGN_IN_CLOUD_PROVISION_FLOW_FAIL_ERROR; |
| 513 break; | 516 break; |
| 517 case ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR: | |
| 518 error = ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR; | |
| 519 break; | |
| 514 default: | 520 default: |
| 515 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; | 521 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; |
| 516 break; | 522 break; |
| 517 } | 523 } |
| 518 | 524 |
| 519 if (result == ProvisioningResult::ARC_STOPPED) { | 525 if (result == ProvisioningResult::ARC_STOPPED || |
| 526 result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { | |
| 520 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) | 527 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) |
| 521 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); | 528 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); |
| 522 ShutdownBridge(); | 529 ShutdownBridge(); |
| 523 if (support_host_) | 530 if (support_host_) |
| 524 support_host_->ShowError(error, false); | 531 support_host_->ShowError(error, false); |
| 525 return; | 532 return; |
| 526 } | 533 } |
| 527 | 534 |
| 528 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || | 535 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || |
| 529 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || | 536 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 785 DCHECK(!auth_code.empty()); | 792 DCHECK(!auth_code.empty()); |
| 786 | 793 |
| 787 account_info_notifier_->Notify(!IsOptInVerificationDisabled(), auth_code, | 794 account_info_notifier_->Notify(!IsOptInVerificationDisabled(), auth_code, |
| 788 GetAccountType(), | 795 GetAccountType(), |
| 789 policy_util::IsAccountManaged(profile_)); | 796 policy_util::IsAccountManaged(profile_)); |
| 790 account_info_notifier_.reset(); | 797 account_info_notifier_.reset(); |
| 791 } | 798 } |
| 792 | 799 |
| 793 void ArcAuthService::OnArcSignInTimeout() { | 800 void ArcAuthService::OnArcSignInTimeout() { |
| 794 LOG(ERROR) << "Timed out waiting for first sign in."; | 801 LOG(ERROR) << "Timed out waiting for first sign in."; |
| 795 OnSignInFailedInternal(ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT); | 802 OnProvisioningFinished(ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT); |
| 796 } | 803 } |
| 797 | 804 |
| 798 void ArcAuthService::CancelAuthCode() { | 805 void ArcAuthService::CancelAuthCode() { |
| 799 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 806 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 800 | 807 |
| 801 if (state_ == State::NOT_INITIALIZED) { | 808 if (state_ == State::NOT_INITIALIZED) { |
| 802 NOTREACHED(); | 809 NOTREACHED(); |
| 803 return; | 810 return; |
| 804 } | 811 } |
| 805 | 812 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 881 } | 888 } |
| 882 return; | 889 return; |
| 883 } | 890 } |
| 884 | 891 |
| 885 SetState(State::SHOWING_TERMS_OF_SERVICE); | 892 SetState(State::SHOWING_TERMS_OF_SERVICE); |
| 886 if (support_host_) | 893 if (support_host_) |
| 887 support_host_->ShowTermsOfService(); | 894 support_host_->ShowTermsOfService(); |
| 888 } | 895 } |
| 889 | 896 |
| 890 void ArcAuthService::OnPrepareContextFailed() { | 897 void ArcAuthService::OnPrepareContextFailed() { |
| 891 ShutdownBridge(); | 898 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 892 if (support_host_) { | 899 OnProvisioningFinished(ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR); |
| 893 support_host_->ShowError(ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, | |
| 894 false); | |
| 895 } | |
| 896 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | |
| 897 } | 900 } |
| 898 | 901 |
| 899 void ArcAuthService::OnAuthCodeSuccess(const std::string& auth_code) { | 902 void ArcAuthService::OnAuthCodeSuccess(const std::string& auth_code) { |
| 900 OnAuthCodeObtained(auth_code); | 903 OnAuthCodeObtained(auth_code); |
| 901 } | 904 } |
| 902 | 905 |
| 903 void ArcAuthService::OnAuthCodeFailed() { | 906 void ArcAuthService::OnAuthCodeFailed() { |
| 904 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 907 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 905 ShutdownBridge(); | 908 OnProvisioningFinished(ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR); |
| 906 if (support_host_) { | |
| 907 support_host_->ShowError(ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, | |
| 908 false); | |
| 909 } | |
| 910 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | |
| 911 } | 909 } |
| 912 | 910 |
| 913 void ArcAuthService::StartArcAndroidManagementCheck() { | 911 void ArcAuthService::StartArcAndroidManagementCheck() { |
| 914 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 912 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 915 DCHECK(arc_bridge_service()->stopped()); | 913 DCHECK(arc_bridge_service()->stopped()); |
| 916 DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE || | 914 DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE || |
| 917 state_ == State::CHECKING_ANDROID_MANAGEMENT); | 915 state_ == State::CHECKING_ANDROID_MANAGEMENT); |
| 918 SetState(State::CHECKING_ANDROID_MANAGEMENT); | 916 SetState(State::CHECKING_ANDROID_MANAGEMENT); |
| 919 | 917 |
| 920 android_management_checker_.reset(new ArcAndroidManagementChecker( | 918 android_management_checker_.reset(new ArcAndroidManagementChecker( |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1097 return os << "ACTIVE"; | 1095 return os << "ACTIVE"; |
| 1098 } | 1096 } |
| 1099 | 1097 |
| 1100 // Some compiler reports an error even if all values of an enum-class are | 1098 // Some compiler reports an error even if all values of an enum-class are |
| 1101 // covered indivisually in a switch statement. | 1099 // covered indivisually in a switch statement. |
| 1102 NOTREACHED(); | 1100 NOTREACHED(); |
| 1103 return os; | 1101 return os; |
| 1104 } | 1102 } |
| 1105 | 1103 |
| 1106 } // namespace arc | 1104 } // namespace arc |
| OLD | NEW |