blob: bc6e5a3a6b2a36f2b1b2f3ac20bc66d2f7078ed4 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/public/cpp/host_resolver_mojom_traits.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "net/dns/public/dns_over_https_server_config.h"
#include "net/dns/public/host_resolver_source.h"
#include "net/dns/public/mdns_listener_update_type.h"
#include "net/dns/public/resolve_error_info.h"
#include "net/dns/public/secure_dns_mode.h"
#include "net/dns/public/secure_dns_policy.h"
#include "services/network/public/cpp/ip_address_mojom_traits.h"
#include "services/network/public/cpp/ip_endpoint_mojom_traits.h"
#include "services/network/public/mojom/host_resolver.mojom.h"
namespace mojo {
using network::mojom::DnsConfigOverrides;
using network::mojom::DnsConfigOverridesDataView;
using network::mojom::DnsOverHttpsServer;
using network::mojom::DnsOverHttpsServerDataView;
using network::mojom::DnsOverHttpsServerPtr;
using network::mojom::DnsQueryType;
using network::mojom::MdnsListenClient;
using network::mojom::OptionalSecureDnsMode;
using network::mojom::ResolveHostParameters;
namespace {
DnsConfigOverrides::Tristate ToTristate(absl::optional<bool> optional) {
if (!optional)
return DnsConfigOverrides::Tristate::NO_OVERRIDE;
if (optional.value())
return DnsConfigOverrides::Tristate::TRISTATE_TRUE;
return DnsConfigOverrides::Tristate::TRISTATE_FALSE;
}
absl::optional<bool> FromTristate(DnsConfigOverrides::Tristate tristate) {
switch (tristate) {
case DnsConfigOverrides::Tristate::NO_OVERRIDE:
return absl::nullopt;
case DnsConfigOverrides::Tristate::TRISTATE_TRUE:
return true;
case DnsConfigOverrides::Tristate::TRISTATE_FALSE:
return false;
}
}
bool ReadDnsOverHttpsServerData(
mojo::ArrayDataView<DnsOverHttpsServerDataView> data,
absl::optional<std::vector<net::DnsOverHttpsServerConfig>>* out) {
if (data.is_null()) {
out->reset();
return true;
}
out->emplace();
for (size_t i = 0; i < data.size(); ++i) {
DnsOverHttpsServerDataView server_data;
data.GetDataView(i, &server_data);
std::string server_template;
if (!server_data.ReadServerTemplate(&server_template))
return false;
out->value().emplace_back(std::move(server_template),
server_data.use_post());
}
return true;
}
OptionalSecureDnsMode ToOptionalSecureDnsMode(
absl::optional<net::SecureDnsMode> optional) {
if (!optional)
return OptionalSecureDnsMode::NO_OVERRIDE;
switch (optional.value()) {
case net::SecureDnsMode::kOff:
return OptionalSecureDnsMode::OFF;
case net::SecureDnsMode::kAutomatic:
return OptionalSecureDnsMode::AUTOMATIC;
case net::SecureDnsMode::kSecure:
return OptionalSecureDnsMode::SECURE;
}
}
} // namespace
absl::optional<net::SecureDnsMode> FromOptionalSecureDnsMode(
OptionalSecureDnsMode mode) {
switch (mode) {
case OptionalSecureDnsMode::NO_OVERRIDE:
return absl::nullopt;
case OptionalSecureDnsMode::OFF:
return net::SecureDnsMode::kOff;
case OptionalSecureDnsMode::AUTOMATIC:
return net::SecureDnsMode::kAutomatic;
case OptionalSecureDnsMode::SECURE:
return net::SecureDnsMode::kSecure;
}
}
// static
DnsConfigOverrides::Tristate
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::
append_to_multi_label_name(const net::DnsConfigOverrides& overrides) {
return ToTristate(overrides.append_to_multi_label_name);
}
// static
DnsConfigOverrides::Tristate
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::rotate(
const net::DnsConfigOverrides& overrides) {
return ToTristate(overrides.rotate);
}
// static
DnsConfigOverrides::Tristate
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::
use_local_ipv6(const net::DnsConfigOverrides& overrides) {
return ToTristate(overrides.use_local_ipv6);
}
// static
absl::optional<std::vector<DnsOverHttpsServerPtr>>
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::
dns_over_https_servers(const net::DnsConfigOverrides& overrides) {
if (!overrides.dns_over_https_servers)
return absl::nullopt;
std::vector<DnsOverHttpsServerPtr> out_servers;
for (net::DnsOverHttpsServerConfig server :
overrides.dns_over_https_servers.value()) {
out_servers.push_back(
DnsOverHttpsServer::New(server.server_template, server.use_post));
}
return absl::make_optional(std::move(out_servers));
}
// static
OptionalSecureDnsMode
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::
secure_dns_mode(const net::DnsConfigOverrides& overrides) {
return ToOptionalSecureDnsMode(overrides.secure_dns_mode);
}
// static
DnsConfigOverrides::Tristate
StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::
allow_dns_over_https_upgrade(const net::DnsConfigOverrides& overrides) {
return ToTristate(overrides.allow_dns_over_https_upgrade);
}
// static
bool StructTraits<DnsConfigOverridesDataView, net::DnsConfigOverrides>::Read(
DnsConfigOverridesDataView data,
net::DnsConfigOverrides* out) {
if (!data.ReadNameservers(&out->nameservers))
return false;
if (!data.ReadSearch(&out->search))
return false;
out->append_to_multi_label_name =
FromTristate(data.append_to_multi_label_name());
if (data.ndots() < -1)
return false;
if (data.ndots() >= 0)
out->ndots = data.ndots();
// if == -1, leave nullopt.
if (!data.ReadFallbackPeriod(&out->fallback_period))
return false;
if (data.attempts() < -1)
return false;
if (data.attempts() >= 0)
out->attempts = data.attempts();
// if == -1, leave nullopt.
out->rotate = FromTristate(data.rotate());
out->use_local_ipv6 = FromTristate(data.use_local_ipv6());
mojo::ArrayDataView<DnsOverHttpsServerDataView> dns_over_https_servers_data;
data.GetDnsOverHttpsServersDataView(&dns_over_https_servers_data);
if (!ReadDnsOverHttpsServerData(dns_over_https_servers_data,
&out->dns_over_https_servers)) {
return false;
}
out->secure_dns_mode = FromOptionalSecureDnsMode(data.secure_dns_mode());
out->allow_dns_over_https_upgrade =
FromTristate(data.allow_dns_over_https_upgrade());
if (!data.ReadDisabledUpgradeProviders(&out->disabled_upgrade_providers))
return false;
out->clear_hosts = data.clear_hosts();
return true;
}
// static
DnsQueryType EnumTraits<DnsQueryType, net::DnsQueryType>::ToMojom(
net::DnsQueryType input) {
switch (input) {
case net::DnsQueryType::UNSPECIFIED:
return DnsQueryType::UNSPECIFIED;
case net::DnsQueryType::A:
return DnsQueryType::A;
case net::DnsQueryType::AAAA:
return DnsQueryType::AAAA;
case net::DnsQueryType::TXT:
return DnsQueryType::TXT;
case net::DnsQueryType::PTR:
return DnsQueryType::PTR;
case net::DnsQueryType::SRV:
return DnsQueryType::SRV;
case net::DnsQueryType::HTTPS:
return DnsQueryType::HTTPS;
case net::DnsQueryType::INTEGRITY:
case net::DnsQueryType::HTTPS_EXPERIMENTAL:
NOTIMPLEMENTED();
return DnsQueryType::UNSPECIFIED;
}
}
// static
bool EnumTraits<DnsQueryType, net::DnsQueryType>::FromMojom(
DnsQueryType input,
net::DnsQueryType* output) {
switch (input) {
case DnsQueryType::UNSPECIFIED:
*output = net::DnsQueryType::UNSPECIFIED;
return true;
case DnsQueryType::A:
*output = net::DnsQueryType::A;
return true;
case DnsQueryType::AAAA:
*output = net::DnsQueryType::AAAA;
return true;
case DnsQueryType::TXT:
*output = net::DnsQueryType::TXT;
return true;
case DnsQueryType::PTR:
*output = net::DnsQueryType::PTR;
return true;
case DnsQueryType::SRV:
*output = net::DnsQueryType::SRV;
return true;
case DnsQueryType::HTTPS:
*output = net::DnsQueryType::HTTPS;
return true;
}
}
// static
ResolveHostParameters::Source
EnumTraits<ResolveHostParameters::Source, net::HostResolverSource>::ToMojom(
net::HostResolverSource input) {
switch (input) {
case net::HostResolverSource::ANY:
return ResolveHostParameters::Source::ANY;
case net::HostResolverSource::SYSTEM:
return ResolveHostParameters::Source::SYSTEM;
case net::HostResolverSource::DNS:
return ResolveHostParameters::Source::DNS;
case net::HostResolverSource::MULTICAST_DNS:
return ResolveHostParameters::Source::MULTICAST_DNS;
case net::HostResolverSource::LOCAL_ONLY:
return ResolveHostParameters::Source::LOCAL_ONLY;
}
}
// static
bool EnumTraits<ResolveHostParameters::Source, net::HostResolverSource>::
FromMojom(ResolveHostParameters::Source input,
net::HostResolverSource* output) {
switch (input) {
case ResolveHostParameters::Source::ANY:
*output = net::HostResolverSource::ANY;
return true;
case ResolveHostParameters::Source::SYSTEM:
*output = net::HostResolverSource::SYSTEM;
return true;
case ResolveHostParameters::Source::DNS:
*output = net::HostResolverSource::DNS;
return true;
case ResolveHostParameters::Source::MULTICAST_DNS:
*output = net::HostResolverSource::MULTICAST_DNS;
return true;
case ResolveHostParameters::Source::LOCAL_ONLY:
*output = net::HostResolverSource::LOCAL_ONLY;
return true;
}
}
// static
MdnsListenClient::UpdateType
EnumTraits<MdnsListenClient::UpdateType, net::MdnsListenerUpdateType>::ToMojom(
net::MdnsListenerUpdateType input) {
switch (input) {
case net::MdnsListenerUpdateType::kAdded:
return MdnsListenClient::UpdateType::ADDED;
case net::MdnsListenerUpdateType::kChanged:
return MdnsListenClient::UpdateType::CHANGED;
case net::MdnsListenerUpdateType::kRemoved:
return MdnsListenClient::UpdateType::REMOVED;
}
}
// static
bool EnumTraits<MdnsListenClient::UpdateType, net::MdnsListenerUpdateType>::
FromMojom(MdnsListenClient::UpdateType input,
net::MdnsListenerUpdateType* output) {
switch (input) {
case MdnsListenClient::UpdateType::ADDED:
*output = net::MdnsListenerUpdateType::kAdded;
return true;
case MdnsListenClient::UpdateType::CHANGED:
*output = net::MdnsListenerUpdateType::kChanged;
return true;
case MdnsListenClient::UpdateType::REMOVED:
*output = net::MdnsListenerUpdateType::kRemoved;
return true;
}
}
// static
network::mojom::SecureDnsMode
EnumTraits<network::mojom::SecureDnsMode, net::SecureDnsMode>::ToMojom(
net::SecureDnsMode secure_dns_mode) {
switch (secure_dns_mode) {
case net::SecureDnsMode::kOff:
return network::mojom::SecureDnsMode::OFF;
case net::SecureDnsMode::kAutomatic:
return network::mojom::SecureDnsMode::AUTOMATIC;
case net::SecureDnsMode::kSecure:
return network::mojom::SecureDnsMode::SECURE;
}
}
// static
bool EnumTraits<network::mojom::SecureDnsMode, net::SecureDnsMode>::FromMojom(
network::mojom::SecureDnsMode in,
net::SecureDnsMode* out) {
switch (in) {
case network::mojom::SecureDnsMode::OFF:
*out = net::SecureDnsMode::kOff;
return true;
case network::mojom::SecureDnsMode::AUTOMATIC:
*out = net::SecureDnsMode::kAutomatic;
return true;
case network::mojom::SecureDnsMode::SECURE:
*out = net::SecureDnsMode::kSecure;
return true;
}
}
// static
network::mojom::SecureDnsPolicy
EnumTraits<network::mojom::SecureDnsPolicy, net::SecureDnsPolicy>::ToMojom(
net::SecureDnsPolicy secure_dns_mode) {
switch (secure_dns_mode) {
case net::SecureDnsPolicy::kAllow:
return network::mojom::SecureDnsPolicy::ALLOW;
case net::SecureDnsPolicy::kDisable:
return network::mojom::SecureDnsPolicy::DISABLE;
}
}
// static
bool EnumTraits<network::mojom::SecureDnsPolicy, net::SecureDnsPolicy>::
FromMojom(network::mojom::SecureDnsPolicy in, net::SecureDnsPolicy* out) {
switch (in) {
case network::mojom::SecureDnsPolicy::ALLOW:
*out = net::SecureDnsPolicy::kAllow;
return true;
case network::mojom::SecureDnsPolicy::DISABLE:
*out = net::SecureDnsPolicy::kDisable;
return true;
}
}
} // namespace mojo