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
|
// Copyright 2019 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/secure_dns_util.h"
#include <algorithm>
#include <iterator>
#include <memory>
#include <string>
#include "base/check.h"
#include "base/containers/contains.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_macros.h"
#include "build/build_config.h"
#include "chrome/browser/net/dns_probe_runner.h"
#include "chrome/common/chrome_features.h"
#include "components/country_codes/country_codes.h"
#include "components/embedder_support/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "net/dns/public/dns_config_overrides.h"
#include "net/dns/public/dns_over_https_config.h"
#include "net/dns/public/doh_provider_entry.h"
#include "net/dns/public/secure_dns_mode.h"
using ::country_codes::CountryId;
namespace chrome_browser_net::secure_dns {
namespace {
const char kAlternateErrorPagesBackup[] = "alternate_error_pages.backup";
bool EntryIsForCountry(const net::DohProviderEntry* entry,
CountryId country_id) {
if (entry->display_globally) {
return true;
}
const auto& countries = entry->display_countries;
bool matches = std::ranges::any_of(
countries, [country_id](const std::string& country_code) {
return CountryId(country_code) == country_id;
});
if (matches) {
DCHECK(!entry->ui_name.empty());
DCHECK(!entry->privacy_policy.empty());
}
return matches;
}
} // namespace
void RegisterProbesSettingBackupPref(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(kAlternateErrorPagesBackup, true);
}
void MigrateProbesSettingToOrFromBackup(PrefService* prefs) {
// TODO(crbug.com/40748688): remove this code around M97 to make sure the vast
// majority of the clients are migrated.
if (!prefs->HasPrefPath(kAlternateErrorPagesBackup)) {
// If the user never changed the value of the preference and still uses
// the hardcoded default value, we'll consider it to be the user value for
// the purposes of this migration.
const base::Value* user_value =
prefs->FindPreference(embedder_support::kAlternateErrorPagesEnabled)
->HasUserSetting()
? prefs->GetUserPrefValue(
embedder_support::kAlternateErrorPagesEnabled)
: prefs->GetDefaultPrefValue(
embedder_support::kAlternateErrorPagesEnabled);
DCHECK(user_value->is_bool());
prefs->SetBoolean(kAlternateErrorPagesBackup, user_value->GetBool());
prefs->ClearPref(embedder_support::kAlternateErrorPagesEnabled);
}
}
net::DohProviderEntry::List ProvidersForCountry(
const net::DohProviderEntry::List& providers,
CountryId country_id) {
net::DohProviderEntry::List local_providers;
std::ranges::copy_if(providers, std::back_inserter(local_providers),
[country_id](const net::DohProviderEntry* entry) {
return EntryIsForCountry(entry, country_id);
});
return local_providers;
}
net::DohProviderEntry::List SelectEnabledProviders(
const net::DohProviderEntry::List& providers) {
net::DohProviderEntry::List enabled_providers;
std::ranges::copy_if(
providers, std::back_inserter(enabled_providers),
[](const net::DohProviderEntry* entry) {
return base::FeatureList::IsEnabled(entry->feature.get());
});
return enabled_providers;
}
void UpdateValidationHistogram(bool valid) {
UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ValidationAttemptSuccess", valid);
}
void UpdateProbeHistogram(bool success) {
UMA_HISTOGRAM_BOOLEAN("Net.DNS.UI.ProbeAttemptSuccess", success);
}
std::unique_ptr<DnsProbeRunner> MakeProbeRunner(
net::DnsOverHttpsConfig doh_config,
const network::NetworkContextGetter& network_context_getter) {
net::DnsConfigOverrides overrides;
overrides.search = std::vector<std::string>();
overrides.attempts = 1;
overrides.secure_dns_mode = net::SecureDnsMode::kSecure;
overrides.dns_over_https_config = std::move(doh_config);
return std::make_unique<DnsProbeRunner>(std::move(overrides),
network_context_getter);
}
} // namespace chrome_browser_net::secure_dns
|