Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/policy/arc_android_management_checker.h" | 5 #include "chrome/browser/chromeos/arc/policy/arc_android_management_checker.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | |
| 8 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 9 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
| 10 #include "chrome/browser/browser_process_platform_part.h" | 11 #include "chrome/browser/browser_process_platform_part.h" |
| 11 #include "chrome/browser/chromeos/arc/policy/arc_android_management_checker_dele gate.h" | 12 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h" |
| 12 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" | 13 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
| 14 #include "chrome/browser/profiles/profile.h" | |
| 15 #include "components/policy/core/browser/browser_policy_connector.h" | |
| 13 #include "components/policy/core/common/cloud/device_management_service.h" | 16 #include "components/policy/core/common/cloud/device_management_service.h" |
| 14 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 17 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
| 15 | 18 |
| 16 namespace arc { | 19 namespace arc { |
| 17 | 20 |
| 18 namespace { | 21 namespace { |
| 19 | 22 |
| 20 constexpr int kRetryTimeMinMs = 10 * 1000; // 10 sec. | 23 constexpr int kRetryTimeMinMs = 10 * 1000; // 10 sec. |
| 21 constexpr int kRetryTimeMaxMs = 1 * 60 * 60 * 1000; // 1 hour. | 24 constexpr int kRetryTimeMaxMs = 1 * 60 * 60 * 1000; // 1 hour. |
| 22 | 25 |
| 23 policy::DeviceManagementService* GetDeviceManagementService() { | 26 policy::DeviceManagementService* GetDeviceManagementService() { |
| 24 policy::BrowserPolicyConnectorChromeOS* const connector = | 27 policy::BrowserPolicyConnectorChromeOS* const connector = |
| 25 g_browser_process->platform_part()->browser_policy_connector_chromeos(); | 28 g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
| 26 return connector->device_management_service(); | 29 return connector->device_management_service(); |
| 27 } | 30 } |
| 28 | 31 |
| 29 } // namespace | 32 } // namespace |
| 30 | 33 |
| 31 ArcAndroidManagementChecker::ArcAndroidManagementChecker( | 34 ArcAndroidManagementChecker::ArcAndroidManagementChecker( |
| 32 ArcAndroidManagementCheckerDelegate* delegate, | 35 Profile* profile, |
| 33 ProfileOAuth2TokenService* token_service, | 36 ProfileOAuth2TokenService* token_service, |
| 34 const std::string& account_id, | 37 const std::string& account_id, |
| 35 bool background_mode) | 38 bool retry_on_error) |
| 36 : delegate_(delegate), | 39 : profile_(profile), |
| 37 token_service_(token_service), | 40 token_service_(token_service), |
| 38 account_id_(account_id), | 41 account_id_(account_id), |
| 39 background_mode_(background_mode), | 42 retry_on_error_(retry_on_error), |
| 40 retry_time_ms_(kRetryTimeMinMs), | 43 retry_time_ms_(kRetryTimeMinMs), |
| 41 android_management_client_(GetDeviceManagementService(), | 44 android_management_client_(GetDeviceManagementService(), |
| 42 g_browser_process->system_request_context(), | 45 g_browser_process->system_request_context(), |
| 43 account_id, | 46 account_id, |
| 44 token_service), | 47 token_service), |
| 45 weak_ptr_factory_(this) { | 48 weak_ptr_factory_(this) {} |
| 46 if (token_service_->RefreshTokenIsAvailable(account_id_)) { | |
| 47 StartCheck(); | |
| 48 } else { | |
| 49 DCHECK(background_mode_); | |
| 50 token_service_->AddObserver(this); | |
| 51 } | |
| 52 } | |
| 53 | 49 |
| 54 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() { | 50 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() { |
| 55 token_service_->RemoveObserver(this); | 51 token_service_->RemoveObserver(this); |
| 56 } | 52 } |
| 57 | 53 |
| 58 // static | 54 // static |
| 59 void ArcAndroidManagementChecker::StartClient() { | 55 void ArcAndroidManagementChecker::StartClient() { |
| 60 GetDeviceManagementService()->ScheduleInitialization(0); | 56 GetDeviceManagementService()->ScheduleInitialization(0); |
| 61 } | 57 } |
| 62 | 58 |
| 59 void ArcAndroidManagementChecker::StartCheck(const CheckCallback& callback) { | |
| 60 DCHECK(callback_.is_null()); | |
|
khmel
2016/10/25 14:55:20
Now your logic is incorrect, before all checks wer
hidehiko
2016/10/25 16:15:20
This is common pattern used in Chrome, AFAIK.
Act
khmel
2016/10/25 16:18:03
Acknowledged.
| |
| 61 | |
| 62 // Do not send requests for Chrome OS managed users, nor for well-known | |
| 63 // consumer domains. | |
| 64 if (policy_util::IsAccountManaged(profile_) || | |
| 65 policy::BrowserPolicyConnector::IsNonEnterpriseUser( | |
| 66 profile_->GetProfileUserName())) { | |
| 67 callback.Run(policy::AndroidManagementClient::Result::RESULT_UNMANAGED); | |
| 68 return; | |
| 69 } | |
| 70 | |
| 71 callback_ = callback; | |
| 72 EnsureRefreshTokenLoaded(); | |
| 73 } | |
| 74 | |
| 75 void ArcAndroidManagementChecker::EnsureRefreshTokenLoaded() { | |
| 76 if (token_service_->RefreshTokenIsAvailable(account_id_)) { | |
| 77 // If the refresh token is already available, just start the management | |
| 78 // check immediately. | |
| 79 StartCheckInternal(); | |
| 80 return; | |
| 81 } | |
| 82 | |
| 83 // Set the observer to the token service so the callback will be called | |
| 84 // when the token is loaded. | |
| 85 token_service_->AddObserver(this); | |
| 86 } | |
| 87 | |
| 63 void ArcAndroidManagementChecker::OnRefreshTokenAvailable( | 88 void ArcAndroidManagementChecker::OnRefreshTokenAvailable( |
| 64 const std::string& account_id) { | 89 const std::string& account_id) { |
| 65 if (account_id != account_id_) | 90 if (account_id != account_id_) |
| 66 return; | 91 return; |
| 67 OnRefreshTokensLoaded(); | 92 OnRefreshTokensLoaded(); |
| 68 } | 93 } |
| 69 | 94 |
| 70 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() { | 95 void ArcAndroidManagementChecker::OnRefreshTokensLoaded() { |
| 71 token_service_->RemoveObserver(this); | 96 token_service_->RemoveObserver(this); |
| 72 StartCheck(); | 97 StartCheckInternal(); |
| 73 } | 98 } |
| 74 | 99 |
| 75 void ArcAndroidManagementChecker::StartCheck() { | 100 void ArcAndroidManagementChecker::StartCheckInternal() { |
| 101 DCHECK(!callback_.is_null()); | |
| 102 | |
| 76 if (!token_service_->RefreshTokenIsAvailable(account_id_)) { | 103 if (!token_service_->RefreshTokenIsAvailable(account_id_)) { |
| 77 VLOG(2) << "No refresh token is available for android management check."; | 104 VLOG(2) << "No refresh token is available for android management check."; |
| 78 OnAndroidManagementChecked( | 105 base::ResetAndReturn(&callback_) |
| 79 policy::AndroidManagementClient::Result::RESULT_ERROR); | 106 .Run(policy::AndroidManagementClient::Result::RESULT_ERROR); |
| 80 return; | 107 return; |
| 81 } | 108 } |
| 82 | 109 |
| 83 VLOG(2) << "Start android management check."; | 110 VLOG(2) << "Start android management check."; |
| 84 android_management_client_.StartCheckAndroidManagement( | 111 android_management_client_.StartCheckAndroidManagement( |
| 85 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked, | 112 base::Bind(&ArcAndroidManagementChecker::OnAndroidManagementChecked, |
| 86 weak_ptr_factory_.GetWeakPtr())); | 113 weak_ptr_factory_.GetWeakPtr())); |
| 87 } | 114 } |
| 88 | 115 |
| 89 void ArcAndroidManagementChecker::ScheduleCheck() { | |
| 90 DCHECK(background_mode_); | |
| 91 | |
| 92 VLOG(2) << "Schedule next android management check in " << retry_time_ms_ | |
| 93 << " ms."; | |
| 94 | |
| 95 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
| 96 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheck, | |
| 97 weak_ptr_factory_.GetWeakPtr()), | |
| 98 base::TimeDelta::FromMilliseconds(retry_time_ms_)); | |
| 99 retry_time_ms_ *= 2; | |
| 100 if (retry_time_ms_ > kRetryTimeMaxMs) | |
| 101 retry_time_ms_ = kRetryTimeMaxMs; | |
| 102 } | |
| 103 | |
| 104 void ArcAndroidManagementChecker::DispatchResult( | |
| 105 policy::AndroidManagementClient::Result result) { | |
| 106 DCHECK(delegate_); | |
| 107 delegate_->OnAndroidManagementChecked(result); | |
| 108 } | |
| 109 | |
| 110 void ArcAndroidManagementChecker::OnAndroidManagementChecked( | 116 void ArcAndroidManagementChecker::OnAndroidManagementChecked( |
| 111 policy::AndroidManagementClient::Result result) { | 117 policy::AndroidManagementClient::Result result) { |
| 118 DCHECK(!callback_.is_null()); | |
| 112 VLOG(2) << "Android management check done " << result << "."; | 119 VLOG(2) << "Android management check done " << result << "."; |
| 113 if (background_mode_ && | 120 if (retry_on_error_ && |
| 114 result == policy::AndroidManagementClient::Result::RESULT_ERROR) { | 121 result == policy::AndroidManagementClient::Result::RESULT_ERROR) { |
| 115 ScheduleCheck(); | 122 ScheduleRetry(); |
| 116 return; | 123 return; |
| 117 } | 124 } |
| 118 | 125 |
| 119 base::ThreadTaskRunnerHandle::Get()->PostTask( | 126 base::ResetAndReturn(&callback_).Run(result); |
| 120 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::DispatchResult, | 127 } |
| 121 weak_ptr_factory_.GetWeakPtr(), result)); | 128 |
| 129 void ArcAndroidManagementChecker::ScheduleRetry() { | |
| 130 DCHECK(retry_on_error_); | |
| 131 DCHECK(!callback_.is_null()); | |
| 132 VLOG(2) << "Schedule next android management check in " << retry_time_ms_ | |
| 133 << " ms."; | |
| 134 | |
| 135 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
| 136 FROM_HERE, base::Bind(&ArcAndroidManagementChecker::StartCheckInternal, | |
| 137 weak_ptr_factory_.GetWeakPtr()), | |
| 138 base::TimeDelta::FromMilliseconds(retry_time_ms_)); | |
| 139 retry_time_ms_ = std::min(retry_time_ms_ * 2, kRetryTimeMaxMs); | |
| 122 } | 140 } |
| 123 | 141 |
| 124 } // namespace arc | 142 } // namespace arc |
| OLD | NEW |