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/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
| 11 #include "base/metrics/histogram.h" |
| 12 #include "base/metrics/sparse_histogram.h" |
11 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
12 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" | 14 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" |
13 #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" |
14 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 16 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
15 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" | 17 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" |
16 #include "chrome/browser/policy/cloud/resource_cache.h" | 18 #include "chrome/browser/policy/cloud/resource_cache.h" |
17 #include "chrome/browser/policy/policy_bundle.h" | 19 #include "chrome/browser/policy/policy_bundle.h" |
18 #include "chrome/browser/policy/policy_domain_descriptor.h" | 20 #include "chrome/browser/policy/policy_domain_descriptor.h" |
19 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
20 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
21 #include "net/url_request/url_request_context_getter.h" | 23 #include "net/url_request/url_request_context_getter.h" |
22 | 24 |
23 namespace em = enterprise_management; | 25 namespace em = enterprise_management; |
24 | 26 |
25 namespace policy { | 27 namespace policy { |
26 | 28 |
| 29 namespace { |
| 30 |
| 31 // UMA histogram names. |
| 32 const char kUMADelayInitialization[] = |
| 33 "Enterprise.UserPolicyChromeOS.DelayInitialization"; |
| 34 const char kUMAInitialFetchClientError[] = |
| 35 "Enterprise.UserPolicyChromeOS.InitialFetch.ClientError"; |
| 36 const char kUMAInitialFetchDelayClientRegister[] = |
| 37 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayClientRegister"; |
| 38 const char kUMAInitialFetchDelayOAuth2Token[] = |
| 39 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayOAuth2Token"; |
| 40 const char kUMAInitialFetchDelayPolicyFetch[] = |
| 41 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayPolicyFetch"; |
| 42 const char kUMAInitialFetchDelayTotal[] = |
| 43 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayTotal"; |
| 44 const char kUMAInitialFetchOAuth2Error[] = |
| 45 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2Error"; |
| 46 const char kUMAInitialFetchOAuth2NetworkError[] = |
| 47 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2NetworkError"; |
| 48 |
| 49 } // namespace |
| 50 |
27 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS( | 51 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS( |
28 scoped_ptr<CloudPolicyStore> store, | 52 scoped_ptr<CloudPolicyStore> store, |
29 scoped_ptr<ResourceCache> resource_cache, | 53 scoped_ptr<ResourceCache> resource_cache, |
30 bool wait_for_policy_fetch) | 54 bool wait_for_policy_fetch) |
31 : CloudPolicyManager( | 55 : CloudPolicyManager( |
32 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()), | 56 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()), |
33 store.get()), | 57 store.get()), |
34 store_(store.Pass()), | 58 store_(store.Pass()), |
35 wait_for_policy_fetch_(wait_for_policy_fetch) { | 59 wait_for_policy_fetch_(wait_for_policy_fetch) { |
| 60 time_init_started_ = base::Time::Now(); |
36 if (resource_cache) { | 61 if (resource_cache) { |
37 // TODO(joaodasilva): Move the backend from the FILE thread to the blocking | 62 // TODO(joaodasilva): Move the backend from the FILE thread to the blocking |
38 // pool. | 63 // pool. |
39 component_policy_service_.reset(new ComponentCloudPolicyService( | 64 component_policy_service_.reset(new ComponentCloudPolicyService( |
40 this, | 65 this, |
41 store_.get(), | 66 store_.get(), |
42 resource_cache.Pass(), | 67 resource_cache.Pass(), |
43 content::BrowserThread::GetMessageLoopProxyForThread( | 68 content::BrowserThread::GetMessageLoopProxyForThread( |
44 content::BrowserThread::FILE), | 69 content::BrowserThread::FILE), |
45 content::BrowserThread::GetMessageLoopProxyForThread( | 70 content::BrowserThread::GetMessageLoopProxyForThread( |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 scoped_ptr<PolicyBundle> bundle = CloudPolicyManager::CreatePolicyBundle(); | 148 scoped_ptr<PolicyBundle> bundle = CloudPolicyManager::CreatePolicyBundle(); |
124 if (component_policy_service_) | 149 if (component_policy_service_) |
125 bundle->MergeFrom(component_policy_service_->policy()); | 150 bundle->MergeFrom(component_policy_service_->policy()); |
126 return bundle.Pass(); | 151 return bundle.Pass(); |
127 } | 152 } |
128 | 153 |
129 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted( | 154 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted( |
130 CloudPolicyService* cloud_policy_service) { | 155 CloudPolicyService* cloud_policy_service) { |
131 DCHECK_EQ(service(), cloud_policy_service); | 156 DCHECK_EQ(service(), cloud_policy_service); |
132 cloud_policy_service->RemoveObserver(this); | 157 cloud_policy_service->RemoveObserver(this); |
| 158 |
| 159 time_init_completed_ = base::Time::Now(); |
| 160 UMA_HISTOGRAM_TIMES(kUMADelayInitialization, |
| 161 time_init_completed_ - time_init_started_); |
| 162 |
133 // If the CloudPolicyClient isn't registered at this stage then it needs an | 163 // If the CloudPolicyClient isn't registered at this stage then it needs an |
134 // OAuth token for the initial registration. | 164 // OAuth token for the initial registration. |
135 // | 165 // |
136 // If |wait_for_policy_fetch_| is true then Profile initialization is blocking | 166 // If |wait_for_policy_fetch_| is true then Profile initialization is blocking |
137 // on the initial policy fetch, so the token must be fetched immediately. | 167 // on the initial policy fetch, so the token must be fetched immediately. |
138 // In that case, the signin Profile is used to authenticate a Gaia request to | 168 // In that case, the signin Profile is used to authenticate a Gaia request to |
139 // fetch a refresh token, and then the policy token is fetched. | 169 // fetch a refresh token, and then the policy token is fetched. |
140 // | 170 // |
141 // If |wait_for_policy_fetch_| is false then the UserCloudPolicyTokenForwarder | 171 // If |wait_for_policy_fetch_| is false then the UserCloudPolicyTokenForwarder |
142 // service will eventually call OnAccessTokenAvailable() once an access token | 172 // service will eventually call OnAccessTokenAvailable() once an access token |
(...skipping 21 matching lines...) Expand all Loading... |
164 | 194 |
165 void UserCloudPolicyManagerChromeOS::OnPolicyFetched( | 195 void UserCloudPolicyManagerChromeOS::OnPolicyFetched( |
166 CloudPolicyClient* client) { | 196 CloudPolicyClient* client) { |
167 // No action required. If we're blocked on a policy fetch, we'll learn about | 197 // No action required. If we're blocked on a policy fetch, we'll learn about |
168 // completion of it through OnInitialPolicyFetchComplete(). | 198 // completion of it through OnInitialPolicyFetchComplete(). |
169 } | 199 } |
170 | 200 |
171 void UserCloudPolicyManagerChromeOS::OnRegistrationStateChanged( | 201 void UserCloudPolicyManagerChromeOS::OnRegistrationStateChanged( |
172 CloudPolicyClient* cloud_policy_client) { | 202 CloudPolicyClient* cloud_policy_client) { |
173 DCHECK_EQ(client(), cloud_policy_client); | 203 DCHECK_EQ(client(), cloud_policy_client); |
| 204 |
174 if (wait_for_policy_fetch_) { | 205 if (wait_for_policy_fetch_) { |
| 206 time_client_registered_ = base::Time::Now(); |
| 207 if (!time_token_available_.is_null()) { |
| 208 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayClientRegister, |
| 209 time_client_registered_ - time_token_available_); |
| 210 } |
| 211 |
175 // If we're blocked on the policy fetch, now is a good time to issue it. | 212 // If we're blocked on the policy fetch, now is a good time to issue it. |
176 if (client()->is_registered()) { | 213 if (client()->is_registered()) { |
177 service()->RefreshPolicy( | 214 service()->RefreshPolicy( |
178 base::Bind( | 215 base::Bind( |
179 &UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete, | 216 &UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete, |
180 base::Unretained(this))); | 217 base::Unretained(this))); |
181 } else { | 218 } else { |
182 // If the client has switched to not registered, we bail out as this | 219 // If the client has switched to not registered, we bail out as this |
183 // indicates the cloud policy setup flow has been aborted. | 220 // indicates the cloud policy setup flow has been aborted. |
184 CancelWaitForPolicyFetch(); | 221 CancelWaitForPolicyFetch(); |
185 } | 222 } |
186 } | 223 } |
187 } | 224 } |
188 | 225 |
189 void UserCloudPolicyManagerChromeOS::OnClientError( | 226 void UserCloudPolicyManagerChromeOS::OnClientError( |
190 CloudPolicyClient* cloud_policy_client) { | 227 CloudPolicyClient* cloud_policy_client) { |
191 DCHECK_EQ(client(), cloud_policy_client); | 228 DCHECK_EQ(client(), cloud_policy_client); |
192 CancelWaitForPolicyFetch(); | 229 CancelWaitForPolicyFetch(); |
| 230 |
| 231 if (wait_for_policy_fetch_) { |
| 232 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchClientError, |
| 233 cloud_policy_client->status()); |
| 234 } |
193 } | 235 } |
194 | 236 |
195 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyRefreshNeeded() { | 237 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyRefreshNeeded() { |
196 core()->RefreshSoon(); | 238 core()->RefreshSoon(); |
197 } | 239 } |
198 | 240 |
199 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() { | 241 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() { |
200 CheckAndPublishPolicy(); | 242 CheckAndPublishPolicy(); |
201 StartRefreshSchedulerIfReady(); | 243 StartRefreshSchedulerIfReady(); |
202 } | 244 } |
(...skipping 15 matching lines...) Expand all Loading... |
218 g_browser_process->system_request_context(), | 260 g_browser_process->system_request_context(), |
219 base::Bind(&UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched, | 261 base::Bind(&UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched, |
220 base::Unretained(this)))); | 262 base::Unretained(this)))); |
221 token_fetcher_->Start(); | 263 token_fetcher_->Start(); |
222 } | 264 } |
223 | 265 |
224 void UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched( | 266 void UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched( |
225 const std::string& policy_token, | 267 const std::string& policy_token, |
226 const GoogleServiceAuthError& error) { | 268 const GoogleServiceAuthError& error) { |
227 DCHECK(!client()->is_registered()); | 269 DCHECK(!client()->is_registered()); |
| 270 |
| 271 time_token_available_ = base::Time::Now(); |
| 272 if (wait_for_policy_fetch_) { |
| 273 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayOAuth2Token, |
| 274 time_token_available_ - time_init_completed_); |
| 275 } |
| 276 |
228 if (error.state() == GoogleServiceAuthError::NONE) { | 277 if (error.state() == GoogleServiceAuthError::NONE) { |
229 // Start client registration. Either OnRegistrationStateChanged() or | 278 // Start client registration. Either OnRegistrationStateChanged() or |
230 // OnClientError() will be called back. | 279 // OnClientError() will be called back. |
231 client()->Register(em::DeviceRegisterRequest::USER, | 280 client()->Register(em::DeviceRegisterRequest::USER, |
232 policy_token, std::string(), false, std::string()); | 281 policy_token, std::string(), false, std::string()); |
233 } else { | 282 } else { |
234 // Failed to get a token, stop waiting and use an empty policy. | 283 // Failed to get a token, stop waiting and use an empty policy. |
235 CancelWaitForPolicyFetch(); | 284 CancelWaitForPolicyFetch(); |
| 285 |
| 286 UMA_HISTOGRAM_ENUMERATION(kUMAInitialFetchOAuth2Error, |
| 287 error.state(), |
| 288 GoogleServiceAuthError::NUM_STATES); |
| 289 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) { |
| 290 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchOAuth2NetworkError, |
| 291 error.network_error()); |
| 292 } |
236 } | 293 } |
237 | 294 |
238 token_fetcher_.reset(); | 295 token_fetcher_.reset(); |
239 } | 296 } |
240 | 297 |
241 void UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete( | 298 void UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete( |
242 bool success) { | 299 bool success) { |
| 300 |
| 301 const base::Time now = base::Time::Now(); |
| 302 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayPolicyFetch, |
| 303 now - time_client_registered_); |
| 304 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayTotal, now - time_init_started_); |
243 CancelWaitForPolicyFetch(); | 305 CancelWaitForPolicyFetch(); |
244 } | 306 } |
245 | 307 |
246 void UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch() { | 308 void UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch() { |
247 wait_for_policy_fetch_ = false; | 309 wait_for_policy_fetch_ = false; |
248 CheckAndPublishPolicy(); | 310 CheckAndPublishPolicy(); |
249 // Now that |wait_for_policy_fetch_| is guaranteed to be false, the scheduler | 311 // Now that |wait_for_policy_fetch_| is guaranteed to be false, the scheduler |
250 // can be started. | 312 // can be started. |
251 StartRefreshSchedulerIfReady(); | 313 StartRefreshSchedulerIfReady(); |
252 } | 314 } |
(...skipping 14 matching lines...) Expand all Loading... |
267 // start the scheduler. The |component_policy_service_| will call back into | 329 // start the scheduler. The |component_policy_service_| will call back into |
268 // OnComponentCloudPolicyUpdated() once it's ready. | 330 // OnComponentCloudPolicyUpdated() once it's ready. |
269 return; | 331 return; |
270 } | 332 } |
271 | 333 |
272 StartRefreshScheduler(); | 334 StartRefreshScheduler(); |
273 core()->TrackRefreshDelayPref(local_state_, prefs::kUserPolicyRefreshRate); | 335 core()->TrackRefreshDelayPref(local_state_, prefs::kUserPolicyRefreshRate); |
274 } | 336 } |
275 | 337 |
276 } // namespace policy | 338 } // namespace policy |
OLD | NEW |