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 |
deleted file mode 100644 |
index 3b0784c0ff9abbf913c56a9598e58e66fba82b74..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/arc/arc_policy_bridge.cc |
+++ /dev/null |
@@ -1,319 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/arc/arc_policy_bridge.h" |
- |
-#include <memory> |
-#include <string> |
-#include <utility> |
- |
-#include "base/json/json_reader.h" |
-#include "base/json/json_string_value_serializer.h" |
-#include "base/logging.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/values.h" |
-#include "chrome/browser/chromeos/profiles/profile_helper.h" |
-#include "chrome/browser/policy/profile_policy_connector.h" |
-#include "chrome/browser/policy/profile_policy_connector_factory.h" |
-#include "chromeos/network/onc/onc_utils.h" |
-#include "components/arc/arc_bridge_service.h" |
-#include "components/onc/onc_constants.h" |
-#include "components/policy/core/common/policy_map.h" |
-#include "components/policy/core/common/policy_namespace.h" |
-#include "components/policy/policy_constants.h" |
-#include "components/user_manager/user.h" |
-#include "mojo/public/cpp/bindings/string.h" |
- |
-namespace arc { |
- |
-namespace { |
- |
-const char kArcGlobalAppRestrictions[] = "globalAppRestrictions"; |
-const char kArcCaCerts[] = "caCerts"; |
- |
-// 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 MapBoolToBool(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) |
- return; |
- if (!policy_value->IsType(base::Value::TYPE_BOOLEAN)) { |
- LOG(ERROR) << "Policy " << policy_name << " is not a boolean."; |
- return; |
- } |
- bool bool_value; |
- policy_value->GetAsBoolean(&bool_value); |
- filtered_policies->SetBoolean(arc_policy_name, |
- bool_value != invert_bool_value); |
-} |
- |
-// int_true: value of Chrome OS policy for which arc policy is set to true. |
-// It is set to false for all other values. |
-void MapIntToBool(const std::string& arc_policy_name, |
- const std::string& policy_name, |
- const policy::PolicyMap& policy_map, |
- int int_true, |
- base::DictionaryValue* filtered_policies) { |
- const base::Value* const policy_value = policy_map.GetValue(policy_name); |
- if (!policy_value) |
- return; |
- if (!policy_value->IsType(base::Value::TYPE_INTEGER)) { |
- LOG(ERROR) << "Policy " << policy_name << " is not an integer."; |
- return; |
- } |
- int int_value; |
- policy_value->GetAsInteger(&int_value); |
- filtered_policies->SetBoolean(arc_policy_name, int_value == int_true); |
-} |
- |
-void AddGlobalAppRestriction(const std::string& arc_app_restriction_name, |
- const std::string& policy_name, |
- const policy::PolicyMap& policy_map, |
- base::DictionaryValue* filtered_policies) { |
- const base::Value* const policy_value = policy_map.GetValue(policy_name); |
- if (policy_value) { |
- base::DictionaryValue* global_app_restrictions = nullptr; |
- if (!filtered_policies->GetDictionary(kArcGlobalAppRestrictions, |
- &global_app_restrictions)) { |
- global_app_restrictions = new base::DictionaryValue(); |
- filtered_policies->Set(kArcGlobalAppRestrictions, |
- global_app_restrictions); |
- } |
- global_app_restrictions->SetWithoutPathExpansion( |
- arc_app_restriction_name, policy_value->CreateDeepCopy()); |
- } |
-} |
- |
-void AddOncCaCertsToPolicies(const policy::PolicyMap& policy_map, |
- base::DictionaryValue* filtered_policies) { |
- const base::Value* const policy_value = |
- policy_map.GetValue(policy::key::kArcCertificatesSyncMode); |
- int32_t mode = ArcCertsSyncMode::SYNC_DISABLED; |
- |
- // Old certs should be uninstalled if the sync is disabled or policy is not |
- // set. |
- if (!policy_value || !policy_value->GetAsInteger(&mode) || |
- mode != ArcCertsSyncMode::COPY_CA_CERTS) { |
- return; |
- } |
- |
- // Importing CA certificates from device policy is not allowed. |
- // Import only from user policy. |
- const base::Value* onc_policy_value = |
- policy_map.GetValue(policy::key::kOpenNetworkConfiguration); |
- if (!onc_policy_value) { |
- VLOG(1) << "onc policy is not set."; |
- return; |
- } |
- std::string onc_blob; |
- if (!onc_policy_value->GetAsString(&onc_blob)) { |
- LOG(ERROR) << "Value of onc policy has invalid format."; |
- return; |
- } |
- |
- base::ListValue certificates; |
- { |
- base::ListValue unused_network_configs; |
- base::DictionaryValue unused_global_network_config; |
- if (!chromeos::onc::ParseAndValidateOncForImport( |
- onc_blob, onc::ONCSource::ONC_SOURCE_USER_POLICY, |
- "" /* no passphrase */, &unused_network_configs, |
- &unused_global_network_config, &certificates)) { |
- LOG(ERROR) << "Value of onc policy has invalid format =" << onc_blob; |
- } |
- } |
- |
- std::unique_ptr<base::ListValue> ca_certs( |
- base::MakeUnique<base::ListValue>()); |
- for (const auto& entry : certificates) { |
- const base::DictionaryValue* certificate = nullptr; |
- if (!entry->GetAsDictionary(&certificate)) { |
- DLOG(FATAL) << "Value of a certificate entry is not a dictionary " |
- << "value."; |
- continue; |
- } |
- |
- std::string cert_type; |
- certificate->GetStringWithoutPathExpansion(::onc::certificate::kType, |
- &cert_type); |
- if (cert_type != ::onc::certificate::kAuthority) |
- continue; |
- |
- const base::ListValue* trust_list = nullptr; |
- if (!certificate->GetListWithoutPathExpansion( |
- ::onc::certificate::kTrustBits, &trust_list)) { |
- continue; |
- } |
- |
- bool web_trust_flag = false; |
- for (const auto& list_val : *trust_list) { |
- std::string trust_type; |
- if (!list_val->GetAsString(&trust_type)) |
- NOTREACHED(); |
- |
- if (trust_type == ::onc::certificate::kWeb) { |
- // "Web" implies that the certificate is to be trusted for SSL |
- // identification. |
- web_trust_flag = true; |
- break; |
- } |
- } |
- if (!web_trust_flag) |
- continue; |
- |
- std::string x509_data; |
- if (!certificate->GetStringWithoutPathExpansion(::onc::certificate::kX509, |
- &x509_data)) { |
- continue; |
- } |
- |
- base::DictionaryValue data; |
- data.SetString("X509", x509_data); |
- ca_certs->Append(data.CreateDeepCopy()); |
- } |
- filtered_policies->Set(kArcCaCerts, std::move(ca_certs)); |
-} |
- |
-std::string GetFilteredJSONPolicies(const policy::PolicyMap& policy_map) { |
- base::DictionaryValue filtered_policies; |
- // Parse ArcPolicy as JSON string before adding other policies to the |
- // dictionary. |
- const base::Value* const app_policy_value = |
- policy_map.GetValue(policy::key::kArcPolicy); |
- if (app_policy_value) { |
- std::string app_policy_string; |
- app_policy_value->GetAsString(&app_policy_string); |
- std::unique_ptr<base::DictionaryValue> app_policy_dict = |
- base::DictionaryValue::From(base::JSONReader::Read(app_policy_string)); |
- if (app_policy_dict) { |
- // Need a deep copy of all values here instead of doing a swap, because |
- // JSONReader::Read constructs a dictionary whose StringValues are |
- // JSONStringValues which are based on StringPiece instead of string. |
- filtered_policies.MergeDictionary(app_policy_dict.get()); |
- } else { |
- LOG(ERROR) << "Value of ArcPolicy has invalid format: " |
- << app_policy_string; |
- } |
- } |
- |
- // Keep them sorted by the ARC policy names. |
- MapBoolToBool("cameraDisabled", policy::key::kVideoCaptureAllowed, policy_map, |
- true, &filtered_policies); |
- MapBoolToBool("debuggingFeaturesDisabled", |
- policy::key::kDeveloperToolsDisabled, policy_map, false, |
- &filtered_policies); |
- MapBoolToBool("screenCaptureDisabled", policy::key::kDisableScreenshots, |
- policy_map, false, &filtered_policies); |
- MapIntToBool("shareLocationDisabled", policy::key::kDefaultGeolocationSetting, |
- policy_map, 2 /*BlockGeolocation*/, &filtered_policies); |
- MapBoolToBool("unmuteMicrophoneDisabled", policy::key::kAudioCaptureAllowed, |
- policy_map, true, &filtered_policies); |
- MapBoolToBool("mountPhysicalMediaDisabled", |
- policy::key::kExternalStorageDisabled, policy_map, false, |
- &filtered_policies); |
- |
- // Add global app restrictions. |
- AddGlobalAppRestriction("com.android.browser:URLBlacklist", |
- policy::key::kURLBlacklist, policy_map, |
- &filtered_policies); |
- AddGlobalAppRestriction("com.android.browser:URLWhitelist", |
- policy::key::kURLWhitelist, policy_map, |
- &filtered_policies); |
- |
- // Add CA certificates. |
- AddOncCaCertsToPolicies(policy_map, &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(2) << "ArcPolicyBridge::ArcPolicyBridge"; |
- arc_bridge_service()->policy()->AddObserver(this); |
-} |
- |
-ArcPolicyBridge::ArcPolicyBridge(ArcBridgeService* bridge_service, |
- policy::PolicyService* policy_service) |
- : ArcService(bridge_service), |
- binding_(this), |
- policy_service_(policy_service) { |
- VLOG(2) << "ArcPolicyBridge::ArcPolicyBridge(bridge_service, policy_service)"; |
- arc_bridge_service()->policy()->AddObserver(this); |
-} |
- |
-ArcPolicyBridge::~ArcPolicyBridge() { |
- VLOG(2) << "ArcPolicyBridge::~ArcPolicyBridge"; |
- arc_bridge_service()->policy()->RemoveObserver(this); |
-} |
- |
-void ArcPolicyBridge::OverrideIsManagedForTesting(bool is_managed) { |
- is_managed_ = is_managed; |
-} |
- |
-void ArcPolicyBridge::OnInstanceReady() { |
- VLOG(1) << "ArcPolicyBridge::OnPolicyInstanceReady"; |
- if (policy_service_ == nullptr) { |
- InitializePolicyService(); |
- } |
- policy_service_->AddObserver(policy::POLICY_DOMAIN_CHROME, this); |
- |
- mojom::PolicyInstance* const policy_instance = |
- arc_bridge_service()->policy()->GetInstanceForMethod("Init"); |
- DCHECK(policy_instance); |
- policy_instance->Init(binding_.CreateInterfacePtrAndBind()); |
-} |
- |
-void ArcPolicyBridge::OnInstanceClosed() { |
- VLOG(1) << "ArcPolicyBridge::OnPolicyInstanceClosed"; |
- policy_service_->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); |
- policy_service_ = nullptr; |
-} |
- |
-void ArcPolicyBridge::GetPolicies(const GetPoliciesCallback& callback) { |
- VLOG(1) << "ArcPolicyBridge::GetPolicies"; |
- if (!is_managed_) { |
- callback.Run(mojo::String("")); |
- return; |
- } |
- const policy::PolicyNamespace policy_namespace(policy::POLICY_DOMAIN_CHROME, |
- std::string()); |
- const policy::PolicyMap& policy_map = |
- policy_service_->GetPolicies(policy_namespace); |
- const std::string json_policies = GetFilteredJSONPolicies(policy_map); |
- callback.Run(mojo::String(json_policies)); |
-} |
- |
-void ArcPolicyBridge::OnPolicyUpdated(const policy::PolicyNamespace& ns, |
- const policy::PolicyMap& previous, |
- const policy::PolicyMap& current) { |
- VLOG(1) << "ArcPolicyBridge::OnPolicyUpdated"; |
- auto* instance = |
- arc_bridge_service()->policy()->GetInstanceForMethod("OnPolicyUpdated"); |
- if (!instance) |
- return; |
- instance->OnPolicyUpdated(); |
-} |
- |
-void ArcPolicyBridge::InitializePolicyService() { |
- const user_manager::User* const primary_user = |
- user_manager::UserManager::Get()->GetPrimaryUser(); |
- Profile* const profile = |
- chromeos::ProfileHelper::Get()->GetProfileByUser(primary_user); |
- auto* profile_policy_connector = |
- policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile); |
- policy_service_ = profile_policy_connector->policy_service(); |
- is_managed_ = profile_policy_connector->IsManaged(); |
-} |
- |
-} // namespace arc |