blob: 26482a29c3a7a6c41fe40ef8e60025aed2b1ceae [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/policy/core/browser/policy_conversions.h"
#include <string>
#include <utility>
#include "base/check.h"
#include "base/values.h"
#include "build/build_config.h"
#include "components/policy/core/browser/policy_conversions_client.h"
#include "components/strings/grit/components_strings.h"
#include "extensions/buildflags/buildflags.h"
#include "ui/base/l10n/l10n_util.h"
using base::Value;
namespace policy {
const webui::LocalizedString kPolicySources[POLICY_SOURCE_COUNT] = {
{"sourceEnterpriseDefault", IDS_POLICY_SOURCE_ENTERPRISE_DEFAULT},
{"commandLine", IDS_POLICY_SOURCE_COMMAND_LINE},
{"cloud", IDS_POLICY_SOURCE_CLOUD},
{"sourceActiveDirectory", IDS_POLICY_SOURCE_ACTIVE_DIRECTORY},
{"sourceDeviceLocalAccountOverrideDeprecated",
IDS_POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE},
{"platform", IDS_POLICY_SOURCE_PLATFORM},
{"priorityCloud", IDS_POLICY_SOURCE_CLOUD},
{"merged", IDS_POLICY_SOURCE_MERGED},
{"cloud_from_ash", IDS_POLICY_SOURCE_CLOUD_FROM_ASH},
{"restrictedManagedGuestSessionOverride",
IDS_POLICY_SOURCE_RESTRICTED_MANAGED_GUEST_SESSION_OVERRIDE},
};
const char kIdKey[] = "id";
const char kNameKey[] = "name";
const char kPoliciesKey[] = "policies";
const char kPolicyNamesKey[] = "policyNames";
const char kChromePoliciesId[] = "chrome";
const char kChromePoliciesName[] = "Chrome Policies";
#if !BUILDFLAG(IS_CHROMEOS)
const char kPrecedenceOrderKey[] = "precedenceOrder";
const char kPrecedencePoliciesId[] = "precedence";
const char kPrecedencePoliciesName[] = "Policy Precedence";
#endif // !BUILDFLAG(IS_CHROMEOS)
#if BUILDFLAG(IS_CHROMEOS)
const char kDeviceLocalAccountPoliciesId[] = "deviceLocalAccountPolicies";
#endif // BUILDFLAG(IS_CHROMEOS)
PolicyConversions::Delegate::Delegate(PolicyConversionsClient* client)
: client_(client) {}
PolicyConversions::Delegate::~Delegate() = default;
PolicyConversions::PolicyConversions(
std::unique_ptr<PolicyConversionsClient> client)
: client_(std::move(client)),
delegate_(std::make_unique<DefaultPolicyConversions>(client_.get())) {
DCHECK(client_.get());
}
PolicyConversions::~PolicyConversions() = default;
PolicyConversions& PolicyConversions::EnableConvertTypes(bool enabled) {
client_->EnableConvertTypes(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnableConvertValues(bool enabled) {
client_->EnableConvertValues(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnableDeviceLocalAccountPolicies(
bool enabled) {
client_->EnableDeviceLocalAccountPolicies(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnableDeviceInfo(bool enabled) {
client_->EnableDeviceInfo(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnablePrettyPrint(bool enabled) {
client_->EnablePrettyPrint(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnableUserPolicies(bool enabled) {
client_->EnableUserPolicies(enabled);
return *this;
}
PolicyConversions& PolicyConversions::SetDropDefaultValues(bool enabled) {
client_->SetDropDefaultValues(enabled);
return *this;
}
PolicyConversions& PolicyConversions::EnableShowMachineValues(bool enabled) {
client_->EnableShowMachineValues(enabled);
return *this;
}
PolicyConversions& PolicyConversions::UseChromePolicyConversions() {
delegate_ = std::make_unique<ChromePolicyConversions>(client_.get());
return *this;
}
std::string PolicyConversions::ToJSON() {
return client_->ConvertValueToJSON(base::Value(ToValueDict()));
}
base::Value::Dict PolicyConversions::ToValueDict() {
return delegate_->ToValueDict();
}
/**
* DefaultPolicyConversions
*/
DefaultPolicyConversions::DefaultPolicyConversions(
PolicyConversionsClient* client)
: PolicyConversions::Delegate(client) {}
DefaultPolicyConversions::~DefaultPolicyConversions() = default;
Value::Dict DefaultPolicyConversions::ToValueDict() {
Value::Dict all_policies;
if (client()->HasUserPolicies()) {
all_policies.Set("chromePolicies", client()->GetChromePolicies());
}
#if BUILDFLAG(ENABLE_EXTENSIONS)
all_policies.Merge(GetExtensionPolicies());
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
#if BUILDFLAG(IS_CHROMEOS)
all_policies.Set(kDeviceLocalAccountPoliciesId,
GetDeviceLocalAccountPolicies());
Value::Dict identity_fields = client()->GetIdentityFields();
if (!identity_fields.empty())
all_policies.Merge(std::move(identity_fields));
#endif // BUILDFLAG(IS_CHROMEOS)
return all_policies;
}
#if BUILDFLAG(IS_CHROMEOS)
Value::Dict DefaultPolicyConversions::GetDeviceLocalAccountPolicies() {
Value::List policies = client()->GetDeviceLocalAccountPolicies();
Value::Dict device_values;
for (auto&& policy : policies) {
const std::string* id = policy.GetDict().FindString(kIdKey);
Value* policies_value = policy.GetDict().Find(kPoliciesKey);
DCHECK(id);
DCHECK(policies_value);
device_values.Set(*id, std::move(*policies_value));
}
return device_values;
}
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS)
base::Value::Dict DefaultPolicyConversions::GetExtensionPolicies() {
base::Value::Dict extension_policies;
if (client()->HasUserPolicies()) {
extension_policies.Set("extensionPolicies",
GetExtensionPolicies(POLICY_DOMAIN_EXTENSIONS));
}
#if BUILDFLAG(IS_CHROMEOS)
extension_policies.Set("loginScreenExtensionPolicies",
GetExtensionPolicies(POLICY_DOMAIN_SIGNIN_EXTENSIONS));
#endif // BUILDFLAG(IS_CHROMEOS)
return extension_policies;
}
Value::Dict DefaultPolicyConversions::GetExtensionPolicies(
PolicyDomain policy_domain) {
Value::List policies = client()->GetExtensionPolicies(policy_domain);
Value::Dict extension_values;
for (auto&& policy : policies) {
const std::string* id = policy.GetDict().FindString(kIdKey);
Value* policies_value = policy.GetDict().Find(kPoliciesKey);
DCHECK(id);
DCHECK(policies_value);
extension_values.Set(*id, std::move(*policies_value));
}
return extension_values;
}
#endif // BUILDFLAG(ENABLE_EXTENSIONS)
/**
* ChromePolicyConversions
*/
ChromePolicyConversions::ChromePolicyConversions(
PolicyConversionsClient* client)
: PolicyConversions::Delegate(client) {}
ChromePolicyConversions::~ChromePolicyConversions() = default;
Value::Dict ChromePolicyConversions::ToValueDict() {
CHECK(!client()->GetDeviceLocalAccountPoliciesEnabled())
<< "Chrome policies doesn't include device local account policies.";
CHECK(!client()->GetDeviceInfoEnabled())
<< "Chrome policies doesn't include device info.";
Value::Dict all_policies;
if (client()->HasUserPolicies()) {
all_policies.Set(kChromePoliciesId, GetChromePolicies());
#if !BUILDFLAG(IS_CHROMEOS)
// Precedence policies do not apply to Chrome OS, so the Policy Precedence
// table is not shown in chrome://policy.
all_policies.Set(kPrecedencePoliciesId, GetPrecedencePolicies());
#endif // !BUILDFLAG(IS_CHROMEOS)
}
return all_policies;
}
Value::Dict ChromePolicyConversions::GetChromePolicies() {
Value::Dict chrome_policies_data;
chrome_policies_data.Set(kNameKey, kChromePoliciesName);
Value::Dict chrome_policies = client()->GetChromePolicies();
chrome_policies_data.Set(kPoliciesKey, std::move(chrome_policies));
return chrome_policies_data;
}
#if !BUILDFLAG(IS_CHROMEOS)
Value::Dict ChromePolicyConversions::GetPrecedencePolicies() {
Value::Dict precedence_policies_data;
precedence_policies_data.Set(kNameKey, kPrecedencePoliciesName);
precedence_policies_data.Set(kPoliciesKey, client()->GetPrecedencePolicies());
precedence_policies_data.Set(kPrecedenceOrderKey,
client()->GetPrecedenceOrder());
return precedence_policies_data;
}
#endif // !BUILDFLAG(IS_CHROMEOS)
} // namespace policy