| 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 backwards compatibility, use NETWORK_ERROR for |
| 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) |
| 471 UpdateOptInCancelUMA(OptInCancelReason::CLOUD_PROVISION_FLOW_FAIL); |
| 472 } |
| 473 |
| 474 if (result == ProvisioningResult::SUCCESS) { |
| 475 if (support_host_) |
| 476 support_host_->Close(); |
| 477 |
| 478 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) |
| 479 return; |
| 480 |
| 481 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); |
| 482 if (!IsOptInVerificationDisabled()) { |
| 483 playstore_launcher_.reset( |
| 484 new ArcAppLauncher(profile_, kPlayStoreAppId, true)); |
| 485 } |
| 486 |
| 487 for (auto& observer : observer_list_) |
| 488 observer.OnInitialStart(); |
| 489 return; |
| 488 } | 490 } |
| 489 | 491 |
| 490 ArcSupportHost::Error error; | 492 ArcSupportHost::Error error; |
| 491 switch (result) { | 493 switch (result) { |
| 492 case ProvisioningResult::GMS_NETWORK_ERROR: | 494 case ProvisioningResult::GMS_NETWORK_ERROR: |
| 493 error = ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR; | 495 error = ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR; |
| 494 break; | 496 break; |
| 495 case ProvisioningResult::GMS_SERVICE_UNAVAILABLE: | 497 case ProvisioningResult::GMS_SERVICE_UNAVAILABLE: |
| 496 case ProvisioningResult::GMS_SIGN_IN_FAILED: | 498 case ProvisioningResult::GMS_SIGN_IN_FAILED: |
| 497 case ProvisioningResult::GMS_SIGN_IN_TIMEOUT: | 499 case ProvisioningResult::GMS_SIGN_IN_TIMEOUT: |
| 498 case ProvisioningResult::GMS_SIGN_IN_INTERNAL_ERROR: | 500 case ProvisioningResult::GMS_SIGN_IN_INTERNAL_ERROR: |
| 499 error = ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR; | 501 error = ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR; |
| 500 break; | 502 break; |
| 501 case ProvisioningResult::GMS_BAD_AUTHENTICATION: | 503 case ProvisioningResult::GMS_BAD_AUTHENTICATION: |
| 502 error = ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR; | 504 error = ArcSupportHost::Error::SIGN_IN_BAD_AUTHENTICATION_ERROR; |
| 503 break; | 505 break; |
| 504 case ProvisioningResult::DEVICE_CHECK_IN_FAILED: | 506 case ProvisioningResult::DEVICE_CHECK_IN_FAILED: |
| 505 case ProvisioningResult::DEVICE_CHECK_IN_TIMEOUT: | 507 case ProvisioningResult::DEVICE_CHECK_IN_TIMEOUT: |
| 506 case ProvisioningResult::DEVICE_CHECK_IN_INTERNAL_ERROR: | 508 case ProvisioningResult::DEVICE_CHECK_IN_INTERNAL_ERROR: |
| 507 error = ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR; | 509 error = ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR; |
| 508 break; | 510 break; |
| 509 case ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED: | 511 case ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED: |
| 510 case ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT: | 512 case ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT: |
| 511 case ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR: | 513 case ProvisioningResult::CLOUD_PROVISION_FLOW_INTERNAL_ERROR: |
| 512 error = ArcSupportHost::Error::SIGN_IN_CLOUD_PROVISION_FLOW_FAIL_ERROR; | 514 error = ArcSupportHost::Error::SIGN_IN_CLOUD_PROVISION_FLOW_FAIL_ERROR; |
| 513 break; | 515 break; |
| 516 case ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR: |
| 517 error = ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR; |
| 518 break; |
| 514 default: | 519 default: |
| 515 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; | 520 error = ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR; |
| 516 break; | 521 break; |
| 517 } | 522 } |
| 518 | 523 |
| 519 if (result == ProvisioningResult::ARC_STOPPED) { | 524 if (result == ProvisioningResult::ARC_STOPPED || |
| 525 result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { |
| 520 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) | 526 if (profile_->GetPrefs()->HasPrefPath(prefs::kArcSignedIn)) |
| 521 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); | 527 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, false); |
| 522 ShutdownBridge(); | 528 ShutdownBridge(); |
| 523 if (support_host_) | 529 if (support_host_) |
| 524 support_host_->ShowError(error, false); | 530 support_host_->ShowError(error, false); |
| 525 return; | 531 return; |
| 526 } | 532 } |
| 527 | 533 |
| 528 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || | 534 if (result == ProvisioningResult::CLOUD_PROVISION_FLOW_FAILED || |
| 529 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || | 535 result == ProvisioningResult::CLOUD_PROVISION_FLOW_TIMEOUT || |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 DCHECK(!auth_code.empty()); | 796 DCHECK(!auth_code.empty()); |
| 791 | 797 |
| 792 account_info_notifier_->Notify(!IsOptInVerificationDisabled(), auth_code, | 798 account_info_notifier_->Notify(!IsOptInVerificationDisabled(), auth_code, |
| 793 GetAccountType(), | 799 GetAccountType(), |
| 794 policy_util::IsAccountManaged(profile_)); | 800 policy_util::IsAccountManaged(profile_)); |
| 795 account_info_notifier_.reset(); | 801 account_info_notifier_.reset(); |
| 796 } | 802 } |
| 797 | 803 |
| 798 void ArcAuthService::OnArcSignInTimeout() { | 804 void ArcAuthService::OnArcSignInTimeout() { |
| 799 LOG(ERROR) << "Timed out waiting for first sign in."; | 805 LOG(ERROR) << "Timed out waiting for first sign in."; |
| 800 OnSignInFailedInternal(ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT); | 806 OnProvisioningFinished(ProvisioningResult::OVERALL_SIGN_IN_TIMEOUT); |
| 801 } | 807 } |
| 802 | 808 |
| 803 void ArcAuthService::CancelAuthCode() { | 809 void ArcAuthService::CancelAuthCode() { |
| 804 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 810 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 805 | 811 |
| 806 if (state_ == State::NOT_INITIALIZED) { | 812 if (state_ == State::NOT_INITIALIZED) { |
| 807 NOTREACHED(); | 813 NOTREACHED(); |
| 808 return; | 814 return; |
| 809 } | 815 } |
| 810 | 816 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 } | 892 } |
| 887 return; | 893 return; |
| 888 } | 894 } |
| 889 | 895 |
| 890 SetState(State::SHOWING_TERMS_OF_SERVICE); | 896 SetState(State::SHOWING_TERMS_OF_SERVICE); |
| 891 if (support_host_) | 897 if (support_host_) |
| 892 support_host_->ShowTermsOfService(); | 898 support_host_->ShowTermsOfService(); |
| 893 } | 899 } |
| 894 | 900 |
| 895 void ArcAuthService::OnPrepareContextFailed() { | 901 void ArcAuthService::OnPrepareContextFailed() { |
| 896 ShutdownBridge(); | 902 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 897 if (support_host_) { | 903 OnProvisioningFinished(ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR); |
| 898 support_host_->ShowError(ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, | |
| 899 false); | |
| 900 } | |
| 901 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | |
| 902 } | 904 } |
| 903 | 905 |
| 904 void ArcAuthService::OnAuthCodeSuccess(const std::string& auth_code) { | 906 void ArcAuthService::OnAuthCodeSuccess(const std::string& auth_code) { |
| 905 OnAuthCodeObtained(auth_code); | 907 OnAuthCodeObtained(auth_code); |
| 906 } | 908 } |
| 907 | 909 |
| 908 void ArcAuthService::OnAuthCodeFailed() { | 910 void ArcAuthService::OnAuthCodeFailed() { |
| 909 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 911 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 910 ShutdownBridge(); | 912 OnProvisioningFinished(ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR); |
| 911 if (support_host_) { | |
| 912 support_host_->ShowError(ArcSupportHost::Error::SERVER_COMMUNICATION_ERROR, | |
| 913 false); | |
| 914 } | |
| 915 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); | |
| 916 } | 913 } |
| 917 | 914 |
| 918 void ArcAuthService::StartArcAndroidManagementCheck() { | 915 void ArcAuthService::StartArcAndroidManagementCheck() { |
| 919 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 916 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 920 DCHECK(arc_bridge_service()->stopped()); | 917 DCHECK(arc_bridge_service()->stopped()); |
| 921 DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE || | 918 DCHECK(state_ == State::SHOWING_TERMS_OF_SERVICE || |
| 922 state_ == State::CHECKING_ANDROID_MANAGEMENT); | 919 state_ == State::CHECKING_ANDROID_MANAGEMENT); |
| 923 SetState(State::CHECKING_ANDROID_MANAGEMENT); | 920 SetState(State::CHECKING_ANDROID_MANAGEMENT); |
| 924 | 921 |
| 925 android_management_checker_.reset(new ArcAndroidManagementChecker( | 922 android_management_checker_.reset(new ArcAndroidManagementChecker( |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 return os << "ACTIVE"; | 1099 return os << "ACTIVE"; |
| 1103 } | 1100 } |
| 1104 | 1101 |
| 1105 // Some compiler reports an error even if all values of an enum-class are | 1102 // Some compiler reports an error even if all values of an enum-class are |
| 1106 // covered indivisually in a switch statement. | 1103 // covered indivisually in a switch statement. |
| 1107 NOTREACHED(); | 1104 NOTREACHED(); |
| 1108 return os; | 1105 return os; |
| 1109 } | 1106 } |
| 1110 | 1107 |
| 1111 } // namespace arc | 1108 } // namespace arc |
| OLD | NEW |