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
|
// Copyright 2024 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/net/network_annotation_monitor.h"
#include <utility>
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profiles_state.h"
#include "chrome/common/pref_names.h"
#include "chromeos/dbus/regmon/regmon_client.h"
#include "chromeos/dbus/regmon/regmon_service.pb.h"
#include "components/prefs/pref_service.h"
NetworkAnnotationMonitor::NetworkAnnotationMonitor() = default;
NetworkAnnotationMonitor::~NetworkAnnotationMonitor() = default;
void NetworkAnnotationMonitor::Report(int32_t hash_code) {
// Multi-profile is not currently supported, so only run on ChromeOS for now.
static_assert(BUILDFLAG(IS_CHROMEOS));
const base::TimeTicks start_time = base::TimeTicks::Now();
// Get blocklist prefs from the current active profile, which on ChromeOS
// should be the only profile based on the above check.
const Profile* profile = ProfileManager::GetActiveUserProfile();
if (!profile) {
// This case should be rare, but is possible. We have observed empty
// profiles in browser tests, for example.
return;
}
const base::Value::Dict& blocklist =
profile->GetPrefs()->GetDict(prefs::kNetworkAnnotationBlocklist);
// Ignore any network calls not in the blocklist.
if (!blocklist.contains(base::NumberToString(hash_code))) {
return;
}
chromeos::RegmonClient* client = chromeos::RegmonClient::Get();
if (!client) {
return;
}
regmon::PolicyViolation policy_violation;
policy_violation.set_policy(::regmon::PolicyViolation::POLICY_UNSPECIFIED);
policy_violation.set_annotation_hash(hash_code);
regmon::RecordPolicyViolationRequest request =
regmon::RecordPolicyViolationRequest();
*request.mutable_violation() = policy_violation;
client->RecordPolicyViolation(request);
// Publish time metric for this function.
UMA_HISTOGRAM_TIMES("ChromeOS.Regmon.ReportViolationTime",
base::TimeTicks::Now() - start_time);
}
mojo::PendingRemote<network::mojom::NetworkAnnotationMonitor>
NetworkAnnotationMonitor::GetClient() {
// Reset receiver if already bound. This can happen if the Network Service
// crashed and has been restarted.
if (receiver_.is_bound()) {
receiver_.reset();
}
mojo::PendingRemote<network::mojom::NetworkAnnotationMonitor> client;
receiver_.Bind(client.InitWithNewPipeAndPassReceiver());
return client;
}
void NetworkAnnotationMonitor::FlushForTesting() {
receiver_.FlushForTesting(); // IN-TEST
}
|