| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/policy/user_cloud_policy_manager_chromeos.h" | 5 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | |
| 10 #include "base/logging.h" | 9 #include "base/logging.h" |
| 11 #include "base/message_loop/message_loop_proxy.h" | |
| 12 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 13 #include "base/metrics/sparse_histogram.h" | 11 #include "base/metrics/sparse_histogram.h" |
| 14 #include "base/sequenced_task_runner.h" | 12 #include "base/sequenced_task_runner.h" |
| 15 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
| 16 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" | 14 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" |
| 17 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom
eos.h" | 15 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom
eos.h" |
| 18 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 16 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 19 #include "chrome/browser/policy/cloud/cloud_external_data_manager.h" | 17 #include "chrome/browser/policy/cloud/cloud_external_data_manager.h" |
| 20 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" | 18 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" |
| 21 #include "chrome/browser/policy/cloud/resource_cache.h" | |
| 22 #include "components/policy/core/common/policy_bundle.h" | |
| 23 #include "components/policy/core/common/policy_pref_names.h" | 19 #include "components/policy/core/common/policy_pref_names.h" |
| 24 #include "components/policy/core/common/policy_switches.h" | |
| 25 #include "content/public/browser/browser_thread.h" | |
| 26 #include "net/url_request/url_request_context_getter.h" | 20 #include "net/url_request/url_request_context_getter.h" |
| 27 | 21 |
| 28 namespace em = enterprise_management; | 22 namespace em = enterprise_management; |
| 29 | 23 |
| 30 namespace policy { | 24 namespace policy { |
| 31 | 25 |
| 32 namespace { | 26 namespace { |
| 33 | 27 |
| 34 // UMA histogram names. | 28 // UMA histogram names. |
| 35 const char kUMADelayInitialization[] = | 29 const char kUMADelayInitialization[] = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 47 const char kUMAInitialFetchOAuth2Error[] = | 41 const char kUMAInitialFetchOAuth2Error[] = |
| 48 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2Error"; | 42 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2Error"; |
| 49 const char kUMAInitialFetchOAuth2NetworkError[] = | 43 const char kUMAInitialFetchOAuth2NetworkError[] = |
| 50 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2NetworkError"; | 44 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2NetworkError"; |
| 51 | 45 |
| 52 } // namespace | 46 } // namespace |
| 53 | 47 |
| 54 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS( | 48 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS( |
| 55 scoped_ptr<CloudPolicyStore> store, | 49 scoped_ptr<CloudPolicyStore> store, |
| 56 scoped_ptr<CloudExternalDataManager> external_data_manager, | 50 scoped_ptr<CloudExternalDataManager> external_data_manager, |
| 51 const base::FilePath& component_policy_cache_path, |
| 52 bool wait_for_policy_fetch, |
| 53 base::TimeDelta initial_policy_fetch_timeout, |
| 57 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 54 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
| 58 const base::FilePath& resource_cache_dir, | 55 const scoped_refptr<base::SequencedTaskRunner>& file_task_runner, |
| 59 bool wait_for_policy_fetch, | 56 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner) |
| 60 base::TimeDelta initial_policy_fetch_timeout) | |
| 61 : CloudPolicyManager( | 57 : CloudPolicyManager( |
| 62 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()), | 58 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()), |
| 63 store.get(), | 59 store.get(), |
| 64 task_runner), | 60 task_runner, |
| 61 file_task_runner, |
| 62 io_task_runner), |
| 65 store_(store.Pass()), | 63 store_(store.Pass()), |
| 66 external_data_manager_(external_data_manager.Pass()), | 64 external_data_manager_(external_data_manager.Pass()), |
| 67 resource_cache_dir_(resource_cache_dir), | 65 component_policy_cache_path_(component_policy_cache_path), |
| 68 wait_for_policy_fetch_(wait_for_policy_fetch), | 66 wait_for_policy_fetch_(wait_for_policy_fetch), |
| 69 policy_fetch_timeout_(false, false) { | 67 policy_fetch_timeout_(false, false) { |
| 70 time_init_started_ = base::Time::Now(); | 68 time_init_started_ = base::Time::Now(); |
| 71 if (wait_for_policy_fetch_) { | 69 if (wait_for_policy_fetch_) { |
| 72 policy_fetch_timeout_.Start( | 70 policy_fetch_timeout_.Start( |
| 73 FROM_HERE, | 71 FROM_HERE, |
| 74 initial_policy_fetch_timeout, | 72 initial_policy_fetch_timeout, |
| 75 base::Bind(&UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch, | 73 base::Bind(&UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch, |
| 76 base::Unretained(this))); | 74 base::Unretained(this))); |
| 77 } | 75 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 88 DCHECK(local_state); | 86 DCHECK(local_state); |
| 89 local_state_ = local_state; | 87 local_state_ = local_state; |
| 90 scoped_ptr<CloudPolicyClient> cloud_policy_client( | 88 scoped_ptr<CloudPolicyClient> cloud_policy_client( |
| 91 new CloudPolicyClient(std::string(), std::string(), user_affiliation, | 89 new CloudPolicyClient(std::string(), std::string(), user_affiliation, |
| 92 NULL, device_management_service)); | 90 NULL, device_management_service)); |
| 93 core()->Connect(cloud_policy_client.Pass()); | 91 core()->Connect(cloud_policy_client.Pass()); |
| 94 client()->AddObserver(this); | 92 client()->AddObserver(this); |
| 95 | 93 |
| 96 external_data_manager_->Connect(request_context); | 94 external_data_manager_->Connect(request_context); |
| 97 | 95 |
| 98 CreateComponentCloudPolicyService(request_context); | 96 CreateComponentCloudPolicyService(component_policy_cache_path_, |
| 97 request_context); |
| 99 | 98 |
| 100 // Determine the next step after the CloudPolicyService initializes. | 99 // Determine the next step after the CloudPolicyService initializes. |
| 101 if (service()->IsInitializationComplete()) { | 100 if (service()->IsInitializationComplete()) { |
| 102 OnInitializationCompleted(service()); | 101 OnInitializationCompleted(service()); |
| 103 } else { | 102 } else { |
| 104 service()->AddObserver(this); | 103 service()->AddObserver(this); |
| 105 } | 104 } |
| 106 } | 105 } |
| 107 | 106 |
| 108 void UserCloudPolicyManagerChromeOS::OnAccessTokenAvailable( | 107 void UserCloudPolicyManagerChromeOS::OnAccessTokenAvailable( |
| 109 const std::string& access_token) { | 108 const std::string& access_token) { |
| 110 access_token_ = access_token; | 109 access_token_ = access_token; |
| 111 if (service() && service()->IsInitializationComplete() && | 110 if (service() && service()->IsInitializationComplete() && |
| 112 client() && !client()->is_registered()) { | 111 client() && !client()->is_registered()) { |
| 113 OnOAuth2PolicyTokenFetched( | 112 OnOAuth2PolicyTokenFetched( |
| 114 access_token, GoogleServiceAuthError(GoogleServiceAuthError::NONE)); | 113 access_token, GoogleServiceAuthError(GoogleServiceAuthError::NONE)); |
| 115 } | 114 } |
| 116 } | 115 } |
| 117 | 116 |
| 118 bool UserCloudPolicyManagerChromeOS::IsClientRegistered() const { | 117 bool UserCloudPolicyManagerChromeOS::IsClientRegistered() const { |
| 119 return client() && client()->is_registered(); | 118 return client() && client()->is_registered(); |
| 120 } | 119 } |
| 121 | 120 |
| 122 void UserCloudPolicyManagerChromeOS::Shutdown() { | 121 void UserCloudPolicyManagerChromeOS::Shutdown() { |
| 123 if (client()) | 122 if (client()) |
| 124 client()->RemoveObserver(this); | 123 client()->RemoveObserver(this); |
| 125 if (service()) | 124 if (service()) |
| 126 service()->RemoveObserver(this); | 125 service()->RemoveObserver(this); |
| 127 token_fetcher_.reset(); | 126 token_fetcher_.reset(); |
| 128 component_policy_service_.reset(); | |
| 129 external_data_manager_->Disconnect(); | 127 external_data_manager_->Disconnect(); |
| 130 CloudPolicyManager::Shutdown(); | 128 CloudPolicyManager::Shutdown(); |
| 131 } | 129 } |
| 132 | 130 |
| 133 bool UserCloudPolicyManagerChromeOS::IsInitializationComplete( | 131 bool UserCloudPolicyManagerChromeOS::IsInitializationComplete( |
| 134 PolicyDomain domain) const { | 132 PolicyDomain domain) const { |
| 135 if (!CloudPolicyManager::IsInitializationComplete(domain)) | 133 if (!CloudPolicyManager::IsInitializationComplete(domain)) |
| 136 return false; | 134 return false; |
| 137 if (domain == POLICY_DOMAIN_CHROME) | 135 if (domain == POLICY_DOMAIN_CHROME) |
| 138 return !wait_for_policy_fetch_; | 136 return !wait_for_policy_fetch_; |
| 139 if (ComponentCloudPolicyService::SupportsDomain(domain) && | |
| 140 component_policy_service_) { | |
| 141 return component_policy_service_->is_initialized(); | |
| 142 } | |
| 143 return true; | 137 return true; |
| 144 } | 138 } |
| 145 | 139 |
| 146 scoped_ptr<PolicyBundle> UserCloudPolicyManagerChromeOS::CreatePolicyBundle() { | |
| 147 scoped_ptr<PolicyBundle> bundle = CloudPolicyManager::CreatePolicyBundle(); | |
| 148 if (component_policy_service_) | |
| 149 bundle->MergeFrom(component_policy_service_->policy()); | |
| 150 return bundle.Pass(); | |
| 151 } | |
| 152 | |
| 153 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted( | 140 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted( |
| 154 CloudPolicyService* cloud_policy_service) { | 141 CloudPolicyService* cloud_policy_service) { |
| 155 DCHECK_EQ(service(), cloud_policy_service); | 142 DCHECK_EQ(service(), cloud_policy_service); |
| 156 cloud_policy_service->RemoveObserver(this); | 143 cloud_policy_service->RemoveObserver(this); |
| 157 | 144 |
| 158 time_init_completed_ = base::Time::Now(); | 145 time_init_completed_ = base::Time::Now(); |
| 159 UMA_HISTOGRAM_TIMES(kUMADelayInitialization, | 146 UMA_HISTOGRAM_TIMES(kUMADelayInitialization, |
| 160 time_init_completed_ - time_init_started_); | 147 time_init_completed_ - time_init_started_); |
| 161 | 148 |
| 162 // If the CloudPolicyClient isn't registered at this stage then it needs an | 149 // If the CloudPolicyClient isn't registered at this stage then it needs an |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 CloudPolicyClient* cloud_policy_client) { | 213 CloudPolicyClient* cloud_policy_client) { |
| 227 DCHECK_EQ(client(), cloud_policy_client); | 214 DCHECK_EQ(client(), cloud_policy_client); |
| 228 if (wait_for_policy_fetch_) { | 215 if (wait_for_policy_fetch_) { |
| 229 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchClientError, | 216 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchClientError, |
| 230 cloud_policy_client->status()); | 217 cloud_policy_client->status()); |
| 231 } | 218 } |
| 232 CancelWaitForPolicyFetch(); | 219 CancelWaitForPolicyFetch(); |
| 233 } | 220 } |
| 234 | 221 |
| 235 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() { | 222 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() { |
| 236 CheckAndPublishPolicy(); | 223 CloudPolicyManager::OnComponentCloudPolicyUpdated(); |
| 237 StartRefreshSchedulerIfReady(); | 224 StartRefreshSchedulerIfReady(); |
| 238 } | 225 } |
| 239 | 226 |
| 240 void UserCloudPolicyManagerChromeOS::CreateComponentCloudPolicyService( | |
| 241 const scoped_refptr<net::URLRequestContextGetter>& request_context) { | |
| 242 // Init() must have been called. | |
| 243 DCHECK(schema_registry()); | |
| 244 // Called at most once. | |
| 245 DCHECK(!component_policy_service_); | |
| 246 | |
| 247 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
| 248 switches::kEnableComponentCloudPolicy)) { | |
| 249 return; | |
| 250 } | |
| 251 | |
| 252 // TODO(joaodasilva): Move the |backend_task_runner| to the blocking pool. | |
| 253 // Currently it's not possible because the ComponentCloudPolicyStore is | |
| 254 // NonThreadSafe and doesn't support getting calls from different threads. | |
| 255 scoped_refptr<base::SequencedTaskRunner> backend_task_runner = | |
| 256 content::BrowserThread::GetMessageLoopProxyForThread( | |
| 257 content::BrowserThread::FILE); | |
| 258 scoped_ptr<ResourceCache> resource_cache( | |
| 259 new ResourceCache(resource_cache_dir_, backend_task_runner)); | |
| 260 component_policy_service_.reset(new ComponentCloudPolicyService( | |
| 261 this, | |
| 262 schema_registry(), | |
| 263 core(), | |
| 264 resource_cache.Pass(), | |
| 265 request_context, | |
| 266 backend_task_runner, | |
| 267 content::BrowserThread::GetMessageLoopProxyForThread( | |
| 268 content::BrowserThread::IO))); | |
| 269 } | |
| 270 | |
| 271 void UserCloudPolicyManagerChromeOS::FetchPolicyOAuthTokenUsingSigninProfile() { | 227 void UserCloudPolicyManagerChromeOS::FetchPolicyOAuthTokenUsingSigninProfile() { |
| 272 scoped_refptr<net::URLRequestContextGetter> signin_context; | 228 scoped_refptr<net::URLRequestContextGetter> signin_context; |
| 273 Profile* signin_profile = chromeos::ProfileHelper::GetSigninProfile(); | 229 Profile* signin_profile = chromeos::ProfileHelper::GetSigninProfile(); |
| 274 if (signin_profile) | 230 if (signin_profile) |
| 275 signin_context = signin_profile->GetRequestContext(); | 231 signin_context = signin_profile->GetRequestContext(); |
| 276 if (!signin_context.get()) { | 232 if (!signin_context.get()) { |
| 277 LOG(ERROR) << "No signin Profile for policy oauth token fetch!"; | 233 LOG(ERROR) << "No signin Profile for policy oauth token fetch!"; |
| 278 OnOAuth2PolicyTokenFetched( | 234 OnOAuth2PolicyTokenFetched( |
| 279 std::string(), GoogleServiceAuthError(GoogleServiceAuthError::NONE)); | 235 std::string(), GoogleServiceAuthError(GoogleServiceAuthError::NONE)); |
| 280 return; | 236 return; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 void UserCloudPolicyManagerChromeOS::StartRefreshSchedulerIfReady() { | 299 void UserCloudPolicyManagerChromeOS::StartRefreshSchedulerIfReady() { |
| 344 if (core()->refresh_scheduler()) | 300 if (core()->refresh_scheduler()) |
| 345 return; // Already started. | 301 return; // Already started. |
| 346 | 302 |
| 347 if (wait_for_policy_fetch_) | 303 if (wait_for_policy_fetch_) |
| 348 return; // Still waiting for the initial, blocking fetch. | 304 return; // Still waiting for the initial, blocking fetch. |
| 349 | 305 |
| 350 if (!service() || !local_state_) | 306 if (!service() || !local_state_) |
| 351 return; // Not connected. | 307 return; // Not connected. |
| 352 | 308 |
| 353 if (component_policy_service_ && | 309 if (component_policy_service() && |
| 354 !component_policy_service_->is_initialized()) { | 310 !component_policy_service()->is_initialized()) { |
| 355 // If the client doesn't have the list of components to fetch yet then don't | 311 // If the client doesn't have the list of components to fetch yet then don't |
| 356 // start the scheduler. The |component_policy_service_| will call back into | 312 // start the scheduler. The |component_policy_service_| will call back into |
| 357 // OnComponentCloudPolicyUpdated() once it's ready. | 313 // OnComponentCloudPolicyUpdated() once it's ready. |
| 358 return; | 314 return; |
| 359 } | 315 } |
| 360 | 316 |
| 361 core()->StartRefreshScheduler(); | 317 core()->StartRefreshScheduler(); |
| 362 core()->TrackRefreshDelayPref(local_state_, | 318 core()->TrackRefreshDelayPref(local_state_, |
| 363 policy_prefs::kUserPolicyRefreshRate); | 319 policy_prefs::kUserPolicyRefreshRate); |
| 364 } | 320 } |
| 365 | 321 |
| 366 } // namespace policy | 322 } // namespace policy |
| OLD | NEW |