mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Stop proxying connections to localhost by default; should fix
`x11-proxy-crash'. [originally from svn r2348]
This commit is contained in:
parent
c583c6e85e
commit
8304f4e0dc
@ -1,4 +1,4 @@
|
|||||||
\versionid $Id: config.but,v 1.45 2002/12/18 11:39:25 simon Exp $
|
\versionid $Id: config.but,v 1.46 2002/12/18 12:18:54 simon Exp $
|
||||||
|
|
||||||
\C{config} Configuring PuTTY
|
\C{config} Configuring PuTTY
|
||||||
|
|
||||||
@ -1439,6 +1439,12 @@ from proxying.
|
|||||||
|
|
||||||
This excludes both of the above ranges at once.
|
This excludes both of the above ranges at once.
|
||||||
|
|
||||||
|
Connections to the local host (the host name \c{localhost}, and any
|
||||||
|
loopback IP address) are never proxied, even if the proxy exclude
|
||||||
|
list does not explicitly contain them. It is very unlikely that this
|
||||||
|
behaviour would ever cause problems, but if it does you can change
|
||||||
|
it by enabling \q{Consider proxying local host connections}.
|
||||||
|
|
||||||
\S{config-proxy-auth} Username and password
|
\S{config-proxy-auth} Username and password
|
||||||
|
|
||||||
\cfg{winhelp-topic}{proxy.auth}
|
\cfg{winhelp-topic}{proxy.auth}
|
||||||
|
@ -76,6 +76,8 @@ void sk_cleanup(void); /* called just before program exit */
|
|||||||
|
|
||||||
SockAddr sk_namelookup(char *host, char **canonicalname);
|
SockAddr sk_namelookup(char *host, char **canonicalname);
|
||||||
void sk_getaddr(SockAddr addr, char *buf, int buflen);
|
void sk_getaddr(SockAddr addr, char *buf, int buflen);
|
||||||
|
int sk_hostname_is_local(char *name);
|
||||||
|
int sk_address_is_local(SockAddr addr);
|
||||||
enum { ADDRTYPE_IPV4, ADDRTYPE_IPV6 };
|
enum { ADDRTYPE_IPV4, ADDRTYPE_IPV6 };
|
||||||
int sk_addrtype(SockAddr addr);
|
int sk_addrtype(SockAddr addr);
|
||||||
void sk_addrcopy(SockAddr addr, char *buf);
|
void sk_addrcopy(SockAddr addr, char *buf);
|
||||||
|
8
proxy.c
8
proxy.c
@ -247,6 +247,14 @@ static int proxy_for_destination (SockAddr addr, char * hostname, int port)
|
|||||||
int hostip_len, hostname_len;
|
int hostip_len, hostname_len;
|
||||||
char * exclude_list;
|
char * exclude_list;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check the host name and IP against the hard-coded
|
||||||
|
* representations of `localhost'.
|
||||||
|
*/
|
||||||
|
if (!cfg.even_proxy_localhost &&
|
||||||
|
(sk_hostname_is_local(hostname) || sk_address_is_local(addr)))
|
||||||
|
return 0; /* do not proxy */
|
||||||
|
|
||||||
/* we want a string representation of the IP address for comparisons */
|
/* we want a string representation of the IP address for comparisons */
|
||||||
sk_getaddr(addr, hostip, 64);
|
sk_getaddr(addr, hostip, 64);
|
||||||
|
|
||||||
|
1
putty.h
1
putty.h
@ -214,6 +214,7 @@ struct config_tag {
|
|||||||
int tcp_nodelay;
|
int tcp_nodelay;
|
||||||
/* Proxy options */
|
/* Proxy options */
|
||||||
char proxy_exclude_list[512];
|
char proxy_exclude_list[512];
|
||||||
|
int even_proxy_localhost;
|
||||||
enum { PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET } proxy_type;
|
enum { PROXY_NONE, PROXY_HTTP, PROXY_SOCKS, PROXY_TELNET } proxy_type;
|
||||||
char proxy_host[512];
|
char proxy_host[512];
|
||||||
int proxy_port;
|
int proxy_port;
|
||||||
|
@ -150,6 +150,7 @@ void save_settings(char *section, int do_host, Config * cfg)
|
|||||||
|
|
||||||
/* proxy settings */
|
/* proxy settings */
|
||||||
write_setting_s(sesskey, "ProxyExcludeList", cfg->proxy_exclude_list);
|
write_setting_s(sesskey, "ProxyExcludeList", cfg->proxy_exclude_list);
|
||||||
|
write_setting_i(sesskey, "ProxyLocalhost", cfg->even_proxy_localhost);
|
||||||
write_setting_i(sesskey, "ProxyType", cfg->proxy_type);
|
write_setting_i(sesskey, "ProxyType", cfg->proxy_type);
|
||||||
write_setting_s(sesskey, "ProxyHost", cfg->proxy_host);
|
write_setting_s(sesskey, "ProxyHost", cfg->proxy_host);
|
||||||
write_setting_i(sesskey, "ProxyPort", cfg->proxy_port);
|
write_setting_i(sesskey, "ProxyPort", cfg->proxy_port);
|
||||||
@ -383,6 +384,7 @@ void load_settings(char *section, int do_host, Config * cfg)
|
|||||||
/* proxy settings */
|
/* proxy settings */
|
||||||
gpps(sesskey, "ProxyExcludeList", "", cfg->proxy_exclude_list,
|
gpps(sesskey, "ProxyExcludeList", "", cfg->proxy_exclude_list,
|
||||||
sizeof(cfg->proxy_exclude_list));
|
sizeof(cfg->proxy_exclude_list));
|
||||||
|
gppi(sesskey, "ProxyLocalhost", 0, &cfg->even_proxy_localhost);
|
||||||
gppi(sesskey, "ProxyType", PROXY_NONE, &i); cfg->proxy_type = i;
|
gppi(sesskey, "ProxyType", PROXY_NONE, &i); cfg->proxy_type = i;
|
||||||
gpps(sesskey, "ProxyHost", "proxy", cfg->proxy_host,
|
gpps(sesskey, "ProxyHost", "proxy", cfg->proxy_host,
|
||||||
sizeof(cfg->proxy_host));
|
sizeof(cfg->proxy_host));
|
||||||
|
20
unix/uxnet.c
20
unix/uxnet.c
@ -209,6 +209,26 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sk_hostname_is_local(char *name)
|
||||||
|
{
|
||||||
|
return !strcmp(name, "localhost");
|
||||||
|
}
|
||||||
|
|
||||||
|
int sk_address_is_local(SockAddr addr)
|
||||||
|
{
|
||||||
|
#ifdef IPV6
|
||||||
|
if (addr->family == AF_INET) {
|
||||||
|
#endif
|
||||||
|
struct in_addr a;
|
||||||
|
a.s_addr = htonl(addr->address);
|
||||||
|
return ipv4_is_loopback(a);
|
||||||
|
#ifdef IPV6
|
||||||
|
} else {
|
||||||
|
FIXME; /* someone who can compile for IPV6 had better do this bit */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int sk_addrtype(SockAddr addr)
|
int sk_addrtype(SockAddr addr)
|
||||||
{
|
{
|
||||||
return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6);
|
return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6);
|
||||||
|
11
windlg.c
11
windlg.c
@ -454,6 +454,7 @@ enum { IDCX_ABOUT =
|
|||||||
IDC_PROXYPORTEDIT,
|
IDC_PROXYPORTEDIT,
|
||||||
IDC_PROXYEXCLUDESTATIC,
|
IDC_PROXYEXCLUDESTATIC,
|
||||||
IDC_PROXYEXCLUDEEDIT,
|
IDC_PROXYEXCLUDEEDIT,
|
||||||
|
IDC_PROXYLOCALHOST,
|
||||||
IDC_PROXYUSERSTATIC,
|
IDC_PROXYUSERSTATIC,
|
||||||
IDC_PROXYUSEREDIT,
|
IDC_PROXYUSEREDIT,
|
||||||
IDC_PROXYPASSSTATIC,
|
IDC_PROXYPASSSTATIC,
|
||||||
@ -882,6 +883,7 @@ char *help_context_cmd(int id)
|
|||||||
return "JI(`',`proxy.main')";
|
return "JI(`',`proxy.main')";
|
||||||
case IDC_PROXYEXCLUDESTATIC:
|
case IDC_PROXYEXCLUDESTATIC:
|
||||||
case IDC_PROXYEXCLUDEEDIT:
|
case IDC_PROXYEXCLUDEEDIT:
|
||||||
|
case IDC_PROXYLOCALHOST:
|
||||||
return "JI(`',`proxy.exclude')";
|
return "JI(`',`proxy.exclude')";
|
||||||
case IDC_PROXYUSERSTATIC:
|
case IDC_PROXYUSERSTATIC:
|
||||||
case IDC_PROXYUSEREDIT:
|
case IDC_PROXYUSEREDIT:
|
||||||
@ -1349,6 +1351,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
|
|||||||
SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host);
|
SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host);
|
||||||
SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE);
|
SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE);
|
||||||
SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list);
|
SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list);
|
||||||
|
CheckDlgButton(hwnd, IDC_PROXYLOCALHOST, cfg.even_proxy_localhost);
|
||||||
SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command);
|
SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command);
|
||||||
SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username);
|
SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username);
|
||||||
SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password);
|
SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password);
|
||||||
@ -1868,6 +1871,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
|
|||||||
multiedit(&cp,
|
multiedit(&cp,
|
||||||
"&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC,
|
"&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC,
|
||||||
IDC_PROXYEXCLUDEEDIT, 100, NULL);
|
IDC_PROXYEXCLUDEEDIT, 100, NULL);
|
||||||
|
checkbox(&cp, "Consider pro&xying local host connections",
|
||||||
|
IDC_PROXYLOCALHOST);
|
||||||
staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC,
|
staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC,
|
||||||
IDC_PROXYUSEREDIT, 60);
|
IDC_PROXYUSEREDIT, 60);
|
||||||
staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
|
staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
|
||||||
@ -3023,6 +3028,12 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
|
|||||||
IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5;
|
IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IDC_PROXYLOCALHOST:
|
||||||
|
if (HIWORD(wParam) == BN_CLICKED ||
|
||||||
|
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||||
|
cfg.even_proxy_localhost =
|
||||||
|
IsDlgButtonChecked(hwnd, IDC_PROXYLOCALHOST);
|
||||||
|
break;
|
||||||
case IDC_PROXYTYPENONE:
|
case IDC_PROXYTYPENONE:
|
||||||
case IDC_PROXYTYPEHTTP:
|
case IDC_PROXYTYPEHTTP:
|
||||||
case IDC_PROXYTYPESOCKS:
|
case IDC_PROXYTYPESOCKS:
|
||||||
|
20
winnet.c
20
winnet.c
@ -371,6 +371,26 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sk_hostname_is_local(char *name)
|
||||||
|
{
|
||||||
|
return !strcmp(name, "localhost");
|
||||||
|
}
|
||||||
|
|
||||||
|
int sk_address_is_local(SockAddr addr)
|
||||||
|
{
|
||||||
|
#ifdef IPV6
|
||||||
|
if (addr->family == AF_INET) {
|
||||||
|
#endif
|
||||||
|
struct in_addr a;
|
||||||
|
a.s_addr = htonl(addr->address);
|
||||||
|
return ipv4_is_loopback(a);
|
||||||
|
#ifdef IPV6
|
||||||
|
} else {
|
||||||
|
FIXME; /* someone who can compile for IPV6 had better do this bit */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int sk_addrtype(SockAddr addr)
|
int sk_addrtype(SockAddr addr)
|
||||||
{
|
{
|
||||||
return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6);
|
return (addr->family == AF_INET ? ADDRTYPE_IPV4 : ADDRTYPE_IPV6);
|
||||||
|
Loading…
Reference in New Issue
Block a user