1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
// 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");
break;
#else
NOTREACHED();
#endif
case PrefValueStore::PrefStoreType::COMMAND_LINE_STORE:
metadata.Append("command_line_controlled");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_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
break;
case PrefValueStore::PrefStoreType::RECOMMENDED_STORE:
metadata.Append("recommended");
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::DEFAULT_STORE:
metadata.Append("default");
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_modifiable");
#endif
break;
case PrefValueStore::PrefStoreType::INVALID_STORE:
metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
metadata.Append("extension_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
|