#include "extensions/browser/api/declarative_net_request/file_backed_ruleset_source.h"
#include <memory>
#include <set>
#include <string_view>
#include <utility>
#include "base/check_op.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/json/json_reader.h"
#include "base/json/json_string_value_serializer.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/timer/elapsed_timer.h"
#include "base/values.h"
#include "content/public/browser/browser_context.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
#include "extensions/browser/api/declarative_net_request/parse_info.h"
#include "extensions/browser/api/declarative_net_request/utils.h"
#include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/api/declarative_net_request/dnr_manifest_data.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/file_util.h"
#include "extensions/common/install_warning.h"
#include "services/data_decoder/public/cpp/data_decoder.h"
#include "tools/json_schema_compiler/util.h"
namespace extensions::declarative_net_request {
namespace {
dnr_api;
Status;
constexpr const char kFileDoesNotExistError[] = …;
constexpr const char kFileReadError[] = …;
constexpr const char kDynamicRulesetDirectory[] = …;
constexpr const char kDynamicRulesJSONFilename[] = …;
constexpr const char kDynamicIndexedRulesFilename[] = …;
std::string GetFilename(const base::FilePath& file_path) { … }
std::string GetErrorWithFilename(const base::FilePath& json_path,
std::string_view error) { … }
InstallWarning CreateInstallWarning(const base::FilePath& json_path,
const std::string& message) { … }
ReadJSONRulesResult ParseRulesFromJSON(const RulesetID& ruleset_id,
const base::FilePath& json_path,
const base::Value& rules,
size_t rule_limit,
bool is_dynamic_ruleset) { … }
IndexAndPersistJSONRulesetResult IndexAndPersistRuleset(
const FileBackedRulesetSource& source,
ReadJSONRulesResult read_result,
const base::ElapsedTimer& timer,
uint8_t parse_flags) { … }
void OnSafeJSONParse(
const base::FilePath& json_path,
const FileBackedRulesetSource& source,
uint8_t parse_flags,
FileBackedRulesetSource::IndexAndPersistJSONRulesetCallback callback,
data_decoder::DataDecoder::ValueOrError result) { … }
}
IndexAndPersistJSONRulesetResult
IndexAndPersistJSONRulesetResult::CreateSuccessResult(
int ruleset_checksum,
std::vector<InstallWarning> warnings,
size_t rules_count,
size_t regex_rules_count,
base::TimeDelta index_and_persist_time) { … }
IndexAndPersistJSONRulesetResult
IndexAndPersistJSONRulesetResult::CreateIgnoreResult(
std::vector<InstallWarning> warnings) { … }
IndexAndPersistJSONRulesetResult
IndexAndPersistJSONRulesetResult::CreateErrorResult(std::string error) { … }
IndexAndPersistJSONRulesetResult::~IndexAndPersistJSONRulesetResult() = default;
IndexAndPersistJSONRulesetResult::IndexAndPersistJSONRulesetResult(
IndexAndPersistJSONRulesetResult&&) = default;
IndexAndPersistJSONRulesetResult& IndexAndPersistJSONRulesetResult::operator=(
IndexAndPersistJSONRulesetResult&&) = default;
IndexAndPersistJSONRulesetResult::IndexAndPersistJSONRulesetResult() = default;
ReadJSONRulesResult ReadJSONRulesResult::CreateErrorResult(Status status,
std::string error) { … }
ReadJSONRulesResult::ReadJSONRulesResult() = default;
ReadJSONRulesResult::~ReadJSONRulesResult() = default;
ReadJSONRulesResult::ReadJSONRulesResult(ReadJSONRulesResult&&) = default;
ReadJSONRulesResult& ReadJSONRulesResult::operator=(ReadJSONRulesResult&&) =
default;
std::vector<FileBackedRulesetSource> FileBackedRulesetSource::CreateStatic(
const Extension& extension,
RulesetFilter ruleset_filter) { … }
FileBackedRulesetSource FileBackedRulesetSource::CreateStatic(
const Extension& extension,
const DNRManifestData::RulesetInfo& info) { … }
FileBackedRulesetSource FileBackedRulesetSource::CreateDynamic(
content::BrowserContext* context,
const ExtensionId& extension_id) { … }
std::unique_ptr<FileBackedRulesetSource>
FileBackedRulesetSource::CreateTemporarySource(RulesetID id,
size_t rule_count_limit,
ExtensionId extension_id) { … }
FileBackedRulesetSource::~FileBackedRulesetSource() = default;
FileBackedRulesetSource::FileBackedRulesetSource(FileBackedRulesetSource&&) =
default;
FileBackedRulesetSource& FileBackedRulesetSource::operator=(
FileBackedRulesetSource&&) = default;
FileBackedRulesetSource FileBackedRulesetSource::Clone() const { … }
IndexAndPersistJSONRulesetResult
FileBackedRulesetSource::IndexAndPersistJSONRulesetUnsafe(
uint8_t parse_flags) const { … }
void FileBackedRulesetSource::IndexAndPersistJSONRuleset(
data_decoder::DataDecoder* decoder,
uint8_t parse_flags,
IndexAndPersistJSONRulesetCallback callback) const { … }
ReadJSONRulesResult FileBackedRulesetSource::ReadJSONRulesUnsafe() const { … }
bool FileBackedRulesetSource::SerializeRulesToJSON(
const std::vector<dnr_api::Rule>& rules,
std::string* json) const { … }
LoadRulesetResult FileBackedRulesetSource::CreateVerifiedMatcher(
int expected_ruleset_checksum,
std::unique_ptr<RulesetMatcher>* matcher) const { … }
FileBackedRulesetSource::FileBackedRulesetSource(base::FilePath json_path,
base::FilePath indexed_path,
RulesetID id,
size_t rule_count_limit,
ExtensionId extension_id,
bool enabled_by_default)
: … { … }
}