xref: /aosp_15_r20/external/cronet/net/socket/socks5_client_socket.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_SOCKET_SOCKS5_CLIENT_SOCKET_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKS5_CLIENT_SOCKET_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <memory>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_repeating_callback.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
24*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace net {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker // This StreamSocket is used to setup a SOCKSv5 handshake with a socks proxy.
29*6777b538SAndroid Build Coastguard Worker // Currently no SOCKSv5 authentication is supported.
30*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SOCKS5ClientSocket : public StreamSocket {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   // |destination| contains the hostname and port to which the socket above will
33*6777b538SAndroid Build Coastguard Worker   // communicate to via the SOCKS layer.
34*6777b538SAndroid Build Coastguard Worker   //
35*6777b538SAndroid Build Coastguard Worker   // Although SOCKS 5 supports 3 different modes of addressing, we will
36*6777b538SAndroid Build Coastguard Worker   // always pass it a hostname. This means the DNS resolving is done
37*6777b538SAndroid Build Coastguard Worker   // proxy side.
38*6777b538SAndroid Build Coastguard Worker   SOCKS5ClientSocket(std::unique_ptr<StreamSocket> transport_socket,
39*6777b538SAndroid Build Coastguard Worker                      const HostPortPair& destination,
40*6777b538SAndroid Build Coastguard Worker                      const NetworkTrafficAnnotationTag& traffic_annotation);
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   SOCKS5ClientSocket(const SOCKS5ClientSocket&) = delete;
43*6777b538SAndroid Build Coastguard Worker   SOCKS5ClientSocket& operator=(const SOCKS5ClientSocket&) = delete;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   // On destruction Disconnect() is called.
46*6777b538SAndroid Build Coastguard Worker   ~SOCKS5ClientSocket() override;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // StreamSocket implementation.
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   // Does the SOCKS handshake and completes the protocol.
51*6777b538SAndroid Build Coastguard Worker   int Connect(CompletionOnceCallback callback) override;
52*6777b538SAndroid Build Coastguard Worker   void Disconnect() override;
53*6777b538SAndroid Build Coastguard Worker   bool IsConnected() const override;
54*6777b538SAndroid Build Coastguard Worker   bool IsConnectedAndIdle() const override;
55*6777b538SAndroid Build Coastguard Worker   const NetLogWithSource& NetLog() const override;
56*6777b538SAndroid Build Coastguard Worker   bool WasEverUsed() const override;
57*6777b538SAndroid Build Coastguard Worker   NextProto GetNegotiatedProtocol() const override;
58*6777b538SAndroid Build Coastguard Worker   bool GetSSLInfo(SSLInfo* ssl_info) override;
59*6777b538SAndroid Build Coastguard Worker   int64_t GetTotalReceivedBytes() const override;
60*6777b538SAndroid Build Coastguard Worker   void ApplySocketTag(const SocketTag& tag) override;
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Socket implementation.
63*6777b538SAndroid Build Coastguard Worker   int Read(IOBuffer* buf,
64*6777b538SAndroid Build Coastguard Worker            int buf_len,
65*6777b538SAndroid Build Coastguard Worker            CompletionOnceCallback callback) override;
66*6777b538SAndroid Build Coastguard Worker   int Write(IOBuffer* buf,
67*6777b538SAndroid Build Coastguard Worker             int buf_len,
68*6777b538SAndroid Build Coastguard Worker             CompletionOnceCallback callback,
69*6777b538SAndroid Build Coastguard Worker             const NetworkTrafficAnnotationTag& traffic_annotation) override;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   int SetReceiveBufferSize(int32_t size) override;
72*6777b538SAndroid Build Coastguard Worker   int SetSendBufferSize(int32_t size) override;
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   int GetPeerAddress(IPEndPoint* address) const override;
75*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address) const override;
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker  private:
78*6777b538SAndroid Build Coastguard Worker   enum State {
79*6777b538SAndroid Build Coastguard Worker     STATE_GREET_WRITE,
80*6777b538SAndroid Build Coastguard Worker     STATE_GREET_WRITE_COMPLETE,
81*6777b538SAndroid Build Coastguard Worker     STATE_GREET_READ,
82*6777b538SAndroid Build Coastguard Worker     STATE_GREET_READ_COMPLETE,
83*6777b538SAndroid Build Coastguard Worker     STATE_HANDSHAKE_WRITE,
84*6777b538SAndroid Build Coastguard Worker     STATE_HANDSHAKE_WRITE_COMPLETE,
85*6777b538SAndroid Build Coastguard Worker     STATE_HANDSHAKE_READ,
86*6777b538SAndroid Build Coastguard Worker     STATE_HANDSHAKE_READ_COMPLETE,
87*6777b538SAndroid Build Coastguard Worker     STATE_NONE,
88*6777b538SAndroid Build Coastguard Worker   };
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   // Addressing type that can be specified in requests or responses.
91*6777b538SAndroid Build Coastguard Worker   enum SocksEndPointAddressType {
92*6777b538SAndroid Build Coastguard Worker     kEndPointDomain = 0x03,
93*6777b538SAndroid Build Coastguard Worker     kEndPointResolvedIPv4 = 0x01,
94*6777b538SAndroid Build Coastguard Worker     kEndPointResolvedIPv6 = 0x04,
95*6777b538SAndroid Build Coastguard Worker   };
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker   static const unsigned int kGreetReadHeaderSize;
98*6777b538SAndroid Build Coastguard Worker   static const unsigned int kWriteHeaderSize;
99*6777b538SAndroid Build Coastguard Worker   static const unsigned int kReadHeaderSize;
100*6777b538SAndroid Build Coastguard Worker   static const uint8_t kSOCKS5Version;
101*6777b538SAndroid Build Coastguard Worker   static const uint8_t kTunnelCommand;
102*6777b538SAndroid Build Coastguard Worker   static const uint8_t kNullByte;
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   void DoCallback(int result);
105*6777b538SAndroid Build Coastguard Worker   void OnIOComplete(int result);
106*6777b538SAndroid Build Coastguard Worker   void OnReadWriteComplete(CompletionOnceCallback callback, int result);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   int DoLoop(int last_io_result);
109*6777b538SAndroid Build Coastguard Worker   int DoHandshakeRead();
110*6777b538SAndroid Build Coastguard Worker   int DoHandshakeReadComplete(int result);
111*6777b538SAndroid Build Coastguard Worker   int DoHandshakeWrite();
112*6777b538SAndroid Build Coastguard Worker   int DoHandshakeWriteComplete(int result);
113*6777b538SAndroid Build Coastguard Worker   int DoGreetRead();
114*6777b538SAndroid Build Coastguard Worker   int DoGreetReadComplete(int result);
115*6777b538SAndroid Build Coastguard Worker   int DoGreetWrite();
116*6777b538SAndroid Build Coastguard Worker   int DoGreetWriteComplete(int result);
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Writes the SOCKS handshake buffer into |handshake|
119*6777b538SAndroid Build Coastguard Worker   // and return OK on success.
120*6777b538SAndroid Build Coastguard Worker   int BuildHandshakeWriteBuffer(std::string* handshake) const;
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   CompletionRepeatingCallback io_callback_;
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker   // Stores the underlying socket.
125*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<StreamSocket> transport_socket_;
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   State next_state_ = STATE_NONE;
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   // Stores the callback to the layer above, called on completing Connect().
130*6777b538SAndroid Build Coastguard Worker   CompletionOnceCallback user_callback_;
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   // This IOBuffer is used by the class to read and write
133*6777b538SAndroid Build Coastguard Worker   // SOCKS handshake data. The length contains the expected size to
134*6777b538SAndroid Build Coastguard Worker   // read or write.
135*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBuffer> handshake_buf_;
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   // While writing, this buffer stores the complete write handshake data.
138*6777b538SAndroid Build Coastguard Worker   // While reading, it stores the handshake information received so far.
139*6777b538SAndroid Build Coastguard Worker   std::string buffer_;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   // This becomes true when the SOCKS handshake has completed and the
142*6777b538SAndroid Build Coastguard Worker   // overlying connection is free to communicate.
143*6777b538SAndroid Build Coastguard Worker   bool completed_handshake_ = false;
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker   // These contain the bytes sent / received by the SOCKS handshake.
146*6777b538SAndroid Build Coastguard Worker   size_t bytes_sent_ = 0;
147*6777b538SAndroid Build Coastguard Worker   size_t bytes_received_ = 0;
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   size_t read_header_size;
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker   bool was_ever_used_ = false;
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker   const HostPortPair destination_;
154*6777b538SAndroid Build Coastguard Worker 
155*6777b538SAndroid Build Coastguard Worker   NetLogWithSource net_log_;
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker   // Traffic annotation for socket control.
158*6777b538SAndroid Build Coastguard Worker   NetworkTrafficAnnotationTag traffic_annotation_;
159*6777b538SAndroid Build Coastguard Worker };
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker }  // namespace net
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_SOCKS5_CLIENT_SOCKET_H_
164