* A proxy layer, if necessary, wedges itself between the
* network code and the higher level backend.
*
- * Supported proxies: HTTP CONNECT, generic telnet
- * In progress: SOCKS
+ * Supported proxies: HTTP CONNECT, generic telnet, SOCKS 4 & 5
*/
#ifndef PUTTY_PROXY_H
typedef struct Socket_proxy_tag * Proxy_Socket;
struct Socket_proxy_tag {
- struct socket_function_table *fn;
+ const struct socket_function_table *fn;
/* the above variable absolutely *must* be the first in this structure */
char * error;
*/
/* closing */
- char *closing_error_msg;
+ const char *closing_error_msg;
int closing_error_code;
int closing_calling_back;
int sent_bufsize;
/* accepting */
- void *accepting_sock;
-
- /* spin locks, for the critical switch from negotiating
- * to active state. we have to dump all of our pending
- * buffers without new events (read, writes, etc) corrupting
- * things. we should not have built up a large amount of
- * pending data during negotiation, so hopefully this will
- * not have a large effect on performance.
- */
+ OSSocket accepting_sock;
- char lock_close;
- char lock_write;
- char lock_write_oob;
- char lock_receive;
- char lock_flush;
- char lock_closing;
- char lock_sent;
- char lock_accepting;
- char lock_freeze;
+ /* configuration, used to look up proxy settings */
+ Config cfg;
+ /* CHAP transient data */
+ int chap_num_attributes;
+ int chap_num_attributes_processed;
+ int chap_current_attribute;
+ int chap_current_datalen;
};
typedef struct Plug_proxy_tag * Proxy_Plug;
struct Plug_proxy_tag {
- struct plug_function_table *fn;
+ const struct plug_function_table *fn;
/* the above variable absolutely *must* be the first in this structure */
Proxy_Socket proxy_socket;
extern int proxy_http_negotiate (Proxy_Socket, int);
extern int proxy_telnet_negotiate (Proxy_Socket, int);
-extern int proxy_socks_negotiate (Proxy_Socket, int);
+extern int proxy_socks4_negotiate (Proxy_Socket, int);
+extern int proxy_socks5_negotiate (Proxy_Socket, int);
+
+/*
+ * This may be reused by local-command proxies on individual
+ * platforms.
+ */
+char *format_telnet_command(SockAddr addr, int port, const Config *cfg);
+
+/*
+ * These are implemented in cproxy.c or nocproxy.c, depending on
+ * whether encrypted proxy authentication is available.
+ */
+extern void proxy_socks5_offerencryptedauth(char *command, int *len);
+extern int proxy_socks5_handlechap (Proxy_Socket p);
+extern int proxy_socks5_selectchap(Proxy_Socket p);
#endif