Procházet zdrojové kódy

add support for -u2 in socks

z3APA3A před 10 roky
rodič
revize
75c63d2de6
6 změnil soubory, kde provedl 22 přidání a 9 odebrání
  1. 10 1
      man/3proxy.cfg.3
  2. 1 1
      src/common.c
  3. 1 1
      src/proxy.c
  4. 5 2
      src/proxymain.c
  5. 4 3
      src/socks.c
  6. 1 1
      src/structures.h

+ 10 - 1
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

+ 1 - 1
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;

+ 1 - 1
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) {

+ 5 - 2
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; i<argc; i++) {
@@ -287,7 +288,8 @@ int MODULEMAINFUNC (int argc, char** argv){
 			iscbl = 1;
 			break;
 		 case 'u':
-			srv.nouser = 1;
+			srv.needuser = 0;
+			if(*(argv[i] + 2)) needuser = atoi(argv[i] + 2);
 			break;
 		 case 'T':
 			srv.transparent = 1;
@@ -672,6 +674,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
  srv->logdumpsrv = 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;

+ 4 - 3
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(&param->req), "\0\0\0", 3)){
 		param->service = S_SOCKS45;
 		sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, 0, conf.timeouts[STRING_S]);

+ 1 - 1
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;