Index: chrome/browser/policy/cloud_policy_cache.cc |
diff --git a/chrome/browser/policy/cloud_policy_cache.cc b/chrome/browser/policy/cloud_policy_cache.cc |
index c7b96b8874af89b647996f72a42bb288a46a6d03..c127c1e43d56bb2a2d46a9bb088a38ddb6004063 100644 |
--- a/chrome/browser/policy/cloud_policy_cache.cc |
+++ b/chrome/browser/policy/cloud_policy_cache.cc |
@@ -82,7 +82,7 @@ class CloudPolicyCache::CloudPolicyProvider |
class PersistPolicyTask : public Task { |
public: |
PersistPolicyTask(const FilePath& path, |
- const em::CloudPolicyResponse* cloud_policy_response, |
+ const em::PolicyFetchResponse* cloud_policy_response, |
const em::DevicePolicyResponse* device_policy_response, |
const bool is_unmanaged) |
: path_(path), |
@@ -95,7 +95,7 @@ class PersistPolicyTask : public Task { |
virtual void Run(); |
const FilePath path_; |
- scoped_ptr<const em::CloudPolicyResponse> cloud_policy_response_; |
+ scoped_ptr<const em::PolicyFetchResponse> cloud_policy_response_; |
scoped_ptr<const em::DevicePolicyResponse> device_policy_response_; |
const bool is_unmanaged_; |
}; |
@@ -132,7 +132,8 @@ CloudPolicyCache::CloudPolicyCache( |
device_policy_(new DictionaryValue), |
initialization_complete_(false), |
is_unmanaged_(false), |
- has_device_policy_(false) { |
+ has_device_policy_(false), |
+ last_policy_server_timestamp_(0) { |
managed_policy_provider_.reset( |
new CloudPolicyProvider( |
ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), |
@@ -172,6 +173,7 @@ void CloudPolicyCache::LoadFromFile() { |
return; |
} |
base::Time timestamp; |
+ int64 raw_timestamp; |
PolicyMap mandatory_policy; |
PolicyMap recommended_policy; |
is_unmanaged_ = cached_response.unmanaged(); |
@@ -182,7 +184,8 @@ void CloudPolicyCache::LoadFromFile() { |
bool ok = DecodePolicyResponse(cached_response.cloud_policy(), |
&mandatory_policy, |
&recommended_policy, |
- ×tamp); |
+ ×tamp, |
+ &raw_timestamp); |
if (!ok) { |
LOG(WARNING) << "Decoding policy data failed."; |
return; |
@@ -197,6 +200,7 @@ void CloudPolicyCache::LoadFromFile() { |
if (cached_response.has_cloud_policy()) { |
mandatory_policy_.Swap(&mandatory_policy); |
recommended_policy_.Swap(&recommended_policy); |
+ last_policy_server_timestamp_ = raw_timestamp; |
has_device_policy_ = false; |
} else if (cached_response.has_device_policy()) { |
scoped_ptr<DictionaryValue> value( |
@@ -211,15 +215,16 @@ void CloudPolicyCache::LoadFromFile() { |
observer_list_, OnUpdatePolicy()); |
} |
-void CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
+void CloudPolicyCache::SetPolicy(const em::PolicyFetchResponse& policy) { |
DCHECK(CalledOnValidThread()); |
bool initialization_was_not_complete = !initialization_complete_; |
is_unmanaged_ = false; |
base::Time timestamp; |
+ int64 raw_timestamp; |
PolicyMap mandatory_policy; |
PolicyMap recommended_policy; |
bool ok = DecodePolicyResponse(policy, &mandatory_policy, &recommended_policy, |
- ×tamp); |
+ ×tamp, &raw_timestamp); |
if (!ok) |
return; |
@@ -230,6 +235,7 @@ void CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
recommended_policy_.Swap(&recommended_policy); |
initialization_complete_ = true; |
last_policy_refresh_time_ = timestamp; |
+ last_policy_server_timestamp_ = raw_timestamp; |
has_device_policy_ = false; |
if (new_policy_differs || initialization_was_not_complete) { |
@@ -242,7 +248,7 @@ void CloudPolicyCache::SetPolicy(const em::CloudPolicyResponse& policy) { |
LOG(WARNING) << "Server returned policy with timestamp from the future, " |
"not persisting to disk."; |
} else { |
- em::CloudPolicyResponse* policy_copy = new em::CloudPolicyResponse; |
+ em::PolicyFetchResponse* policy_copy = new em::PolicyFetchResponse; |
policy_copy->CopyFrom(policy); |
BrowserThread::PostTask( |
BrowserThread::FILE, |
@@ -305,33 +311,42 @@ void CloudPolicyCache::SetUnmanaged() { |
// static |
bool CloudPolicyCache::DecodePolicyResponse( |
- const em::CloudPolicyResponse& policy_response, |
+ const em::PolicyFetchResponse& policy_response, |
PolicyMap* mandatory, |
PolicyMap* recommended, |
- base::Time* timestamp) { |
- std::string data = policy_response.signed_response(); |
+ base::Time* timestamp, |
+ int64* raw_timestamp) { |
+ std::string data = policy_response.policy_data(); |
- if (!VerifySignature(policy_response.signature(), data, |
+ if (!VerifySignature(policy_response.policy_data_signature(), data, |
policy_response.certificate_chain())) { |
LOG(WARNING) << "Failed to verify signature."; |
return false; |
} |
- em::SignedCloudPolicyResponse response; |
- if (!response.ParseFromArray(data.c_str(), data.size())) { |
- LOG(WARNING) << "Failed to parse SignedCloudPolicyResponse protobuf."; |
+ em::PolicyData policy_data; |
+ if (!policy_data.ParseFromString(data)) { |
+ LOG(WARNING) << "Failed to parse PolicyData protobuf."; |
return false; |
} |
- // TODO(jkummerow): Verify response.device_token(). Needs final specification |
- // which token we're actually sending / expecting to get back. |
+ // TODO(jkummerow): Verify policy_data.device_token(). Needs final |
+ // specification which token we're actually sending / expecting to get back. |
- // TODO(jkummerow): Store response.device_name(), if we decide to transfer |
+ // TODO(jkummerow): Store policy_data.device_name(), if we decide to transfer |
// it from the server to the client. |
DCHECK(timestamp); |
- *timestamp = base::Time::FromTimeT(response.timestamp()); |
- DecodePolicy(response.settings(), mandatory, recommended); |
+ DCHECK(raw_timestamp); |
+ *raw_timestamp = policy_data.timestamp(); |
+ *timestamp = base::Time::UnixEpoch() + |
+ base::TimeDelta::FromMilliseconds(*raw_timestamp); |
+ em::CloudPolicySettings policy; |
+ if (!policy.ParseFromString(policy_data.policy_value())) { |
+ LOG(WARNING) << "Failed to parse CloudPolicySettingsj protobuf."; |
Jakob Kummerow
2011/02/28 11:06:31
nit: j?
gfeher
2011/02/28 12:21:32
Done.
|
+ return false; |
+ } |
+ DecodePolicy(policy, mandatory, recommended); |
return true; |
} |