Chromium Code Reviews| Index: chrome/browser/policy/user_policy_cache.cc |
| diff --git a/chrome/browser/policy/user_policy_cache.cc b/chrome/browser/policy/user_policy_cache.cc |
| index 12845f06aedf583b0152c199c3c994bd74d0be6d..c8621b995800ebdfc0f2420adbdb5eb4b8dd6179 100644 |
| --- a/chrome/browser/policy/user_policy_cache.cc |
| +++ b/chrome/browser/policy/user_policy_cache.cc |
| @@ -4,11 +4,14 @@ |
| #include "chrome/browser/policy/user_policy_cache.h" |
| +#include <limits> |
| #include <string> |
| #include "base/file_util.h" |
| #include "base/logging.h" |
| #include "base/task.h" |
| +#include "base/values.h" |
| +#include "chrome/browser/policy/configuration_policy_pref_store.h" |
| #include "chrome/browser/policy/policy_map.h" |
| #include "chrome/browser/policy/proto/cloud_policy.pb.h" |
| #include "chrome/browser/policy/proto/device_management_local.pb.h" |
| @@ -147,7 +150,138 @@ bool UserPolicyCache::DecodePolicyData(const em::PolicyData& policy_data, |
| return false; |
| } |
| DecodePolicy(policy, mandatory, recommended); |
| + MaybeDecodeOldstylePolicy(policy, mandatory, recommended); |
|
Mattias Nissler (ping if slow)
2011/04/13 17:53:02
Instead of hacking the field at position 2 into Cl
Jakob Kummerow
2011/04/14 17:17:00
Good idea. Done.
|
| return true; |
| } |
| +// Everything below is only needed for supporting old-style GenericNamedValue |
| +// based policy data and can be removed once this support is no longer needed. |
| + |
| +using google::protobuf::RepeatedField; |
| +using google::protobuf::RepeatedPtrField; |
| + |
| +class PolicyMapProxy : public ConfigurationPolicyStoreInterface { |
| + public: |
| + // Does not take ownership of |policy_map|, and callers need to make sure |
| + // that |policy_map| outlives this PolicyMapProxy. |
| + explicit PolicyMapProxy(PolicyMap* policy_map) |
| + : policy_map_(policy_map) {} |
| + virtual ~PolicyMapProxy() {} |
| + virtual void Apply(ConfigurationPolicyType policy, Value* value) { |
| + policy_map_->Set(policy, value); |
| + } |
| + |
| + private: |
| + PolicyMap* policy_map_; |
|
Mattias Nissler (ping if slow)
2011/04/13 17:53:02
DISALLOW_COPY_AND_ASSIGN
Jakob Kummerow
2011/04/14 17:17:00
Done.
|
| +}; |
| + |
| +void UserPolicyCache::MaybeDecodeOldstylePolicy( |
| + const em::CloudPolicySettings& policy, |
| + PolicyMap* mandatory, |
| + PolicyMap* recommended) { |
| + // Return immediately if we already have policy information in the maps. |
| + if (!mandatory->empty() || !recommended->empty()) |
| + return; |
| + // Return if there's no old-style policy to decode. |
| + if (policy.named_value_size() == 0) |
| + return; |
| + |
| + // Inspect GenericNamedValues and decode them. |
| + DictionaryValue result; |
| + RepeatedPtrField<em::GenericNamedValue>::const_iterator named_value; |
| + for (named_value = policy.named_value().begin(); |
| + named_value != policy.named_value().end(); |
| + ++named_value) { |
| + if (named_value->has_value()) { |
| + Value* decoded_value = DecodeValue(named_value->value()); |
| + if (decoded_value) |
| + result.Set(named_value->name(), decoded_value); |
| + } |
| + } |
| + // Hack: Let one of the providers do the transformation from DictionaryValue |
| + // to PolicyMap, since they have the required code anyway. |
| + PolicyMapProxy map_proxy(mandatory); |
| + GetManagedPolicyProvider()->ApplyPolicyValueTree(&result, &map_proxy); |
| +} |
| + |
| +Value* UserPolicyCache::DecodeIntegerValue( |
| + google::protobuf::int64 value) const { |
| + if (value < std::numeric_limits<int>::min() || |
| + value > std::numeric_limits<int>::max()) { |
| + LOG(WARNING) << "Integer value " << value |
| + << " out of numeric limits, ignoring."; |
| + return NULL; |
| + } |
| + |
| + return Value::CreateIntegerValue(static_cast<int>(value)); |
| +} |
| + |
| +Value* UserPolicyCache::DecodeValue(const em::GenericValue& value) const { |
| + if (!value.has_value_type()) |
| + return NULL; |
| + |
| + switch (value.value_type()) { |
| + case em::GenericValue::VALUE_TYPE_BOOL: |
| + if (value.has_bool_value()) |
| + return Value::CreateBooleanValue(value.bool_value()); |
| + return NULL; |
| + case em::GenericValue::VALUE_TYPE_INT64: |
| + if (value.has_int64_value()) |
| + return DecodeIntegerValue(value.int64_value()); |
| + return NULL; |
| + case em::GenericValue::VALUE_TYPE_STRING: |
| + if (value.has_string_value()) |
| + return Value::CreateStringValue(value.string_value()); |
| + return NULL; |
| + case em::GenericValue::VALUE_TYPE_DOUBLE: |
| + if (value.has_double_value()) |
| + return Value::CreateDoubleValue(value.double_value()); |
| + return NULL; |
| + case em::GenericValue::VALUE_TYPE_BYTES: |
| + if (value.has_bytes_value()) { |
| + std::string bytes = value.bytes_value(); |
| + return BinaryValue::CreateWithCopiedBuffer(bytes.c_str(), bytes.size()); |
| + } |
| + return NULL; |
| + case em::GenericValue::VALUE_TYPE_BOOL_ARRAY: { |
| + ListValue* list = new ListValue; |
| + RepeatedField<bool>::const_iterator i; |
| + for (i = value.bool_array().begin(); i != value.bool_array().end(); ++i) |
| + list->Append(Value::CreateBooleanValue(*i)); |
| + return list; |
| + } |
| + case em::GenericValue::VALUE_TYPE_INT64_ARRAY: { |
| + ListValue* list = new ListValue; |
| + RepeatedField<google::protobuf::int64>::const_iterator i; |
| + for (i = value.int64_array().begin(); |
| + i != value.int64_array().end(); ++i) { |
| + Value* int_value = DecodeIntegerValue(*i); |
| + if (int_value) |
| + list->Append(int_value); |
| + } |
| + return list; |
| + } |
| + case em::GenericValue::VALUE_TYPE_STRING_ARRAY: { |
| + ListValue* list = new ListValue; |
| + RepeatedPtrField<std::string>::const_iterator i; |
| + for (i = value.string_array().begin(); |
| + i != value.string_array().end(); ++i) |
| + list->Append(Value::CreateStringValue(*i)); |
| + return list; |
| + } |
| + case em::GenericValue::VALUE_TYPE_DOUBLE_ARRAY: { |
| + ListValue* list = new ListValue; |
| + RepeatedField<double>::const_iterator i; |
| + for (i = value.double_array().begin(); |
| + i != value.double_array().end(); ++i) |
| + list->Append(Value::CreateDoubleValue(*i)); |
| + return list; |
| + } |
| + default: |
| + NOTREACHED() << "Unhandled value type"; |
| + } |
| + |
| + return NULL; |
| +} |
| + |
| } // namespace policy |