Commit 30bcf932 authored by Owen Min's avatar Owen Min Committed by Commit Bot

Add support of getting all policies value without pretty print

Add a new |is_pretty_print| flag to GetAllPolicyValuesAsDictionary
and GetAllPolicyValuesAsJSON function. All JSON objects including JSON
policy values will not be pretty printed if the parameter is set to False.

This is mainly used by cloud reporting to reduce report size.

Bug: 935653
Change-Id: Iec94b27582758bcef866d69dbb8df561544ae95b
Reviewed-on: https://chromium-review.googlesource.com/c/1487511Reviewed-by: default avatarJulian Pastarmov <pastarmovj@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Commit-Queue: Owen Min <zmin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635231}
parent 421f75da
...@@ -128,7 +128,7 @@ std::string SystemLogDelegate::GetPolicyAsJSON() { ...@@ -128,7 +128,7 @@ std::string SystemLogDelegate::GetPolicyAsJSON() {
} }
return policy::GetAllPolicyValuesAsJSON( return policy::GetAllPolicyValuesAsJSON(
ProfileManager::GetActiveUserProfile(), include_user_policies, ProfileManager::GetActiveUserProfile(), include_user_policies,
true /* with_device_data */); true /* with_device_data */, true /* is_pretty_print */);
} }
void SystemLogDelegate::LoadSystemLogs(LogUploadCallback upload_callback) { void SystemLogDelegate::LoadSystemLogs(LogUploadCallback upload_callback) {
......
...@@ -114,7 +114,7 @@ void AppendAdditionalBrowserInformation(em::ChromeDesktopReportRequest* request, ...@@ -114,7 +114,7 @@ void AppendAdditionalBrowserInformation(em::ChromeDesktopReportRequest* request,
request->mutable_browser_report() request->mutable_browser_report()
->mutable_chrome_user_profile_reports(0) ->mutable_chrome_user_profile_reports(0)
->set_policy_data( ->set_policy_data(
policy::GetAllPolicyValuesAsJSON(profile, true, false)); policy::GetAllPolicyValuesAsJSON(profile, true, false, false));
int64_t timestamp = GetMachineLevelUserCloudPolicyFetchTimestamp(); int64_t timestamp = GetMachineLevelUserCloudPolicyFetchTimestamp();
if (timestamp > 0) { if (timestamp > 0) {
......
...@@ -75,10 +75,11 @@ const PolicyStringMap kPolicySources[policy::POLICY_SOURCE_COUNT] = { ...@@ -75,10 +75,11 @@ const PolicyStringMap kPolicySources[policy::POLICY_SOURCE_COUNT] = {
using PolicyToSchemaMap = base::flat_map<std::string, policy::Schema>; using PolicyToSchemaMap = base::flat_map<std::string, policy::Schema>;
// Utility function that returns a JSON serialization of the given |dict|. // Utility function that returns a JSON serialization of the given |dict|.
std::string DictionaryToJSONString(const Value& dict) { std::string DictionaryToJSONString(const Value& dict, bool is_pretty_print) {
std::string json_string; std::string json_string;
base::JSONWriter::WriteWithOptions( base::JSONWriter::WriteWithOptions(
dict, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_string); dict, (is_pretty_print ? base::JSONWriter::OPTIONS_PRETTY_PRINT : 0),
&json_string);
return json_string; return json_string;
} }
...@@ -87,14 +88,15 @@ std::string DictionaryToJSONString(const Value& dict) { ...@@ -87,14 +88,15 @@ std::string DictionaryToJSONString(const Value& dict) {
// i18n_template.js will display. // i18n_template.js will display.
Value CopyAndMaybeConvert(const Value& value, Value CopyAndMaybeConvert(const Value& value,
bool convert_values, bool convert_values,
const base::Optional<policy::Schema>& schema) { const base::Optional<policy::Schema>& schema,
bool is_pretty_print) {
Value value_copy = value.Clone(); Value value_copy = value.Clone();
if (schema.has_value()) if (schema.has_value())
schema->MaskSensitiveValues(&value_copy); schema->MaskSensitiveValues(&value_copy);
if (!convert_values) if (!convert_values)
return value_copy; return value_copy;
if (value_copy.is_dict()) if (value_copy.is_dict())
return Value(DictionaryToJSONString(value_copy)); return Value(DictionaryToJSONString(value_copy, is_pretty_print));
if (!value_copy.is_list()) { if (!value_copy.is_list()) {
return value_copy; return value_copy;
...@@ -103,7 +105,8 @@ Value CopyAndMaybeConvert(const Value& value, ...@@ -103,7 +105,8 @@ Value CopyAndMaybeConvert(const Value& value,
Value result(Value::Type::LIST); Value result(Value::Type::LIST);
for (const auto& element : value_copy.GetList()) { for (const auto& element : value_copy.GetList()) {
if (element.is_dict()) { if (element.is_dict()) {
result.GetList().emplace_back(Value(DictionaryToJSONString(element))); result.GetList().emplace_back(
Value(DictionaryToJSONString(element, is_pretty_print)));
} else { } else {
result.GetList().push_back(element.Clone()); result.GetList().push_back(element.Clone());
} }
...@@ -140,12 +143,14 @@ Value GetPolicyValue( ...@@ -140,12 +143,14 @@ Value GetPolicyValue(
const policy::PolicyMap::Entry& policy, const policy::PolicyMap::Entry& policy,
policy::PolicyErrorMap* errors, policy::PolicyErrorMap* errors,
bool convert_values, bool convert_values,
const base::Optional<PolicyToSchemaMap>& known_policy_schemas) { const base::Optional<PolicyToSchemaMap>& known_policy_schemas,
bool is_pretty_print) {
base::Optional<policy::Schema> known_policy_schema = base::Optional<policy::Schema> known_policy_schema =
GetKnownPolicySchema(known_policy_schemas, policy_name); GetKnownPolicySchema(known_policy_schemas, policy_name);
Value value(Value::Type::DICTIONARY); Value value(Value::Type::DICTIONARY);
value.SetKey("value", CopyAndMaybeConvert(*policy.value, convert_values, value.SetKey("value",
known_policy_schema)); CopyAndMaybeConvert(*policy.value, convert_values,
known_policy_schema, is_pretty_print));
value.SetKey( value.SetKey(
"scope", "scope",
Value((policy.scope == policy::POLICY_SCOPE_USER) ? "user" : "machine")); Value((policy.scope == policy::POLICY_SCOPE_USER) ? "user" : "machine"));
...@@ -172,8 +177,9 @@ Value GetPolicyValue( ...@@ -172,8 +177,9 @@ Value GetPolicyValue(
if (!policy.conflicts.empty()) { if (!policy.conflicts.empty()) {
Value conflict_values(Value::Type::LIST); Value conflict_values(Value::Type::LIST);
for (const auto& conflict : policy.conflicts) { for (const auto& conflict : policy.conflicts) {
base::Value conflicted_policy_value = GetPolicyValue( base::Value conflicted_policy_value =
policy_name, conflict, errors, convert_values, known_policy_schemas); GetPolicyValue(policy_name, conflict, errors, convert_values,
known_policy_schemas, is_pretty_print);
conflict_values.GetList().push_back(std::move(conflicted_policy_value)); conflict_values.GetList().push_back(std::move(conflicted_policy_value));
} }
...@@ -195,22 +201,25 @@ void GetPolicyValues( ...@@ -195,22 +201,25 @@ void GetPolicyValues(
bool with_user_policies, bool with_user_policies,
bool convert_values, bool convert_values,
const base::Optional<PolicyToSchemaMap>& known_policy_schemas, const base::Optional<PolicyToSchemaMap>& known_policy_schemas,
Value* values) { Value* values,
bool is_pretty_print) {
DCHECK(values); DCHECK(values);
for (const auto& entry : map) { for (const auto& entry : map) {
const std::string& policy_name = entry.first; const std::string& policy_name = entry.first;
const PolicyMap::Entry& policy = entry.second; const PolicyMap::Entry& policy = entry.second;
if (policy.scope == policy::POLICY_SCOPE_USER && !with_user_policies) if (policy.scope == policy::POLICY_SCOPE_USER && !with_user_policies)
continue; continue;
base::Value value = GetPolicyValue(policy_name, policy, errors, base::Value value =
convert_values, known_policy_schemas); GetPolicyValue(policy_name, policy, errors, convert_values,
known_policy_schemas, is_pretty_print);
values->SetKey(policy_name, std::move(value)); values->SetKey(policy_name, std::move(value));
} }
} }
base::Optional<PolicyToSchemaMap> GetKnownPolicies( base::Optional<PolicyToSchemaMap> GetKnownPolicies(
const scoped_refptr<policy::SchemaMap> schema_map, const scoped_refptr<policy::SchemaMap> schema_map,
const PolicyNamespace& policy_namespace) { const PolicyNamespace& policy_namespace,
bool is_pretty_print) {
const Schema* schema = schema_map->GetSchema(policy_namespace); const Schema* schema = schema_map->GetSchema(policy_namespace);
// There is no policy name verification without valid schema. // There is no policy name verification without valid schema.
if (!schema || !schema->valid()) if (!schema || !schema->valid())
...@@ -231,7 +240,8 @@ base::Optional<PolicyToSchemaMap> GetKnownPolicies( ...@@ -231,7 +240,8 @@ base::Optional<PolicyToSchemaMap> GetKnownPolicies(
void GetChromePolicyValues(content::BrowserContext* context, void GetChromePolicyValues(content::BrowserContext* context,
bool keep_user_policies, bool keep_user_policies,
bool convert_values, bool convert_values,
Value* values) { Value* values,
bool is_pretty_print) {
policy::PolicyService* policy_service = GetPolicyService(context); policy::PolicyService* policy_service = GetPolicyService(context);
policy::PolicyMap map; policy::PolicyMap map;
...@@ -262,14 +272,17 @@ void GetChromePolicyValues(content::BrowserContext* context, ...@@ -262,14 +272,17 @@ void GetChromePolicyValues(content::BrowserContext* context,
// Convert dictionary values to strings for display. // Convert dictionary values to strings for display.
handler_list->PrepareForDisplaying(&map); handler_list->PrepareForDisplaying(&map);
GetPolicyValues(map, &errors, keep_user_policies, convert_values, GetPolicyValues(
GetKnownPolicies(schema_map, policy_namespace), values); map, &errors, keep_user_policies, convert_values,
GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), values,
is_pretty_print);
} }
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
void GetDeviceLocalAccountPolicies(bool convert_values, void GetDeviceLocalAccountPolicies(bool convert_values,
Value* values, Value* values,
bool with_device_data) { bool with_device_data,
bool is_pretty_print) {
// DeviceLocalAccount policies are only available for affiliated users and for // DeviceLocalAccount policies are only available for affiliated users and for
// system logs. // system logs.
if (!with_device_data && if (!with_device_data &&
...@@ -327,9 +340,10 @@ void GetDeviceLocalAccountPolicies(bool convert_values, ...@@ -327,9 +340,10 @@ void GetDeviceLocalAccountPolicies(bool convert_values,
// Convert dictionary values to strings for display. // Convert dictionary values to strings for display.
handler_list->PrepareForDisplaying(&map); handler_list->PrepareForDisplaying(&map);
GetPolicyValues(map, &errors, true, convert_values, GetPolicyValues(
GetKnownPolicies(schema_map, policy_namespace), map, &errors, true, convert_values,
&current_account_policies); GetKnownPolicies(schema_map, policy_namespace, is_pretty_print),
&current_account_policies, is_pretty_print);
values->SetKey(user_id, std::move(current_account_policies)); values->SetKey(user_id, std::move(current_account_policies));
} }
} }
...@@ -340,7 +354,8 @@ void GetDeviceLocalAccountPolicies(bool convert_values, ...@@ -340,7 +354,8 @@ void GetDeviceLocalAccountPolicies(bool convert_values,
Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
bool with_user_policies, bool with_user_policies,
bool convert_values, bool convert_values,
bool with_device_data) { bool with_device_data,
bool is_pretty_print) {
Value all_policies(Value::Type::DICTIONARY); Value all_policies(Value::Type::DICTIONARY);
if (!context) { if (!context) {
LOG(ERROR) << "Can not dump policies, null context"; LOG(ERROR) << "Can not dump policies, null context";
...@@ -352,7 +367,7 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, ...@@ -352,7 +367,7 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
// Add Chrome policy values. // Add Chrome policy values.
Value chrome_policies(Value::Type::DICTIONARY); Value chrome_policies(Value::Type::DICTIONARY);
GetChromePolicyValues(context, with_user_policies, convert_values, GetChromePolicyValues(context, with_user_policies, convert_values,
&chrome_policies); &chrome_policies, is_pretty_print);
all_policies.SetKey("chromePolicies", std::move(chrome_policies)); all_policies.SetKey("chromePolicies", std::move(chrome_policies));
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
...@@ -383,10 +398,11 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, ...@@ -383,10 +398,11 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
policy::PolicyNamespace policy_namespace = policy::PolicyNamespace( policy::PolicyNamespace policy_namespace = policy::PolicyNamespace(
policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
policy::PolicyErrorMap empty_error_map; policy::PolicyErrorMap empty_error_map;
GetPolicyValues(GetPolicyService(context)->GetPolicies(policy_namespace), GetPolicyValues(
&empty_error_map, with_user_policies, convert_values, GetPolicyService(context)->GetPolicies(policy_namespace),
GetKnownPolicies(schema_map, policy_namespace), &empty_error_map, with_user_policies, convert_values,
&extension_policies); GetKnownPolicies(schema_map, policy_namespace, is_pretty_print),
&extension_policies, is_pretty_print);
extension_values.SetKey(extension->id(), std::move(extension_policies)); extension_values.SetKey(extension->id(), std::move(extension_policies));
} }
all_policies.SetKey("extensionPolicies", std::move(extension_values)); all_policies.SetKey("extensionPolicies", std::move(extension_values));
...@@ -395,7 +411,7 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, ...@@ -395,7 +411,7 @@ Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
Value device_local_account_policies(Value::Type::DICTIONARY); Value device_local_account_policies(Value::Type::DICTIONARY);
GetDeviceLocalAccountPolicies(convert_values, &device_local_account_policies, GetDeviceLocalAccountPolicies(convert_values, &device_local_account_policies,
with_device_data); with_device_data, is_pretty_print);
all_policies.SetKey("deviceLocalAccountPolicies", all_policies.SetKey("deviceLocalAccountPolicies",
std::move(device_local_account_policies)); std::move(device_local_account_policies));
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
...@@ -458,14 +474,15 @@ void FillIdentityFields(Value* policy_dump) { ...@@ -458,14 +474,15 @@ void FillIdentityFields(Value* policy_dump) {
std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context, std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context,
bool with_user_policies, bool with_user_policies,
bool with_device_data) { bool with_device_data,
bool is_pretty_print) {
Value all_policies = policy::GetAllPolicyValuesAsDictionary( Value all_policies = policy::GetAllPolicyValuesAsDictionary(
context, with_user_policies, false /* convert_values */, context, with_user_policies, false /* convert_values */, with_device_data,
with_device_data); is_pretty_print);
if (with_device_data) { if (with_device_data) {
FillIdentityFields(&all_policies); FillIdentityFields(&all_policies);
} }
return DictionaryToJSONString(all_policies); return DictionaryToJSONString(all_policies, is_pretty_print);
} }
} // namespace policy } // namespace policy
...@@ -20,19 +20,23 @@ namespace policy { ...@@ -20,19 +20,23 @@ namespace policy {
// |with_device_data| governs if device identity data (e.g. // |with_device_data| governs if device identity data (e.g.
// enrollment client ID) and device local accounts policies are included, // enrollment client ID) and device local accounts policies are included,
// it is used in logs uploads to the server. // it is used in logs uploads to the server.
// |is_pretty_print| govers if JSON policy value is pretty printed.
base::Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, base::Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context,
bool with_user_policies, bool with_user_policies,
bool convert_values, bool convert_values,
bool with_device_data); bool with_device_data,
bool is_pretty_print);
// Returns a JSON with the values of all set policies. // Returns a JSON with the values of all set policies.
// |with_user_policies| governs if values with POLICY_SCOPE_USER are included. // |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
// |with_device_data| governs if device identity data (e.g. // |with_device_data| governs if device identity data (e.g.
// enrollment client ID) and device local accounts policies are included, // enrollment client ID) and device local accounts policies are included,
// it is used in logs uploads to the server. // it is used in logs uploads to the server.
// |is_pretty_print| governs if the output is formatted.
std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context, std::string GetAllPolicyValuesAsJSON(content::BrowserContext* context,
bool with_user_policies, bool with_user_policies,
bool with_device_data); bool with_device_data,
bool is_pretty_print);
} // namespace policy } // namespace policy
......
...@@ -434,7 +434,8 @@ void NetInternalsMessageHandler::OnStoreDebugLogs(const base::ListValue* list) { ...@@ -434,7 +434,8 @@ void NetInternalsMessageHandler::OnStoreDebugLogs(const base::ListValue* list) {
base::FilePath policies_path = path.Append("policies.json"); base::FilePath policies_path = path.Append("policies.json");
std::string json_policies = policy::GetAllPolicyValuesAsJSON( std::string json_policies = policy::GetAllPolicyValuesAsJSON(
web_ui()->GetWebContents()->GetBrowserContext(), web_ui()->GetWebContents()->GetBrowserContext(),
true /* with_user_policies */, false /* with_device_data */); true /* with_user_policies */, false /* with_device_data */,
true /* is_pretty_print */);
base::PostTaskWithTraitsAndReply( base::PostTaskWithTraitsAndReply(
FROM_HERE, FROM_HERE,
{base::MayBlock(), base::TaskPriority::BEST_EFFORT, {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
......
...@@ -845,7 +845,7 @@ void PolicyUIHandler::SendPolicyValues() const { ...@@ -845,7 +845,7 @@ void PolicyUIHandler::SendPolicyValues() const {
base::Value all_policies = policy::GetAllPolicyValuesAsDictionary( base::Value all_policies = policy::GetAllPolicyValuesAsDictionary(
web_ui()->GetWebContents()->GetBrowserContext(), web_ui()->GetWebContents()->GetBrowserContext(),
true /* with_user_policies */, true /* convert_values */, true /* with_user_policies */, true /* convert_values */,
false /* with_device_data */); false /* with_device_data */, true /* is_pretty_print */);
web_ui()->CallJavascriptFunctionUnsafe("policy.Page.setPolicyValues", web_ui()->CallJavascriptFunctionUnsafe("policy.Page.setPolicyValues",
all_policies); all_policies);
} }
...@@ -922,7 +922,8 @@ void PolicyUIHandler::WritePoliciesToJSONFile( ...@@ -922,7 +922,8 @@ void PolicyUIHandler::WritePoliciesToJSONFile(
const base::FilePath& path) const { const base::FilePath& path) const {
std::string json_policies = policy::GetAllPolicyValuesAsJSON( std::string json_policies = policy::GetAllPolicyValuesAsJSON(
web_ui()->GetWebContents()->GetBrowserContext(), web_ui()->GetWebContents()->GetBrowserContext(),
true /* with_user_policies */, false /* with_device_data */); true /* with_user_policies */, false /* with_device_data */,
true /* is_pretty_print */);
base::PostTaskWithTraits( base::PostTaskWithTraits(
FROM_HERE, FROM_HERE,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment