File: extension_telemetry_config_manager.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (138 lines) | stat: -rw-r--r-- 5,793 bytes parent folder | download | duplicates (6)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h"

#include "base/values.h"
#include "chrome/browser/safe_browsing/extension_telemetry/extension_signal.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/core/common/proto/csd.pb.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"

namespace safe_browsing {

namespace {
// Default values for the ExtensionTelemetryConfigManager and the
// string key values for the `configuration_` dict.
constexpr uint32_t kDefaultWritesPerInterval = 1u;
constexpr uint32_t kDefaultReportingInterval = 3600u;
constexpr uint32_t kDefaultConfigVersion = 0u;
constexpr uint32_t kDefaultSignalEnables32 = 0xffffffff;
constexpr uint64_t kDefaultSignalEnables = 0xffffffffffffffff;
constexpr char kConfigurationVersion[] = "version";
constexpr char kWritesPerInterval[] = "writes_per_interval";
constexpr char kReportingInterval[] = "reporting_interval";
constexpr char kSignalEnables0[] = "signal_enables_0";
constexpr char kSignalEnables1[] = "signal_enables_1";
}  // namespace

ExtensionTelemetryConfigManager::~ExtensionTelemetryConfigManager() = default;

ExtensionTelemetryConfigManager::ExtensionTelemetryConfigManager(
    PrefService* pref_service)
    : pref_service_(pref_service) {}

void ExtensionTelemetryConfigManager::LoadConfig() {
  configuration_ = GetExtensionTelemetryConfig(*pref_service_).Clone();
}

// A copy of the configuration data stored in prefs. The configuration
// data is organized as a dictionary (see example below).
// "safe_browsing.extension_telemetry_configuration": <- DICT
//   "version":1
//   "reporting_interval":3600
//   "writes_per_interval":1
//   "<extension_id_1>": <- DICT
//      "signal_enables_0" : 0x0000000f
//      "signal_enables_1" : 0x00000000
//   "<extension_id_2>": <- DICT
//      "signal_enables_0" : 0x0000000c
//      "signal_enables_1" : 0x00000000
void ExtensionTelemetryConfigManager::SaveConfig(
    const ExtensionTelemetryReportResponse_Configuration& telemetry_config) {
  if (!telemetry_config.has_configuration_version()) {
    return;
  }
  uint32_t configuration_version = telemetry_config.configuration_version();
  if (configuration_version <= GetConfigVersion()) {
    return;
  }
  base::Value::Dict telemetry_config_dict;
  telemetry_config_dict.Set(kConfigurationVersion,
                            static_cast<int>(configuration_version));
  if (telemetry_config.has_reporting_interval_seconds()) {
    telemetry_config_dict.Set(
        kReportingInterval,
        static_cast<int>(telemetry_config.reporting_interval_seconds()));
  }
  if (telemetry_config.has_writes_per_interval()) {
    telemetry_config_dict.Set(
        kWritesPerInterval,
        static_cast<int>(telemetry_config.writes_per_interval()));
  }
  // Extract signal enables represented as bitmasks.
  for (auto& proto_extension_parameter :
       telemetry_config.extension_parameters()) {
    uint64_t signal_enables_bitmask =
        proto_extension_parameter.signal_enable_mask();
    base::Value::Dict extension_dict;
    // In order to store the bitmask into the base::value::dict object
    // the `signal_enables` bitmask must be split from it's uint64 form
    // into two int32 variables.
    extension_dict.Set(kSignalEnables0,
                       static_cast<int>(signal_enables_bitmask));
    extension_dict.Set(kSignalEnables1,
                       static_cast<int>(signal_enables_bitmask >> 32));
    telemetry_config_dict.Set(proto_extension_parameter.extension_id(),
                              std::move(extension_dict));
  }
  SetExtensionTelemetryConfig(*pref_service_, telemetry_config_dict);
  configuration_ = std::move(telemetry_config_dict);
}

bool ExtensionTelemetryConfigManager::IsSignalEnabled(
    const extensions::ExtensionId& extension_id,
    ExtensionSignalType signal_type) const {
  const base::Value::Dict* extension_dict =
      configuration_.FindDict(extension_id);
  if (!extension_dict) {
    return true;
  }
  uint64_t signal_enables_bitmask = GetSignalEnables(extension_id);
  return (signal_enables_bitmask &
          (1ull << (static_cast<uint64_t>(signal_type))));
}

uint32_t ExtensionTelemetryConfigManager::GetWritesPerInterval() const {
  std::optional<int> param = configuration_.FindInt(kWritesPerInterval);
  return static_cast<uint32_t>(param.value_or(kDefaultWritesPerInterval));
}

uint32_t ExtensionTelemetryConfigManager::GetConfigVersion() const {
  std::optional<int> param = configuration_.FindInt(kConfigurationVersion);
  return static_cast<uint32_t>(param.value_or(kDefaultConfigVersion));
}

uint32_t ExtensionTelemetryConfigManager::GetReportingInterval() const {
  std::optional<int> param = configuration_.FindInt(kReportingInterval);
  return static_cast<uint32_t>(param.value_or(kDefaultReportingInterval));
}

uint64_t ExtensionTelemetryConfigManager::GetSignalEnables(
    const extensions::ExtensionId& extension_id) const {
  const base::Value::Dict* extension_dict =
      configuration_.FindDict(extension_id);
  if (!extension_dict) {
    // By default, all signals are enabled for extensions.
    return kDefaultSignalEnables;
  }
  uint32_t signal_enables_0 =
      static_cast<uint32_t>(extension_dict->FindInt(kSignalEnables0)
                                .value_or(kDefaultSignalEnables32));
  uint32_t signal_enables_1 =
      static_cast<uint32_t>(extension_dict->FindInt(kSignalEnables1)
                                .value_or(kDefaultSignalEnables32));
  return static_cast<uint64_t>(signal_enables_1) << 32 | signal_enables_0;
}
}  // namespace safe_browsing