X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=proxy.c;h=52006794cb9753b8af0c1bea554c0d3045c9890c;hb=510f49e405e71ba5c97875e7a019364e1ef5fac9;hp=423ed8da492eac154f2e725a3a2a9cdc6f828332;hpb=89da2ddf564a93414ee9ab2df3f053608094e417;p=PuTTY.git diff --git a/proxy.c b/proxy.c index 423ed8da..52006794 100644 --- a/proxy.c +++ b/proxy.c @@ -362,17 +362,42 @@ int proxy_for_destination (SockAddr addr, const char *hostname, return 1; } +static char *dns_log_msg(const char *host, int addressfamily, + const char *reason) +{ + return dupprintf("Looking up host \"%s\"%s for %s", host, + (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" : + addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : + ""), reason); +} + SockAddr name_lookup(const char *host, int port, char **canonicalname, - Conf *conf, int addressfamily) + Conf *conf, int addressfamily, void *frontend, + const char *reason) { + char *logmsg; if (conf_get_int(conf, CONF_proxy_type) != PROXY_NONE && do_proxy_dns(conf) && proxy_for_destination(NULL, host, port, conf)) { + + if (frontend) { + logmsg = dupprintf("Leaving host lookup to proxy of \"%s\"" + " (for %s)", host, reason); + logevent(frontend, logmsg); + sfree(logmsg); + } + *canonicalname = dupstr(host); return sk_nonamelookup(host); + } else { + if (frontend) { + logmsg = dns_log_msg(host, addressfamily, reason); + logevent(frontend, logmsg); + sfree(logmsg); + } + + return sk_namelookup(host, canonicalname, addressfamily); } - - return sk_namelookup(host, canonicalname, addressfamily); } Socket new_connection(SockAddr addr, const char *hostname, @@ -388,7 +413,8 @@ Socket new_connection(SockAddr addr, const char *hostname, sk_proxy_write_eof, sk_proxy_flush, sk_proxy_set_frozen, - sk_proxy_socket_error + sk_proxy_socket_error, + NULL, /* peer_info */ }; static const struct plug_function_table plug_fn_table = { @@ -406,6 +432,7 @@ Socket new_connection(SockAddr addr, const char *hostname, Proxy_Plug pplug; SockAddr proxy_addr; char *proxy_canonical_name; + const char *proxy_type; Socket sret; int type; @@ -438,23 +465,45 @@ Socket new_connection(SockAddr addr, const char *hostname, type = conf_get_int(conf, CONF_proxy_type); if (type == PROXY_HTTP) { ret->negotiate = proxy_http_negotiate; + proxy_type = "HTTP"; } else if (type == PROXY_SOCKS4) { ret->negotiate = proxy_socks4_negotiate; + proxy_type = "SOCKS 4"; } else if (type == PROXY_SOCKS5) { ret->negotiate = proxy_socks5_negotiate; + proxy_type = "SOCKS 5"; } else if (type == PROXY_TELNET) { ret->negotiate = proxy_telnet_negotiate; + proxy_type = "Telnet"; } else { ret->error = "Proxy error: Unknown proxy method"; return (Socket) ret; } + { + char *logmsg = dupprintf("Will use %s proxy at %s:%d to connect" + " to %s:%d", proxy_type, + conf_get_str(conf, CONF_proxy_host), + conf_get_int(conf, CONF_proxy_port), + hostname, port); + plug_log(plug, 2, NULL, 0, logmsg, 0); + sfree(logmsg); + } + /* create the proxy plug to map calls from the actual * socket into our proxy socket layer */ pplug = snew(struct Plug_proxy_tag); pplug->fn = &plug_fn_table; pplug->proxy_socket = ret; + { + char *logmsg = dns_log_msg(conf_get_str(conf, CONF_proxy_host), + conf_get_int(conf, CONF_addressfamily), + "proxy"); + plug_log(plug, 2, NULL, 0, logmsg, 0); + sfree(logmsg); + } + /* look-up proxy */ proxy_addr = sk_namelookup(conf_get_str(conf, CONF_proxy_host), &proxy_canonical_name, @@ -467,6 +516,16 @@ Socket new_connection(SockAddr addr, const char *hostname, } sfree(proxy_canonical_name); + { + char addrbuf[256], *logmsg; + sk_getaddr(proxy_addr, addrbuf, lenof(addrbuf)); + logmsg = dupprintf("Connecting to %s proxy at %s port %d", + proxy_type, addrbuf, + conf_get_int(conf, CONF_proxy_port)); + plug_log(plug, 2, NULL, 0, logmsg, 0); + sfree(logmsg); + } + /* create the actual socket we will be using, * connected to our proxy server and port. */ @@ -1187,9 +1246,11 @@ int proxy_socks5_negotiate (Proxy_Socket p, int change) char userpwbuf[255 + 255 + 3]; int ulen, plen; ulen = strlen(username); - if (ulen > 255) ulen = 255; if (ulen < 1) ulen = 1; + if (ulen > 255) ulen = 255; + if (ulen < 1) ulen = 1; plen = strlen(password); - if (plen > 255) plen = 255; if (plen < 1) plen = 1; + if (plen > 255) plen = 255; + if (plen < 1) plen = 1; userpwbuf[0] = 1; /* version number of subnegotiation */ userpwbuf[1] = ulen; memcpy(userpwbuf+2, username, ulen); @@ -1453,6 +1514,39 @@ int proxy_telnet_negotiate (Proxy_Socket p, int change) formatted_cmd = format_telnet_command(p->remote_addr, p->remote_port, p->conf); + { + /* + * Re-escape control chars in the command, for logging. + */ + char *reescaped = snewn(4*strlen(formatted_cmd) + 1, char); + const char *in; + char *out; + char *logmsg; + + for (in = formatted_cmd, out = reescaped; *in; in++) { + if (*in == '\n') { + *out++ = '\\'; *out++ = 'n'; + } else if (*in == '\r') { + *out++ = '\\'; *out++ = 'r'; + } else if (*in == '\t') { + *out++ = '\\'; *out++ = 't'; + } else if (*in == '\\') { + *out++ = '\\'; *out++ = '\\'; + } else if ((unsigned)(((unsigned char)*in) - 0x20) < + (0x7F-0x20)) { + *out++ = *in; + } else { + out += sprintf(out, "\\x%02X", (unsigned)*in & 0xFF); + } + } + *out = '\0'; + + logmsg = dupprintf("Sending Telnet proxy command: %s", reescaped); + plug_log(p->plug, 2, NULL, 0, logmsg, 0); + sfree(logmsg); + sfree(reescaped); + } + sk_write(p->sub_socket, formatted_cmd, strlen(formatted_cmd)); sfree(formatted_cmd);