xref: /aosp_15_r20/external/cronet/net/dns/dns_client.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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