Chromium Code Reviews| Index: chrome/browser/chromeos/arc/arc_policy_bridge.cc |
| diff --git a/chrome/browser/chromeos/arc/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/arc_policy_bridge.cc |
| index e472d9ad5d5cfe7b2903ad00a0e400ded09f0c7f..15f7bf78cb47343bf12fd9fc865f9a94de5293b3 100644 |
| --- a/chrome/browser/chromeos/arc/arc_policy_bridge.cc |
| +++ b/chrome/browser/chromeos/arc/arc_policy_bridge.cc |
| @@ -4,6 +4,9 @@ |
| #include "chrome/browser/chromeos/arc/arc_policy_bridge.h" |
| +#include <string> |
| + |
| +#include "base/json/json_reader.h" |
| #include "base/json/json_string_value_serializer.h" |
| #include "base/logging.h" |
| #include "base/values.h" |
| @@ -18,6 +21,60 @@ |
| namespace arc { |
| +namespace { |
| + |
| +// invert_bool_value: If the Chrome policy and the ARC policy with boolean value |
| +// have opposite semantics, set this to true so the bool is inverted before |
| +// being added. Otherwise, set it to false. |
| +void AddPolicy(const std::string arc_policy_name, |
| + const std::string policy_name, |
| + const policy::PolicyMap& policy_map, |
| + bool invert_bool_value, |
| + base::DictionaryValue& filtered_policies) { |
| + const base::Value* const policy_value = policy_map.GetValue(policy_name); |
| + if (policy_value) { |
| + if (invert_bool_value && policy_value->IsType(base::Value::TYPE_BOOLEAN)) { |
| + bool bool_value; |
| + policy_value->GetAsBoolean(&bool_value); |
| + filtered_policies.SetBoolean(arc_policy_name, !bool_value); |
| + } else { |
| + filtered_policies.Set(arc_policy_name, |
| + policy_value->CreateDeepCopy().release()); |
| + } |
| + } |
| +} |
| + |
| +std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map) { |
| + base::DictionaryValue filtered_policies; |
| + // Parse ArcApplicationPolicy as JSON string before adding other policies to |
| + // the dictionary. |
| + const base::Value* const app_policy_value = |
| + policy_map.GetValue(policy::key::kArcApplicationPolicy); |
| + if (app_policy_value) { |
| + std::string app_policy_string; |
| + app_policy_value->GetAsString(&app_policy_string); |
| + std::unique_ptr<base::DictionaryValue> app_policy_dict = |
|
bartfab (slow)
2016/04/07 12:46:29
Nit: #include <memory>
|
| + base::DictionaryValue::From(base::JSONReader::Read(app_policy_string)); |
| + if (app_policy_dict) { |
| + filtered_policies.Swap(app_policy_dict.get()); |
|
bartfab (slow)
2016/04/07 12:46:29
This is correct but dangerous: The Swap() throws a
|
| + } else { |
| + LOG(ERROR) << "Value of ArcApplicationPolicy has invalid format: " |
|
bartfab (slow)
2016/04/07 12:46:29
We would ideally surface this on the chrome://poli
|
| + << app_policy_string; |
| + } |
| + } |
| + |
| + // Keep them sorted by the ARC policy names. |
| + AddPolicy("cameraDisabled", policy::key::kVideoCaptureAllowed, policy_map, |
| + true, filtered_policies); |
| + |
| + std::string policy_json; |
| + JSONStringValueSerializer serializer(&policy_json); |
| + serializer.Serialize(filtered_policies); |
| + return policy_json; |
| +} |
| + |
| +} // namespace |
| + |
| ArcPolicyBridge::ArcPolicyBridge(ArcBridgeService* bridge_service) |
| : ArcService(bridge_service), binding_(this) { |
| VLOG(1) << "ArcPolicyBridge::ArcPolicyBridge"; |
| @@ -89,23 +146,4 @@ void ArcPolicyBridge::InitializePolicyService() { |
| ->policy_service(); |
| } |
| -std::string ArcPolicyBridge::GetFilteredJSONPolicies( |
| - const policy::PolicyMap& policy_map) { |
| - // TODO(phweiss): Implement general filtering mechanism when more policies |
| - // need to be passed on. |
| - // Create dictionary with the desired policies. |
| - base::DictionaryValue filtered_policies; |
| - const std::string policy_name = policy::key::kArcApplicationPolicy; |
| - const base::Value* const policy_value = policy_map.GetValue(policy_name); |
| - if (policy_value) { |
| - filtered_policies.Set(policy_name, |
| - policy_value->CreateDeepCopy().release()); |
| - } |
| - // Convert dictionary to JSON. |
| - std::string policy_json; |
| - JSONStringValueSerializer serializer(&policy_json); |
| - serializer.Serialize(filtered_policies); |
| - return policy_json; |
| -} |
| - |
| } // namespace arc |