feat: add app.configureHostResolver (#30576)
This commit is contained in:
parent
3b2db5f168
commit
dd7aeda6fb
6 changed files with 292 additions and 7 deletions
|
@ -19,6 +19,7 @@
|
|||
#include "base/system/sys_info.h"
|
||||
#include "chrome/browser/browser_process.h"
|
||||
#include "chrome/browser/icon_manager.h"
|
||||
#include "chrome/common/chrome_features.h"
|
||||
#include "chrome/common/chrome_paths.h"
|
||||
#include "content/browser/gpu/compositor_util.h" // nogncheck
|
||||
#include "content/browser/gpu/gpu_data_manager_impl.h" // nogncheck
|
||||
|
@ -27,13 +28,16 @@
|
|||
#include "content/public/browser/child_process_data.h"
|
||||
#include "content/public/browser/client_certificate_delegate.h"
|
||||
#include "content/public/browser/gpu_data_manager.h"
|
||||
#include "content/public/browser/network_service_instance.h"
|
||||
#include "content/public/browser/render_frame_host.h"
|
||||
#include "content/public/common/content_switches.h"
|
||||
#include "media/audio/audio_manager.h"
|
||||
#include "net/dns/public/util.h"
|
||||
#include "net/ssl/client_cert_identity.h"
|
||||
#include "net/ssl/ssl_cert_request_info.h"
|
||||
#include "net/ssl/ssl_private_key.h"
|
||||
#include "sandbox/policy/switches.h"
|
||||
#include "services/network/network_service.h"
|
||||
#include "shell/browser/api/electron_api_menu.h"
|
||||
#include "shell/browser/api/electron_api_session.h"
|
||||
#include "shell/browser/api/electron_api_web_contents.h"
|
||||
|
@ -419,6 +423,27 @@ struct Converter<content::CertificateRequestResultType> {
|
|||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Converter<net::SecureDnsMode> {
|
||||
static bool FromV8(v8::Isolate* isolate,
|
||||
v8::Local<v8::Value> val,
|
||||
net::SecureDnsMode* out) {
|
||||
std::string s;
|
||||
if (!ConvertFromV8(isolate, val, &s))
|
||||
return false;
|
||||
if (s == "off") {
|
||||
*out = net::SecureDnsMode::kOff;
|
||||
return true;
|
||||
} else if (s == "automatic") {
|
||||
*out = net::SecureDnsMode::kAutomatic;
|
||||
return true;
|
||||
} else if (s == "secure") {
|
||||
*out = net::SecureDnsMode::kSecure;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
} // namespace gin
|
||||
|
||||
namespace electron {
|
||||
|
@ -1525,6 +1550,108 @@ v8::Local<v8::Value> App::GetDockAPI(v8::Isolate* isolate) {
|
|||
}
|
||||
#endif
|
||||
|
||||
void ConfigureHostResolver(v8::Isolate* isolate,
|
||||
const gin_helper::Dictionary& opts) {
|
||||
gin_helper::ErrorThrower thrower(isolate);
|
||||
net::SecureDnsMode secure_dns_mode = net::SecureDnsMode::kOff;
|
||||
std::string default_doh_templates;
|
||||
if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) {
|
||||
if (features::kDnsOverHttpsFallbackParam.Get()) {
|
||||
secure_dns_mode = net::SecureDnsMode::kAutomatic;
|
||||
} else {
|
||||
secure_dns_mode = net::SecureDnsMode::kSecure;
|
||||
}
|
||||
default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get();
|
||||
}
|
||||
std::string server_method;
|
||||
std::vector<net::DnsOverHttpsServerConfig> dns_over_https_servers;
|
||||
absl::optional<std::vector<network::mojom::DnsOverHttpsServerPtr>>
|
||||
servers_mojo;
|
||||
if (!default_doh_templates.empty() &&
|
||||
secure_dns_mode != net::SecureDnsMode::kOff) {
|
||||
for (base::StringPiece server_template :
|
||||
SplitStringPiece(default_doh_templates, " ", base::TRIM_WHITESPACE,
|
||||
base::SPLIT_WANT_NONEMPTY)) {
|
||||
if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
bool use_post = server_method == "POST";
|
||||
dns_over_https_servers.emplace_back(std::string(server_template),
|
||||
use_post);
|
||||
|
||||
if (!servers_mojo.has_value()) {
|
||||
servers_mojo = absl::make_optional<
|
||||
std::vector<network::mojom::DnsOverHttpsServerPtr>>();
|
||||
}
|
||||
|
||||
network::mojom::DnsOverHttpsServerPtr server_mojo =
|
||||
network::mojom::DnsOverHttpsServer::New();
|
||||
server_mojo->server_template = std::string(server_template);
|
||||
server_mojo->use_post = use_post;
|
||||
servers_mojo->emplace_back(std::move(server_mojo));
|
||||
}
|
||||
}
|
||||
|
||||
bool enable_built_in_resolver =
|
||||
base::FeatureList::IsEnabled(features::kAsyncDns);
|
||||
bool additional_dns_query_types_enabled = true;
|
||||
|
||||
if (opts.Has("enableBuiltInResolver") &&
|
||||
!opts.Get("enableBuiltInResolver", &enable_built_in_resolver)) {
|
||||
thrower.ThrowTypeError("enableBuiltInResolver must be a boolean");
|
||||
return;
|
||||
}
|
||||
|
||||
if (opts.Has("secureDnsMode") &&
|
||||
!opts.Get("secureDnsMode", &secure_dns_mode)) {
|
||||
thrower.ThrowTypeError(
|
||||
"secureDnsMode must be one of: off, automatic, secure");
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<std::string> secure_dns_server_strings;
|
||||
if (opts.Has("secureDnsServers")) {
|
||||
if (!opts.Get("secureDnsServers", &secure_dns_server_strings)) {
|
||||
thrower.ThrowTypeError("secureDnsServers must be an array of strings");
|
||||
return;
|
||||
}
|
||||
servers_mojo = absl::nullopt;
|
||||
for (const std::string& server_template : secure_dns_server_strings) {
|
||||
std::string server_method;
|
||||
if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) {
|
||||
thrower.ThrowTypeError(std::string("not a valid DoH template: ") +
|
||||
server_template);
|
||||
return;
|
||||
}
|
||||
bool use_post = server_method == "POST";
|
||||
if (!servers_mojo.has_value()) {
|
||||
servers_mojo = absl::make_optional<
|
||||
std::vector<network::mojom::DnsOverHttpsServerPtr>>();
|
||||
}
|
||||
|
||||
network::mojom::DnsOverHttpsServerPtr server_mojo =
|
||||
network::mojom::DnsOverHttpsServer::New();
|
||||
server_mojo->server_template = std::string(server_template);
|
||||
server_mojo->use_post = use_post;
|
||||
servers_mojo->emplace_back(std::move(server_mojo));
|
||||
}
|
||||
}
|
||||
|
||||
if (opts.Has("enableAdditionalDnsQueryTypes") &&
|
||||
!opts.Get("enableAdditionalDnsQueryTypes",
|
||||
&additional_dns_query_types_enabled)) {
|
||||
thrower.ThrowTypeError("enableAdditionalDnsQueryTypes must be a boolean");
|
||||
return;
|
||||
}
|
||||
|
||||
// Configure the stub resolver. This must be done after the system
|
||||
// NetworkContext is created, but before anything has the chance to use it.
|
||||
content::GetNetworkService()->ConfigureStubHostResolver(
|
||||
enable_built_in_resolver, secure_dns_mode, std::move(servers_mojo),
|
||||
additional_dns_query_types_enabled);
|
||||
}
|
||||
|
||||
// static
|
||||
App* App::Get() {
|
||||
static base::NoDestructor<App> app;
|
||||
|
@ -1671,6 +1798,7 @@ gin::ObjectTemplateBuilder App::GetObjectTemplateBuilder(v8::Isolate* isolate) {
|
|||
#endif
|
||||
.SetProperty("userAgentFallback", &App::GetUserAgentFallback,
|
||||
&App::SetUserAgentFallback)
|
||||
.SetMethod("configureHostResolver", &ConfigureHostResolver)
|
||||
.SetMethod("enableSandbox", &App::EnableSandbox);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue