From 75c63d2de6a7d9bcd4cad77ec68108213c43c356 Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Fri, 15 Jan 2016 15:29:57 +0300 Subject: [PATCH] add support for -u2 in socks --- man/3proxy.cfg.3 | 11 ++++++++++- src/common.c | 2 +- src/proxy.c | 2 +- src/proxymain.c | 7 +++++-- src/socks.c | 7 ++++--- src/structures.h | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/man/3proxy.cfg.3 b/man/3proxy.cfg.3 index 58a39de..0e7eec7 100644 --- a/man/3proxy.cfg.3 +++ b/man/3proxy.cfg.3 @@ -119,12 +119,21 @@ view without ability to reset). .br (for udppm) - singlepacket, expect only one packet from both client and server .br +.B -u +Never ask for username/password +.br +.B -u2 +(socks) require username/password in authentication methods +.br .B -a (for proxy) - anonymous proxy (no information about client reported) .br .B -a1 (for proxy) - anonymous proxy (random client information reported) .br +.B -a2 +(for proxy) - generate Via: and X-Forwared-For: instead of Forwarded: +.br .B -6 Only resolve IPv6 addresses .br @@ -570,7 +579,7 @@ Operation is one of: FTP_LIST - FTP list request .br FTP_DATA - FTP data connection. Note: FTP_DATA requires access to dynamic - non-ptivileged (1024-65535) ports on remote side. +non-ptivileged (1024-65535) ports on remote side. .br FTP - matches any FTP/FTP Data request .br diff --git a/src/common.c b/src/common.c index 79632dc..a160395 100644 --- a/src/common.c +++ b/src/common.c @@ -262,7 +262,7 @@ int parseusername(char *username, struct clientparam *param, int extpasswd){ char *sb = NULL, *se = NULL, *sp = NULL; if(!username || !*username) return 1; - if(!param->srv->nouser && (sb = strchr(username, ':')) && (se = strchr(sb + 1, ':')) && (!extpasswd || (sp = strchr(se + 1, ':')))){ + if(param->srv->needuser && (sb = strchr(username, ':')) && (se = strchr(sb + 1, ':')) && (!extpasswd || (sp = strchr(se + 1, ':')))){ *sb = 0; *se = 0; if(sp) *sp = 0; diff --git a/src/proxy.c b/src/proxy.c index 3d1ad0c..d55bc0d 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1072,7 +1072,7 @@ CLEANRET: else if(param->res >=30 && param->res < 80) { socksend(param->clisock, (unsigned char *)proxy_stringtable[5], (int)strlen(proxy_stringtable[5]), conf.timeouts[STRING_S]); } - else if(param->res == 1 || (param->srv->nouser && param->res < 10)) { + else if(param->res == 1 || (!param->srv->needuser && param->res < 10)) { socksend(param->clisock, (unsigned char *)proxy_stringtable[11], (int)strlen(proxy_stringtable[11]), conf.timeouts[STRING_S]); } else if(param->res < 10) { diff --git a/src/proxymain.c b/src/proxymain.c index a37cb67..316ff77 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -119,6 +119,7 @@ int MODULEMAINFUNC (int argc, char** argv){ " -d go to background (daemon)\n" #else " -u never ask for username\n" + " -u2 always ask for username\n" #endif " -fFORMAT logging format (see documentation)\n" " -l log to stderr\n" @@ -195,7 +196,7 @@ int MODULEMAINFUNC (int argc, char** argv){ conf.services = conf.services->prev = &srv; } #else - srv.nouser = 1; + srv.needuser = 0; #endif for (i=1; ilogdumpsrv = conf.logdumpsrv; srv->logdumpcli = conf.logdumpcli; srv->cbsock = INVALID_SOCKET; + srv->needuser = 1; memset(param, 0, sizeof(struct clientparam)); param->srv = srv; param->remsock = param->clisock = param->ctrlsock = param->ctrlsocksrv = INVALID_SOCKET; diff --git a/src/socks.c b/src/socks.c index 52814db..1dea56d 100644 --- a/src/socks.c +++ b/src/socks.c @@ -48,13 +48,14 @@ void * sockschild(struct clientparam* param) { if ((i = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);} /* nmethods */ for (; i; i--) { if ((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_S], 0)) == EOF) {RETURN(441);} - if (res == 2 && !param->srv->nouser) { + if (res == 2 && param->srv->needuser) { havepass = res; } } buf[0] = 5; - buf[1] = havepass; + buf[1] = (param->srv->needuser > 1 && !havepass)? 255 : havepass; if(socksend(param->clisock, buf, 2, conf.timeouts[STRING_S])!=2){RETURN(401);} + if (param->srv->needuser > 1 && !havepass) RETURN(4); if (havepass) { if (((res = sockgetcharcli(param, conf.timeouts[SINGLEBYTE_L], 0))) != 1) { RETURN(412); @@ -150,7 +151,7 @@ void * sockschild(struct clientparam* param) { else { sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]); buf[127] = 0; - if(!param->srv->nouser && *buf && !param->username)param->username = (unsigned char *)mystrdup((char *)buf); + if(param->srv->needuser && *buf && !param->username)param->username = (unsigned char *)mystrdup((char *)buf); if(!memcmp(SAADDR(¶m->req), "\0\0\0", 3)){ param->service = S_SOCKS45; sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]); diff --git a/src/structures.h b/src/structures.h index 536b03c..c6219c2 100644 --- a/src/structures.h +++ b/src/structures.h @@ -366,7 +366,7 @@ struct srvparam { int version; int singlepacket; int usentlm; - int nouser; + int needuser; int silent; int transparent; int nfilters, nreqfilters, nhdrfilterscli, nhdrfilterssrv, npredatfilters, ndatfilterscli, ndatfilterssrv;