OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/policy/cloud/cloud_policy_invalidator.h" | 5 #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/hash.h" | 8 #include "base/hash.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 const int CloudPolicyInvalidator::kMaxFetchDelayMax = 300000; | 28 const int CloudPolicyInvalidator::kMaxFetchDelayMax = 300000; |
29 const int CloudPolicyInvalidator::kInvalidationGracePeriod = 10; | 29 const int CloudPolicyInvalidator::kInvalidationGracePeriod = 10; |
30 const int CloudPolicyInvalidator::kUnknownVersionIgnorePeriod = 30; | 30 const int CloudPolicyInvalidator::kUnknownVersionIgnorePeriod = 30; |
31 const int CloudPolicyInvalidator::kMaxInvalidationTimeDelta = 300; | 31 const int CloudPolicyInvalidator::kMaxInvalidationTimeDelta = 300; |
32 | 32 |
33 CloudPolicyInvalidator::CloudPolicyInvalidator( | 33 CloudPolicyInvalidator::CloudPolicyInvalidator( |
34 enterprise_management::DeviceRegisterRequest::Type type, | 34 enterprise_management::DeviceRegisterRequest::Type type, |
35 CloudPolicyCore* core, | 35 CloudPolicyCore* core, |
36 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | 36 const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
37 scoped_ptr<base::Clock> clock, | 37 scoped_ptr<base::Clock> clock, |
38 int64 highest_handled_invalidation_version) | 38 int64_t highest_handled_invalidation_version) |
39 : state_(UNINITIALIZED), | 39 : state_(UNINITIALIZED), |
40 type_(type), | 40 type_(type), |
41 core_(core), | 41 core_(core), |
42 task_runner_(task_runner), | 42 task_runner_(task_runner), |
43 clock_(clock.Pass()), | 43 clock_(clock.Pass()), |
44 invalidation_service_(NULL), | 44 invalidation_service_(NULL), |
45 invalidations_enabled_(false), | 45 invalidations_enabled_(false), |
46 invalidation_service_enabled_(false), | 46 invalidation_service_enabled_(false), |
47 is_registered_(false), | 47 is_registered_(false), |
48 invalid_(false), | 48 invalid_(false), |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 if (type_ == enterprise_management::DeviceRegisterRequest::DEVICE) { | 160 if (type_ == enterprise_management::DeviceRegisterRequest::DEVICE) { |
161 UMA_HISTOGRAM_ENUMERATION(kMetricDevicePolicyRefresh, | 161 UMA_HISTOGRAM_ENUMERATION(kMetricDevicePolicyRefresh, |
162 GetPolicyRefreshMetric(policy_changed), | 162 GetPolicyRefreshMetric(policy_changed), |
163 METRIC_POLICY_REFRESH_SIZE); | 163 METRIC_POLICY_REFRESH_SIZE); |
164 } else { | 164 } else { |
165 UMA_HISTOGRAM_ENUMERATION(kMetricUserPolicyRefresh, | 165 UMA_HISTOGRAM_ENUMERATION(kMetricUserPolicyRefresh, |
166 GetPolicyRefreshMetric(policy_changed), | 166 GetPolicyRefreshMetric(policy_changed), |
167 METRIC_POLICY_REFRESH_SIZE); | 167 METRIC_POLICY_REFRESH_SIZE); |
168 } | 168 } |
169 | 169 |
170 const int64 store_invalidation_version = store->invalidation_version(); | 170 const int64_t store_invalidation_version = store->invalidation_version(); |
171 | 171 |
172 // If the policy was invalid and the version stored matches the latest | 172 // If the policy was invalid and the version stored matches the latest |
173 // invalidation version, acknowledge the latest invalidation. | 173 // invalidation version, acknowledge the latest invalidation. |
174 if (invalid_ && store_invalidation_version == invalidation_version_) | 174 if (invalid_ && store_invalidation_version == invalidation_version_) |
175 AcknowledgeInvalidation(); | 175 AcknowledgeInvalidation(); |
176 | 176 |
177 // Update the highest invalidation version that was handled already. | 177 // Update the highest invalidation version that was handled already. |
178 if (store_invalidation_version > highest_handled_invalidation_version_) | 178 if (store_invalidation_version > highest_handled_invalidation_version_) |
179 highest_handled_invalidation_version_ = store_invalidation_version; | 179 highest_handled_invalidation_version_ = store_invalidation_version; |
180 } | 180 } |
(...skipping 24 matching lines...) Expand all Loading... |
205 // If there is still a pending invalidation, acknowledge it, since we only | 205 // If there is still a pending invalidation, acknowledge it, since we only |
206 // care about the latest invalidation. | 206 // care about the latest invalidation. |
207 if (invalid_) | 207 if (invalid_) |
208 AcknowledgeInvalidation(); | 208 AcknowledgeInvalidation(); |
209 | 209 |
210 // Get the version and payload from the invalidation. | 210 // Get the version and payload from the invalidation. |
211 // When an invalidation with unknown version is received, use negative | 211 // When an invalidation with unknown version is received, use negative |
212 // numbers based on the number of such invalidations received. This | 212 // numbers based on the number of such invalidations received. This |
213 // ensures that the version numbers do not collide with "real" versions | 213 // ensures that the version numbers do not collide with "real" versions |
214 // (which are positive) or previous invalidations with unknown version. | 214 // (which are positive) or previous invalidations with unknown version. |
215 int64 version; | 215 int64_t version; |
216 std::string payload; | 216 std::string payload; |
217 if (invalidation.is_unknown_version()) { | 217 if (invalidation.is_unknown_version()) { |
218 version = -(++unknown_version_invalidation_count_); | 218 version = -(++unknown_version_invalidation_count_); |
219 } else { | 219 } else { |
220 version = invalidation.version(); | 220 version = invalidation.version(); |
221 payload = invalidation.payload(); | 221 payload = invalidation.payload(); |
222 } | 222 } |
223 | 223 |
224 // Ignore the invalidation if it is expired. | 224 // Ignore the invalidation if it is expired. |
225 bool is_expired = IsInvalidationExpired(version); | 225 bool is_expired = IsInvalidationExpired(version); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 invalidation_->Acknowledge(); | 373 invalidation_->Acknowledge(); |
374 invalidation_.reset(); | 374 invalidation_.reset(); |
375 // Cancel any scheduled policy refreshes. | 375 // Cancel any scheduled policy refreshes. |
376 weak_factory_.InvalidateWeakPtrs(); | 376 weak_factory_.InvalidateWeakPtrs(); |
377 } | 377 } |
378 | 378 |
379 bool CloudPolicyInvalidator::IsPolicyChanged( | 379 bool CloudPolicyInvalidator::IsPolicyChanged( |
380 const enterprise_management::PolicyData* policy) { | 380 const enterprise_management::PolicyData* policy) { |
381 // Determine if the policy changed by comparing its hash value to the | 381 // Determine if the policy changed by comparing its hash value to the |
382 // previous policy's hash value. | 382 // previous policy's hash value. |
383 uint32 new_hash_value = 0; | 383 uint32_t new_hash_value = 0; |
384 if (policy && policy->has_policy_value()) | 384 if (policy && policy->has_policy_value()) |
385 new_hash_value = base::Hash(policy->policy_value()); | 385 new_hash_value = base::Hash(policy->policy_value()); |
386 bool changed = new_hash_value != policy_hash_value_; | 386 bool changed = new_hash_value != policy_hash_value_; |
387 policy_hash_value_ = new_hash_value; | 387 policy_hash_value_ = new_hash_value; |
388 return changed; | 388 return changed; |
389 } | 389 } |
390 | 390 |
391 bool CloudPolicyInvalidator::IsInvalidationExpired(int64 version) { | 391 bool CloudPolicyInvalidator::IsInvalidationExpired(int64_t version) { |
392 base::Time last_fetch_time = base::Time::UnixEpoch() + | 392 base::Time last_fetch_time = base::Time::UnixEpoch() + |
393 base::TimeDelta::FromMilliseconds(core_->store()->policy()->timestamp()); | 393 base::TimeDelta::FromMilliseconds(core_->store()->policy()->timestamp()); |
394 | 394 |
395 // If the version is unknown, consider the invalidation invalid if the | 395 // If the version is unknown, consider the invalidation invalid if the |
396 // policy was fetched very recently. | 396 // policy was fetched very recently. |
397 if (version < 0) { | 397 if (version < 0) { |
398 base::TimeDelta elapsed = clock_->Now() - last_fetch_time; | 398 base::TimeDelta elapsed = clock_->Now() - last_fetch_time; |
399 return elapsed.InSeconds() < kUnknownVersionIgnorePeriod; | 399 return elapsed.InSeconds() < kUnknownVersionIgnorePeriod; |
400 } | 400 } |
401 | 401 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 bool CloudPolicyInvalidator::GetInvalidationsEnabled() { | 437 bool CloudPolicyInvalidator::GetInvalidationsEnabled() { |
438 if (!invalidations_enabled_) | 438 if (!invalidations_enabled_) |
439 return false; | 439 return false; |
440 // If invalidations have been enabled for less than the grace period, then | 440 // If invalidations have been enabled for less than the grace period, then |
441 // consider invalidations to be disabled for metrics reporting. | 441 // consider invalidations to be disabled for metrics reporting. |
442 base::TimeDelta elapsed = clock_->Now() - invalidations_enabled_time_; | 442 base::TimeDelta elapsed = clock_->Now() - invalidations_enabled_time_; |
443 return elapsed.InSeconds() >= kInvalidationGracePeriod; | 443 return elapsed.InSeconds() >= kInvalidationGracePeriod; |
444 } | 444 } |
445 | 445 |
446 } // namespace policy | 446 } // namespace policy |
OLD | NEW |