| 
					
				 | 
			
			
				@@ -0,0 +1,59 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Copyright (c) 2001 Matej Pfajfar. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (c) 2001-2004, Roger Dingledine. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (c) 2007-2017, The Tor Project, Inc. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* See LICENSE for licensing information */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifndef SOCKS_REQUEST_ST_H 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define SOCKS_REQUEST_ST_H 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** State of a SOCKS request from a user to an OP.  Also used to encode other 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * information for non-socks user request (such as those on TransPort and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * DNSPort) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+struct socks_request_t { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** Which version of SOCKS did the client use? One of "0, 4, 5" -- where 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * 0 means that no socks handshake ever took place, and this is just a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * stub connection (e.g. see connection_ap_make_link()). */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t socks_version; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** If using socks5 authentication, which authentication type did we 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * negotiate?  currently we support 0 (no authentication) and 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * (username/password). */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t auth_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** What is this stream's goal? One of the SOCKS_COMMAND_* values */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t command; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** Which kind of listener created this stream? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t listener_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  size_t replylen; /**< Length of <b>reply</b>. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t reply[MAX_SOCKS_REPLY_LEN]; /**< Write an entry into this string if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    * we want to specify our own socks reply, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    * rather than using the default socks4 or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    * socks5 socks reply. We use this for the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    * two-stage socks5 handshake. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char address[MAX_SOCKS_ADDR_LEN]; /**< What address did the client ask to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       connect to/resolve? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint16_t port; /**< What port did the client ask to connect to? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unsigned int has_finished : 1; /**< Has the SOCKS handshake finished? Used to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              * make sure we send back a socks reply for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              * every connection. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unsigned int got_auth : 1; /**< Have we received any authentication data? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** If this is set, we will choose "no authentication" instead of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * "username/password" authentication if both are offered. Used as input to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * parse_socks. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unsigned int socks_prefer_no_auth : 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** Number of bytes in username; 0 if username is NULL */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  size_t usernamelen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** Number of bytes in password; 0 if password is NULL */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  uint8_t passwordlen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** The negotiated username value if any (for socks5), or the entire 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * authentication string (for socks4).  This value is NOT nul-terminated; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * see usernamelen for its length. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char *username; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /** The negotiated password value if any (for socks5). This value is NOT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * nul-terminated; see passwordlen for its length. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  char *password; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |