• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_BASE_SOCKETADAPTERS_H_
12 #define WEBRTC_BASE_SOCKETADAPTERS_H_
13 
14 #include <map>
15 #include <string>
16 
17 #include "webrtc/base/asyncsocket.h"
18 #include "webrtc/base/cryptstring.h"
19 #include "webrtc/base/logging.h"
20 
21 namespace rtc {
22 
23 struct HttpAuthContext;
24 class ByteBuffer;
25 
26 ///////////////////////////////////////////////////////////////////////////////
27 
28 // Implements a socket adapter that can buffer and process data internally,
29 // as in the case of connecting to a proxy, where you must speak the proxy
30 // protocol before commencing normal socket behavior.
31 class BufferedReadAdapter : public AsyncSocketAdapter {
32  public:
33   BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
34   virtual ~BufferedReadAdapter();
35 
36   virtual int Send(const void* pv, size_t cb);
37   virtual int Recv(void* pv, size_t cb);
38 
39  protected:
DirectSend(const void * pv,size_t cb)40   int DirectSend(const void* pv, size_t cb) {
41     return AsyncSocketAdapter::Send(pv, cb);
42   }
43 
44   void BufferInput(bool on = true);
45   virtual void ProcessInput(char* data, size_t* len) = 0;
46 
47   virtual void OnReadEvent(AsyncSocket * socket);
48 
49  private:
50   char * buffer_;
51   size_t buffer_size_, data_len_;
52   bool buffering_;
53   DISALLOW_EVIL_CONSTRUCTORS(BufferedReadAdapter);
54 };
55 
56 ///////////////////////////////////////////////////////////////////////////////
57 
58 // Interface for implementing proxy server sockets.
59 class AsyncProxyServerSocket : public BufferedReadAdapter {
60  public:
AsyncProxyServerSocket(AsyncSocket * socket,size_t buffer_size)61   AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size)
62       : BufferedReadAdapter(socket, buffer_size) {}
63   sigslot::signal2<AsyncProxyServerSocket*,
64                    const SocketAddress&>  SignalConnectRequest;
65   virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
66 };
67 
68 ///////////////////////////////////////////////////////////////////////////////
69 
70 // Implements a socket adapter that performs the client side of a
71 // fake SSL handshake. Used for "ssltcp" P2P functionality.
72 class AsyncSSLSocket : public BufferedReadAdapter {
73  public:
74   explicit AsyncSSLSocket(AsyncSocket* socket);
75 
76   virtual int Connect(const SocketAddress& addr);
77 
78  protected:
79   virtual void OnConnectEvent(AsyncSocket* socket);
80   virtual void ProcessInput(char* data, size_t* len);
81   DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLSocket);
82 };
83 
84 // Implements a socket adapter that performs the server side of a
85 // fake SSL handshake. Used when implementing a relay server that does "ssltcp".
86 class AsyncSSLServerSocket : public BufferedReadAdapter {
87  public:
88   explicit AsyncSSLServerSocket(AsyncSocket* socket);
89 
90  protected:
91   virtual void ProcessInput(char* data, size_t* len);
92   DISALLOW_EVIL_CONSTRUCTORS(AsyncSSLServerSocket);
93 };
94 
95 ///////////////////////////////////////////////////////////////////////////////
96 
97 // Implements a socket adapter that speaks the HTTP/S proxy protocol.
98 class AsyncHttpsProxySocket : public BufferedReadAdapter {
99  public:
100   AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent,
101     const SocketAddress& proxy,
102     const std::string& username, const CryptString& password);
103   virtual ~AsyncHttpsProxySocket();
104 
105   // If connect is forced, the adapter will always issue an HTTP CONNECT to the
106   // target address.  Otherwise, it will connect only if the destination port
107   // is not port 80.
SetForceConnect(bool force)108   void SetForceConnect(bool force) { force_connect_ = force; }
109 
110   virtual int Connect(const SocketAddress& addr);
111   virtual SocketAddress GetRemoteAddress() const;
112   virtual int Close();
113   virtual ConnState GetState() const;
114 
115  protected:
116   virtual void OnConnectEvent(AsyncSocket* socket);
117   virtual void OnCloseEvent(AsyncSocket* socket, int err);
118   virtual void ProcessInput(char* data, size_t* len);
119 
120   bool ShouldIssueConnect() const;
121   void SendRequest();
122   void ProcessLine(char* data, size_t len);
123   void EndResponse();
124   void Error(int error);
125 
126  private:
127   SocketAddress proxy_, dest_;
128   std::string agent_, user_, headers_;
129   CryptString pass_;
130   bool force_connect_;
131   size_t content_length_;
132   int defer_error_;
133   bool expect_close_;
134   enum ProxyState {
135     PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS,
136     PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR
137   } state_;
138   HttpAuthContext * context_;
139   std::string unknown_mechanisms_;
140   DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxySocket);
141 };
142 
143 /* TODO: Implement this.
144 class AsyncHttpsProxyServerSocket : public AsyncProxyServerSocket {
145  public:
146   explicit AsyncHttpsProxyServerSocket(AsyncSocket* socket);
147 
148  private:
149   virtual void ProcessInput(char * data, size_t& len);
150   void Error(int error);
151   DISALLOW_EVIL_CONSTRUCTORS(AsyncHttpsProxyServerSocket);
152 };
153 */
154 
155 ///////////////////////////////////////////////////////////////////////////////
156 
157 // Implements a socket adapter that speaks the SOCKS proxy protocol.
158 class AsyncSocksProxySocket : public BufferedReadAdapter {
159  public:
160   AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy,
161     const std::string& username, const CryptString& password);
162 
163   virtual int Connect(const SocketAddress& addr);
164   virtual SocketAddress GetRemoteAddress() const;
165   virtual int Close();
166   virtual ConnState GetState() const;
167 
168  protected:
169   virtual void OnConnectEvent(AsyncSocket* socket);
170   virtual void ProcessInput(char* data, size_t* len);
171 
172   void SendHello();
173   void SendConnect();
174   void SendAuth();
175   void Error(int error);
176 
177  private:
178   enum State {
179     SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR
180   };
181   State state_;
182   SocketAddress proxy_, dest_;
183   std::string user_;
184   CryptString pass_;
185   DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxySocket);
186 };
187 
188 // Implements a proxy server socket for the SOCKS protocol.
189 class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket {
190  public:
191   explicit AsyncSocksProxyServerSocket(AsyncSocket* socket);
192 
193  private:
194   virtual void ProcessInput(char* data, size_t* len);
195   void DirectSend(const ByteBuffer& buf);
196 
197   void HandleHello(ByteBuffer* request);
198   void SendHelloReply(int method);
199   void HandleAuth(ByteBuffer* request);
200   void SendAuthReply(int result);
201   void HandleConnect(ByteBuffer* request);
202   virtual void SendConnectResult(int result, const SocketAddress& addr);
203 
204   void Error(int error);
205 
206   static const int kBufferSize = 1024;
207   enum State {
208     SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR
209   };
210   State state_;
211   DISALLOW_EVIL_CONSTRUCTORS(AsyncSocksProxyServerSocket);
212 };
213 
214 ///////////////////////////////////////////////////////////////////////////////
215 
216 // Implements a socket adapter that logs everything that it sends and receives.
217 class LoggingSocketAdapter : public AsyncSocketAdapter {
218  public:
219   LoggingSocketAdapter(AsyncSocket* socket, LoggingSeverity level,
220                  const char * label, bool hex_mode = false);
221 
222   virtual int Send(const void *pv, size_t cb);
223   virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr);
224   virtual int Recv(void *pv, size_t cb);
225   virtual int RecvFrom(void *pv, size_t cb, SocketAddress *paddr);
226   virtual int Close();
227 
228  protected:
229   virtual void OnConnectEvent(AsyncSocket * socket);
230   virtual void OnCloseEvent(AsyncSocket * socket, int err);
231 
232  private:
233   LoggingSeverity level_;
234   std::string label_;
235   bool hex_mode_;
236   LogMultilineState lms_;
237   DISALLOW_EVIL_CONSTRUCTORS(LoggingSocketAdapter);
238 };
239 
240 ///////////////////////////////////////////////////////////////////////////////
241 
242 }  // namespace rtc
243 
244 #endif  // WEBRTC_BASE_SOCKETADAPTERS_H_
245