mirror of
				https://github.com/3proxy/3proxy.git
				synced 2025-10-31 05:45:51 +08:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/origin/devel'
This commit is contained in:
		
						commit
						bf934201bb
					
				| @ -1,145 +0,0 @@ | |||||||
| /*
 |  | ||||||
|    3APA3A simpliest proxy server |  | ||||||
|    (c) 2002-2008 by ZARAZA <3APA3A@security.nnov.ru> |  | ||||||
| 
 |  | ||||||
|    please read License Agreement |  | ||||||
| 
 |  | ||||||
|    $Id: common.c,v 1.81 2007/12/18 09:26:44 vlad Exp $ |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #include "proxy.h" |  | ||||||
| 
 |  | ||||||
| struct counter_header { |  | ||||||
| 	unsigned char sig[4]; |  | ||||||
| 	time_t updated; |  | ||||||
| } cheader = {"3CF", (time_t)0}; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| struct counter_record { |  | ||||||
| 	unsigned long traf; |  | ||||||
| 	unsigned long trafgb; |  | ||||||
| 	time_t cleared; |  | ||||||
| 	time_t updated; |  | ||||||
| } crecord; |  | ||||||
| 
 |  | ||||||
| #ifdef _WIN32 |  | ||||||
| struct counter_header_old { |  | ||||||
| 	unsigned char sig[4]; |  | ||||||
| 	DWORD updated; |  | ||||||
| } cheader_old = {"3CF", (time_t)0}; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| struct counter_record_old { |  | ||||||
| 	unsigned long traf; |  | ||||||
| 	unsigned long trafgb; |  | ||||||
| 	DWORD cleared; |  | ||||||
| 	DWORD updated; |  | ||||||
| } crecord_old; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| int main(int argc, char *argv[]){ |  | ||||||
| 	FILE *txt; |  | ||||||
| 	int bin; |  | ||||||
| 	int i; |  | ||||||
| 	long unsigned lu1, lu2; |  | ||||||
| 	char buf[256]; |  | ||||||
| 	if(argc!=4){ |  | ||||||
| 		fprintf(stderr, "Usage: %s command binary_file text_file\n" |  | ||||||
| 				" commands are:\n" |  | ||||||
| 				"\texport - dump counterfile to text\n" |  | ||||||
| #ifdef _WIN32 |  | ||||||
| 				"\toldexport - export counterfile from older 3proxy version\n" |  | ||||||
| #endif |  | ||||||
| 				"\timport- import counterfile from text\n" |  | ||||||
| 				"Examples:\n" |  | ||||||
| #ifdef _WIN32 |  | ||||||
| 				" %s oldexport counterfile.3cf tmpfile\n" |  | ||||||
| #else |  | ||||||
| 				" %s export counterfilenew.3cf tmpfile\n" |  | ||||||
| #endif |  | ||||||
| 				" %s import counterfilenew.3cf tmpfile\n" |  | ||||||
| 				"text file record format:\n" |  | ||||||
| 				"%%d %%10lu %%10lu %%lu %%lu\n" |  | ||||||
| 				" 1 - counter number\n" |  | ||||||
| 				" 2 - traffic (Bytes)\n" |  | ||||||
| 				" 3 - traffic (GB)\n" |  | ||||||
| 				" 4 - time counter reset (time_t)\n" |  | ||||||
| 				" 5 - time counter updated (time_t)\n" |  | ||||||
| 				,argv[0] , argv[0], argv[0]); |  | ||||||
| 		return 1; |  | ||||||
| 	} |  | ||||||
| 	if(!strcmp(argv[1], "export")){ |  | ||||||
| 		bin = open((char *)argv[2], O_BINARY|O_RDONLY, 0660); |  | ||||||
| 		if(bin < 0){ |  | ||||||
| 			fprintf(stderr, "Failed to open %s\n", argv[2]); |  | ||||||
| 			return 2; |  | ||||||
| 		} |  | ||||||
| 		if(read(bin, &cheader, sizeof(cheader)) != sizeof(cheader) || |  | ||||||
| 		   memcmp(&cheader, "3CF", 4)){ |  | ||||||
| 			fprintf(stderr, "Invalid counter file\n"); |  | ||||||
| 			return 3; |  | ||||||
| 		} |  | ||||||
| 		txt = fopen(argv[3], "w"); |  | ||||||
| 		if(!txt) txt = stdout; |  | ||||||
| 		for(i=1; read(bin, &crecord, sizeof(crecord))==sizeof(crecord); i++) |  | ||||||
| 			fprintf(txt,"%d %10lu %10lu %lu %lu\n", i,  |  | ||||||
| 				crecord.trafgb, |  | ||||||
| 				crecord.traf, |  | ||||||
| 				(unsigned long) crecord.cleared, |  | ||||||
| 				(unsigned long) crecord.updated); |  | ||||||
| 	} |  | ||||||
| #ifdef _WIN32 |  | ||||||
| 	else if(!strcmp(argv[1], "oldexport")){ |  | ||||||
| 		bin = open((char *)argv[2], O_BINARY|O_RDONLY, 0660); |  | ||||||
| 		if(bin < 0){ |  | ||||||
| 			fprintf(stderr, "Failed to open %s\n", argv[2]); |  | ||||||
| 			return 2; |  | ||||||
| 		} |  | ||||||
| 		if(read(bin, &cheader_old, sizeof(cheader_old)) != sizeof(cheader_old) || |  | ||||||
| 		   memcmp(&cheader, "3CF", 4)){ |  | ||||||
| 			fprintf(stderr, "Invalid counter file\n"); |  | ||||||
| 			return 3; |  | ||||||
| 		} |  | ||||||
| 		txt = fopen(argv[3], "w"); |  | ||||||
| 		if(!txt) txt = stdout; |  | ||||||
| 		for(i=1; read(bin, &crecord_old, sizeof(crecord_old))==sizeof(crecord_old); i++) |  | ||||||
| 			fprintf(txt, "%d %10lu %10lu %lu %lu\n", i,  |  | ||||||
| 				crecord_old.trafgb, |  | ||||||
| 				crecord_old.traf, |  | ||||||
| 				(unsigned long) crecord_old.cleared, |  | ||||||
| 				(unsigned long) crecord_old.updated); |  | ||||||
| 	} |  | ||||||
| #endif |  | ||||||
| 	else if(!strcmp(argv[1], "import")){ |  | ||||||
| 		bin = open((char *)argv[2], O_BINARY|O_WRONLY|O_CREAT|O_EXCL, 0660); |  | ||||||
| 		if(bin < 0){ |  | ||||||
| 			fprintf(stderr, "Failed to open %s\n", argv[2]); |  | ||||||
| 			return 2; |  | ||||||
| 		} |  | ||||||
| 		txt = fopen(argv[3], "r"); |  | ||||||
| 		if(!txt) { |  | ||||||
| 			fprintf(stderr, "Failed to open %s\n", argv[3]); |  | ||||||
| 			return 3; |  | ||||||
| 		} |  | ||||||
| 		cheader.updated = time(0); |  | ||||||
| 		write(bin, &cheader, sizeof(cheader)); |  | ||||||
| 		while(fgets(buf, 256, txt) && |  | ||||||
| 			sscanf(buf, "%d %10lu %10lu %lu %lu\n", |  | ||||||
| 				&i, &crecord.trafgb, &crecord.traf, |  | ||||||
| 				&lu1, &lu2) == 5){ |  | ||||||
| 
 |  | ||||||
| 			crecord.cleared = (time_t) lu1; |  | ||||||
| 			crecord.updated = (time_t) lu1; |  | ||||||
| 			lseek(bin, |  | ||||||
| 			 sizeof(struct counter_header) + (i-1) * sizeof(crecord), |  | ||||||
| 			 SEEK_SET); |  | ||||||
| 			write(bin, &crecord, sizeof(crecord)); |  | ||||||
| 
 |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		fprintf(stderr, "Unknown command: %s\n", argv[1]); |  | ||||||
| 		return 5; |  | ||||||
| 	} |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
							
								
								
									
										234
									
								
								src/msnpr.c
									
									
									
									
									
								
							
							
						
						
									
										234
									
								
								src/msnpr.c
									
									
									
									
									
								
							| @ -1,234 +0,0 @@ | |||||||
| /*
 |  | ||||||
|    3APA3A simpliest proxy server |  | ||||||
|    (c) 2002-2008 by ZARAZA <3APA3A@security.nnov.ru> |  | ||||||
| 
 |  | ||||||
|    please read License Agreement |  | ||||||
| 
 |  | ||||||
|    $Id: msnpr.c,v 1.3 2012-04-11 23:01:19 vlad Exp $ |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| #include "proxy.h" |  | ||||||
| 
 |  | ||||||
| #ifndef PORTMAP |  | ||||||
| #define PORTMAP |  | ||||||
| #endif |  | ||||||
| #define RETURN(xxx) { param->res = xxx; goto CLEANRET; } |  | ||||||
| 
 |  | ||||||
| struct msn_cookie { |  | ||||||
| 	struct msn_cookie *next; |  | ||||||
| 	unsigned char *userid; |  | ||||||
| 	char * connectstring; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static struct msn_cookie *msn_cookies = NULL; |  | ||||||
| pthread_mutex_t msn_cookie_mutex; |  | ||||||
| int msn_cookie_mutex_init = 0; |  | ||||||
| 
 |  | ||||||
| static void msn_clear(void *fo){ |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| static FILTER_ACTION msn_srv(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ |  | ||||||
| 	unsigned char *data = *buf_p + offset; |  | ||||||
| 	int len = (int)(*length_p - offset); |  | ||||||
| 	struct sockaddr_in sa; |  | ||||||
| 	SASIZETYPE size = sizeof(sa); |  | ||||||
| 	struct msn_cookie *cookie; |  | ||||||
| 	char tmpbuf[256]; |  | ||||||
| 	char *sp1, *sp2, *sp3; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	if(*bufsize_p - *length_p < 32) return CONTINUE; |  | ||||||
| 	if(len < 10 || len > 220) return CONTINUE; |  | ||||||
| 
 |  | ||||||
| 	data[len] = 0; |  | ||||||
| 	 |  | ||||||
| 
 |  | ||||||
| 	sp1 = data + 3; |  | ||||||
| 	if(data[0] == 'X' && data[1] == 'F' && data[2] == 'R' && data[3] == ' '){ |  | ||||||
| 		if(!(sp2 = strchr(sp1 + 1, ' ')) || !(sp2 = strchr(sp2 + 1, ' '))|| !(sp3 = strchr(sp2 + 1, ' '))) return CONTINUE; |  | ||||||
| 	} |  | ||||||
| 	else if(data[0] == 'R' && data[1] == 'N' && data[2] == 'G' && data[3] == ' '){ |  | ||||||
| 		if(!(sp2 = strchr(sp1 + 1, ' ')) || !(sp3 = strchr(sp2 + 1, ' '))) return CONTINUE; |  | ||||||
| 	} |  | ||||||
| 	else return CONTINUE; |  | ||||||
| 
 |  | ||||||
|  	*sp2 = 0; |  | ||||||
|  	*sp3 = 0; |  | ||||||
| 	if(getsockname(param->clisock, (struct sockaddr *)&sa, &size)==-1) { |  | ||||||
| 		return CONTINUE; |  | ||||||
| 	}; |  | ||||||
| 	cookie = myalloc(sizeof(struct msn_cookie)); |  | ||||||
| 	cookie->connectstring = mystrdup(sp2 + 1); |  | ||||||
| 	cookie->userid = mystrdup(param->username); |  | ||||||
| 
 |  | ||||||
| 	pthread_mutex_lock(&msn_cookie_mutex); |  | ||||||
| 	cookie->next = msn_cookies; |  | ||||||
| 	msn_cookies = cookie; |  | ||||||
| 	pthread_mutex_unlock(&msn_cookie_mutex); |  | ||||||
| 
 |  | ||||||
| 	strcpy(tmpbuf, data); |  | ||||||
| 	len = (int)strlen(tmpbuf); |  | ||||||
| 	tmpbuf[len++] = ' '; |  | ||||||
| 
 |  | ||||||
| 	len+=myinet_ntoa(sa.sin_addr, tmpbuf+len); |  | ||||||
| 	sprintf(tmpbuf+len, ":%hu %s", ntohs(sa.sin_port), sp3 + 1); |  | ||||||
| 	len = (int)strlen(tmpbuf); |  | ||||||
| 	memcpy(*buf_p + offset, tmpbuf, len); |  | ||||||
| 	*length_p = offset + len; |  | ||||||
| 
 |  | ||||||
| 	return CONTINUE; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static struct filter msnfilter = { |  | ||||||
| 	NULL, |  | ||||||
| 	"msnfilter", |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	NULL, |  | ||||||
| 	*msn_srv, |  | ||||||
| 	*msn_clear, |  | ||||||
| 	NULL |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void * msnprchild(struct clientparam* param) { |  | ||||||
|  int res, len; |  | ||||||
|  unsigned char *buf; |  | ||||||
|  int buflen = 256; |  | ||||||
|  char *sp1, *sp2, *sp3; |  | ||||||
|  char *verstr = NULL; |  | ||||||
|  int id; |  | ||||||
|  struct msn_cookie *cookie, *prevcookie=NULL; |  | ||||||
|  int sec = 0;  |  | ||||||
|  struct filterp  **newfilters; |  | ||||||
|  int skip = 0; |  | ||||||
|  struct filterp msnfilterp = { |  | ||||||
| 	&msnfilter, |  | ||||||
| 	(void *)&skip |  | ||||||
|  }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  if(!msn_cookie_mutex_init){ |  | ||||||
| 	msn_cookie_mutex_init = 1; |  | ||||||
| 	pthread_mutex_init(&msn_cookie_mutex, NULL); |  | ||||||
|  } |  | ||||||
| 
 |  | ||||||
|  buf = myalloc(buflen);  |  | ||||||
|  res = sockgetlinebuf(param, CLIENT, buf, 240, '\n', conf.timeouts[STRING_S]); |  | ||||||
|  if(res < 10) RETURN(1201); |  | ||||||
|  buf[res] = 0; |  | ||||||
|  if(!(sp1 = strchr(buf, ' ')) || !(sp2 = strchr(sp1 + 1, ' ')) || !(sp3 = strchr(sp2 + 1, ' ')) || ((int)(sp3-sp2)) < 6) RETURN(1202); |  | ||||||
|  if((buf[0] == 'U' && buf[1] == 'S' && buf[2] == 'R') || |  | ||||||
|     (buf[0] == 'A' && buf[1] == 'N' && buf[2] == 'S')){ |  | ||||||
|         len = 1 + (int)(sp3 - sp2); |  | ||||||
|  	param->username = myalloc(len - 1); |  | ||||||
|  	memcpy(param->username, sp2 + 1, len - 2); |  | ||||||
| 	sec = 1; |  | ||||||
| 
 |  | ||||||
|  } |  | ||||||
|  else if(buf[0] != 'V' || buf[1] != 'E' || buf[2] != 'R') {RETURN(1203);} |  | ||||||
|  else { |  | ||||||
| 	id = atoi(sp1 + 1); |  | ||||||
| 	verstr = mystrdup(buf); |  | ||||||
| 
 |  | ||||||
| 	if(socksend(param->clisock, buf, res, conf.timeouts[STRING_S])!=res) {RETURN (1204);} |  | ||||||
| 
 |  | ||||||
| 	res = sockgetlinebuf(param, CLIENT, buf, 240, '\n', conf.timeouts[STRING_S]); |  | ||||||
| 	if(res < 10) RETURN(1205); |  | ||||||
|  	buf[res] = 0; |  | ||||||
|  	if(buf[0] != 'C' || buf[1] != 'V' || buf[2] != 'R' || !(sp1=strrchr(buf,' ')) || (len = (int)strlen(sp1+1)) < 3) RETURN(1206); |  | ||||||
|  	param->username = myalloc(len - 1); |  | ||||||
|  	memcpy(param->username, sp1 + 1, len - 2); |  | ||||||
|  } |  | ||||||
|  param->username[len - 2] = 0; |  | ||||||
|  param->operation = CONNECT; |  | ||||||
| 
 |  | ||||||
|  pthread_mutex_lock(&msn_cookie_mutex); |  | ||||||
|  for(cookie = msn_cookies; cookie; cookie = cookie->next){ |  | ||||||
| 	if(!strcmp(param->username, cookie->userid)){ |  | ||||||
| 		parsehostname(cookie->connectstring, param, ntohs(param->srv->targetport)); |  | ||||||
| 		if(prevcookie)prevcookie->next = cookie->next; |  | ||||||
| 		else msn_cookies = cookie->next; |  | ||||||
| 		myfree(cookie->connectstring); |  | ||||||
| 		myfree(cookie->userid); |  | ||||||
| 		myfree(cookie); |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| 	prevcookie = cookie; |  | ||||||
|  } |  | ||||||
|  pthread_mutex_unlock(&msn_cookie_mutex); |  | ||||||
|  if(!cookie) { |  | ||||||
| 	if(sec) RETURN(1233); |  | ||||||
| 	parsehostname((char *)param->srv->target, param, ntohs(param->srv->targetport)); |  | ||||||
|  } |  | ||||||
|  res = (*param->srv->authfunc)(param); |  | ||||||
|  if(res) {RETURN(res);} |  | ||||||
| 
 |  | ||||||
|  if(!sec){ |  | ||||||
| 	len = (int)strlen(verstr); |  | ||||||
| 	if(socksend(param->remsock, verstr, len, conf.timeouts[STRING_S])!= len) {RETURN (1207);} |  | ||||||
| 	param->statscli += len; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	myfree(verstr); |  | ||||||
| 	verstr = mystrdup(buf); |  | ||||||
| 
 |  | ||||||
| 	len = sockgetlinebuf(param, SERVER, buf, 240, '\n', conf.timeouts[STRING_S]); |  | ||||||
| 	if(len < 10) RETURN(1208); |  | ||||||
| 	param->statssrv += len; |  | ||||||
| 
 |  | ||||||
| 	strcpy(buf, verstr); |  | ||||||
|  } |  | ||||||
| 
 |  | ||||||
|  len = (int)strlen(buf); |  | ||||||
|  if((res=handledatfltcli(param,  &buf, &buflen, 0, &len))!=PASS) RETURN(res); |  | ||||||
|  if(socksend(param->remsock, buf, len, conf.timeouts[STRING_S])!= len) {RETURN (1207);} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  param->statscli += len; |  | ||||||
| 
 |  | ||||||
|  if(sec){ |  | ||||||
| 	RETURN(sockmap(param, conf.timeouts[CONNECTION_L])); |  | ||||||
|  } |  | ||||||
| 
 |  | ||||||
|  param->ndatfilterssrv++; |  | ||||||
|  newfilters = myalloc(param->ndatfilterssrv * sizeof(struct filterp *)); |  | ||||||
|  if(param->ndatfilterssrv > 1){ |  | ||||||
| 	memcpy(newfilters, param->datfilterssrv, (param->ndatfilterssrv - 1) * sizeof(struct filterp *)); |  | ||||||
| 	myfree(param->datfilterssrv); |  | ||||||
|  } |  | ||||||
|  param->datfilterssrv = newfilters; |  | ||||||
|  newfilters[param->ndatfilterssrv - 1] = &msnfilterp; |  | ||||||
| 
 |  | ||||||
|  param->res = sockmap(param, conf.timeouts[CONNECTION_L]); |  | ||||||
| 
 |  | ||||||
|  param->ndatfilterssrv--; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| CLEANRET: |  | ||||||
|   |  | ||||||
|   |  | ||||||
|  if(verstr)myfree(verstr); |  | ||||||
|  if(buf)myfree(buf); |  | ||||||
|  (*param->srv->logfunc)(param, NULL); |  | ||||||
|  freeparam(param); |  | ||||||
|  return (NULL); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #ifdef WITHMAIN |  | ||||||
| struct proxydef childdef = { |  | ||||||
| 	msnprchild, |  | ||||||
| 	0, |  | ||||||
| 	0, |  | ||||||
| 	S_MSNPR, |  | ||||||
| 	"" |  | ||||||
| }; |  | ||||||
| #include "proxymain.c" |  | ||||||
| #endif |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 z3APA3A
						z3APA3A