2 * Network proxy abstraction in PuTTY
4 * A proxy layer, if necessary, wedges itself between the
5 * network code and the higher level backend.
7 * Supported proxies: HTTP CONNECT, generic telnet, SOCKS 4 & 5
13 #define PROXY_ERROR_GENERAL 8000
14 #define PROXY_ERROR_UNEXPECTED 8001
16 typedef struct Socket_proxy_tag
* Proxy_Socket
;
18 struct Socket_proxy_tag
{
19 const struct socket_function_table
*fn
;
20 /* the above variable absolutely *must* be the first in this structure */
29 bufchain pending_output_data
;
30 bufchain pending_oob_output_data
;
32 bufchain pending_input_data
;
35 #define PROXY_STATE_NEW -1
36 #define PROXY_STATE_ACTIVE 0
38 int state
; /* proxy states greater than 0 are implementation
39 * dependent, but represent various stages/states
40 * of the initialization/setup/negotiation with the
43 int freeze
; /* should we freeze the underlying socket when
44 * we are done with the proxy negotiation? this
45 * simply caches the value of sk_set_frozen calls.
48 #define PROXY_CHANGE_NEW -1
49 #define PROXY_CHANGE_CLOSING 0
50 #define PROXY_CHANGE_SENT 1
51 #define PROXY_CHANGE_RECEIVE 2
52 #define PROXY_CHANGE_ACCEPTING 3
54 /* something has changed (a call from the sub socket
55 * layer into our Proxy Plug layer, or we were just
56 * created, etc), so the proxy layer needs to handle
57 * this change (the type of which is the second argument)
58 * and further the proxy negotiation process.
61 int (*negotiate
) (Proxy_Socket
/* this */, int /* change type */);
63 /* current arguments of plug handlers
64 * (for use by proxy's negotiate function)
68 const char *closing_error_msg
;
69 int closing_error_code
;
70 int closing_calling_back
;
81 OSSocket accepting_sock
;
83 /* configuration, used to look up proxy settings */
86 /* CHAP transient data */
87 int chap_num_attributes
;
88 int chap_num_attributes_processed
;
89 int chap_current_attribute
;
90 int chap_current_datalen
;
93 typedef struct Plug_proxy_tag
* Proxy_Plug
;
95 struct Plug_proxy_tag
{
96 const struct plug_function_table
*fn
;
97 /* the above variable absolutely *must* be the first in this structure */
99 Proxy_Socket proxy_socket
;
103 extern void proxy_activate (Proxy_Socket
);
105 extern int proxy_http_negotiate (Proxy_Socket
, int);
106 extern int proxy_telnet_negotiate (Proxy_Socket
, int);
107 extern int proxy_socks4_negotiate (Proxy_Socket
, int);
108 extern int proxy_socks5_negotiate (Proxy_Socket
, int);
111 * This may be reused by local-command proxies on individual
114 char *format_telnet_command(SockAddr addr
, int port
, Conf
*conf
);
117 * These are implemented in cproxy.c or nocproxy.c, depending on
118 * whether encrypted proxy authentication is available.
120 extern void proxy_socks5_offerencryptedauth(char *command
, int *len
);
121 extern int proxy_socks5_handlechap (Proxy_Socket p
);
122 extern int proxy_socks5_selectchap(Proxy_Socket p
);