1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_DNS_CLIENT_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_DNS_CLIENT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/base/rand_callback.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_config.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_hosts.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_config_overrides.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace url { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker class SchemeHostPort; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker } // namespace url 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker namespace net { 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker class AddressSorter; 28*6777b538SAndroid Build Coastguard Worker class ClientSocketFactory; 29*6777b538SAndroid Build Coastguard Worker class DnsSession; 30*6777b538SAndroid Build Coastguard Worker class DnsTransactionFactory; 31*6777b538SAndroid Build Coastguard Worker class NetLog; 32*6777b538SAndroid Build Coastguard Worker class ResolveContext; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // Entry point for HostResolverManager to interact with the built-in async 35*6777b538SAndroid Build Coastguard Worker // resolver, as implemented by DnsTransactionFactory. Manages configuration and 36*6777b538SAndroid Build Coastguard Worker // status of the resolver. 37*6777b538SAndroid Build Coastguard Worker class NET_EXPORT DnsClient { 38*6777b538SAndroid Build Coastguard Worker public: 39*6777b538SAndroid Build Coastguard Worker static const int kMaxInsecureFallbackFailures = 16; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker virtual ~DnsClient() = default; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Returns true if the DnsClient is able and allowed to make secure DNS 44*6777b538SAndroid Build Coastguard Worker // transactions and DoH probe runners. If false, secure transactions and DoH 45*6777b538SAndroid Build Coastguard Worker // probe runners should not be created. 46*6777b538SAndroid Build Coastguard Worker virtual bool CanUseSecureDnsTransactions() const = 0; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Returns true if the DnsClient is able and allowed to make insecure DNS 49*6777b538SAndroid Build Coastguard Worker // transactions. If false, insecure transactions should not be created. Will 50*6777b538SAndroid Build Coastguard Worker // always be false unless SetInsecureEnabled(true) has been called. 51*6777b538SAndroid Build Coastguard Worker virtual bool CanUseInsecureDnsTransactions() const = 0; 52*6777b538SAndroid Build Coastguard Worker virtual bool CanQueryAdditionalTypesViaInsecureDns() const = 0; 53*6777b538SAndroid Build Coastguard Worker virtual void SetInsecureEnabled(bool enabled, 54*6777b538SAndroid Build Coastguard Worker bool additional_types_enabled) = 0; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // When true, DoH should not be used in AUTOMATIC mode since no DoH servers 57*6777b538SAndroid Build Coastguard Worker // have a successful probe state. 58*6777b538SAndroid Build Coastguard Worker virtual bool FallbackFromSecureTransactionPreferred( 59*6777b538SAndroid Build Coastguard Worker ResolveContext* context) const = 0; 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // When true, insecure DNS transactions should not be used when reasonable 62*6777b538SAndroid Build Coastguard Worker // fallback alternatives, e.g. system resolution can be used instead. 63*6777b538SAndroid Build Coastguard Worker virtual bool FallbackFromInsecureTransactionPreferred() const = 0; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Updates DNS config. If effective config has changed, destroys the current 66*6777b538SAndroid Build Coastguard Worker // DnsTransactionFactory and creates a new one according to the effective 67*6777b538SAndroid Build Coastguard Worker // config, unless it is invalid or has |unhandled_options|. 68*6777b538SAndroid Build Coastguard Worker // 69*6777b538SAndroid Build Coastguard Worker // Returns whether or not the effective config changed. 70*6777b538SAndroid Build Coastguard Worker virtual bool SetSystemConfig(std::optional<DnsConfig> system_config) = 0; 71*6777b538SAndroid Build Coastguard Worker virtual bool SetConfigOverrides(DnsConfigOverrides config_overrides) = 0; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // If there is a current session, forces replacement with a new current 74*6777b538SAndroid Build Coastguard Worker // session with the same effective config, and creates a new 75*6777b538SAndroid Build Coastguard Worker // DnsTransactionFactory for the new session. 76*6777b538SAndroid Build Coastguard Worker virtual void ReplaceCurrentSession() = 0; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // Used for tracking per-context-per-session data. 79*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1022059): Once more per-context-per-session data has been 80*6777b538SAndroid Build Coastguard Worker // moved to ResolveContext and it doesn't need to call back into DnsSession, 81*6777b538SAndroid Build Coastguard Worker // convert this to a more limited session handle to prevent overuse of 82*6777b538SAndroid Build Coastguard Worker // DnsSession outside the DnsClient code. 83*6777b538SAndroid Build Coastguard Worker virtual DnsSession* GetCurrentSession() = 0; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Retrieve the current DNS configuration that would be used if transactions 86*6777b538SAndroid Build Coastguard Worker // were otherwise currently allowed. Returns null if configuration is 87*6777b538SAndroid Build Coastguard Worker // invalid or a configuration has not yet been read from the system. 88*6777b538SAndroid Build Coastguard Worker virtual const DnsConfig* GetEffectiveConfig() const = 0; 89*6777b538SAndroid Build Coastguard Worker virtual const DnsHosts* GetHosts() const = 0; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker // Returns all preset addresses for the specified endpoint, if any are 92*6777b538SAndroid Build Coastguard Worker // present in the current effective DnsConfig. 93*6777b538SAndroid Build Coastguard Worker virtual std::optional<std::vector<IPEndPoint>> GetPresetAddrs( 94*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& endpoint) const = 0; 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // Returns null if the current config is not valid. 97*6777b538SAndroid Build Coastguard Worker virtual DnsTransactionFactory* GetTransactionFactory() = 0; 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker virtual AddressSorter* GetAddressSorter() = 0; 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker virtual void IncrementInsecureFallbackFailures() = 0; 102*6777b538SAndroid Build Coastguard Worker virtual void ClearInsecureFallbackFailures() = 0; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // Return the effective DNS configuration as a value that can be recorded in 105*6777b538SAndroid Build Coastguard Worker // the NetLog. This also synthesizes interpretative data to the Value, e.g. 106*6777b538SAndroid Build Coastguard Worker // whether secure and insecure transactions are enabled. 107*6777b538SAndroid Build Coastguard Worker virtual base::Value::Dict GetDnsConfigAsValueForNetLog() const = 0; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker virtual std::optional<DnsConfig> GetSystemConfigForTesting() const = 0; 110*6777b538SAndroid Build Coastguard Worker virtual DnsConfigOverrides GetConfigOverridesForTesting() const = 0; 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker virtual void SetTransactionFactoryForTesting( 113*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DnsTransactionFactory> factory) = 0; 114*6777b538SAndroid Build Coastguard Worker virtual void SetAddressSorterForTesting( 115*6777b538SAndroid Build Coastguard Worker std::unique_ptr<AddressSorter> address_sorter) = 0; 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker // Creates default client. 118*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<DnsClient> CreateClient(NetLog* net_log); 119*6777b538SAndroid Build Coastguard Worker 120*6777b538SAndroid Build Coastguard Worker // Creates a client for testing. Allows using a mock ClientSocketFactory and 121*6777b538SAndroid Build Coastguard Worker // a deterministic random number generator. |socket_factory| must outlive 122*6777b538SAndroid Build Coastguard Worker // the returned DnsClient. 123*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<DnsClient> CreateClientForTesting( 124*6777b538SAndroid Build Coastguard Worker NetLog* net_log, 125*6777b538SAndroid Build Coastguard Worker const RandIntCallback& rand_int_callback); 126*6777b538SAndroid Build Coastguard Worker }; 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker } // namespace net 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_DNS_CLIENT_H_ 131