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_SOCKS_CLIENT_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKS_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/gtest_prod_util.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/resolve_error_info.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker namespace net { 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // The SOCKS client socket implementation 32*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SOCKSClientSocket : public StreamSocket { 33*6777b538SAndroid Build Coastguard Worker public: 34*6777b538SAndroid Build Coastguard Worker // |destination| contains the hostname and port to which the socket above will 35*6777b538SAndroid Build Coastguard Worker // communicate to via the socks layer. For testing the referrer is optional. 36*6777b538SAndroid Build Coastguard Worker // |network_anonymization_key| is used for host resolution. 37*6777b538SAndroid Build Coastguard Worker SOCKSClientSocket(std::unique_ptr<StreamSocket> transport_socket, 38*6777b538SAndroid Build Coastguard Worker const HostPortPair& destination, 39*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 40*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 41*6777b538SAndroid Build Coastguard Worker HostResolver* host_resolver, 42*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 43*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker SOCKSClientSocket(const SOCKSClientSocket&) = delete; 46*6777b538SAndroid Build Coastguard Worker SOCKSClientSocket& operator=(const SOCKSClientSocket&) = delete; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // On destruction Disconnect() is called. 49*6777b538SAndroid Build Coastguard Worker ~SOCKSClientSocket() override; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // StreamSocket implementation. 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Does the SOCKS handshake and completes the protocol. 54*6777b538SAndroid Build Coastguard Worker int Connect(CompletionOnceCallback callback) override; 55*6777b538SAndroid Build Coastguard Worker void Disconnect() override; 56*6777b538SAndroid Build Coastguard Worker bool IsConnected() const override; 57*6777b538SAndroid Build Coastguard Worker bool IsConnectedAndIdle() const override; 58*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& NetLog() const override; 59*6777b538SAndroid Build Coastguard Worker bool WasEverUsed() const override; 60*6777b538SAndroid Build Coastguard Worker NextProto GetNegotiatedProtocol() const override; 61*6777b538SAndroid Build Coastguard Worker bool GetSSLInfo(SSLInfo* ssl_info) override; 62*6777b538SAndroid Build Coastguard Worker int64_t GetTotalReceivedBytes() const override; 63*6777b538SAndroid Build Coastguard Worker void ApplySocketTag(const SocketTag& tag) override; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Socket implementation. 66*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, 67*6777b538SAndroid Build Coastguard Worker int buf_len, 68*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 69*6777b538SAndroid Build Coastguard Worker int ReadIfReady(IOBuffer* buf, 70*6777b538SAndroid Build Coastguard Worker int buf_len, 71*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 72*6777b538SAndroid Build Coastguard Worker int CancelReadIfReady() override; 73*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 74*6777b538SAndroid Build Coastguard Worker int buf_len, 75*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 76*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation) override; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker int SetReceiveBufferSize(int32_t size) override; 79*6777b538SAndroid Build Coastguard Worker int SetSendBufferSize(int32_t size) override; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const override; 82*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const override; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Returns error information about any host resolution attempt. 85*6777b538SAndroid Build Coastguard Worker ResolveErrorInfo GetResolveErrorInfo() const; 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker private: 88*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(SOCKSClientSocketTest, CompleteHandshake); 89*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(SOCKSClientSocketTest, SOCKS4AFailedDNS); 90*6777b538SAndroid Build Coastguard Worker FRIEND_TEST_ALL_PREFIXES(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6); 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker enum State { 93*6777b538SAndroid Build Coastguard Worker STATE_RESOLVE_HOST, 94*6777b538SAndroid Build Coastguard Worker STATE_RESOLVE_HOST_COMPLETE, 95*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_WRITE, 96*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_WRITE_COMPLETE, 97*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_READ, 98*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_READ_COMPLETE, 99*6777b538SAndroid Build Coastguard Worker STATE_NONE, 100*6777b538SAndroid Build Coastguard Worker }; 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker void DoCallback(int result); 103*6777b538SAndroid Build Coastguard Worker void OnIOComplete(int result); 104*6777b538SAndroid Build Coastguard Worker void OnReadWriteComplete(CompletionOnceCallback callback, int result); 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker int DoLoop(int last_io_result); 107*6777b538SAndroid Build Coastguard Worker int DoResolveHost(); 108*6777b538SAndroid Build Coastguard Worker int DoResolveHostComplete(int 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 114*6777b538SAndroid Build Coastguard Worker const std::string BuildHandshakeWriteBuffer() const; 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker // Stores the underlying socket. 117*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> transport_socket_; 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker State next_state_ = STATE_NONE; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker // Stores the callbacks to the layer above, called on completing Connect(). 122*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback user_callback_; 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // This IOBuffer is used by the class to read and write 125*6777b538SAndroid Build Coastguard Worker // SOCKS handshake data. The length contains the expected size to 126*6777b538SAndroid Build Coastguard Worker // read or write. 127*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> handshake_buf_; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker // While writing, this buffer stores the complete write handshake data. 130*6777b538SAndroid Build Coastguard Worker // While reading, it stores the handshake information received so far. 131*6777b538SAndroid Build Coastguard Worker std::string buffer_; 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker // This becomes true when the SOCKS handshake has completed and the 134*6777b538SAndroid Build Coastguard Worker // overlying connection is free to communicate. 135*6777b538SAndroid Build Coastguard Worker bool completed_handshake_ = false; 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker // These contain the bytes sent / received by the SOCKS handshake. 138*6777b538SAndroid Build Coastguard Worker size_t bytes_sent_ = 0; 139*6777b538SAndroid Build Coastguard Worker size_t bytes_received_ = 0; 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker // This becomes true when the socket is used to send or receive data. 142*6777b538SAndroid Build Coastguard Worker bool was_ever_used_ = false; 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker // Used to resolve the hostname to which the SOCKS proxy will connect. 145*6777b538SAndroid Build Coastguard Worker raw_ptr<HostResolver> host_resolver_; 146*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy_; 147*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ResolveHostRequest> resolve_host_request_; 148*6777b538SAndroid Build Coastguard Worker const HostPortPair destination_; 149*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey network_anonymization_key_; 150*6777b538SAndroid Build Coastguard Worker RequestPriority priority_; 151*6777b538SAndroid Build Coastguard Worker ResolveErrorInfo resolve_error_info_; 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker // Traffic annotation for socket control. 156*6777b538SAndroid Build Coastguard Worker NetworkTrafficAnnotationTag traffic_annotation_; 157*6777b538SAndroid Build Coastguard Worker }; 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker } // namespace net 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_SOCKS_CLIENT_SOCKET_H_ 162