[go: nahoru, domu]

blob: 4dec0d32234d78bc9ae8f299ba38e3eb4443b3fd [file] [log] [blame]
// Copyright 2022 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/local_state/local_state_utils.h"
#include <string>
#include <vector>
#include "base/json/json_writer.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "build/build_config.h"
#include "components/prefs/pref_service.h"
#include "extensions/buildflags/buildflags.h"
namespace local_state_utils {
namespace {
// Returns true if |pref_name| starts with one of the |valid_prefixes|.
bool HasValidPrefix(const std::string& pref_name,
const std::vector<std::string> valid_prefixes) {
for (const std::string& prefix : valid_prefixes) {
if (base::StartsWith(pref_name, prefix, base::CompareCase::SENSITIVE)) {
return true;
}
}
return false;
}
base::Value::List GetPrefsMetadata(
PrefValueStore::PrefStoreType pref_value_store_type) {
base::Value::List metadata;
switch (pref_value_store_type) {
case PrefValueStore::PrefStoreType::MANAGED_STORE:
metadata.Append("managed");
break;
case PrefValueStore::PrefStoreType::SUPERVISED_USER_STORE:
metadata.Append("managed_by_custodian");
break;
case PrefValueStore::PrefStoreType::EXTENSION_STORE:
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_controlled");
metadata.Append("extension_modifiable");
#else
NOTREACHED();
#endif
break;
case PrefValueStore::PrefStoreType::STANDALONE_BROWSER_STORE:
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_controlled");
metadata.Append("standalone_browser_modifiable");
#endif
metadata.Append("extension_modifiable");
break;
case PrefValueStore::PrefStoreType::COMMAND_LINE_STORE:
metadata.Append("command_line_controlled");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::USER_STORE:
metadata.Append("user_controlled");
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::RECOMMENDED_STORE:
metadata.Append("recommended");
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::DEFAULT_STORE:
metadata.Append("default");
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::INVALID_STORE:
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
metadata.Append("standalone_browser_modifiable");
#endif
break;
}
return metadata;
}
} // namespace
std::optional<std::string> GetPrefsAsJson(
PrefService* pref_service,
const std::vector<std::string>& accepted_prefixes) {
std::vector<PrefService::PreferenceValueAndStore> values =
pref_service->GetPreferencesValueAndStore();
base::Value::Dict local_state_values;
for (const auto& [name, value, pref_value_store_type] : values) {
// Filter out the prefs to only include variations and UMA related fields,
// which don't contain PII.
if (!accepted_prefixes.empty() &&
!HasValidPrefix(name, accepted_prefixes)) {
continue;
}
base::Value::Dict pref_details;
pref_details.Set("value", value.Clone());
pref_details.Set("metadata", GetPrefsMetadata(pref_value_store_type));
local_state_values.SetByDottedPath(name, std::move(pref_details));
}
std::string result;
if (!base::JSONWriter::WriteWithOptions(
local_state_values, base::JSONWriter::OPTIONS_PRETTY_PRINT,
&result)) {
return std::nullopt;
}
return result;
}
} // namespace local_state_utils