mirror of
https://github.com/3proxy/3proxy.git
synced 2025-04-22 04:02:08 +08:00
get rid of unsigned chars
This commit is contained in:
parent
3e35fdd054
commit
1f7a33d5ab
12
src/3proxy.c
12
src/3proxy.c
@ -19,7 +19,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
FILE * confopen();
|
FILE * confopen();
|
||||||
extern unsigned char *strings[];
|
extern char *strings[];
|
||||||
extern FILE *writable;
|
extern FILE *writable;
|
||||||
extern struct counter_header cheader;
|
extern struct counter_header cheader;
|
||||||
extern struct counter_record crecord;
|
extern struct counter_record crecord;
|
||||||
@ -79,7 +79,7 @@ void __stdcall CommandHandler( DWORD dwCommand )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void __stdcall ServiceMain(int argc, unsigned char* argv[] )
|
void __stdcall ServiceMain(int argc, char* argv[] )
|
||||||
{
|
{
|
||||||
|
|
||||||
hSrv = RegisterServiceCtrlHandler((LPCSTR)conf.stringtable[1], (LPHANDLER_FUNCTION)CommandHandler);
|
hSrv = RegisterServiceCtrlHandler((LPCSTR)conf.stringtable[1], (LPHANDLER_FUNCTION)CommandHandler);
|
||||||
@ -181,7 +181,7 @@ void doschedule(void){
|
|||||||
|
|
||||||
void dumpcounters(struct trafcount *tlin, int counterd){
|
void dumpcounters(struct trafcount *tlin, int counterd){
|
||||||
|
|
||||||
unsigned char tmpbuf[8192];
|
char tmpbuf[8192];
|
||||||
struct trafcount *tl;
|
struct trafcount *tl;
|
||||||
if(counterd >= 0 && tlin) {
|
if(counterd >= 0 && tlin) {
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ void dumpcounters(struct trafcount *tlin, int counterd){
|
|||||||
if(cheader.updated && conf.countertype && timechanged(cheader.updated, conf.time, conf.countertype)){
|
if(cheader.updated && conf.countertype && timechanged(cheader.updated, conf.time, conf.countertype)){
|
||||||
FILE * cfp;
|
FILE * cfp;
|
||||||
|
|
||||||
cfp = fopen((char *)dologname(tmpbuf, sizeof(tmpbuf), (unsigned char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w");
|
cfp = fopen((char *)dologname(tmpbuf, sizeof(tmpbuf), (char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w");
|
||||||
if(cfp){
|
if(cfp){
|
||||||
for(tl = tlin; cfp && tl; tl = tl->next){
|
for(tl = tlin; cfp && tl; tl = tl->next){
|
||||||
if(tl->type >= conf.countertype)
|
if(tl->type >= conf.countertype)
|
||||||
@ -293,9 +293,9 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
|
|||||||
FILE * fp = NULL;
|
FILE * fp = NULL;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
unsigned char * arg;
|
char * arg;
|
||||||
WSADATA wd;
|
WSADATA wd;
|
||||||
unsigned char tmpbuf[8192];
|
char tmpbuf[8192];
|
||||||
|
|
||||||
WSAStartup(MAKEWORD( 1, 1 ), &wd);
|
WSAStartup(MAKEWORD( 1, 1 ), &wd);
|
||||||
osv.dwOSVersionInfoSize = sizeof(osv);
|
osv.dwOSVersionInfoSize = sizeof(osv);
|
||||||
|
@ -133,20 +133,14 @@ $(BUILDDIR)mycrypt$(EXESUFFICS): md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycryptmain$(
|
|||||||
md4$(OBJSUFFICS): libs/md4.h libs/md4.c
|
md4$(OBJSUFFICS): libs/md4.h libs/md4.c
|
||||||
$(CC) $(COUT)md4$(OBJSUFFICS) $(CFLAGS) libs/md4.c
|
$(CC) $(COUT)md4$(OBJSUFFICS) $(CFLAGS) libs/md4.c
|
||||||
|
|
||||||
smbdes$(OBJSUFFICS): libs/smbdes.c
|
|
||||||
$(CC) $(COUT)smbdes$(OBJSUFFICS) $(CFLAGS) libs/smbdes.c
|
|
||||||
|
|
||||||
md5$(OBJSUFFICS): libs/md5.h libs/md5.c
|
md5$(OBJSUFFICS): libs/md5.h libs/md5.c
|
||||||
$(CC) $(COUT)md5$(OBJSUFFICS) $(CFLAGS) libs/md5.c
|
$(CC) $(COUT)md5$(OBJSUFFICS) $(CFLAGS) libs/md5.c
|
||||||
|
|
||||||
ntlm$(OBJSUFFICS): ntlm.c
|
|
||||||
$(CC) $(COUT)ntlm$(OBJSUFFICS) $(CFLAGS) ntlm.c
|
|
||||||
|
|
||||||
stringtable$(OBJSUFFICS): stringtable.c
|
stringtable$(OBJSUFFICS): stringtable.c
|
||||||
$(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c
|
$(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c
|
||||||
|
|
||||||
$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) log$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS)
|
$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) log$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS)
|
||||||
$(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
$(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES)
|
@$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES)
|
||||||
|
89
src/auth.c
89
src/auth.c
@ -9,12 +9,12 @@
|
|||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
|
|
||||||
|
|
||||||
int clientnegotiate(struct chain * redir, struct clientparam * param, struct sockaddr * addr, unsigned char * hostname){
|
int clientnegotiate(struct chain * redir, struct clientparam * param, struct sockaddr * addr, char * hostname){
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
unsigned char *username;
|
char *username;
|
||||||
int res;
|
int res;
|
||||||
int len=0;
|
int len=0;
|
||||||
unsigned char * user, *pass;
|
char * user, *pass;
|
||||||
|
|
||||||
|
|
||||||
user = redir->extuser;
|
user = redir->extuser;
|
||||||
@ -56,7 +56,7 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc
|
|||||||
":%hu HTTP/1.0\r\nConnection: keep-alive\r\n", ntohs(*SAPORT(addr)));
|
":%hu HTTP/1.0\r\nConnection: keep-alive\r\n", ntohs(*SAPORT(addr)));
|
||||||
if(user){
|
if(user){
|
||||||
len += sprintf((char *)buf + len, "Proxy-Authorization: Basic ");
|
len += sprintf((char *)buf + len, "Proxy-Authorization: Basic ");
|
||||||
sprintf((char *)username, "%.128s:%.128s", user, pass?pass:(unsigned char *)"");
|
sprintf((char *)username, "%.128s:%.128s", user, pass?pass:(char *)"");
|
||||||
en64(username, buf+len, (int)strlen((char *)username));
|
en64(username, buf+len, (int)strlen((char *)username));
|
||||||
len = (int)strlen((char *)buf);
|
len = (int)strlen((char *)buf);
|
||||||
len += sprintf((char *)buf + len, "\r\n");
|
len += sprintf((char *)buf + len, "\r\n");
|
||||||
@ -87,7 +87,7 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc
|
|||||||
buf[7] = 3;
|
buf[7] = 3;
|
||||||
}
|
}
|
||||||
else memcpy(buf+4, SAADDR(addr), 4);
|
else memcpy(buf+4, SAADDR(addr), 4);
|
||||||
if(!user)user = (unsigned char *)"anonymous";
|
if(!user)user = (char *)"anonymous";
|
||||||
len = (int)strlen((char *)user) + 1;
|
len = (int)strlen((char *)user) + 1;
|
||||||
memcpy(buf+8, user, len);
|
memcpy(buf+8, user, len);
|
||||||
len += 8;
|
len += 8;
|
||||||
@ -138,10 +138,10 @@ int clientnegotiate(struct chain * redir, struct clientparam * param, struct soc
|
|||||||
}
|
}
|
||||||
if(buf[1] == 2){
|
if(buf[1] == 2){
|
||||||
buf[inbuf++] = 1;
|
buf[inbuf++] = 1;
|
||||||
buf[inbuf] = (unsigned char)strlen((char *)user);
|
buf[inbuf] = (char)strlen((char *)user);
|
||||||
memcpy(buf+inbuf+1, user, buf[inbuf]);
|
memcpy(buf+inbuf+1, user, buf[inbuf]);
|
||||||
inbuf += buf[inbuf] + 1;
|
inbuf += buf[inbuf] + 1;
|
||||||
buf[inbuf] = pass?(unsigned char)strlen((char *)pass):0;
|
buf[inbuf] = pass?(char)strlen((char *)pass):0;
|
||||||
if(pass)memcpy(buf+inbuf+1, pass, buf[inbuf]);
|
if(pass)memcpy(buf+inbuf+1, pass, buf[inbuf]);
|
||||||
inbuf += buf[inbuf] + 1;
|
inbuf += buf[inbuf] + 1;
|
||||||
if(socksend(param->remsock, buf, inbuf, conf.timeouts[CHAIN_TO]) != inbuf){
|
if(socksend(param->remsock, buf, inbuf, conf.timeouts[CHAIN_TO]) != inbuf){
|
||||||
@ -260,11 +260,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
|
|||||||
if(cur->extuser){
|
if(cur->extuser){
|
||||||
if(param->extusername)
|
if(param->extusername)
|
||||||
myfree(param->extusername);
|
myfree(param->extusername);
|
||||||
param->extusername = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser));
|
param->extusername = (char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser));
|
||||||
if(cur->extpass){
|
if(cur->extpass){
|
||||||
if(param->extpassword)
|
if(param->extpassword)
|
||||||
myfree(param->extpassword);
|
myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass));
|
param->extpassword = (char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass));
|
||||||
}
|
}
|
||||||
if(*cur->extuser == '*' && !param->username) return 4;
|
if(*cur->extuser == '*' && !param->username) return 4;
|
||||||
}
|
}
|
||||||
@ -312,11 +312,11 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
|
|||||||
if(*cur -> extuser == '*' && !param->username) return 4;
|
if(*cur -> extuser == '*' && !param->username) return 4;
|
||||||
if(param->extusername)
|
if(param->extusername)
|
||||||
myfree(param->extusername);
|
myfree(param->extusername);
|
||||||
param->extusername = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser));
|
param->extusername = (char *)mystrdup((char *)((*cur->extuser == '*' && param->username)? param->username : cur->extuser));
|
||||||
if(cur->extpass){
|
if(cur->extpass){
|
||||||
if(param->extpassword)
|
if(param->extpassword)
|
||||||
myfree(param->extpassword);
|
myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass));
|
param->extpassword = (char *)mystrdup((char *)((*cur->extuser == '*' && param->password)?param->password : cur->extpass));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -330,14 +330,14 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
|
|||||||
|
|
||||||
int IPInentry(struct sockaddr *sa, struct iplist *ipentry){
|
int IPInentry(struct sockaddr *sa, struct iplist *ipentry){
|
||||||
int addrlen;
|
int addrlen;
|
||||||
unsigned char *ip, *ipf, *ipt;
|
char *ip, *ipf, *ipt;
|
||||||
|
|
||||||
|
|
||||||
if(!sa || ! ipentry || *SAFAMILY(sa) != ipentry->family) return 0;
|
if(!sa || ! ipentry || *SAFAMILY(sa) != ipentry->family) return 0;
|
||||||
|
|
||||||
ip = (unsigned char *)SAADDR(sa);
|
ip = (char *)SAADDR(sa);
|
||||||
ipf = (unsigned char *)&ipentry->ip_from;
|
ipf = (char *)&ipentry->ip_from;
|
||||||
ipt = (unsigned char *)&ipentry->ip_to;
|
ipt = (char *)&ipentry->ip_to;
|
||||||
|
|
||||||
|
|
||||||
addrlen = SAADDRLEN(sa);
|
addrlen = SAADDRLEN(sa);
|
||||||
@ -352,12 +352,12 @@ int ACLmatches(struct ace* acentry, struct clientparam * param){
|
|||||||
struct iplist *ipentry;
|
struct iplist *ipentry;
|
||||||
struct portlist *portentry;
|
struct portlist *portentry;
|
||||||
struct period *periodentry;
|
struct period *periodentry;
|
||||||
unsigned char * username;
|
char * username;
|
||||||
struct hostname * hstentry=NULL;
|
struct hostname * hstentry=NULL;
|
||||||
int i;
|
int i;
|
||||||
int match = 0;
|
int match = 0;
|
||||||
|
|
||||||
username = param->username?param->username:(unsigned char *)"-";
|
username = param->username?param->username:(char *)"-";
|
||||||
if(acentry->src) {
|
if(acentry->src) {
|
||||||
for(ipentry = acentry->src; ipentry; ipentry = ipentry->next)
|
for(ipentry = acentry->src; ipentry; ipentry = ipentry->next)
|
||||||
if(IPInentry((struct sockaddr *)¶m->sincr, ipentry)) {
|
if(IPInentry((struct sockaddr *)¶m->sincr, ipentry)) {
|
||||||
@ -770,7 +770,7 @@ int cacheauth(struct clientparam * param){
|
|||||||
if(param->username){
|
if(param->username){
|
||||||
myfree(param->username);
|
myfree(param->username);
|
||||||
}
|
}
|
||||||
param->username = (unsigned char *)mystrdup(ac->username);
|
param->username = (char *)mystrdup(ac->username);
|
||||||
pthread_mutex_unlock(&hash_mutex);
|
pthread_mutex_unlock(&hash_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -873,7 +873,7 @@ int doauth(struct clientparam * param){
|
|||||||
|
|
||||||
int ipauth(struct clientparam * param){
|
int ipauth(struct clientparam * param){
|
||||||
int res;
|
int res;
|
||||||
unsigned char *username;
|
char *username;
|
||||||
|
|
||||||
if(param->preauthorized) return (0);
|
if(param->preauthorized) return (0);
|
||||||
username = param->username;
|
username = param->username;
|
||||||
@ -898,7 +898,7 @@ int dnsauth(struct clientparam * param){
|
|||||||
if(*SAFAMILY(¶m->sincr)!=AF_INET){
|
if(*SAFAMILY(¶m->sincr)!=AF_INET){
|
||||||
char *s = buf;
|
char *s = buf;
|
||||||
for(i=15; i>=0; i--){
|
for(i=15; i>=0; i--){
|
||||||
unsigned char c=((unsigned char *)SAADDR(¶m->sincr))[i];
|
char c=((char *)SAADDR(¶m->sincr))[i];
|
||||||
*s++ = dig[(c&0xf)];
|
*s++ = dig[(c&0xf)];
|
||||||
*s++ = '.';
|
*s++ = '.';
|
||||||
*s++ = dig[(c>>4)];
|
*s++ = dig[(c>>4)];
|
||||||
@ -916,7 +916,7 @@ int dnsauth(struct clientparam * param){
|
|||||||
((u&0xFF000000)>>24));
|
((u&0xFF000000)>>24));
|
||||||
|
|
||||||
}
|
}
|
||||||
if(!udpresolve(*SAFAMILY(¶m->sincr), (unsigned char *)buf, (unsigned char *)addr, NULL, param, 1)) {
|
if(!udpresolve(*SAFAMILY(¶m->sincr), (char *)buf, (char *)addr, NULL, param, 1)) {
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
if(memcmp(SAADDR(¶m->sincr), addr, SAADDRLEN(¶m->sincr))) {
|
if(memcmp(SAADDR(¶m->sincr), addr, SAADDRLEN(¶m->sincr))) {
|
||||||
@ -928,7 +928,7 @@ int dnsauth(struct clientparam * param){
|
|||||||
|
|
||||||
int strongauth(struct clientparam * param){
|
int strongauth(struct clientparam * param){
|
||||||
struct passwords * pwl;
|
struct passwords * pwl;
|
||||||
unsigned char buf[256];
|
char buf[256];
|
||||||
|
|
||||||
|
|
||||||
if(!param->username) return 4;
|
if(!param->username) return 4;
|
||||||
@ -942,15 +942,6 @@ int strongauth(struct clientparam * param){
|
|||||||
else if (!param->pwtype && param->password && !strcmp((char *)param->password, (char *)pwl->password)){
|
else if (!param->pwtype && param->password && !strcmp((char *)param->password, (char *)pwl->password)){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifndef NOCRYPT
|
|
||||||
else if (param->pwtype == 2 && param->password) {
|
|
||||||
ntpwdhash(buf, pwl->password, 0);
|
|
||||||
mschap(buf, param->password, buf + 16);
|
|
||||||
if(!memcmp(buf+16, param->password+8, 24)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
pthread_mutex_unlock(&pwl_mutex);
|
pthread_mutex_unlock(&pwl_mutex);
|
||||||
return 6;
|
return 6;
|
||||||
#ifndef NOCRYPT
|
#ifndef NOCRYPT
|
||||||
@ -964,13 +955,6 @@ int strongauth(struct clientparam * param){
|
|||||||
if(param->password && !param->pwtype && !memcmp(pwl->password, ntpwdhash(buf,param->password, 1), 32)) {
|
if(param->password && !param->pwtype && !memcmp(pwl->password, ntpwdhash(buf,param->password, 1), 32)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (param->pwtype == 2){
|
|
||||||
fromhex(pwl->password, buf, 16);
|
|
||||||
mschap(buf, param->password, buf + 16);
|
|
||||||
if(!memcmp(buf + 16, param->password+8, 24)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&pwl_mutex);
|
pthread_mutex_unlock(&pwl_mutex);
|
||||||
return 8;
|
return 8;
|
||||||
#endif
|
#endif
|
||||||
@ -1011,7 +995,7 @@ struct hashtable dns_table = {0, 4, {0,0,0,0}, NULL, NULL, NULL};
|
|||||||
struct hashtable dns6_table = {0, 16, {0,0,0,0}, NULL, NULL, NULL};
|
struct hashtable dns6_table = {0, 16, {0,0,0,0}, NULL, NULL, NULL};
|
||||||
|
|
||||||
|
|
||||||
void nametohash(const unsigned char * name, unsigned char *hash, unsigned char *rnd){
|
void nametohash(const char * name, char *hash, char *rnd){
|
||||||
unsigned i, j, k;
|
unsigned i, j, k;
|
||||||
memcpy(hash, rnd, sizeof(unsigned)*4);
|
memcpy(hash, rnd, sizeof(unsigned)*4);
|
||||||
for(i=0, j=0, k=0; name[j]; j++){
|
for(i=0, j=0, k=0; name[j]; j++){
|
||||||
@ -1023,7 +1007,7 @@ void nametohash(const unsigned char * name, unsigned char *hash, unsigned char *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned hashindex(struct hashtable *ht, const unsigned char* hash){
|
unsigned hashindex(struct hashtable *ht, const char* hash){
|
||||||
unsigned t1, t2, t3, t4;
|
unsigned t1, t2, t3, t4;
|
||||||
t1 = *(unsigned *)hash;
|
t1 = *(unsigned *)hash;
|
||||||
t2 = *(unsigned *)(hash + sizeof(unsigned));
|
t2 = *(unsigned *)(hash + sizeof(unsigned));
|
||||||
@ -1102,7 +1086,7 @@ int inithashtable(struct hashtable *ht, unsigned nhashsize){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires){
|
void hashadd(struct hashtable *ht, const char* name, char* value, time_t expires){
|
||||||
struct hashentry * hen, *he;
|
struct hashentry * hen, *he;
|
||||||
struct hashentry ** hep;
|
struct hashentry ** hep;
|
||||||
|
|
||||||
@ -1115,7 +1099,7 @@ void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* val
|
|||||||
}
|
}
|
||||||
hen = ht->hashempty;
|
hen = ht->hashempty;
|
||||||
ht->hashempty = ht->hashempty->next;
|
ht->hashempty = ht->hashempty->next;
|
||||||
nametohash(name, hen->hash, (unsigned char *)ht->rnd);
|
nametohash(name, hen->hash, (char *)ht->rnd);
|
||||||
memcpy(hen->value, value, ht->recsize);
|
memcpy(hen->value, value, ht->recsize);
|
||||||
hen->expires = expires;
|
hen->expires = expires;
|
||||||
hen->next = NULL;
|
hen->next = NULL;
|
||||||
@ -1135,8 +1119,8 @@ void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* val
|
|||||||
pthread_mutex_unlock(&hash_mutex);
|
pthread_mutex_unlock(&hash_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsigned char* value, unsigned *ttl){
|
unsigned long hashresolv(struct hashtable *ht, const char* name, char* value, unsigned *ttl){
|
||||||
unsigned char hash[sizeof(unsigned)*4];
|
char hash[sizeof(unsigned)*4];
|
||||||
struct hashentry ** hep;
|
struct hashentry ** hep;
|
||||||
struct hashentry *he;
|
struct hashentry *he;
|
||||||
unsigned index;
|
unsigned index;
|
||||||
@ -1146,7 +1130,7 @@ unsigned long hashresolv(struct hashtable *ht, const unsigned char* name, unsign
|
|||||||
pthread_mutex_unlock(&hash_mutex);
|
pthread_mutex_unlock(&hash_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
nametohash(name, hash, (unsigned char *)ht->rnd);
|
nametohash(name, hash, (char *)ht->rnd);
|
||||||
index = hashindex(ht, hash);
|
index = hashindex(ht, hash);
|
||||||
for(hep = ht->hashtable + index; (he = *hep)!=NULL; ){
|
for(hep = ht->hashtable + index; (he = *hep)!=NULL; ){
|
||||||
if(he->expires < conf.time) {
|
if(he->expires < conf.time) {
|
||||||
@ -1171,7 +1155,7 @@ struct nserver nservers[MAXNSERVERS] = {{{0},0}, {{0},0}, {{0},0}, {{0},0}, {{0}
|
|||||||
struct nserver authnserver;
|
struct nserver authnserver;
|
||||||
|
|
||||||
|
|
||||||
unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth){
|
unsigned long udpresolve(int af, char * name, char * value, unsigned *retttl, struct clientparam* param, int makeauth){
|
||||||
|
|
||||||
int i,n;
|
int i,n;
|
||||||
unsigned long retval;
|
unsigned long retval;
|
||||||
@ -1185,7 +1169,8 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers;
|
n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers;
|
||||||
for(i=0; i<n; i++){
|
for(i=0; i<n; i++){
|
||||||
unsigned short nq, na;
|
unsigned short nq, na;
|
||||||
unsigned char b[4098], *buf, *s1, *s2;
|
char b[4098], *s1, *s2;
|
||||||
|
unsigned char *buf;
|
||||||
int j, k, len, flen;
|
int j, k, len, flen;
|
||||||
SOCKET sock;
|
SOCKET sock;
|
||||||
unsigned ttl;
|
unsigned ttl;
|
||||||
@ -1199,7 +1184,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
int usetcp = 0;
|
int usetcp = 0;
|
||||||
unsigned short serial = 1;
|
unsigned short serial = 1;
|
||||||
|
|
||||||
buf = b+2;
|
buf = (unsigned char*)b+2;
|
||||||
|
|
||||||
sinsl = (param && !makeauth)? ¶m->sinsl : &addr;
|
sinsl = (param && !makeauth)? ¶m->sinsl : &addr;
|
||||||
sinsr = (param && !makeauth)? ¶m->sinsr : &addr;
|
sinsr = (param && !makeauth)? ¶m->sinsr : &addr;
|
||||||
@ -1257,7 +1242,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
memcpy(buf + 13, name, len);
|
memcpy(buf + 13, name, len);
|
||||||
len += 13;
|
len += 13;
|
||||||
buf[len] = 0;
|
buf[len] = 0;
|
||||||
for(s2 = buf + 12; (s1 = (unsigned char *)strchr((char *)s2 + 1, '.')); s2 = s1)*s2 = (unsigned char)((s1 - s2) - 1);
|
for(s2 = buf + 12; (s1 = (char *)strchr((char *)s2 + 1, '.')); s2 = s1)*s2 = (char)((s1 - s2) - 1);
|
||||||
*s2 = (len - (int)(s2 - buf)) - 1;
|
*s2 = (len - (int)(s2 - buf)) - 1;
|
||||||
len++;
|
len++;
|
||||||
buf[len++] = 0;
|
buf[len++] = 0;
|
||||||
@ -1343,7 +1328,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
}
|
}
|
||||||
*s2 = 0;
|
*s2 = 0;
|
||||||
if(param->username)myfree(param->username);
|
if(param->username)myfree(param->username);
|
||||||
param->username = (unsigned char *)mystrdup ((char *)buf + k + 13);
|
param->username = mystrdup ((char *)buf + k + 13);
|
||||||
|
|
||||||
return udpresolve(af,param->username, value, NULL, NULL, 2);
|
return udpresolve(af,param->username, value, NULL, NULL, 2);
|
||||||
}
|
}
|
||||||
@ -1352,11 +1337,11 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long myresolver(int af, unsigned char * name, unsigned char * value){
|
unsigned long myresolver(int af, char * name, char * value){
|
||||||
return udpresolve(af, name, value, NULL, NULL, 0);
|
return udpresolve(af, name, value, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long fakeresolver (int af, unsigned char *name, unsigned char * value){
|
unsigned long fakeresolver (int af, char *name, char * value){
|
||||||
memset(value, 0, af == AF_INET6? 16 : 4);
|
memset(value, 0, af == AF_INET6? 16 : 4);
|
||||||
if(af == AF_INET6){
|
if(af == AF_INET6){
|
||||||
memset(value, 0, 16);
|
memset(value, 0, 16);
|
||||||
|
@ -168,22 +168,7 @@ char radiussecret[64]="";
|
|||||||
|
|
||||||
pthread_mutex_t rad_mutex;
|
pthread_mutex_t rad_mutex;
|
||||||
|
|
||||||
void md5_calc(unsigned char *output, unsigned char *input,
|
static void md5_calc(unsigned char *output, unsigned char *input,
|
||||||
unsigned int inputlen);
|
|
||||||
|
|
||||||
|
|
||||||
char *strNcpy(char *dest, const char *src, int n)
|
|
||||||
{
|
|
||||||
if (n > 0)
|
|
||||||
strncpy(dest, src, n);
|
|
||||||
else
|
|
||||||
n = 1;
|
|
||||||
dest[n - 1] = 0;
|
|
||||||
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
void md5_calc(unsigned char *output, unsigned char *input,
|
|
||||||
unsigned int inlen)
|
unsigned int inlen)
|
||||||
{
|
{
|
||||||
MD5_CTX context;
|
MD5_CTX context;
|
||||||
@ -220,7 +205,7 @@ static int calc_replydigest(char *packet, char *original, const char *secret, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define AUTH_PASS_LEN (16)
|
#define AUTH_PASS_LEN (16)
|
||||||
int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vector)
|
static int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vector)
|
||||||
{
|
{
|
||||||
uint8_t buffer[AUTH_VECTOR_LEN + MAX_STRING_LEN + 1];
|
uint8_t buffer[AUTH_VECTOR_LEN + MAX_STRING_LEN + 1];
|
||||||
char digest[AUTH_VECTOR_LEN];
|
char digest[AUTH_VECTOR_LEN];
|
||||||
@ -258,7 +243,7 @@ int rad_pwencode(char *passwd, int *pwlen, const char *secret, const char *vecto
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void random_vector(uint8_t *vector, struct clientparam *param)
|
static void random_vector(uint8_t *vector, struct clientparam *param)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
static int did_random = 0;
|
static int did_random = 0;
|
||||||
@ -300,7 +285,7 @@ typedef struct radius_packet_t {
|
|||||||
|
|
||||||
#define packet (*((radius_packet_t *)inbuf))
|
#define packet (*((radius_packet_t *)inbuf))
|
||||||
|
|
||||||
int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop){
|
static int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop){
|
||||||
int id;
|
int id;
|
||||||
int res = 4;
|
int res = 4;
|
||||||
SOCKET sockfd = -1;
|
SOCKET sockfd = -1;
|
||||||
@ -518,7 +503,7 @@ int radbuf(struct clientparam * param, unsigned char * inbuf, int auth, int stop
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int radsend(const unsigned char *inbuf, int total_length, int auth,
|
static int radsend(const unsigned char *inbuf, int total_length, int auth,
|
||||||
#ifdef NOIPV6
|
#ifdef NOIPV6
|
||||||
struct sockaddr_in* sinsl
|
struct sockaddr_in* sinsl
|
||||||
#else
|
#else
|
||||||
@ -685,12 +670,12 @@ int radauth(struct clientparam * param){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){
|
int raddobuf(struct clientparam * param, char * buf, const unsigned char *s){
|
||||||
return radbuf(param, buf, 0, 1);
|
return radbuf(param, (unsigned char *)buf, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void logradius(const unsigned char *buf, int len, struct LOGGER *logger){
|
void logradius(const char *buf, int len, struct LOGGER *logger){
|
||||||
if(len)radsend(buf, len, 0, NULL);
|
if(len)radsend((unsigned char *)buf, len, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
14
src/base64.c
14
src/base64.c
@ -7,11 +7,11 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static const unsigned char base64digits[] =
|
static const char base64digits[] =
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
#define BAD 255
|
#define BAD 255
|
||||||
static const unsigned char base64val[] = {
|
static const char base64val[] = {
|
||||||
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
|
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
|
||||||
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
|
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
|
||||||
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
|
BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
|
||||||
@ -23,7 +23,7 @@ static const unsigned char base64val[] = {
|
|||||||
};
|
};
|
||||||
#define DECODE64(c) ((c > 32 && c<127)? base64val[(int)c] : BAD)
|
#define DECODE64(c) ((c > 32 && c<127)? base64val[(int)c] : BAD)
|
||||||
|
|
||||||
unsigned char* en64 (const unsigned char *in, unsigned char *out, int inlen)
|
unsigned char* en64 (const char *in, char *out, int inlen)
|
||||||
{
|
{
|
||||||
for (; inlen > 0; inlen -= 3, in+=3)
|
for (; inlen > 0; inlen -= 3, in+=3)
|
||||||
{
|
{
|
||||||
@ -79,9 +79,9 @@ int de64 (const char *in, char *out, int maxlen)
|
|||||||
return (len);
|
return (len);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char hex[] = "0123456789ABCDEF";
|
char hex[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
void tohex(unsigned char *in, unsigned char *out, int len){
|
void tohex(char *in, char *out, int len){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
@ -91,13 +91,13 @@ void tohex(unsigned char *in, unsigned char *out, int len){
|
|||||||
out[(i<<1)] = 0;
|
out[(i<<1)] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fromhex(unsigned char *in, unsigned char *out, int len){
|
void fromhex(char *in, char *out, int len){
|
||||||
char *c1, *c2;
|
char *c1, *c2;
|
||||||
for (; len > 0; len--) {
|
for (; len > 0; len--) {
|
||||||
c1 = strchr((char *)hex, *in++);
|
c1 = strchr((char *)hex, *in++);
|
||||||
c2 = strchr((char *)hex, *in++);
|
c2 = strchr((char *)hex, *in++);
|
||||||
if(c1 && c2){
|
if(c1 && c2){
|
||||||
*out++ = ((unsigned char)((unsigned char *)c1 - hex) << 4) + (unsigned char)((unsigned char *)c2 - hex);
|
*out++ = (char)(unsigned char)(((c1 - hex) << 4) + (c2 - hex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
src/common.c
32
src/common.c
@ -31,7 +31,7 @@ int randomizer = 1;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char **stringtable = NULL;
|
char **stringtable = NULL;
|
||||||
|
|
||||||
#ifdef WITH_LINUX_FUTEX
|
#ifdef WITH_LINUX_FUTEX
|
||||||
int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)
|
int sys_futex(void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)
|
||||||
@ -124,12 +124,12 @@ struct extparam conf = {
|
|||||||
NULL, /* BANDLIMFUNC bandlimfunc; */
|
NULL, /* BANDLIMFUNC bandlimfunc; */
|
||||||
NULL, /* TRAFCOUNTFUNC trafcountfunc; */
|
NULL, /* TRAFCOUNTFUNC trafcountfunc; */
|
||||||
NULL, /* void (*prelog)(struct clientparam * param); */
|
NULL, /* void (*prelog)(struct clientparam * param); */
|
||||||
NULL, NULL, /* unsigned char *logtarget, *logformat; */
|
NULL, NULL, /* char *logtarget, *logformat; */
|
||||||
NULL, /* struct filemon * fmon; */
|
NULL, /* struct filemon * fmon; */
|
||||||
NULL, /* struct filter * filters; */
|
NULL, /* struct filter * filters; */
|
||||||
NULL, /* struct auth *authfuncs; */
|
NULL, /* struct auth *authfuncs; */
|
||||||
NULL, /* char* demanddialprog; */
|
NULL, /* char* demanddialprog; */
|
||||||
NULL, /* unsigned char **stringtable; */
|
NULL, /* char **stringtable; */
|
||||||
(time_t)0, /* time_t time; */
|
(time_t)0, /* time_t time; */
|
||||||
0,0, /* unsigned logdumpsrv, logdumpcli; */
|
0,0, /* unsigned logdumpsrv, logdumpcli; */
|
||||||
'@', /* char delimchar; */
|
'@', /* char delimchar; */
|
||||||
@ -270,7 +270,7 @@ int ceparseargs(const char *str){
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int parsehost(int family, unsigned char *host, struct sockaddr *sa){
|
int parsehost(int family, char *host, struct sockaddr *sa){
|
||||||
char *sp=NULL,*se=NULL;
|
char *sp=NULL,*se=NULL;
|
||||||
unsigned short port=0;
|
unsigned short port=0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -306,7 +306,7 @@ int parsehostname(char *hostname, struct clientparam *param, unsigned short port
|
|||||||
}
|
}
|
||||||
if(hostname != (char *)param->hostname){
|
if(hostname != (char *)param->hostname){
|
||||||
if(param->hostname) myfree(param->hostname);
|
if(param->hostname) myfree(param->hostname);
|
||||||
param->hostname = (unsigned char *)mystrdup(hostname + (se!=0));
|
param->hostname = (char *)mystrdup(hostname + (se!=0));
|
||||||
}
|
}
|
||||||
if(sp){
|
if(sp){
|
||||||
port = atoi(sp+1);
|
port = atoi(sp+1);
|
||||||
@ -329,11 +329,11 @@ int parseusername(char *username, struct clientparam *param, int extpasswd){
|
|||||||
if(sp) *sp = 0;
|
if(sp) *sp = 0;
|
||||||
if(*(sb+1)) {
|
if(*(sb+1)) {
|
||||||
if(param->password) myfree(param->password);
|
if(param->password) myfree(param->password);
|
||||||
param->password = (unsigned char *)mystrdup(sb+1);
|
param->password = (char *)mystrdup(sb+1);
|
||||||
}
|
}
|
||||||
if(*username) {
|
if(*username) {
|
||||||
if(param->username) myfree(param->username);
|
if(param->username) myfree(param->username);
|
||||||
param->username = (unsigned char *)mystrdup(username);
|
param->username = (char *)mystrdup(username);
|
||||||
}
|
}
|
||||||
username = se+1;
|
username = se+1;
|
||||||
}
|
}
|
||||||
@ -342,11 +342,11 @@ int parseusername(char *username, struct clientparam *param, int extpasswd){
|
|||||||
if(sp){
|
if(sp){
|
||||||
*sp = 0;
|
*sp = 0;
|
||||||
if(param->extpassword) myfree(param->extpassword);
|
if(param->extpassword) myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *) mystrdup(sp+1);
|
param->extpassword = (char *) mystrdup(sp+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(param->extusername) myfree(param->extusername);
|
if(param->extusername) myfree(param->extusername);
|
||||||
param->extusername = (unsigned char *)mystrdup(username);
|
param->extusername = (char *)mystrdup(username);
|
||||||
if(sb) *sb = ':';
|
if(sb) *sb = ':';
|
||||||
if(se) *se = ':';
|
if(se) *se = ':';
|
||||||
if(sp) *sp = ':';
|
if(sp) *sp = ':';
|
||||||
@ -429,7 +429,7 @@ int doconnect(struct clientparam * param){
|
|||||||
#endif
|
#endif
|
||||||
#ifdef SO_REUSEPORT
|
#ifdef SO_REUSEPORT
|
||||||
opt = 1;
|
opt = 1;
|
||||||
so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
|
so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(int));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -462,7 +462,7 @@ int doconnect(struct clientparam * param){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask) {
|
int scanaddr(const char *s, unsigned long * ip, unsigned long * mask) {
|
||||||
unsigned d1, d2, d3, d4, m;
|
unsigned d1, d2, d3, d4, m;
|
||||||
int res;
|
int res;
|
||||||
if ((res = sscanf((char *)s, "%u.%u.%u.%u/%u", &d1, &d2, &d3, &d4, &m)) < 4) return 0;
|
if ((res = sscanf((char *)s, "%u.%u.%u.%u/%u", &d1, &d2, &d3, &d4, &m)) < 4) return 0;
|
||||||
@ -495,7 +495,7 @@ struct hostent * my_gethostbyname(char *name, char *buf, struct hostent *hp){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NOIPV6
|
#ifdef NOIPV6
|
||||||
unsigned long getip(unsigned char *name){
|
unsigned long getip(char *name){
|
||||||
unsigned long retval;
|
unsigned long retval;
|
||||||
int i;
|
int i;
|
||||||
int ndots = 0;
|
int ndots = 0;
|
||||||
@ -522,8 +522,8 @@ unsigned long getip(unsigned char *name){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((tmpresolv=resolvfunc)){
|
if((tmpresolv=resolvfunc)){
|
||||||
if((*tmpresolv)(AF_INET, name, (unsigned char *)&retval)) return retval;
|
if((*tmpresolv)(AF_INET, name, (char *)&retval)) return retval;
|
||||||
return (*tmpresolv)(AF_INET, name, (unsigned char *)&retval)?retval:0;
|
return (*tmpresolv)(AF_INET, name, (char *)&retval)?retval:0;
|
||||||
}
|
}
|
||||||
#if !defined(_WIN32) && !defined(GETHOSTBYNAME_R)
|
#if !defined(_WIN32) && !defined(GETHOSTBYNAME_R)
|
||||||
if(!ghbn_init){
|
if(!ghbn_init){
|
||||||
@ -548,7 +548,7 @@ unsigned long getip(unsigned char *name){
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int afdetect(unsigned char *name){
|
int afdetect(char *name){
|
||||||
int ndots=0, ncols=0, nhex=0;
|
int ndots=0, ncols=0, nhex=0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -580,7 +580,7 @@ int afdetect(unsigned char *name){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){
|
unsigned long getip46(int family, char *name, struct sockaddr *sa){
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
int detect;
|
int detect;
|
||||||
struct addrinfo *ai, hint;
|
struct addrinfo *ai, hint;
|
||||||
|
180
src/conf.c
180
src/conf.c
@ -131,7 +131,7 @@ int start_proxy_thread(struct child * chp){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_proxy(int argc, unsigned char ** argv){
|
static int h_proxy(int argc, char ** argv){
|
||||||
struct child ch;
|
struct child ch;
|
||||||
|
|
||||||
ch.argc = argc;
|
ch.argc = argc;
|
||||||
@ -216,12 +216,12 @@ static int h_proxy(int argc, unsigned char ** argv){
|
|||||||
return start_proxy_thread(&ch);
|
return start_proxy_thread(&ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_internal(int argc, unsigned char ** argv){
|
static int h_internal(int argc, char ** argv){
|
||||||
getip46(46, argv[1], (struct sockaddr *)&conf.intsa);
|
getip46(46, argv[1], (struct sockaddr *)&conf.intsa);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_external(int argc, unsigned char ** argv){
|
static int h_external(int argc, char ** argv){
|
||||||
int res;
|
int res;
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
struct sockaddr_in6 sa6;
|
struct sockaddr_in6 sa6;
|
||||||
@ -237,49 +237,49 @@ static int h_external(int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_log(int argc, unsigned char ** argv){
|
static int h_log(int argc, char ** argv){
|
||||||
myfree(conf.logtarget);
|
myfree(conf.logtarget);
|
||||||
if(argc < 2) conf.logtarget = (unsigned char *)mystrdup("");
|
if(argc < 2) conf.logtarget = (char *)mystrdup("");
|
||||||
else conf.logtarget = (unsigned char *)mystrdup((char *)argv[1]);
|
else conf.logtarget = (char *)mystrdup((char *)argv[1]);
|
||||||
if(argc > 2) {
|
if(argc > 2) {
|
||||||
conf.logtype = getrotate(*argv[2]);
|
conf.logtype = getrotate(*argv[2]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_stacksize(int argc, unsigned char **argv){
|
static int h_stacksize(int argc, char **argv){
|
||||||
conf.stacksize = atoi((char *)argv[1]);
|
conf.stacksize = atoi((char *)argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_force(int argc, unsigned char **argv){
|
static int h_force(int argc, char **argv){
|
||||||
conf.noforce = 0;
|
conf.noforce = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_noforce(int argc, unsigned char **argv){
|
static int h_noforce(int argc, char **argv){
|
||||||
conf.noforce = 1;
|
conf.noforce = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_service(int argc, unsigned char **argv){
|
static int h_service(int argc, char **argv){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_daemon(int argc, unsigned char **argv){
|
static int h_daemon(int argc, char **argv){
|
||||||
if(!conf.demon)daemonize();
|
if(!conf.demon)daemonize();
|
||||||
conf.demon = 1;
|
conf.demon = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_config(int argc, unsigned char **argv){
|
static int h_config(int argc, char **argv){
|
||||||
if(conf.conffile)myfree(conf.conffile);
|
if(conf.conffile)myfree(conf.conffile);
|
||||||
conf.conffile = mystrdup((char *)argv[1]);
|
conf.conffile = mystrdup((char *)argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_include(int argc, unsigned char **argv){
|
static int h_include(int argc, char **argv){
|
||||||
int res;
|
int res;
|
||||||
FILE *fp1;
|
FILE *fp1;
|
||||||
|
|
||||||
@ -293,18 +293,18 @@ static int h_include(int argc, unsigned char **argv){
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_archiver(int argc, unsigned char **argv){
|
static int h_archiver(int argc, char **argv){
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
conf.archiver = myalloc(argc * sizeof(char *));
|
conf.archiver = myalloc(argc * sizeof(char *));
|
||||||
if(conf.archiver) {
|
if(conf.archiver) {
|
||||||
conf.archiverc = argc;
|
conf.archiverc = argc;
|
||||||
for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (unsigned char *)mystrdup((char *)argv[j]);
|
for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (char *)mystrdup((char *)argv[j]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_counter(int argc, unsigned char **argv){
|
static int h_counter(int argc, char **argv){
|
||||||
struct counter_header ch1;
|
struct counter_header ch1;
|
||||||
if(conf.counterd >=0)close(conf.counterd);
|
if(conf.counterd >=0)close(conf.counterd);
|
||||||
if(!conf.trafcountfunc) conf.trafcountfunc = trafcountfunc;
|
if(!conf.trafcountfunc) conf.trafcountfunc = trafcountfunc;
|
||||||
@ -344,19 +344,19 @@ static int h_counter(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_rotate(int argc, unsigned char **argv){
|
static int h_rotate(int argc, char **argv){
|
||||||
conf.rotate = atoi((char *)argv[1]);
|
conf.rotate = atoi((char *)argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_logformat(int argc, unsigned char **argv){
|
static int h_logformat(int argc, char **argv){
|
||||||
unsigned char * old = conf.logformat;
|
char * old = conf.logformat;
|
||||||
conf.logformat = (unsigned char *)mystrdup((char *)argv[1]);
|
conf.logformat = (char *)mystrdup((char *)argv[1]);
|
||||||
if(old) myfree(old);
|
if(old) myfree(old);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_timeouts(int argc, unsigned char **argv){
|
static int h_timeouts(int argc, char **argv){
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
for(j = 0; conf.timeouts[j] && j + 1 < argc; j++) {
|
for(j = 0; conf.timeouts[j] && j + 1 < argc; j++) {
|
||||||
@ -368,11 +368,11 @@ static int h_timeouts(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_noop(int argc, unsigned char **argv){
|
static int h_noop(int argc, char **argv){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_auth(int argc, unsigned char **argv){
|
static int h_auth(int argc, char **argv){
|
||||||
struct auth *au, * newau;
|
struct auth *au, * newau;
|
||||||
|
|
||||||
freeauth(conf.authfuncs);
|
freeauth(conf.authfuncs);
|
||||||
@ -397,9 +397,9 @@ static int h_auth(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_users(int argc, unsigned char **argv){
|
static int h_users(int argc, char **argv){
|
||||||
int j;
|
int j;
|
||||||
unsigned char *arg;
|
char *arg;
|
||||||
struct passwords *pwl = NULL;
|
struct passwords *pwl = NULL;
|
||||||
|
|
||||||
for (j = 1; j<argc; j++) {
|
for (j = 1; j<argc; j++) {
|
||||||
@ -409,22 +409,22 @@ static int h_users(int argc, unsigned char **argv){
|
|||||||
}
|
}
|
||||||
memset(pwl, 0, sizeof(struct passwords));
|
memset(pwl, 0, sizeof(struct passwords));
|
||||||
|
|
||||||
arg = (unsigned char *)strchr((char *)argv[j], ':');
|
arg = (char *)strchr((char *)argv[j], ':');
|
||||||
if(!arg||!arg[1]||!arg[2]||arg[3]!=':') {
|
if(!arg||!arg[1]||!arg[2]||arg[3]!=':') {
|
||||||
pwl->user = (unsigned char *)mystrdup((char *)argv[j]);
|
pwl->user = (char *)mystrdup((char *)argv[j]);
|
||||||
pwl->pwtype = SYS;
|
pwl->pwtype = SYS;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*arg = 0;
|
*arg = 0;
|
||||||
pwl->user = (unsigned char *)mystrdup((char *)argv[j]);
|
pwl->user = (char *)mystrdup((char *)argv[j]);
|
||||||
if((arg[1] == 'C' && arg[2] == 'L' && (pwl->pwtype = CL)) ||
|
if((arg[1] == 'C' && arg[2] == 'L' && (pwl->pwtype = CL)) ||
|
||||||
(arg[1] == 'C' && arg[2] == 'R' && (pwl->pwtype = CR)) ||
|
(arg[1] == 'C' && arg[2] == 'R' && (pwl->pwtype = CR)) ||
|
||||||
(arg[1] == 'N' && arg[2] == 'T' && (pwl->pwtype = NT)) ||
|
(arg[1] == 'N' && arg[2] == 'T' && (pwl->pwtype = NT)) ||
|
||||||
(arg[1] == 'L' && arg[2] == 'M' && (pwl->pwtype = LM))){
|
(arg[1] == 'L' && arg[2] == 'M' && (pwl->pwtype = LM))){
|
||||||
pwl->password = (unsigned char *)mystrdup((char *)arg+4);
|
pwl->password = (char *)mystrdup((char *)arg+4);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pwl->password = (unsigned char *) mystrdup((char *)arg + 1);
|
pwl->password = (char *) mystrdup((char *)arg + 1);
|
||||||
pwl->pwtype = UN;
|
pwl->pwtype = UN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -438,7 +438,7 @@ static int h_users(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_maxconn(int argc, unsigned char **argv){
|
static int h_maxconn(int argc, char **argv){
|
||||||
conf.maxchild = atoi((char *)argv[1]);
|
conf.maxchild = atoi((char *)argv[1]);
|
||||||
if(!conf.maxchild) {
|
if(!conf.maxchild) {
|
||||||
return(1);
|
return(1);
|
||||||
@ -458,21 +458,21 @@ static int h_maxconn(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_flush(int argc, unsigned char **argv){
|
static int h_flush(int argc, char **argv){
|
||||||
freeacl(conf.acl);
|
freeacl(conf.acl);
|
||||||
conf.acl = NULL;
|
conf.acl = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
static int h_flushusers(int argc, unsigned char **argv){
|
static int h_flushusers(int argc, char **argv){
|
||||||
freepwl(conf.pwl);
|
freepwl(conf.pwl);
|
||||||
conf.pwl = NULL;
|
conf.pwl = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int h_nserver(int argc, unsigned char **argv){
|
static int h_nserver(int argc, char **argv){
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
if(numservers < MAXNSERVERS) {
|
if(numservers < MAXNSERVERS) {
|
||||||
@ -491,7 +491,7 @@ static int h_nserver(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_authnserver(int argc, unsigned char **argv){
|
static int h_authnserver(int argc, char **argv){
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
if((str = strchr((char *)argv[1], '/')))
|
if((str = strchr((char *)argv[1], '/')))
|
||||||
@ -505,12 +505,12 @@ static int h_authnserver(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_fakeresolve(int argc, unsigned char **argv){
|
static int h_fakeresolve(int argc, char **argv){
|
||||||
resolvfunc = fakeresolver;
|
resolvfunc = fakeresolver;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nscache(int argc, unsigned char **argv){
|
static int h_nscache(int argc, char **argv){
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = atoi((char *)argv[1]);
|
res = atoi((char *)argv[1]);
|
||||||
@ -524,7 +524,7 @@ static int h_nscache(int argc, unsigned char **argv){
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int h_nscache6(int argc, unsigned char **argv){
|
static int h_nscache6(int argc, char **argv){
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = atoi((char *)argv[1]);
|
res = atoi((char *)argv[1]);
|
||||||
@ -539,7 +539,7 @@ static int h_nscache6(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nsrecord(int argc, unsigned char **argv){
|
static int h_nsrecord(int argc, char **argv){
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
struct sockaddr_in6 sa;
|
struct sockaddr_in6 sa;
|
||||||
#else
|
#else
|
||||||
@ -552,7 +552,7 @@ static int h_nsrecord(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_system(int argc, unsigned char **argv){
|
static int h_system(int argc, char **argv){
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if((res = system((char *)argv[1])) == -1){
|
if((res = system((char *)argv[1])) == -1){
|
||||||
@ -562,7 +562,7 @@ static int h_system(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_pidfile(int argc, unsigned char **argv){
|
static int h_pidfile(int argc, char **argv){
|
||||||
FILE *pidf;
|
FILE *pidf;
|
||||||
|
|
||||||
if(!(pidf = fopen((char *)argv[1], "w"))){
|
if(!(pidf = fopen((char *)argv[1], "w"))){
|
||||||
@ -574,7 +574,7 @@ static int h_pidfile(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_monitor(int argc, unsigned char **argv){
|
static int h_monitor(int argc, char **argv){
|
||||||
struct filemon * fm;
|
struct filemon * fm;
|
||||||
|
|
||||||
fm = myalloc(sizeof (struct filemon));
|
fm = myalloc(sizeof (struct filemon));
|
||||||
@ -590,7 +590,7 @@ static int h_monitor(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_parent(int argc, unsigned char **argv){
|
static int h_parent(int argc, char **argv){
|
||||||
struct ace *acl = NULL;
|
struct ace *acl = NULL;
|
||||||
struct chain *chains;
|
struct chain *chains;
|
||||||
|
|
||||||
@ -637,10 +637,10 @@ static int h_parent(int argc, unsigned char **argv){
|
|||||||
#else
|
#else
|
||||||
getip46(46, argv[3], (struct sockaddr *)&chains->addr);
|
getip46(46, argv[3], (struct sockaddr *)&chains->addr);
|
||||||
#endif
|
#endif
|
||||||
chains->exthost = (unsigned char *)mystrdup((char *)argv[3]);
|
chains->exthost = (char *)mystrdup((char *)argv[3]);
|
||||||
*SAPORT(&chains->addr) = htons((unsigned short)atoi((char *)argv[4]));
|
*SAPORT(&chains->addr) = htons((unsigned short)atoi((char *)argv[4]));
|
||||||
if(argc > 5) chains->extuser = (unsigned char *)mystrdup((char *)argv[5]);
|
if(argc > 5) chains->extuser = (char *)mystrdup((char *)argv[5]);
|
||||||
if(argc > 6) chains->extpass = (unsigned char *)mystrdup((char *)argv[6]);
|
if(argc > 6) chains->extpass = (char *)mystrdup((char *)argv[6]);
|
||||||
if(!acl->chains) {
|
if(!acl->chains) {
|
||||||
acl->chains = chains;
|
acl->chains = chains;
|
||||||
}
|
}
|
||||||
@ -654,7 +654,7 @@ static int h_parent(int argc, unsigned char **argv){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nolog(int argc, unsigned char **argv){
|
static int h_nolog(int argc, char **argv){
|
||||||
struct ace *acl = NULL;
|
struct ace *acl = NULL;
|
||||||
|
|
||||||
acl = conf.acl;
|
acl = conf.acl;
|
||||||
@ -668,7 +668,7 @@ static int h_nolog(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanipl(unsigned char *arg, struct iplist *dst){
|
int scanipl(char *arg, struct iplist *dst){
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
struct sockaddr_in6 sa;
|
struct sockaddr_in6 sa;
|
||||||
#else
|
#else
|
||||||
@ -686,7 +686,7 @@ int scanipl(unsigned char *arg, struct iplist *dst){
|
|||||||
dst->family = *SAFAMILY(&sa);
|
dst->family = *SAFAMILY(&sa);
|
||||||
if(dash){
|
if(dash){
|
||||||
if(afdetect(dash+1) == -1) return 1;
|
if(afdetect(dash+1) == -1) return 1;
|
||||||
if(!getip46(46, (unsigned char *)dash+1, (struct sockaddr *)&sa)) return 2;
|
if(!getip46(46, (char *)dash+1, (struct sockaddr *)&sa)) return 2;
|
||||||
memcpy(&dst->ip_to, SAADDR(&sa), SAADDRLEN(&sa));
|
memcpy(&dst->ip_to, SAADDR(&sa), SAADDRLEN(&sa));
|
||||||
if(*SAFAMILY(&sa) != dst->family || memcmp(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)) < 0) return 3;
|
if(*SAFAMILY(&sa) != dst->family || memcmp(&dst->ip_to, &dst->ip_from, SAADDRLEN(&sa)) < 0) return 3;
|
||||||
return 0;
|
return 0;
|
||||||
@ -700,12 +700,12 @@ int scanipl(unsigned char *arg, struct iplist *dst){
|
|||||||
int i, nbytes = masklen / 8, nbits = (8 - (masklen % 8)) % 8;
|
int i, nbytes = masklen / 8, nbits = (8 - (masklen % 8)) % 8;
|
||||||
|
|
||||||
for(i = addrlen; i>(nbytes + (nbits > 0)); i--){
|
for(i = addrlen; i>(nbytes + (nbits > 0)); i--){
|
||||||
((unsigned char *)&dst->ip_from)[i-1] = 0x00;
|
((char *)&dst->ip_from)[i-1] = 0x00;
|
||||||
((unsigned char *)&dst->ip_to)[i-1] = 0xff;
|
((char *)&dst->ip_to)[i-1] = 0xff;
|
||||||
}
|
}
|
||||||
for(;nbits;nbits--){
|
for(;nbits;nbits--){
|
||||||
((unsigned char *)&dst->ip_from)[nbytes] &= ~(0x01<<(nbits-1));
|
((char *)&dst->ip_from)[nbytes] &= ~(0x01<<(nbits-1));
|
||||||
((unsigned char *)&dst->ip_to)[nbytes] |= (0x01<<(nbits-1));
|
((char *)&dst->ip_to)[nbytes] |= (0x01<<(nbits-1));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -713,9 +713,9 @@ int scanipl(unsigned char *arg, struct iplist *dst){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ace * make_ace (int argc, unsigned char ** argv){
|
struct ace * make_ace (int argc, char ** argv){
|
||||||
struct ace * acl;
|
struct ace * acl;
|
||||||
unsigned char *arg;
|
char *arg;
|
||||||
struct iplist *ipl=NULL;
|
struct iplist *ipl=NULL;
|
||||||
struct portlist *portl=NULL;
|
struct portlist *portl=NULL;
|
||||||
struct userlist *userl=NULL;
|
struct userlist *userl=NULL;
|
||||||
@ -727,7 +727,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
memset(acl, 0, sizeof(struct ace));
|
memset(acl, 0, sizeof(struct ace));
|
||||||
if(argc > 0 && strcmp("*", (char *)argv[0])) {
|
if(argc > 0 && strcmp("*", (char *)argv[0])) {
|
||||||
arg = argv[0];
|
arg = argv[0];
|
||||||
arg = (unsigned char *)strtok((char *)arg, ",");
|
arg = (char *)strtok((char *)arg, ",");
|
||||||
do {
|
do {
|
||||||
if(!acl->users) {
|
if(!acl->users) {
|
||||||
acl->users = userl = myalloc(sizeof(struct userlist));
|
acl->users = userl = myalloc(sizeof(struct userlist));
|
||||||
@ -741,11 +741,11 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
memset(userl, 0, sizeof(struct userlist));
|
memset(userl, 0, sizeof(struct userlist));
|
||||||
userl->user=(unsigned char*)mystrdup((char *)arg);
|
userl->user=(char*)mystrdup((char *)arg);
|
||||||
} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
|
} while((arg = (char *)strtok((char *)NULL, ",")));
|
||||||
}
|
}
|
||||||
if(argc > 1 && strcmp("*", (char *)argv[1])) {
|
if(argc > 1 && strcmp("*", (char *)argv[1])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[1], ",");
|
arg = (char *)strtok((char *)argv[1], ",");
|
||||||
do {
|
do {
|
||||||
if(!acl->src) {
|
if(!acl->src) {
|
||||||
acl->src = ipl = myalloc(sizeof(struct iplist));
|
acl->src = ipl = myalloc(sizeof(struct iplist));
|
||||||
@ -763,13 +763,13 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
fprintf(stderr, "Invalid IP, IP range or CIDR, line %d\n", linenum);
|
fprintf(stderr, "Invalid IP, IP range or CIDR, line %d\n", linenum);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
|
} while((arg = (char *)strtok((char *)NULL, ",")));
|
||||||
}
|
}
|
||||||
if(argc > 2 && strcmp("*", (char *)argv[2])) {
|
if(argc > 2 && strcmp("*", (char *)argv[2])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[2], ",");
|
arg = (char *)strtok((char *)argv[2], ",");
|
||||||
do {
|
do {
|
||||||
int arglen;
|
int arglen;
|
||||||
unsigned char *pattern;
|
char *pattern;
|
||||||
struct iplist tmpip={NULL};
|
struct iplist tmpip={NULL};
|
||||||
|
|
||||||
arglen = (int)strlen((char *)arg);
|
arglen = (int)strlen((char *)arg);
|
||||||
@ -799,7 +799,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
arglen--;
|
arglen--;
|
||||||
hostnamel->matchtype ^= MATCHBEGIN;
|
hostnamel->matchtype ^= MATCHBEGIN;
|
||||||
}
|
}
|
||||||
hostnamel->name = (unsigned char *) mystrdup( (char *)pattern);
|
hostnamel->name = (char *) mystrdup( (char *)pattern);
|
||||||
if(!hostnamel->name) {
|
if(!hostnamel->name) {
|
||||||
fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
|
fprintf(stderr, "No memory for ACL entry, line %d\n", linenum);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
@ -820,10 +820,10 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
*ipl = tmpip;
|
*ipl = tmpip;
|
||||||
}
|
}
|
||||||
}while((arg = (unsigned char *)strtok((char *)NULL, ",")));
|
}while((arg = (char *)strtok((char *)NULL, ",")));
|
||||||
}
|
}
|
||||||
if(argc > 3 && strcmp("*", (char *)argv[3])) {
|
if(argc > 3 && strcmp("*", (char *)argv[3])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[3], ",");
|
arg = (char *)strtok((char *)argv[3], ",");
|
||||||
do {
|
do {
|
||||||
if(!acl->ports) {
|
if(!acl->ports) {
|
||||||
acl->ports = portl = myalloc(sizeof(struct portlist));
|
acl->ports = portl = myalloc(sizeof(struct portlist));
|
||||||
@ -843,10 +843,10 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
if (res == 1) portl->endport = portl->startport;
|
if (res == 1) portl->endport = portl->startport;
|
||||||
} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
|
} while((arg = (char *)strtok((char *)NULL, ",")));
|
||||||
}
|
}
|
||||||
if(argc > 4 && strcmp("*", (char *)argv[4])) {
|
if(argc > 4 && strcmp("*", (char *)argv[4])) {
|
||||||
arg = (unsigned char *)strtok((char *)argv[4], ",");
|
arg = (char *)strtok((char *)argv[4], ",");
|
||||||
do {
|
do {
|
||||||
if(!strcmp((char *)arg, "CONNECT")){
|
if(!strcmp((char *)arg, "CONNECT")){
|
||||||
acl->operation |= CONNECT;
|
acl->operation |= CONNECT;
|
||||||
@ -909,7 +909,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
fprintf(stderr, "Unknown operation type: %s line %d\n", arg, linenum);
|
fprintf(stderr, "Unknown operation type: %s line %d\n", arg, linenum);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
} while((arg = (unsigned char *)strtok((char *)NULL, ",")));
|
} while((arg = (char *)strtok((char *)NULL, ",")));
|
||||||
}
|
}
|
||||||
if(argc > 5){
|
if(argc > 5){
|
||||||
for(arg = argv[5]; *arg;){
|
for(arg = argv[5]; *arg;){
|
||||||
@ -973,7 +973,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_ace(int argc, unsigned char **argv){
|
static int h_ace(int argc, char **argv){
|
||||||
int res = 0;
|
int res = 0;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
struct ace *acl = NULL;
|
struct ace *acl = NULL;
|
||||||
@ -1187,26 +1187,26 @@ static int h_ace(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_logdump(int argc, unsigned char **argv){
|
static int h_logdump(int argc, char **argv){
|
||||||
conf.logdumpsrv = (unsigned) atoi((char *) *(argv + 1));
|
conf.logdumpsrv = (unsigned) atoi((char *) *(argv + 1));
|
||||||
if(argc > 2) conf.logdumpcli = (unsigned) atoi((char *) *(argv + 2));
|
if(argc > 2) conf.logdumpcli = (unsigned) atoi((char *) *(argv + 2));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_filtermaxsize(int argc, unsigned char **argv){
|
static int h_filtermaxsize(int argc, char **argv){
|
||||||
conf.filtermaxsize = atoi((char *) *(argv + 1));
|
conf.filtermaxsize = atoi((char *) *(argv + 1));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_delimchar(int argc, unsigned char **argv){
|
static int h_delimchar(int argc, char **argv){
|
||||||
conf.delimchar = *argv[1];
|
conf.delimchar = *argv[1];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef NORADIUS
|
#ifndef NORADIUS
|
||||||
static int h_radius(int argc, unsigned char **argv){
|
static int h_radius(int argc, char **argv){
|
||||||
unsigned short port;
|
unsigned short port;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1248,7 +1248,7 @@ static int h_radius(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
static int h_authcache(int argc, unsigned char **argv){
|
static int h_authcache(int argc, char **argv){
|
||||||
conf.authcachetype = 0;
|
conf.authcachetype = 0;
|
||||||
if(strstr((char *) *(argv + 1), "ip")) conf.authcachetype |= 1;
|
if(strstr((char *) *(argv + 1), "ip")) conf.authcachetype |= 1;
|
||||||
if(strstr((char *) *(argv + 1), "user")) conf.authcachetype |= 2;
|
if(strstr((char *) *(argv + 1), "user")) conf.authcachetype |= 2;
|
||||||
@ -1262,7 +1262,7 @@ static int h_authcache(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_plugin(int argc, unsigned char **argv){
|
static int h_plugin(int argc, char **argv){
|
||||||
#ifdef NOPLUGINS
|
#ifdef NOPLUGINS
|
||||||
return 999;
|
return 999;
|
||||||
#else
|
#else
|
||||||
@ -1302,7 +1302,7 @@ static int h_plugin(int argc, unsigned char **argv){
|
|||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
uid_t strtouid(unsigned char *str){
|
uid_t strtouid(char *str){
|
||||||
uid_t res = 0;
|
uid_t res = 0;
|
||||||
|
|
||||||
if(!isnumber(*(char *)str)){
|
if(!isnumber(*(char *)str)){
|
||||||
@ -1315,7 +1315,7 @@ uid_t strtouid(unsigned char *str){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_setuid(int argc, unsigned char **argv){
|
static int h_setuid(int argc, char **argv){
|
||||||
uid_t res = 0;
|
uid_t res = 0;
|
||||||
res = strtouid(argv[1]);
|
res = strtouid(argv[1]);
|
||||||
if(!res || setreuid(res,res)) {
|
if(!res || setreuid(res,res)) {
|
||||||
@ -1325,7 +1325,7 @@ static int h_setuid(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
gid_t strtogid(unsigned char *str){
|
gid_t strtogid(char *str){
|
||||||
gid_t res = 0;
|
gid_t res = 0;
|
||||||
|
|
||||||
if(!isnumber(*(char *)str)){
|
if(!isnumber(*(char *)str)){
|
||||||
@ -1337,7 +1337,7 @@ gid_t strtogid(unsigned char *str){
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_setgid(int argc, unsigned char **argv){
|
static int h_setgid(int argc, char **argv){
|
||||||
gid_t res = 0;
|
gid_t res = 0;
|
||||||
|
|
||||||
res = strtogid(argv[1]);
|
res = strtogid(argv[1]);
|
||||||
@ -1349,7 +1349,7 @@ static int h_setgid(int argc, unsigned char **argv){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int h_chroot(int argc, unsigned char **argv){
|
static int h_chroot(int argc, char **argv){
|
||||||
uid_t uid = 0;
|
uid_t uid = 0;
|
||||||
gid_t gid = 0;
|
gid_t gid = 0;
|
||||||
if(argc > 2) {
|
if(argc > 2) {
|
||||||
@ -1468,15 +1468,15 @@ struct commands commandhandlers[]={
|
|||||||
{specificcommands, "", h_noop, 1, 0}
|
{specificcommands, "", h_noop, 1, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize){
|
int parsestr (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize){
|
||||||
#define buf (*buff)
|
#define buf (*buff)
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
int space = 1;
|
int space = 1;
|
||||||
int comment = 0;
|
int comment = 0;
|
||||||
unsigned char * incbegin = 0;
|
char * incbegin = 0;
|
||||||
int fd;
|
int fd;
|
||||||
int res, len;
|
int res, len;
|
||||||
unsigned char *str1;
|
char *str1;
|
||||||
|
|
||||||
for(;;str++){
|
for(;;str++){
|
||||||
if(*str == '\"'){
|
if(*str == '\"'){
|
||||||
@ -1566,15 +1566,15 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
|
|||||||
|
|
||||||
|
|
||||||
int readconfig(FILE * fp){
|
int readconfig(FILE * fp){
|
||||||
unsigned char ** argv = NULL;
|
char ** argv = NULL;
|
||||||
unsigned char * buf = NULL;
|
char * buf = NULL;
|
||||||
int bufsize = STRINGBUF*2;
|
int bufsize = STRINGBUF*2;
|
||||||
int inbuf = 0;
|
int inbuf = 0;
|
||||||
int argc;
|
int argc;
|
||||||
struct commands * cm;
|
struct commands * cm;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
if( !(buf = myalloc(bufsize)) || ! (argv = myalloc((NPARAMS + 1) * sizeof(unsigned char *))) ) {
|
if( !(buf = myalloc(bufsize)) || ! (argv = myalloc((NPARAMS + 1) * sizeof(char *))) ) {
|
||||||
fprintf(stderr, "No memory for configuration");
|
fprintf(stderr, "No memory for configuration");
|
||||||
return(10);
|
return(10);
|
||||||
}
|
}
|
||||||
@ -1642,9 +1642,9 @@ void freeconf(struct extparam *confp){
|
|||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
struct filemon *fm;
|
struct filemon *fm;
|
||||||
int counterd, archiverc;
|
int counterd, archiverc;
|
||||||
unsigned char *logtarget;
|
char *logtarget;
|
||||||
unsigned char **archiver;
|
char **archiver;
|
||||||
unsigned char * logformat;
|
char * logformat;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1711,7 +1711,7 @@ void freeconf(struct extparam *confp){
|
|||||||
|
|
||||||
{
|
{
|
||||||
char * args[] = {"auth", "iponly", NULL};
|
char * args[] = {"auth", "iponly", NULL};
|
||||||
h_auth(2, (unsigned char **)args);
|
h_auth(2, (char **)args);
|
||||||
}
|
}
|
||||||
if(tc)dumpcounters(tc,counterd);
|
if(tc)dumpcounters(tc,counterd);
|
||||||
for(; tc; tc = (struct trafcount *) itfree(tc, tc->next)){
|
for(; tc; tc = (struct trafcount *) itfree(tc, tc->next)){
|
||||||
|
@ -153,12 +153,12 @@ void * dnsprchild(struct clientparam* param) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
|
if(socksendto(param->remsock, (struct sockaddr *)¶m->sinsr, (char *)buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
|
||||||
RETURN(820);
|
RETURN(820);
|
||||||
}
|
}
|
||||||
param->statscli64 += i;
|
param->statscli64 += i;
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, buf, BUFSIZE, conf.timeouts[DNS_TO]*1000);
|
len = sockrecvfrom(param->remsock, (struct sockaddr *)¶m->sinsr, (char *)buf, BUFSIZE, conf.timeouts[DNS_TO]*1000);
|
||||||
if(len <= 13) {
|
if(len <= 13) {
|
||||||
RETURN(821);
|
RETURN(821);
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ void * dnsprchild(struct clientparam* param) {
|
|||||||
if(len != us) RETURN(832);
|
if(len != us) RETURN(832);
|
||||||
}
|
}
|
||||||
if(buf[6] || buf[7]){
|
if(buf[6] || buf[7]){
|
||||||
if(socksendto(param->clisock, (struct sockaddr *)¶m->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){
|
if(socksendto(param->clisock, (struct sockaddr *)¶m->sincr, (char *)buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){
|
||||||
RETURN(822);
|
RETURN(822);
|
||||||
}
|
}
|
||||||
RETURN(0);
|
RETURN(0);
|
||||||
@ -185,7 +185,7 @@ void * dnsprchild(struct clientparam* param) {
|
|||||||
buf[2] = 0x85;
|
buf[2] = 0x85;
|
||||||
buf[3] = 0x83;
|
buf[3] = 0x83;
|
||||||
}
|
}
|
||||||
res = socksendto(param->clisock, (struct sockaddr *)¶m->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000);
|
res = socksendto(param->clisock, (struct sockaddr *)¶m->sincr, (char *)buf, len, conf.timeouts[SINGLEBYTE_L]*1000);
|
||||||
if(res != len){RETURN(819);}
|
if(res != len){RETURN(819);}
|
||||||
if(!ip) {RETURN(888);}
|
if(!ip) {RETURN(888);}
|
||||||
|
|
||||||
|
52
src/ftp.c
52
src/ftp.c
@ -20,7 +20,7 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) {
|
|||||||
|
|
||||||
if(innbuf)*innbuf = 0;
|
if(innbuf)*innbuf = 0;
|
||||||
if(len < 140) return 707;
|
if(len < 140) return 707;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
}
|
}
|
||||||
if(i < 3) return 706;
|
if(i < 3) return 706;
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
@ -28,13 +28,13 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) {
|
|||||||
*innbuf = i;
|
*innbuf = i;
|
||||||
return 702;
|
return 702;
|
||||||
}
|
}
|
||||||
sprintf(buf, "USER %.128s\r\n", param->extusername?param->extusername:(unsigned char *)"anonymous");
|
sprintf(buf, "USER %.128s\r\n", param->extusername?param->extusername:(char *)"anonymous");
|
||||||
if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
||||||
return 703;
|
return 703;
|
||||||
}
|
}
|
||||||
param->statscli64 += (int)strlen(buf);
|
param->statscli64 += (int)strlen(buf);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
}
|
}
|
||||||
if(i < 3) return 704;
|
if(i < 3) return 704;
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
@ -43,15 +43,15 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) {
|
|||||||
sprintf(buf, "PASS %.128s\r\n",
|
sprintf(buf, "PASS %.128s\r\n",
|
||||||
param->extusername?
|
param->extusername?
|
||||||
(param->extpassword?
|
(param->extpassword?
|
||||||
param->extpassword:(unsigned char *)"")
|
param->extpassword:(char *)"")
|
||||||
:(unsigned char *)"3proxy@");
|
:(char *)"3proxy@");
|
||||||
res = (int)strlen(buf);
|
res = (int)strlen(buf);
|
||||||
if((int)socksend(param->remsock, (unsigned char *)buf, res, conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
if((int)socksend(param->remsock, (char *)buf, res, conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
||||||
return 705;
|
return 705;
|
||||||
}
|
}
|
||||||
param->statscli64 += res;
|
param->statscli64 += res;
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, len - 1, '\n', conf.timeouts[STRING_L])) > 0){
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
res = (i>3 && buf[3] != '-')? atoi(buf)/100 : 0;
|
res = (i>3 && buf[3] != '-')? atoi(buf)/100 : 0;
|
||||||
if(res || (nbuf && (len-i) > 256 && i > 3)) {
|
if(res || (nbuf && (len-i) > 256 && i > 3)) {
|
||||||
@ -71,18 +71,18 @@ int ftplogin(struct clientparam *param, char *nbuf, int *innbuf) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftpcd(struct clientparam *param, unsigned char* path, char *nbuf, int *innbuf){
|
int ftpcd(struct clientparam *param, char* path, char *nbuf, int *innbuf){
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int i;
|
int i;
|
||||||
int inbuf = 0;
|
int inbuf = 0;
|
||||||
|
|
||||||
sprintf(buf, "CWD %.512s\r\n", path);
|
sprintf(buf, "CWD %.512s\r\n", path);
|
||||||
if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
||||||
return 711;
|
return 711;
|
||||||
}
|
}
|
||||||
param->statscli64 += (int)strlen(buf);
|
param->statscli64 += (int)strlen(buf);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
if(nbuf && innbuf && inbuf + i < *innbuf && i > 6) {
|
if(nbuf && innbuf && inbuf + i < *innbuf && i > 6) {
|
||||||
memcpy(nbuf + inbuf, buf, i);
|
memcpy(nbuf + inbuf, buf, i);
|
||||||
inbuf += i;
|
inbuf += i;
|
||||||
@ -95,7 +95,7 @@ int ftpcd(struct clientparam *param, unsigned char* path, char *nbuf, int *innbu
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftpres(struct clientparam *param, unsigned char * buf, int l){
|
int ftpres(struct clientparam *param, char * buf, int l){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (l < 16) return 755;
|
if (l < 16) return 755;
|
||||||
@ -107,10 +107,10 @@ int ftpres(struct clientparam *param, unsigned char * buf, int l){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len){
|
int ftpsyst(struct clientparam *param, char *buf, unsigned len){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(socksend(param->remsock, (unsigned char *)"SYST\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
if(socksend(param->remsock, (char *)"SYST\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
||||||
return 721;
|
return 721;
|
||||||
}
|
}
|
||||||
param->statscli64 += 6;
|
param->statscli64 += 6;
|
||||||
@ -125,11 +125,11 @@ int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len){
|
int ftppwd(struct clientparam *param, char *buf, unsigned len){
|
||||||
int i;
|
int i;
|
||||||
char *b, *e;
|
char *b, *e;
|
||||||
|
|
||||||
if(socksend(param->remsock, (unsigned char *)"PWD\r\n", 5, conf.timeouts[STRING_S]) != 5){
|
if(socksend(param->remsock, (char *)"PWD\r\n", 5, conf.timeouts[STRING_S]) != 5){
|
||||||
return 731;
|
return 731;
|
||||||
}
|
}
|
||||||
param->statscli64 += 5;
|
param->statscli64 += 5;
|
||||||
@ -149,17 +149,17 @@ int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftptype(struct clientparam *param, unsigned char* f_type){
|
int ftptype(struct clientparam *param, char* f_type){
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sprintf(buf, "TYPE %.512s\r\n", f_type);
|
sprintf(buf, "TYPE %.512s\r\n", f_type);
|
||||||
if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
if((int)socksend(param->remsock, (char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
||||||
return 741;
|
return 741;
|
||||||
}
|
}
|
||||||
param->statscli64 += (int)strlen(buf);
|
param->statscli64 += (int)strlen(buf);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
}
|
}
|
||||||
if(i < 3) return 742;
|
if(i < 3) return 742;
|
||||||
if(buf[0] != '2') return 740;
|
if(buf[0] != '2') return 740;
|
||||||
@ -176,12 +176,12 @@ SOCKET ftpdata(struct clientparam *param){
|
|||||||
unsigned short b5, b6;
|
unsigned short b5, b6;
|
||||||
SASIZETYPE sasize;
|
SASIZETYPE sasize;
|
||||||
|
|
||||||
if(socksend(param->remsock, (unsigned char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
if(socksend(param->remsock, (char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
param->statscli64 += 6;
|
param->statscli64 += 6;
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, (char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
}
|
}
|
||||||
if(i < 7) return INVALID_SOCKET;
|
if(i < 7) return INVALID_SOCKET;
|
||||||
if(buf[0] != '2') return INVALID_SOCKET;
|
if(buf[0] != '2') return INVALID_SOCKET;
|
||||||
@ -216,7 +216,7 @@ SOCKET ftpdata(struct clientparam *param){
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned char *arg) {
|
SOCKET ftpcommand(struct clientparam *param, char * command, char *arg) {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int i;
|
int i;
|
||||||
SOCKET s;
|
SOCKET s;
|
||||||
@ -225,15 +225,15 @@ SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned c
|
|||||||
s = ftpdata(param);
|
s = ftpdata(param);
|
||||||
if(s==INVALID_SOCKET) return INVALID_SOCKET;
|
if(s==INVALID_SOCKET) return INVALID_SOCKET;
|
||||||
sprintf(buf, "%.15s%s%.512s\r\n", command, arg?
|
sprintf(buf, "%.15s%s%.512s\r\n", command, arg?
|
||||||
(unsigned char *)" ":(unsigned char *)"",
|
" ":"",
|
||||||
arg?arg:(unsigned char *)"");
|
arg?arg:"");
|
||||||
if((int)socksend(param->remsock, (unsigned char *)buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
if((int)socksend(param->remsock, buf, (int)strlen(buf), conf.timeouts[STRING_S]) != (int)strlen(buf)){
|
||||||
so._closesocket(s);
|
so._closesocket(s);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
param->statscli64 += (int)strlen(buf);
|
param->statscli64 += (int)strlen(buf);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
while((i = sockgetlinebuf(param, SERVER, (unsigned char *)buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
while((i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L])) > 0 && (i < 3 || !isnumber(*buf) || buf[3] == '-')){
|
||||||
}
|
}
|
||||||
if(i < 3) {
|
if(i < 3) {
|
||||||
so._closesocket(s);
|
so._closesocket(s);
|
||||||
|
40
src/ftppr.c
40
src/ftppr.c
@ -13,8 +13,8 @@
|
|||||||
|
|
||||||
void * ftpprchild(struct clientparam* param) {
|
void * ftpprchild(struct clientparam* param) {
|
||||||
int i=0, res;
|
int i=0, res;
|
||||||
unsigned char *buf;
|
char *buf;
|
||||||
unsigned char *se;
|
char *se;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int inbuf;
|
int inbuf;
|
||||||
int pasv = 0;
|
int pasv = 0;
|
||||||
@ -29,7 +29,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
param->operation = CONNECT;
|
param->operation = CONNECT;
|
||||||
lg.l_onoff = 1;
|
lg.l_onoff = 1;
|
||||||
lg.l_linger = conf.timeouts[STRING_L];;
|
lg.l_linger = conf.timeouts[STRING_L];;
|
||||||
if(socksend(param->ctrlsock, (unsigned char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);}
|
if(socksend(param->ctrlsock, (char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);}
|
||||||
for(;;){
|
for(;;){
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 10, '\n', conf.timeouts[CONNECTION_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 10, '\n', conf.timeouts[CONNECTION_S]);
|
||||||
if(!i) {
|
if(!i) {
|
||||||
@ -37,7 +37,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
if(i<4) {RETURN(802);}
|
if(i<4) {RETURN(802);}
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if ((se=(unsigned char *)strchr((char *)buf, '\r'))) *se = 0;
|
if ((se=(char *)strchr((char *)buf, '\r'))) *se = 0;
|
||||||
if (req) myfree (req);
|
if (req) myfree (req);
|
||||||
req = NULL;
|
req = NULL;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
|
if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
|
||||||
param->ctrlsocksrv = param->remsock;
|
param->ctrlsocksrv = param->remsock;
|
||||||
if(socksend(param->ctrlsock, (unsigned char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);}
|
if(socksend(param->ctrlsock, (char *)"220 Ready\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (801);}
|
||||||
status = 1;
|
status = 1;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp((char *)buf, "USER ", 5)){
|
else if (!strncasecmp((char *)buf, "USER ", 5)){
|
||||||
@ -59,12 +59,12 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
|
if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
|
||||||
param->ctrlsocksrv = param->remsock;
|
param->ctrlsocksrv = param->remsock;
|
||||||
}
|
}
|
||||||
if(socksend(param->ctrlsock, (unsigned char *)"331 ok\r\n", 8, conf.timeouts[STRING_S])!=8) {RETURN (807);}
|
if(socksend(param->ctrlsock, (char *)"331 ok\r\n", 8, conf.timeouts[STRING_S])!=8) {RETURN (807);}
|
||||||
status = 2;
|
status = 2;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!strncasecmp((char *)buf, "PASS ", 5)){
|
else if (!strncasecmp((char *)buf, "PASS ", 5)){
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)buf+5);
|
param->extpassword = (char *)mystrdup((char *)buf+5);
|
||||||
inbuf = BUFSIZE;
|
inbuf = BUFSIZE;
|
||||||
res = ftplogin(param, (char *)buf, &inbuf);
|
res = ftplogin(param, (char *)buf, &inbuf);
|
||||||
param->res = res;
|
param->res = res;
|
||||||
@ -129,16 +129,16 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
if(pasv == 1){
|
if(pasv == 1){
|
||||||
if(*SAFAMILY(¶m->sincl) == AF_INET)
|
if(*SAFAMILY(¶m->sincl) == AF_INET)
|
||||||
sprintf((char *)buf, "227 OK (%u,%u,%u,%u,%u,%u)\r\n",
|
sprintf((char *)buf, "227 OK (%u,%u,%u,%u,%u,%u)\r\n",
|
||||||
(unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[0]),
|
(unsigned)(((char *)(SAADDR(¶m->sincl)))[0]),
|
||||||
(unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[1]),
|
(unsigned)(((char *)(SAADDR(¶m->sincl)))[1]),
|
||||||
(unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[2]),
|
(unsigned)(((char *)(SAADDR(¶m->sincl)))[2]),
|
||||||
(unsigned)(((unsigned char *)(SAADDR(¶m->sincl)))[3]),
|
(unsigned)(((char *)(SAADDR(¶m->sincl)))[3]),
|
||||||
(unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[0]),
|
(unsigned)(((char *)(SAPORT(¶m->sincl)))[0]),
|
||||||
(unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[1])
|
(unsigned)(((char *)(SAPORT(¶m->sincl)))[1])
|
||||||
);
|
);
|
||||||
else sprintf((char *)buf, "227 OK (127,0,0,1,%u,%u)\r\n",
|
else sprintf((char *)buf, "227 OK (127,0,0,1,%u,%u)\r\n",
|
||||||
(unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[0]),
|
(unsigned)(((char *)(SAPORT(¶m->sincl)))[0]),
|
||||||
(unsigned)(((unsigned char *)(SAPORT(¶m->sincl)))[1])
|
(unsigned)(((char *)(SAPORT(¶m->sincl)))[1])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -230,11 +230,11 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
so._closesocket(clidatasock);
|
so._closesocket(clidatasock);
|
||||||
clidatasock = INVALID_SOCKET;
|
clidatasock = INVALID_SOCKET;
|
||||||
|
|
||||||
if(socksend(param->ctrlsock, (unsigned char *)"550 err\r\n", 9, conf.timeouts[STRING_S])!=9) {RETURN (831);}
|
if(socksend(param->ctrlsock, (char *)"550 err\r\n", 9, conf.timeouts[STRING_S])!=9) {RETURN (831);}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(socksend(param->ctrlsock, (unsigned char *)"125 data\r\n", 10, conf.timeouts[STRING_S]) != 10) {
|
if(socksend(param->ctrlsock, (char *)"125 data\r\n", 10, conf.timeouts[STRING_S]) != 10) {
|
||||||
param->remsock = INVALID_SOCKET;
|
param->remsock = INVALID_SOCKET;
|
||||||
RETURN (832);
|
RETURN (832);
|
||||||
}
|
}
|
||||||
@ -274,7 +274,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(status < 3) {
|
if(status < 3) {
|
||||||
if(socksend(param->remsock, (unsigned char *)"530 login\r\n", 11, conf.timeouts[STRING_S])!=1) {RETURN (810);}
|
if(socksend(param->remsock, (char *)"530 login\r\n", 11, conf.timeouts[STRING_S])!=1) {RETURN (810);}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(!strncasecmp((char *)buf, "QUIT", 4)) status = 5;
|
if(!strncasecmp((char *)buf, "QUIT", 4)) status = 5;
|
||||||
@ -295,7 +295,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
sasize = sizeof(param->sincr);
|
sasize = sizeof(param->sincr);
|
||||||
if(so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize)){RETURN(819);}
|
if(so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize)){RETURN(819);}
|
||||||
if(req && (param->statscli64 || param->statssrv64)){
|
if(req && (param->statscli64 || param->statssrv64)){
|
||||||
dolog(param, (unsigned char *)req);
|
dolog(param, (char *)req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,7 +316,7 @@ CLEANRET:
|
|||||||
sasize = sizeof(param->sincr);
|
sasize = sizeof(param->sincr);
|
||||||
so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize);
|
so._getpeername(param->ctrlsock, (struct sockaddr *)¶m->sincr, &sasize);
|
||||||
if(param->res != 0 || param->statscli64 || param->statssrv64 ){
|
if(param->res != 0 || param->statscli64 || param->statssrv64 ){
|
||||||
dolog(param, (unsigned char *)((req && (param->res > 802))? req:NULL));
|
dolog(param, (req && (param->res > 802))? req:NULL);
|
||||||
}
|
}
|
||||||
if(req) myfree(req);
|
if(req) myfree(req);
|
||||||
if(buf) myfree(buf);
|
if(buf) myfree(buf);
|
||||||
|
3821
src/libs/regex.c
3821
src/libs/regex.c
File diff suppressed because it is too large
Load Diff
@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
Minimal version of Henry Spencer's regex library
|
|
||||||
with minor modifications
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _REGEX_H_
|
|
||||||
#define _REGEX_H_
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef off_t regoff_t;
|
|
||||||
typedef struct {
|
|
||||||
int re_magic;
|
|
||||||
size_t re_nsub; /* number of parenthesized subexpressions */
|
|
||||||
const char *re_endp; /* end pointer for REG_PEND */
|
|
||||||
struct re_guts *re_g; /* none of your business :-) */
|
|
||||||
} regex_t;
|
|
||||||
typedef struct {
|
|
||||||
regoff_t rm_so; /* start of match */
|
|
||||||
regoff_t rm_eo; /* end of match */
|
|
||||||
} regmatch_t;
|
|
||||||
|
|
||||||
|
|
||||||
extern int regcomp(regex_t *, const char *, int);
|
|
||||||
#define REG_BASIC 0000
|
|
||||||
#define REG_EXTENDED 0001
|
|
||||||
#define REG_ICASE 0002
|
|
||||||
#define REG_NOSUB 0004
|
|
||||||
#define REG_NEWLINE 0010
|
|
||||||
#define REG_NOSPEC 0020
|
|
||||||
#define REG_PEND 0040
|
|
||||||
#define REG_DUMP 0200
|
|
||||||
|
|
||||||
|
|
||||||
#define REG_OKAY 0
|
|
||||||
#define REG_NOMATCH 1
|
|
||||||
#define REG_BADPAT 2
|
|
||||||
#define REG_ECOLLATE 3
|
|
||||||
#define REG_ECTYPE 4
|
|
||||||
#define REG_EESCAPE 5
|
|
||||||
#define REG_ESUBREG 6
|
|
||||||
#define REG_EBRACK 7
|
|
||||||
#define REG_EPAREN 8
|
|
||||||
#define REG_EBRACE 9
|
|
||||||
#define REG_BADBR 10
|
|
||||||
#define REG_ERANGE 11
|
|
||||||
#define REG_ESPACE 12
|
|
||||||
#define REG_BADRPT 13
|
|
||||||
#define REG_EMPTY 14
|
|
||||||
#define REG_ASSERT 15
|
|
||||||
#define REG_INVARG 16
|
|
||||||
#define REG_ATOI 255 /* convert name to number (!) */
|
|
||||||
#define REG_ITOA 0400 /* convert number to name (!) */
|
|
||||||
|
|
||||||
|
|
||||||
extern int regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
|
|
||||||
#define REG_NOTBOL 00001
|
|
||||||
#define REG_NOTEOL 00002
|
|
||||||
#define REG_STARTEND 00004
|
|
||||||
#define REG_TRACE 00400 /* tracing of execution */
|
|
||||||
#define REG_LARGE 01000 /* force large representation */
|
|
||||||
#define REG_BACKR 02000 /* force use of backref code */
|
|
||||||
|
|
||||||
|
|
||||||
extern void regfree(regex_t *);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@ -1,321 +0,0 @@
|
|||||||
/*
|
|
||||||
Unix SMB/CIFS implementation.
|
|
||||||
|
|
||||||
a partial implementation of DES designed for use in the
|
|
||||||
SMB authentication protocol
|
|
||||||
|
|
||||||
Copyright (C) Andrew Tridgell 1998
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define uchar unsigned char
|
|
||||||
|
|
||||||
static const uchar perm1[56] = {57, 49, 41, 33, 25, 17, 9,
|
|
||||||
1, 58, 50, 42, 34, 26, 18,
|
|
||||||
10, 2, 59, 51, 43, 35, 27,
|
|
||||||
19, 11, 3, 60, 52, 44, 36,
|
|
||||||
63, 55, 47, 39, 31, 23, 15,
|
|
||||||
7, 62, 54, 46, 38, 30, 22,
|
|
||||||
14, 6, 61, 53, 45, 37, 29,
|
|
||||||
21, 13, 5, 28, 20, 12, 4};
|
|
||||||
|
|
||||||
static const uchar perm2[48] = {14, 17, 11, 24, 1, 5,
|
|
||||||
3, 28, 15, 6, 21, 10,
|
|
||||||
23, 19, 12, 4, 26, 8,
|
|
||||||
16, 7, 27, 20, 13, 2,
|
|
||||||
41, 52, 31, 37, 47, 55,
|
|
||||||
30, 40, 51, 45, 33, 48,
|
|
||||||
44, 49, 39, 56, 34, 53,
|
|
||||||
46, 42, 50, 36, 29, 32};
|
|
||||||
|
|
||||||
static const uchar perm3[64] = {58, 50, 42, 34, 26, 18, 10, 2,
|
|
||||||
60, 52, 44, 36, 28, 20, 12, 4,
|
|
||||||
62, 54, 46, 38, 30, 22, 14, 6,
|
|
||||||
64, 56, 48, 40, 32, 24, 16, 8,
|
|
||||||
57, 49, 41, 33, 25, 17, 9, 1,
|
|
||||||
59, 51, 43, 35, 27, 19, 11, 3,
|
|
||||||
61, 53, 45, 37, 29, 21, 13, 5,
|
|
||||||
63, 55, 47, 39, 31, 23, 15, 7};
|
|
||||||
|
|
||||||
static const uchar perm4[48] = { 32, 1, 2, 3, 4, 5,
|
|
||||||
4, 5, 6, 7, 8, 9,
|
|
||||||
8, 9, 10, 11, 12, 13,
|
|
||||||
12, 13, 14, 15, 16, 17,
|
|
||||||
16, 17, 18, 19, 20, 21,
|
|
||||||
20, 21, 22, 23, 24, 25,
|
|
||||||
24, 25, 26, 27, 28, 29,
|
|
||||||
28, 29, 30, 31, 32, 1};
|
|
||||||
|
|
||||||
static const uchar perm5[32] = { 16, 7, 20, 21,
|
|
||||||
29, 12, 28, 17,
|
|
||||||
1, 15, 23, 26,
|
|
||||||
5, 18, 31, 10,
|
|
||||||
2, 8, 24, 14,
|
|
||||||
32, 27, 3, 9,
|
|
||||||
19, 13, 30, 6,
|
|
||||||
22, 11, 4, 25};
|
|
||||||
|
|
||||||
|
|
||||||
static const uchar perm6[64] ={ 40, 8, 48, 16, 56, 24, 64, 32,
|
|
||||||
39, 7, 47, 15, 55, 23, 63, 31,
|
|
||||||
38, 6, 46, 14, 54, 22, 62, 30,
|
|
||||||
37, 5, 45, 13, 53, 21, 61, 29,
|
|
||||||
36, 4, 44, 12, 52, 20, 60, 28,
|
|
||||||
35, 3, 43, 11, 51, 19, 59, 27,
|
|
||||||
34, 2, 42, 10, 50, 18, 58, 26,
|
|
||||||
33, 1, 41, 9, 49, 17, 57, 25};
|
|
||||||
|
|
||||||
|
|
||||||
static const uchar sc[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
|
|
||||||
|
|
||||||
static const uchar sbox[8][4][16] = {
|
|
||||||
{{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
|
|
||||||
{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
|
|
||||||
{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
|
|
||||||
{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}},
|
|
||||||
|
|
||||||
{{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
|
|
||||||
{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
|
|
||||||
{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
|
|
||||||
{13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}},
|
|
||||||
|
|
||||||
{{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
|
|
||||||
{13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
|
|
||||||
{13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
|
|
||||||
{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}},
|
|
||||||
|
|
||||||
{{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
|
|
||||||
{13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
|
|
||||||
{10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
|
|
||||||
{3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}},
|
|
||||||
|
|
||||||
{{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
|
|
||||||
{14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
|
|
||||||
{4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
|
|
||||||
{11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}},
|
|
||||||
|
|
||||||
{{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
|
|
||||||
{10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
|
|
||||||
{9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
|
|
||||||
{4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}},
|
|
||||||
|
|
||||||
{{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
|
|
||||||
{13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
|
|
||||||
{1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
|
|
||||||
{6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}},
|
|
||||||
|
|
||||||
{{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
|
|
||||||
{1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
|
|
||||||
{7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
|
|
||||||
{2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}};
|
|
||||||
|
|
||||||
static void permute(char *out, const char *in, const uchar *p, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0;i<n;i++)
|
|
||||||
out[i] = in[p[i]-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lshift(char *d, int count, int n)
|
|
||||||
{
|
|
||||||
char out[64];
|
|
||||||
int i;
|
|
||||||
for (i=0;i<n;i++)
|
|
||||||
out[i] = d[(i+count)%n];
|
|
||||||
for (i=0;i<n;i++)
|
|
||||||
d[i] = out[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void concat(char *out, char *in1, char *in2, int l1, int l2)
|
|
||||||
{
|
|
||||||
while (l1--)
|
|
||||||
*out++ = *in1++;
|
|
||||||
while (l2--)
|
|
||||||
*out++ = *in2++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xor(char *out, char *in1, char *in2, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0;i<n;i++)
|
|
||||||
out[i] = in1[i] ^ in2[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dohash(char *out, char *in, char *key)
|
|
||||||
{
|
|
||||||
int i, j, k;
|
|
||||||
char pk1[56];
|
|
||||||
char c[28];
|
|
||||||
char d[28];
|
|
||||||
char cd[56];
|
|
||||||
char ki[16][48];
|
|
||||||
char pd1[64];
|
|
||||||
char l[32], r[32];
|
|
||||||
char rl[64];
|
|
||||||
|
|
||||||
permute(pk1, key, perm1, 56);
|
|
||||||
|
|
||||||
for (i=0;i<28;i++)
|
|
||||||
c[i] = pk1[i];
|
|
||||||
for (i=0;i<28;i++)
|
|
||||||
d[i] = pk1[i+28];
|
|
||||||
|
|
||||||
for (i=0;i<16;i++) {
|
|
||||||
lshift(c, sc[i], 28);
|
|
||||||
lshift(d, sc[i], 28);
|
|
||||||
|
|
||||||
concat(cd, c, d, 28, 28);
|
|
||||||
permute(ki[i], cd, perm2, 48);
|
|
||||||
}
|
|
||||||
|
|
||||||
permute(pd1, in, perm3, 64);
|
|
||||||
|
|
||||||
for (j=0;j<32;j++) {
|
|
||||||
l[j] = pd1[j];
|
|
||||||
r[j] = pd1[j+32];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0;i<16;i++) {
|
|
||||||
char er[48];
|
|
||||||
char erk[48];
|
|
||||||
char b[8][6];
|
|
||||||
char cb[32];
|
|
||||||
char pcb[32];
|
|
||||||
char r2[32];
|
|
||||||
|
|
||||||
permute(er, r, perm4, 48);
|
|
||||||
|
|
||||||
xor(erk, er, ki[i], 48);
|
|
||||||
|
|
||||||
for (j=0;j<8;j++)
|
|
||||||
for (k=0;k<6;k++)
|
|
||||||
b[j][k] = erk[j*6 + k];
|
|
||||||
|
|
||||||
for (j=0;j<8;j++) {
|
|
||||||
int m, n;
|
|
||||||
m = (b[j][0]<<1) | b[j][5];
|
|
||||||
|
|
||||||
n = (b[j][1]<<3) | (b[j][2]<<2) | (b[j][3]<<1) | b[j][4];
|
|
||||||
|
|
||||||
for (k=0;k<4;k++)
|
|
||||||
b[j][k] = (sbox[j][m][n] & (1<<(3-k)))?1:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j=0;j<8;j++)
|
|
||||||
for (k=0;k<4;k++)
|
|
||||||
cb[j*4+k] = b[j][k];
|
|
||||||
permute(pcb, cb, perm5, 32);
|
|
||||||
|
|
||||||
xor(r2, l, pcb, 32);
|
|
||||||
|
|
||||||
for (j=0;j<32;j++)
|
|
||||||
l[j] = r[j];
|
|
||||||
|
|
||||||
for (j=0;j<32;j++)
|
|
||||||
r[j] = r2[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
concat(rl, r, l, 32, 32);
|
|
||||||
|
|
||||||
permute(out, rl, perm6, 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void str_to_key(unsigned char *str,unsigned char *key)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
key[0] = str[0]>>1;
|
|
||||||
key[1] = ((str[0]&0x01)<<6) | (str[1]>>2);
|
|
||||||
key[2] = ((str[1]&0x03)<<5) | (str[2]>>3);
|
|
||||||
key[3] = ((str[2]&0x07)<<4) | (str[3]>>4);
|
|
||||||
key[4] = ((str[3]&0x0F)<<3) | (str[4]>>5);
|
|
||||||
key[5] = ((str[4]&0x1F)<<2) | (str[5]>>6);
|
|
||||||
key[6] = ((str[5]&0x3F)<<1) | (str[6]>>7);
|
|
||||||
key[7] = str[6]&0x7F;
|
|
||||||
for (i=0;i<8;i++) {
|
|
||||||
key[i] = (key[i]<<1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void smbhash(unsigned char *out, const unsigned char *in, unsigned char *key)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char outb[64];
|
|
||||||
char inb[64];
|
|
||||||
char keyb[64];
|
|
||||||
unsigned char key2[8];
|
|
||||||
|
|
||||||
str_to_key(key, key2);
|
|
||||||
|
|
||||||
for (i=0;i<64;i++) {
|
|
||||||
inb[i] = (in[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
|
|
||||||
keyb[i] = (key2[i/8] & (1<<(7-(i%8)))) ? 1 : 0;
|
|
||||||
outb[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dohash(outb, inb, keyb);
|
|
||||||
|
|
||||||
for (i=0;i<8;i++) {
|
|
||||||
out[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0;i<64;i++) {
|
|
||||||
if (outb[i])
|
|
||||||
out[i/8] |= (1<<(7-(i%8)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Converts the password to uppercase, and creates the LM
|
|
||||||
* password hash.
|
|
||||||
*/
|
|
||||||
void lmpwdhash(const unsigned char *password,unsigned char *lmhash)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned char p14[14];
|
|
||||||
static unsigned char sp8[8] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
|
|
||||||
|
|
||||||
memset(p14, 0, sizeof(p14));
|
|
||||||
for (i = 0; i < 14 && password[i]; i++) {
|
|
||||||
p14[i] = toupper((int) password[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
smbhash(lmhash, sp8, p14);
|
|
||||||
smbhash(lmhash+8, sp8, p14+7);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Take the NT or LM password, and return the MSCHAP response
|
|
||||||
*
|
|
||||||
* The win_password MUST be exactly 16 bytes long.
|
|
||||||
*/
|
|
||||||
void mschap(const unsigned char *win_password,
|
|
||||||
const unsigned char *challenge, unsigned char *response)
|
|
||||||
{
|
|
||||||
unsigned char p21[21];
|
|
||||||
|
|
||||||
memset(p21, 0, sizeof(p21));
|
|
||||||
memcpy(p21, win_password, 16);
|
|
||||||
|
|
||||||
smbhash(response, challenge, p21);
|
|
||||||
smbhash(response+8, challenge, p21+7);
|
|
||||||
smbhash(response+16, challenge, p21+14);
|
|
||||||
}
|
|
22
src/log.c
22
src/log.c
@ -58,7 +58,7 @@ void logpush(struct logevent *evt);
|
|||||||
#define HAVESQL 0
|
#define HAVESQL 0
|
||||||
#else
|
#else
|
||||||
#ifndef NORADIUS
|
#ifndef NORADIUS
|
||||||
int raddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s);
|
int raddobuf(struct clientparam * param, char * buf, int bufsize, const char *s);
|
||||||
void logradius(const char * buf, int len, struct LOGGER *logger);
|
void logradius(const char * buf, int len, struct LOGGER *logger);
|
||||||
#define HAVERADIUS 1
|
#define HAVERADIUS 1
|
||||||
#else
|
#else
|
||||||
@ -67,7 +67,7 @@ void logradius(const char * buf, int len, struct LOGGER *logger);
|
|||||||
#ifndef NOODBC
|
#ifndef NOODBC
|
||||||
#define HAVESQL 1
|
#define HAVESQL 1
|
||||||
static int sqlinit(struct LOGGER *logger);
|
static int sqlinit(struct LOGGER *logger);
|
||||||
static int sqldobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s);
|
static int sqldobuf(struct clientparam * param, char * buf, int bufsize, const char *s);
|
||||||
static void sqllog(const char * buf, int len, struct LOGGER *logger);
|
static void sqllog(const char * buf, int len, struct LOGGER *logger);
|
||||||
static void sqlrotate(struct LOGGER *logger);
|
static void sqlrotate(struct LOGGER *logger);
|
||||||
static void sqlclose(struct LOGGER *logger);
|
static void sqlclose(struct LOGGER *logger);
|
||||||
@ -87,7 +87,7 @@ static void syslogclose(struct LOGGER *logger);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int stdloginit(struct LOGGER *logger);
|
static int stdloginit(struct LOGGER *logger);
|
||||||
static int stddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s);
|
static int stddobuf(struct clientparam * param, char * buf, int bufsize, const char *s);
|
||||||
static void stdlog(const char * buf, int len, struct LOGGER *logger);
|
static void stdlog(const char * buf, int len, struct LOGGER *logger);
|
||||||
static void stdlogrotate(struct LOGGER *logger);
|
static void stdlogrotate(struct LOGGER *logger);
|
||||||
static void stdlogclose(struct LOGGER *logger);
|
static void stdlogclose(struct LOGGER *logger);
|
||||||
@ -346,7 +346,7 @@ static void delaydolog(struct logevent *evt){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dolog(struct clientparam * param, const unsigned char *s){
|
void dolog(struct clientparam * param, const char *s){
|
||||||
static int init = 0;
|
static int init = 0;
|
||||||
|
|
||||||
if(!param || !param->srv){
|
if(!param || !param->srv){
|
||||||
@ -497,7 +497,7 @@ char months[12][4] = {
|
|||||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t) {
|
char * dologname (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t) {
|
||||||
struct tm *ts;
|
struct tm *ts;
|
||||||
|
|
||||||
ts = localtime(&t);
|
ts = localtime(&t);
|
||||||
@ -538,7 +538,7 @@ unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format){
|
int dobuf2(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format){
|
||||||
int i, j;
|
int i, j;
|
||||||
int len;
|
int len;
|
||||||
time_t sec;
|
time_t sec;
|
||||||
@ -670,7 +670,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const u
|
|||||||
if(param->service < 15) {
|
if(param->service < 15) {
|
||||||
len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0;
|
len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0;
|
||||||
if(len > 20) len = 20;
|
if(len > 20) len = 20;
|
||||||
memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1);
|
memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(char*)"-", (len)?len:1);
|
||||||
i += (len)?len:1;
|
i += (len)?len:1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -787,7 +787,7 @@ int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const u
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec){
|
int dobuf(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec){
|
||||||
struct tm* tm;
|
struct tm* tm;
|
||||||
int i;
|
int i;
|
||||||
char * format;
|
char * format;
|
||||||
@ -828,7 +828,7 @@ static int stdloginit(struct LOGGER *logger){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stddobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s){
|
static int stddobuf(struct clientparam * param, char * buf, int bufsize, const char *s){
|
||||||
return dobuf(param, buf, bufsize, s, NULL);
|
return dobuf(param, buf, bufsize, s, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1014,8 +1014,8 @@ static int sqlinit(struct LOGGER *logger){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sqldobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s){
|
static int sqldobuf(struct clientparam * param, char * buf, int bufsize, const char *s){
|
||||||
return dobuf(param, buf, bufsize, s, (unsigned char *)"\'");
|
return dobuf(param, buf, bufsize, s, "\'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,13 +16,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void tohex(unsigned char *in, unsigned char *out, int len);
|
void tohex(char *in, char *out, int len);
|
||||||
|
|
||||||
static unsigned char itoa64[] =
|
static char itoa64[] =
|
||||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
|
|
||||||
void
|
void
|
||||||
_crypt_to64(unsigned char *s, unsigned long v, int n)
|
_crypt_to64(char *s, unsigned long v, int n)
|
||||||
{
|
{
|
||||||
while (--n >= 0) {
|
while (--n >= 0) {
|
||||||
*s++ = itoa64[v&0x3f];
|
*s++ = itoa64[v&0x3f];
|
||||||
@ -31,9 +31,9 @@ _crypt_to64(unsigned char *s, unsigned long v, int n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPassword, int ctohex)
|
char * ntpwdhash (char *szHash, const char *szPassword, int ctohex)
|
||||||
{
|
{
|
||||||
unsigned char szUnicodePass[513];
|
char szUnicodePass[513];
|
||||||
unsigned int nPasswordLen;
|
unsigned int nPasswordLen;
|
||||||
MD4_CTX ctx;
|
MD4_CTX ctx;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -61,14 +61,14 @@ unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPasswor
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsigned char *passwd){
|
char * mycrypt(const char *pw, const char *salt, char *passwd){
|
||||||
|
|
||||||
const unsigned char *ep;
|
const char *ep;
|
||||||
if(salt[0] == '$' && salt[1] == '1' && salt[2] == '$' && (ep = (unsigned char *)strchr((char *)salt+3, '$'))) {
|
if(salt[0] == '$' && salt[1] == '1' && salt[2] == '$' && (ep = (char *)strchr((char *)salt+3, '$'))) {
|
||||||
static unsigned char *magic = (unsigned char *)"$1$";
|
static char *magic = (char *)"$1$";
|
||||||
unsigned char *p;
|
char *p;
|
||||||
const unsigned char *sp;
|
const char *sp;
|
||||||
unsigned char final[MD5_SIZE];
|
char final[MD5_SIZE];
|
||||||
int sl,pl,i;
|
int sl,pl,i;
|
||||||
MD5_CTX ctx,ctx1;
|
MD5_CTX ctx,ctx1;
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
@ -90,7 +90,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
|
|||||||
/* Then the raw salt */
|
/* Then the raw salt */
|
||||||
MD5Update(&ctx,sp,sl);
|
MD5Update(&ctx,sp,sl);
|
||||||
|
|
||||||
/* Then just as many unsigned characters of the MD5(pw,salt,pw) */
|
/* Then just as many characters of the MD5(pw,salt,pw) */
|
||||||
MD5Init(&ctx1);
|
MD5Init(&ctx1);
|
||||||
MD5Update(&ctx1,pw,strlen((char *)pw));
|
MD5Update(&ctx1,pw,strlen((char *)pw));
|
||||||
MD5Update(&ctx1,sp,sl);
|
MD5Update(&ctx1,sp,sl);
|
||||||
@ -170,7 +170,7 @@ unsigned char * mycrypt(const unsigned char *pw, const unsigned char *salt, unsi
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
int main(int argc, char* argv[]){
|
int main(int argc, char* argv[]){
|
||||||
unsigned char buf[1024];
|
char buf[1024];
|
||||||
unsigned i;
|
unsigned i;
|
||||||
if(argc < 2 || argc > 3) {
|
if(argc < 2 || argc > 3) {
|
||||||
fprintf(stderr, "usage: \n"
|
fprintf(stderr, "usage: \n"
|
||||||
@ -185,13 +185,13 @@ int main(int argc, char* argv[]){
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(argc == 2) {
|
if(argc == 2) {
|
||||||
printf("NT:%s\n", ntpwdhash(buf, (unsigned char *)argv[1], 1));
|
printf("NT:%s\n", ntpwdhash(buf, (char *)argv[1], 1));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
i = (int)strlen((char *)argv[1]);
|
i = (int)strlen((char *)argv[1]);
|
||||||
if (i > 64) argv[1][64] = 0;
|
if (i > 64) argv[1][64] = 0;
|
||||||
sprintf((char *)buf, "$1$%s$", argv[1]);
|
sprintf((char *)buf, "$1$%s$", argv[1]);
|
||||||
printf("CR:%s\n", mycrypt((unsigned char *)argv[2], buf, buf+256));
|
printf("CR:%s\n", mycrypt(argv[2], buf, buf+256));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
88
src/ntlm.c
88
src/ntlm.c
@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
3APA3A simpliest proxy server
|
|
||||||
(c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru>
|
|
||||||
|
|
||||||
please read License Agreement
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "proxy.h"
|
|
||||||
struct ntlmchal {
|
|
||||||
unsigned char sig[8];
|
|
||||||
unsigned char messtype[4];
|
|
||||||
unsigned char dom_len[2];
|
|
||||||
unsigned char dom_max_len[2];
|
|
||||||
unsigned char dom_offset[4];
|
|
||||||
unsigned char flags[4];
|
|
||||||
unsigned char challenge[8];
|
|
||||||
unsigned char reserved[8];
|
|
||||||
unsigned char addr_len[2];
|
|
||||||
unsigned char addr_max_len[2];
|
|
||||||
unsigned char addr_offset[4];
|
|
||||||
unsigned char data[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ntlmreq {
|
|
||||||
unsigned char sig[8];
|
|
||||||
unsigned char messtype[4];
|
|
||||||
unsigned char flags[4];
|
|
||||||
unsigned char dom_len[2];
|
|
||||||
unsigned char dom_max_len[2];
|
|
||||||
unsigned char dom_offset[4];
|
|
||||||
unsigned char pad1[2];
|
|
||||||
unsigned char host_len[2];
|
|
||||||
unsigned char host_max_len[2];
|
|
||||||
unsigned char host_offset[4];
|
|
||||||
unsigned char pad2[2];
|
|
||||||
unsigned char data[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
int text2unicode(const char * text, char * buf, int buflen){
|
|
||||||
int count = 0;
|
|
||||||
buflen = ((buflen>>1)<<1);
|
|
||||||
if(!text || !buflen) return 0;
|
|
||||||
do {
|
|
||||||
buf[count++] = toupper(*text++);
|
|
||||||
buf[count++] = '\0';
|
|
||||||
} while (*text && count < buflen);
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
void unicode2text(const char *unicode, char * buf, int len){
|
|
||||||
int i;
|
|
||||||
if(!unicode || !len) return;
|
|
||||||
for(i=0; i<len; i++){
|
|
||||||
buf[i] = unicode[(i<<1)];
|
|
||||||
}
|
|
||||||
buf[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void genchallenge(struct clientparam *param, char * challenge, char *buf){
|
|
||||||
struct ntlmchal *chal;
|
|
||||||
char tmpbuf[1024];
|
|
||||||
char hostname[128];
|
|
||||||
int len, i;
|
|
||||||
|
|
||||||
|
|
||||||
chal = (struct ntlmchal *)tmpbuf;
|
|
||||||
memset(chal, 0, 1024);
|
|
||||||
memcpy(chal->sig, "NTLMSSP", 8);
|
|
||||||
chal->messtype[0] = 2;
|
|
||||||
gethostname(hostname, 128);
|
|
||||||
hostname[15] = 0;
|
|
||||||
len = (((int)strlen(hostname)) << 1);
|
|
||||||
chal->dom_len[0] = len;
|
|
||||||
chal->dom_max_len[0] = len;
|
|
||||||
chal->dom_offset[0] = (unsigned char)((unsigned char *)chal->data - (unsigned char *)chal);
|
|
||||||
chal->flags[0] = 0x03;
|
|
||||||
chal->flags[1] = 0x82;
|
|
||||||
chal->flags[2] = 0x81;
|
|
||||||
chal->flags[3] = 0xA0;
|
|
||||||
text2unicode(hostname, (char *)chal->data, 64);
|
|
||||||
time((time_t *)challenge);
|
|
||||||
memcpy(challenge+4, SAADDR(¶m->sincr), 4);
|
|
||||||
challenge[1]^=*SAPORT(¶m->sincr);
|
|
||||||
for(i = 0; i < 8; i++) challenge[i] ^= myrand(challenge, 8);
|
|
||||||
memcpy(chal->challenge, challenge, 8);
|
|
||||||
en64((unsigned char *)tmpbuf, (unsigned char *)buf, (int)((unsigned char *)chal->data - (unsigned char *)chal) + len);
|
|
||||||
}
|
|
@ -11,11 +11,11 @@
|
|||||||
unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout);
|
unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout);
|
||||||
void trafcountfunc(struct clientparam *param);
|
void trafcountfunc(struct clientparam *param);
|
||||||
int checkACL(struct clientparam * param);
|
int checkACL(struct clientparam * param);
|
||||||
void nametohash(const unsigned char * name, unsigned char *hash);
|
void nametohash(const char * name, char *hash);
|
||||||
unsigned hashindex(const unsigned char* hash);
|
unsigned hashindex(const char* hash);
|
||||||
void decodeurl(unsigned char *s, int allowcr);
|
void decodeurl(char *s, int allowcr);
|
||||||
int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize);
|
int parsestr (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize);
|
||||||
struct ace * make_ace (int argc, unsigned char ** argv);
|
struct ace * make_ace (int argc, char ** argv);
|
||||||
extern char * proxy_stringtable[];
|
extern char * proxy_stringtable[];
|
||||||
extern char * admin_stringtable[];
|
extern char * admin_stringtable[];
|
||||||
extern struct schedule * schedule;
|
extern struct schedule * schedule;
|
||||||
|
@ -760,7 +760,7 @@ static FILTER_ACTION fp_client(void *fo, struct clientparam * param, void** fc){
|
|||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION fp_request(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION fp_request(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
if(fc && (param->service == S_PROXY)){
|
if(fc && (param->service == S_PROXY)){
|
||||||
if(FC->state) {
|
if(FC->state) {
|
||||||
closefiles(FC);
|
closefiles(FC);
|
||||||
@ -776,7 +776,7 @@ static FILTER_ACTION fp_request(void *fc, struct clientparam * param, unsigned c
|
|||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
if(fc && param->service == S_SMTPP) {
|
if(fc && param->service == S_SMTPP) {
|
||||||
processcallbacks(FC, FP_CALLONREQUEST, *buf_p + offset, *length_p - offset);
|
processcallbacks(FC, FP_CALLONREQUEST, *buf_p + offset, *length_p - offset);
|
||||||
if(FC->what & FP_REJECT) return REJECT;
|
if(FC->what & FP_REJECT) return REJECT;
|
||||||
@ -792,7 +792,7 @@ static FILTER_ACTION fp_hcli(void *fc, struct clientparam * param, unsigned char
|
|||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
if(fc && param->service == S_PROXY && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA)){
|
if(fc && param->service == S_PROXY && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA)){
|
||||||
if(FC->what & FP_SRVHEADER) initserverfile(FC);
|
if(FC->what & FP_SRVHEADER) initserverfile(FC);
|
||||||
FC->state = GOT_HTTP_SRV_HDR;
|
FC->state = GOT_HTTP_SRV_HDR;
|
||||||
@ -801,7 +801,7 @@ static FILTER_ACTION fp_hsrv(void *fc, struct clientparam * param, unsigned char
|
|||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
if(fc && FC->state == GOT_HTTP_REQUEST){
|
if(fc && FC->state == GOT_HTTP_REQUEST){
|
||||||
FC->state = GOT_HTTP_CLI_HDR2;
|
FC->state = GOT_HTTP_CLI_HDR2;
|
||||||
}
|
}
|
||||||
@ -809,7 +809,7 @@ static FILTER_ACTION fp_dcli(void *fc, struct clientparam * param, unsigned char
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FILTER_ACTION fp_dsrv(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION fp_dsrv(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
if(fc && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_SRV_HDR)){
|
if(fc && (FC->state == GOT_HTTP_REQUEST || FC->state == GOT_HTTP_CLI_HDR || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_CLIDATA || FC->state == GOT_HTTP_SRV_HDR)){
|
||||||
FC->state = GOT_HTTP_SRV_HDR2;
|
FC->state = GOT_HTTP_SRV_HDR2;
|
||||||
}
|
}
|
||||||
@ -846,7 +846,7 @@ static struct symbol fp_symbols[] = {
|
|||||||
{NULL, "fp_stringtable", (void*) fp_stringtable}
|
{NULL, "fp_stringtable", (void*) fp_stringtable}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int h_cachedir(int argc, unsigned char **argv){
|
static int h_cachedir(int argc, char **argv){
|
||||||
char * dirp;
|
char * dirp;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@ -866,7 +866,7 @@ static int h_cachedir(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_preview(int argc, unsigned char **argv){
|
static int h_preview(int argc, char **argv){
|
||||||
preview = atoi(argv[1]);
|
preview = atoi(argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ main(int argc, char *argv[])
|
|||||||
char *attrs[] = { NULL, NULL };
|
char *attrs[] = { NULL, NULL };
|
||||||
int i, rc = -1;
|
int i, rc = -1;
|
||||||
int lderrno;
|
int lderrno;
|
||||||
unsigned char tmpbuf[1000];
|
char tmpbuf[1000];
|
||||||
|
|
||||||
if ( argc < 6 )
|
if ( argc < 6 )
|
||||||
{
|
{
|
||||||
|
@ -22,7 +22,7 @@ static struct commands ldap_trafgroup_handler;
|
|||||||
static struct commands ldap_attrsgroup_handler;
|
static struct commands ldap_attrsgroup_handler;
|
||||||
static struct commands ldap_dircount_handler;
|
static struct commands ldap_dircount_handler;
|
||||||
|
|
||||||
static void (*dolog)(struct clientparam * param, const unsigned char *s);
|
static void (*ldolog)(struct clientparam * param, const char *s);
|
||||||
|
|
||||||
|
|
||||||
static char *attrs[] = { NULL, NULL};
|
static char *attrs[] = { NULL, NULL};
|
||||||
@ -61,7 +61,7 @@ int savecounters(void)
|
|||||||
struct trafcount *tcd;
|
struct trafcount *tcd;
|
||||||
struct counter_record wcounter;
|
struct counter_record wcounter;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
unsigned char *tmpbuf,pat_file[]="%s%s.lc";
|
char *tmpbuf,pat_file[]="%s%s.lc";
|
||||||
|
|
||||||
|
|
||||||
/* timetoexit !=0 - áóäåì çàâåðøàòüñÿ.*/
|
/* timetoexit !=0 - áóäåì çàâåðøàòüñÿ.*/
|
||||||
@ -112,7 +112,7 @@ static int ldapfunc(struct clientparam *param)
|
|||||||
ld = ldap_init( ldap_serv, 389 );
|
ld = ldap_init( ldap_serv, 389 );
|
||||||
if ( ld == NULL )
|
if ( ld == NULL )
|
||||||
{
|
{
|
||||||
dolog(param,"Error ldap_init: No init lib ldap");
|
ldolog(param,"Error ldap_init: No init lib ldap");
|
||||||
/*ldap_perror( ld, "Error ldap_init" ); */
|
/*ldap_perror( ld, "Error ldap_init" ); */
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ static int ldapfunc(struct clientparam *param)
|
|||||||
|
|
||||||
if ( rc != LDAP_SUCCESS )
|
if ( rc != LDAP_SUCCESS )
|
||||||
{
|
{
|
||||||
dolog(param,"Error ldap_bind: No connect ldap catalog");
|
ldolog(param,"Error ldap_bind: No connect ldap catalog");
|
||||||
ldap_unbind_s(ld);
|
ldap_unbind_s(ld);
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
@ -147,7 +147,7 @@ static int ldapfunc(struct clientparam *param)
|
|||||||
|
|
||||||
if ( ld == NULL )
|
if ( ld == NULL )
|
||||||
{
|
{
|
||||||
dolog(param,"Error ldap_init: No init lib ldap");
|
ldolog(param,"Error ldap_init: No init lib ldap");
|
||||||
/*ldap_perror( ld, "Error ldap_init" ); */
|
/*ldap_perror( ld, "Error ldap_init" ); */
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
@ -156,7 +156,7 @@ static int ldapfunc(struct clientparam *param)
|
|||||||
|
|
||||||
if ( rc != LDAP_SUCCESS )
|
if ( rc != LDAP_SUCCESS )
|
||||||
{
|
{
|
||||||
dolog(param, "Error ldap_bind: Not authorize in ldap\
|
ldolog(param, "Error ldap_bind: Not authorize in ldap\
|
||||||
catalog, checked option \'ldapconnect\' ");
|
catalog, checked option \'ldapconnect\' ");
|
||||||
ldap_unbind_s(ld);
|
ldap_unbind_s(ld);
|
||||||
return 7;
|
return 7;
|
||||||
@ -187,7 +187,7 @@ static int ldapfunc(struct clientparam *param)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapserv */
|
handle command ldapserv */
|
||||||
int h_ldapconnect(int argc, unsigned char ** argv)
|
int h_ldapconnect(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
LDAP *ld = NULL;
|
LDAP *ld = NULL;
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ int h_ldapconnect(int argc, unsigned char ** argv)
|
|||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapaccess */
|
handle command ldapaccess */
|
||||||
int h_access(int argc, unsigned char ** argv)
|
int h_access(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -229,7 +229,7 @@ int h_access(int argc, unsigned char ** argv)
|
|||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapsbase
|
handle command ldapsbase
|
||||||
searching base */
|
searching base */
|
||||||
int h_sbase(int argc, unsigned char ** argv)
|
int h_sbase(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -241,7 +241,7 @@ int h_sbase(int argc, unsigned char ** argv)
|
|||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapuserenv */
|
handle command ldapuserenv */
|
||||||
int h_userenv(int argc, unsigned char ** argv)
|
int h_userenv(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -253,7 +253,7 @@ int h_userenv(int argc, unsigned char ** argv)
|
|||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldaptrafgroup */
|
handle command ldaptrafgroup */
|
||||||
int h_trafgroup(int argc, unsigned char ** argv)
|
int h_trafgroup(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
struct trafcount *newtrafcount;
|
struct trafcount *newtrafcount;
|
||||||
struct bandlim *newbandlim;
|
struct bandlim *newbandlim;
|
||||||
@ -418,7 +418,7 @@ int h_trafgroup(int argc, unsigned char ** argv)
|
|||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapattrsgroup */
|
handle command ldapattrsgroup */
|
||||||
int h_attrsgroup(int argc, unsigned char ** argv)
|
int h_attrsgroup(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -435,7 +435,7 @@ int h_attrsgroup(int argc, unsigned char ** argv)
|
|||||||
}
|
}
|
||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
handle command ldapdircount */
|
handle command ldapdircount */
|
||||||
int h_dircount(int argc, unsigned char ** argv)
|
int h_dircount(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -476,7 +476,7 @@ PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dolog=pluginlink->findbyname("dolog");
|
ldolog=pluginlink->findbyname("dolog");
|
||||||
|
|
||||||
already_loaded = 1;
|
already_loaded = 1;
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ static FILTER_ACTION pcre_filter_client(void *fo, struct clientparam * param, vo
|
|||||||
return (res)? CONTINUE:PASS;
|
return (res)? CONTINUE:PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
int ovector[48];
|
int ovector[48];
|
||||||
int count = 0;
|
int count = 0;
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
@ -195,7 +195,7 @@ static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, uns
|
|||||||
}
|
}
|
||||||
memcpy(newbuf, *buf_p, ovector[0]);
|
memcpy(newbuf, *buf_p, ovector[0]);
|
||||||
pl->freefunc(*buf_p);
|
pl->freefunc(*buf_p);
|
||||||
*buf_p = (unsigned char *)newbuf;
|
*buf_p = (char *)newbuf;
|
||||||
*bufsize_p = ovector[0] + replen + 1;
|
*bufsize_p = ovector[0] + replen + 1;
|
||||||
}
|
}
|
||||||
memcpy(*buf_p + ovector[0], tmpbuf, replen);
|
memcpy(*buf_p + ovector[0], tmpbuf, replen);
|
||||||
@ -219,7 +219,7 @@ static void pcre_filter_close(void *fo){
|
|||||||
pcre_data_free((struct pcre_filter_data *)fo);
|
pcre_data_free((struct pcre_filter_data *)fo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_pcre(int argc, unsigned char **argv){
|
static int h_pcre(int argc, char **argv){
|
||||||
int action = 0;
|
int action = 0;
|
||||||
pcre *re = NULL;
|
pcre *re = NULL;
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
@ -317,7 +317,7 @@ static int h_pcre(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_pcre_extend(int argc, unsigned char **argv){
|
static int h_pcre_extend(int argc, char **argv){
|
||||||
struct ace *acl;
|
struct ace *acl;
|
||||||
if(!pcre_last_filter || !pcre_last_filter->data) return 1;
|
if(!pcre_last_filter || !pcre_last_filter->data) return 1;
|
||||||
acl = ((struct pcre_filter_data *)pcre_last_filter->data)->acl;
|
acl = ((struct pcre_filter_data *)pcre_last_filter->data)->acl;
|
||||||
@ -328,7 +328,7 @@ static int h_pcre_extend(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_pcre_options(int argc, unsigned char **argv){
|
static int h_pcre_options(int argc, char **argv){
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
pcre_options = 0;
|
pcre_options = 0;
|
||||||
|
@ -20,7 +20,7 @@ static struct auth pamauth;
|
|||||||
#ifdef USERCASE
|
#ifdef USERCASE
|
||||||
static int usercaselow = 0;
|
static int usercaselow = 0;
|
||||||
#endif
|
#endif
|
||||||
static unsigned char *service=NULL;
|
static char *service=NULL;
|
||||||
static struct pluginlink * pl;
|
static struct pluginlink * pl;
|
||||||
|
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ static int pamfunc(struct clientparam *param)
|
|||||||
|
|
||||||
/*------------------------------- MAIN --------------------------------------
|
/*------------------------------- MAIN --------------------------------------
|
||||||
start plugin init */
|
start plugin init */
|
||||||
PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, int argc, unsigned char** argv)
|
PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ static char hexMap[] = {
|
|||||||
static BIO *bio_err=NULL;
|
static BIO *bio_err=NULL;
|
||||||
|
|
||||||
|
|
||||||
static size_t bin2hex (const unsigned char* bin, size_t bin_length, char* str, size_t str_length)
|
static size_t bin2hex (const char* bin, size_t bin_length, char* str, size_t str_length)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -111,9 +111,9 @@ SSL_CERT ssl_copy_cert(SSL_CERT cert)
|
|||||||
EVP_PKEY *pk = NULL;
|
EVP_PKEY *pk = NULL;
|
||||||
RSA *rsa = NULL;
|
RSA *rsa = NULL;
|
||||||
|
|
||||||
unsigned char p1[] = "RU";
|
char p1[] = "RU";
|
||||||
unsigned char p2[] = "3proxy";
|
char p2[] = "3proxy";
|
||||||
unsigned char p3[] = "3proxy CA";
|
char p3[] = "3proxy CA";
|
||||||
|
|
||||||
char hash_name_sha1[sizeof(src_cert->sha1_hash)*2 + 1];
|
char hash_name_sha1[sizeof(src_cert->sha1_hash)*2 + 1];
|
||||||
char cache_name[200];
|
char cache_name[200];
|
||||||
|
@ -28,7 +28,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc;
|
PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc;
|
||||||
static void (*pdolog)(struct clientparam * param, const unsigned char *s);
|
static void (*pdolog)(struct clientparam * param, const char *s);
|
||||||
|
|
||||||
static struct pluginlink * pl;
|
static struct pluginlink * pl;
|
||||||
|
|
||||||
@ -239,25 +239,25 @@ int dossl(struct clientparam* param, SSL_CONN* ServerConnp, SSL_CONN* ClientConn
|
|||||||
ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, &ServerCert, &errSSL);
|
ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, &ServerCert, &errSSL);
|
||||||
if ( ServerConn == NULL || ServerCert == NULL ) {
|
if ( ServerConn == NULL || ServerCert == NULL ) {
|
||||||
param->res = 8011;
|
param->res = 8011;
|
||||||
pdolog(param, (unsigned char *)"SSL handshake to server failed");
|
pdolog(param, (char *)"SSL handshake to server failed");
|
||||||
if(ServerConn == NULL) pdolog(param, (unsigned char *)"ServerConn is NULL");
|
if(ServerConn == NULL) pdolog(param, (char *)"ServerConn is NULL");
|
||||||
if(ServerCert == NULL) pdolog(param, (unsigned char *)"ServerCert is NULL");
|
if(ServerCert == NULL) pdolog(param, (char *)"ServerCert is NULL");
|
||||||
if(errSSL)pdolog(param, (unsigned char *)errSSL);
|
if(errSSL)pdolog(param, (char *)errSSL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
FakeCert = ssl_copy_cert(ServerCert);
|
FakeCert = ssl_copy_cert(ServerCert);
|
||||||
if ( FakeCert == NULL ) {
|
if ( FakeCert == NULL ) {
|
||||||
param->res = 8012;
|
param->res = 8012;
|
||||||
_ssl_cert_free(ServerCert);
|
_ssl_cert_free(ServerCert);
|
||||||
pdolog(param, (unsigned char *)"Failed to create certificate copy");
|
pdolog(param, (char *)"Failed to create certificate copy");
|
||||||
ssl_conn_free(ServerConn);
|
ssl_conn_free(ServerConn);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
ClientConn = ssl_handshake_to_client(param->clisock, FakeCert, &errSSL);
|
ClientConn = ssl_handshake_to_client(param->clisock, FakeCert, &errSSL);
|
||||||
if ( ClientConn == NULL ) {
|
if ( ClientConn == NULL ) {
|
||||||
param->res = 8012;
|
param->res = 8012;
|
||||||
pdolog(param, (unsigned char *)"Handshake to client failed");
|
pdolog(param, (char *)"Handshake to client failed");
|
||||||
if(errSSL)pdolog(param, (unsigned char *)errSSL);
|
if(errSSL)pdolog(param, (char *)errSSL);
|
||||||
_ssl_cert_free(ServerCert);
|
_ssl_cert_free(ServerCert);
|
||||||
_ssl_cert_free(FakeCert);
|
_ssl_cert_free(FakeCert);
|
||||||
ssl_conn_free(ServerConn);
|
ssl_conn_free(ServerConn);
|
||||||
@ -329,7 +329,7 @@ static struct filter ssl_filter = {
|
|||||||
int mitm = 0;
|
int mitm = 0;
|
||||||
int ssl_inited = 0;
|
int ssl_inited = 0;
|
||||||
|
|
||||||
static int h_mitm(int argc, unsigned char **argv){
|
static int h_mitm(int argc, char **argv){
|
||||||
if(!ssl_inited) {
|
if(!ssl_inited) {
|
||||||
ssl_init();
|
ssl_init();
|
||||||
ssl_inited = 1;
|
ssl_inited = 1;
|
||||||
@ -342,7 +342,7 @@ static int h_mitm(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_nomitm(int argc, unsigned char **argv){
|
static int h_nomitm(int argc, char **argv){
|
||||||
struct filter * sf;
|
struct filter * sf;
|
||||||
if(!(mitm&1)) return 1;
|
if(!(mitm&1)) return 1;
|
||||||
if(mitm) usleep(100*SLEEPTIME);
|
if(mitm) usleep(100*SLEEPTIME);
|
||||||
@ -357,7 +357,7 @@ static int h_nomitm(int argc, unsigned char **argv){
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_certpath(int argc, unsigned char **argv){
|
static int h_certpath(int argc, char **argv){
|
||||||
size_t len;
|
size_t len;
|
||||||
len = strlen(argv[1]);
|
len = strlen(argv[1]);
|
||||||
if(!len || (argv[1][len - 1] != '/' && argv[1][len - 1] != '\\')) return 1;
|
if(!len || (argv[1][len - 1] != '/' && argv[1][len - 1] != '\\')) return 1;
|
||||||
|
@ -26,7 +26,7 @@ extern "C" {
|
|||||||
int DBGLEVEL = 0;
|
int DBGLEVEL = 0;
|
||||||
|
|
||||||
int already_loaded = 0;
|
int already_loaded = 0;
|
||||||
typedef int (* handler)(int argc, unsigned char ** argv);
|
typedef int (* handler)(int argc, char ** argv);
|
||||||
|
|
||||||
struct extparam * sconfp;
|
struct extparam * sconfp;
|
||||||
struct commands * scommandhandlers;
|
struct commands * scommandhandlers;
|
||||||
@ -79,7 +79,7 @@ static void killtrafcorrect() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct commands trafcorrect_handler;
|
struct commands trafcorrect_handler;
|
||||||
int h_trafcorrect(int argc, unsigned char ** argv) {
|
int h_trafcorrect(int argc, char ** argv) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
if(DBGLEVEL == 1)fprintf(stdout, "See documentation of traffic correct plugin.\n");
|
if(DBGLEVEL == 1)fprintf(stdout, "See documentation of traffic correct plugin.\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -85,12 +85,12 @@ static struct filter transparent_filter = {
|
|||||||
transparent_filter_close
|
transparent_filter_close
|
||||||
};
|
};
|
||||||
|
|
||||||
static int h_transparent(int argc, unsigned char **argv){
|
static int h_transparent(int argc, char **argv){
|
||||||
transparent_filter.filter_open = transparent_filter_open;
|
transparent_filter.filter_open = transparent_filter_open;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h_notransparent(int argc, unsigned char **argv){
|
static int h_notransparent(int argc, char **argv){
|
||||||
transparent_filter.filter_open = NULL;
|
transparent_filter.filter_open = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -22,17 +22,17 @@ static struct auth alwaysauth;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char * conv_utf8_to_cp1251(unsigned char *s){
|
char * conv_utf8_to_cp1251(char *s){
|
||||||
int i, j=0, n=(int)strlen((char *)s);
|
unsigned i, j=0, n=(int)strlen((char *)s);
|
||||||
int byte2 = 0;
|
unsigned byte2 = 0;
|
||||||
int c1, new_c1, new_c2, new_i;
|
unsigned c1, new_c1, new_c2, new_i;
|
||||||
for(i = 0; i < n; i++){
|
for(i = 0; i < n; i++){
|
||||||
if(byte2 && s[i]>=128 && s[i]<=192){
|
if(byte2 && ((unsigned)s[i])>=128 && ((unsigned)s[i])<=192){
|
||||||
new_c2=(c1&3)*64+(s[i]&63);
|
new_c2=(c1&3)*64+(s[i]&63);
|
||||||
new_c1=(c1>>2)&5;
|
new_c1=(c1>>2)&5;
|
||||||
new_i=(new_c1*256)+new_c2;
|
new_i=(new_c1*256)+new_c2;
|
||||||
if(new_i == 1025) s[j++] = 168;
|
if(new_i == 1025) s[j++] = (char)(unsigned char)168;
|
||||||
else if (new_i==1105) s[j++] = 184;
|
else if (new_i==1105) s[j++] = (char)(unsigned char)184;
|
||||||
else if (new_i < (192 + 848) || new_i > (255 + 848)){
|
else if (new_i < (192 + 848) || new_i > (255 + 848)){
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -46,7 +46,7 @@ unsigned char * conv_utf8_to_cp1251(unsigned char *s){
|
|||||||
c1 = s[i];
|
c1 = s[i];
|
||||||
byte2 = 1;
|
byte2 = 1;
|
||||||
}
|
}
|
||||||
else if(s[i] < 128) s[j++] = s[i];
|
else if(((unsigned)s[i]) < 128) s[j++] = s[i];
|
||||||
else return s;
|
else return s;
|
||||||
}
|
}
|
||||||
s[j] = 0;
|
s[j] = 0;
|
||||||
|
18
src/pop3p.c
18
src/pop3p.c
@ -12,23 +12,23 @@
|
|||||||
|
|
||||||
void * pop3pchild(struct clientparam* param) {
|
void * pop3pchild(struct clientparam* param) {
|
||||||
int i=0, res;
|
int i=0, res;
|
||||||
unsigned char buf[320];
|
char buf[320];
|
||||||
unsigned char *se;
|
char *se;
|
||||||
|
|
||||||
if(socksend(param->clisock, (unsigned char *)"+OK Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);}
|
if(socksend(param->clisock, (char *)"+OK Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);}
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
while(i > 4 && strncasecmp((char *)buf, "USER", 4)){
|
while(i > 4 && strncasecmp((char *)buf, "USER", 4)){
|
||||||
if(!strncasecmp((char *)buf, "QUIT", 4)){
|
if(!strncasecmp((char *)buf, "QUIT", 4)){
|
||||||
socksend(param->clisock, (unsigned char *)"+OK\r\n", 5,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"+OK\r\n", 5,conf.timeouts[STRING_S]);
|
||||||
RETURN(0);
|
RETURN(0);
|
||||||
}
|
}
|
||||||
socksend(param->clisock, (unsigned char *)"-ERR need USER first\r\n", 22, conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"-ERR need USER first\r\n", 22, conf.timeouts[STRING_S]);
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
if(i<6) {RETURN(612);}
|
if(i<6) {RETURN(612);}
|
||||||
|
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if ((se=(unsigned char *)strchr((char *)buf, '\r'))) *se = 0;
|
if ((se=(char *)strchr((char *)buf, '\r'))) *se = 0;
|
||||||
if (strncasecmp((char *)buf, "USER ", 5)){RETURN (614);}
|
if (strncasecmp((char *)buf, "USER ", 5)){RETURN (614);}
|
||||||
if(parseconnusername((char *)buf +5, param, 0, 110)){RETURN(615);}
|
if(parseconnusername((char *)buf +5, param, 0, 110)){RETURN(615);}
|
||||||
param->operation = CONNECT;
|
param->operation = CONNECT;
|
||||||
@ -38,9 +38,9 @@ void * pop3pchild(struct clientparam* param) {
|
|||||||
if( i < 3 ) {RETURN(621);}
|
if( i < 3 ) {RETURN(621);}
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if(strncasecmp((char *)buf, "+OK", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(622);}
|
if(strncasecmp((char *)buf, "+OK", 3)||!strncasecmp((char *)buf+4, "PROXY", 5)){RETURN(622);}
|
||||||
if( socksend(param->remsock, (unsigned char *)"USER ", 5, conf.timeouts[STRING_S])!= 5 ||
|
if( socksend(param->remsock, (char *)"USER ", 5, conf.timeouts[STRING_S])!= 5 ||
|
||||||
socksend(param->remsock, param->extusername, (int)strlen((char *)param->extusername), conf.timeouts[STRING_S]) <= 0 ||
|
socksend(param->remsock, param->extusername, (int)strlen((char *)param->extusername), conf.timeouts[STRING_S]) <= 0 ||
|
||||||
socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S])!=2)
|
socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S])!=2)
|
||||||
{RETURN(623);}
|
{RETURN(623);}
|
||||||
param->statscli64 += (uint64_t)(strlen((char *)param->extusername) + 7);
|
param->statscli64 += (uint64_t)(strlen((char *)param->extusername) + 7);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
@ -53,7 +53,7 @@ CLEANRET:
|
|||||||
}
|
}
|
||||||
else dolog(param, NULL);
|
else dolog(param, NULL);
|
||||||
if(param->clisock != INVALID_SOCKET) {
|
if(param->clisock != INVALID_SOCKET) {
|
||||||
if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (unsigned char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]);
|
if ((param->res > 0 && param->res < 100) || (param->res > 611 && param->res <700)) socksend(param->clisock, (char *)"-ERR\r\n", 6,conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
freeparam(param);
|
freeparam(param);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
184
src/proxy.c
184
src/proxy.c
@ -89,9 +89,6 @@ char * proxy_stringtable[] = {
|
|||||||
"<body><h2>403 Access Denied</h2><h3>Access control list denies you to access this resource</body></html>\r\n",
|
"<body><h2>403 Access Denied</h2><h3>Access control list denies you to access this resource</body></html>\r\n",
|
||||||
|
|
||||||
/* 12*/ "HTTP/1.0 407 Proxy Authentication Required\r\n"
|
/* 12*/ "HTTP/1.0 407 Proxy Authentication Required\r\n"
|
||||||
#ifndef NOCRYPT
|
|
||||||
"Proxy-Authenticate: NTLM\r\n"
|
|
||||||
#endif
|
|
||||||
"Proxy-Authenticate: Basic realm=\"proxy\"\r\n"
|
"Proxy-Authenticate: Basic realm=\"proxy\"\r\n"
|
||||||
"Connection: close\r\n"
|
"Connection: close\r\n"
|
||||||
"Content-type: text/html; charset=utf-8\r\n"
|
"Content-type: text/html; charset=utf-8\r\n"
|
||||||
@ -99,10 +96,7 @@ char * proxy_stringtable[] = {
|
|||||||
"<html><head><title>407 Proxy Authentication Required</title></head>\r\n"
|
"<html><head><title>407 Proxy Authentication Required</title></head>\r\n"
|
||||||
"<body><h2>407 Proxy Authentication Required</h2><h3>Access to requested resource disallowed by administrator or you need valid username/password to use this resource</h3></body></html>\r\n",
|
"<body><h2>407 Proxy Authentication Required</h2><h3>Access to requested resource disallowed by administrator or you need valid username/password to use this resource</h3></body></html>\r\n",
|
||||||
|
|
||||||
/* 13*/ "HTTP/1.0 407 Proxy Authentication Required\r\n"
|
/* 13*/ "",
|
||||||
"Connection: keep-alive\r\n"
|
|
||||||
"Content-Length: 0\r\n"
|
|
||||||
"Proxy-Authenticate: NTLM ",
|
|
||||||
|
|
||||||
/* 14*/ "HTTP/1.0 403 Forbidden\r\n"
|
/* 14*/ "HTTP/1.0 403 Forbidden\r\n"
|
||||||
"Connection: close\r\n"
|
"Connection: close\r\n"
|
||||||
@ -152,11 +146,11 @@ static void logurl(struct clientparam * param, char * buf, char * req, int ftp){
|
|||||||
strcpy(se, sb);
|
strcpy(se, sb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(param->res != 555 && param->res != 508)dolog(param, (unsigned char *)(req?buf:NULL));
|
if(param->res != 555 && param->res != 508)dolog(param, (char *)(req?buf:NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void decodeurl(unsigned char *s, int allowcr){
|
void decodeurl(char *s, int allowcr){
|
||||||
unsigned char *d = s;
|
char *d = s;
|
||||||
unsigned u;
|
unsigned u;
|
||||||
|
|
||||||
while(*s){
|
while(*s){
|
||||||
@ -184,7 +178,7 @@ void decodeurl(unsigned char *s, int allowcr){
|
|||||||
*d = 0;
|
*d = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void file2url(unsigned char *sb, unsigned char *buf, unsigned bufsize, int * inbuf, int skip255){
|
void file2url(char *sb, char *buf, unsigned bufsize, int * inbuf, int skip255){
|
||||||
for(; *sb; sb++){
|
for(; *sb; sb++){
|
||||||
if((bufsize - *inbuf)<16)break;
|
if((bufsize - *inbuf)<16)break;
|
||||||
if(*sb=='\r'||*sb=='\n')continue;
|
if(*sb=='\r'||*sb=='\n')continue;
|
||||||
@ -208,14 +202,14 @@ void file2url(unsigned char *sb, unsigned char *buf, unsigned bufsize, int * inb
|
|||||||
|
|
||||||
void * proxychild(struct clientparam* param) {
|
void * proxychild(struct clientparam* param) {
|
||||||
int res=0, i=0;
|
int res=0, i=0;
|
||||||
unsigned char* buf = NULL, *newbuf;
|
char* buf = NULL, *newbuf;
|
||||||
int inbuf;
|
int inbuf;
|
||||||
int bufsize;
|
int bufsize;
|
||||||
unsigned reqlen = 0;
|
unsigned reqlen = 0;
|
||||||
unsigned char *sb=NULL, *sg=NULL, *se=NULL, *sp=NULL,
|
char *sb=NULL, *sg=NULL, *se=NULL, *sp=NULL,
|
||||||
*req=NULL, *su=NULL, *ss = NULL;
|
*req=NULL, *su=NULL, *ss = NULL;
|
||||||
unsigned char *ftpbase=NULL;
|
char *ftpbase=NULL;
|
||||||
unsigned char username[1024];
|
char username[1024];
|
||||||
int keepalive = 0;
|
int keepalive = 0;
|
||||||
uint64_t contentlength64 = 0;
|
uint64_t contentlength64 = 0;
|
||||||
int hascontent =0;
|
int hascontent =0;
|
||||||
@ -293,7 +287,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
myfree(req);
|
myfree(req);
|
||||||
}
|
}
|
||||||
req = (unsigned char *)mystrdup((char *)buf);
|
req = (char *)mystrdup((char *)buf);
|
||||||
if(!req){RETURN(510);}
|
if(!req){RETURN(510);}
|
||||||
if(i<10) {
|
if(i<10) {
|
||||||
RETURN(511);
|
RETURN(511);
|
||||||
@ -302,7 +296,7 @@ for(;;){
|
|||||||
param->transparent = 0;
|
param->transparent = 0;
|
||||||
if((isconnect = !strncasecmp((char *)buf, "CONNECT", 7))) keepalive = 2;
|
if((isconnect = !strncasecmp((char *)buf, "CONNECT", 7))) keepalive = 2;
|
||||||
|
|
||||||
if ((sb=(unsigned char *)(unsigned char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);}
|
if ((sb=(char *)(char *)strchr((char *)buf, ' ')) == NULL) {RETURN(512);}
|
||||||
ss = ++sb;
|
ss = ++sb;
|
||||||
if(!isconnect) {
|
if(!isconnect) {
|
||||||
if (!strncasecmp((char *)sb, "http://", 7)) {
|
if (!strncasecmp((char *)sb, "http://", 7)) {
|
||||||
@ -320,21 +314,21 @@ for(;;){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ((se=(unsigned char *)(unsigned char *)strchr((char *)sb, ' ')) == NULL || sb==se) {RETURN (514);}
|
if ((se=(char *)(char *)strchr((char *)sb, ' ')) == NULL || sb==se) {RETURN (514);}
|
||||||
*se = 0;
|
*se = 0;
|
||||||
}
|
}
|
||||||
if(!param->transparent || isconnect) {
|
if(!param->transparent || isconnect) {
|
||||||
if(!isconnect) {
|
if(!isconnect) {
|
||||||
if ((se=(unsigned char *)(unsigned char *)strchr((char *)sb, '/')) == NULL
|
if ((se=(char *)(char *)strchr((char *)sb, '/')) == NULL
|
||||||
|| sb==se
|
|| sb==se
|
||||||
|| !(sg=(unsigned char *)strchr((char *)sb, ' '))) {RETURN (515);}
|
|| !(sg=(char *)strchr((char *)sb, ' '))) {RETURN (515);}
|
||||||
if(se > sg) se=sg;
|
if(se > sg) se=sg;
|
||||||
*se = 0;
|
*se = 0;
|
||||||
}
|
}
|
||||||
prefix = (int)(se - buf);
|
prefix = (int)(se - buf);
|
||||||
su = (unsigned char*)strrchr((char *)sb, '@');
|
su = (char*)strrchr((char *)sb, '@');
|
||||||
if(su) {
|
if(su) {
|
||||||
su = (unsigned char *)mystrdup((char *)sb);
|
su = (char *)mystrdup((char *)sb);
|
||||||
decodeurl(su, 0);
|
decodeurl(su, 0);
|
||||||
if(parseconnusername((char *)su, (struct clientparam *)param, 1, (unsigned short)((ftp)?21:80))) RETURN (100);
|
if(parseconnusername((char *)su, (struct clientparam *)param, 1, (unsigned short)((ftp)?21:80))) RETURN (100);
|
||||||
myfree(su);
|
myfree(su);
|
||||||
@ -358,7 +352,7 @@ for(;;){
|
|||||||
/*printf("Got: %s\n", buf+inbuf);*/
|
/*printf("Got: %s\n", buf+inbuf);*/
|
||||||
#ifndef WITHMAIN
|
#ifndef WITHMAIN
|
||||||
if(i > 25 && !param->srv->transparent && (!strncasecmp((char *)(buf+inbuf), "proxy-authorization", 19))){
|
if(i > 25 && !param->srv->transparent && (!strncasecmp((char *)(buf+inbuf), "proxy-authorization", 19))){
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -369,65 +363,17 @@ for(;;){
|
|||||||
i = de64(sb, username, 255);
|
i = de64(sb, username, 255);
|
||||||
if(i<=0)continue;
|
if(i<=0)continue;
|
||||||
username[i] = 0;
|
username[i] = 0;
|
||||||
sb = (unsigned char *)strchr((char *)username, ':');
|
sb = (char *)strchr((char *)username, ':');
|
||||||
if(sb){
|
if(sb){
|
||||||
*sb = 0;
|
*sb = 0;
|
||||||
if(param->password)myfree(param->password);
|
if(param->password)myfree(param->password);
|
||||||
param->password = (unsigned char *)mystrdup((char *)sb+1);
|
param->password = (char *)mystrdup((char *)sb+1);
|
||||||
param->pwtype = 0;
|
param->pwtype = 0;
|
||||||
}
|
}
|
||||||
if(param->username)myfree(param->username);
|
if(param->username)myfree(param->username);
|
||||||
param->username = (unsigned char *)mystrdup((char *)username);
|
param->username = (char *)mystrdup((char *)username);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifndef NOCRYPT
|
|
||||||
if(param->srv->usentlm && !strncasecmp((char *)sb, "ntlm", 4)){
|
|
||||||
sb+=4;
|
|
||||||
while(isspace(*sb))sb++;
|
|
||||||
i = de64(sb, username, 1023);
|
|
||||||
if(i<=16)continue;
|
|
||||||
username[i] = 0;
|
|
||||||
if(strncasecmp((char *)username, "NTLMSSP", 8)) continue;
|
|
||||||
if(username[8] == 1) {
|
|
||||||
while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){
|
|
||||||
if(i> 15 && (!strncasecmp((char *)(buf), "content-length", 14))){
|
|
||||||
buf[i]=0;
|
|
||||||
sscanf((char *)buf + 15, "%"PRIu64, &contentlength64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while( contentlength64 > 0 && (i = sockgetlinebuf(param, CLIENT, buf, (BUFSIZE < contentlength64)? BUFSIZE - 1:(int)contentlength64, '\n', conf.timeouts[STRING_S])) > 0){
|
|
||||||
if ((uint64_t)i > contentlength64) break;
|
|
||||||
contentlength64-=i;
|
|
||||||
}
|
|
||||||
contentlength64 = 0;
|
|
||||||
if(param->password)myfree(param->password);
|
|
||||||
param->password = myalloc(32);
|
|
||||||
param->pwtype = 2;
|
|
||||||
i = (int)strlen(proxy_stringtable[13]);
|
|
||||||
memcpy(buf, proxy_stringtable[13], i);
|
|
||||||
genchallenge(param, (char *)param->password, (char *)buf + i);
|
|
||||||
memcpy(buf + strlen((char *)buf), "\r\n\r\n", 5);
|
|
||||||
socksend(param->clisock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]);
|
|
||||||
ckeepalive = keepalive = 1;
|
|
||||||
goto REQUESTEND;
|
|
||||||
}
|
|
||||||
if(username[8] == 3 && param->pwtype == 2 && i>=80) {
|
|
||||||
unsigned offset, len;
|
|
||||||
|
|
||||||
len = username[20] + (((unsigned)username[21]) << 8);
|
|
||||||
offset = username[24] + (((unsigned)username[25]) << 8);
|
|
||||||
if(len != 24 || len + offset > (unsigned)i) continue;
|
|
||||||
memcpy(param->password + 8, username + offset, 24);
|
|
||||||
len = username[36] + (((unsigned)username[37]) << 8);
|
|
||||||
offset = username[40] + (((unsigned)username[41]) << 8);
|
|
||||||
if(len> 255 || len + offset > (unsigned)i) continue;
|
|
||||||
if(param->username) myfree(param->username);
|
|
||||||
unicode2text((char *)username+offset, (char *)username+offset, (len>>1));
|
|
||||||
param->username = (unsigned char *)mystrdup((char *)username+offset);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(!isconnect && (
|
if(!isconnect && (
|
||||||
@ -435,7 +381,7 @@ for(;;){
|
|||||||
||
|
||
|
||||||
(i> 16 && (!strncasecmp((char *)(buf+inbuf), "connection:", 11)))
|
(i> 16 && (!strncasecmp((char *)(buf+inbuf), "connection:", 11)))
|
||||||
)){
|
)){
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -447,16 +393,16 @@ for(;;){
|
|||||||
}
|
}
|
||||||
if( i > 11 && !strncasecmp((char *)(buf+inbuf), "Expect: 100", 11)){
|
if( i > 11 && !strncasecmp((char *)(buf+inbuf), "Expect: 100", 11)){
|
||||||
keepalive = 1;
|
keepalive = 1;
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[17], (int)strlen(proxy_stringtable[17]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[17], (int)strlen(proxy_stringtable[17]), conf.timeouts[STRING_S]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(param->transparent && i > 6 && !strncasecmp((char *)buf + inbuf, "Host:", 5)){
|
if(param->transparent && i > 6 && !strncasecmp((char *)buf + inbuf, "Host:", 5)){
|
||||||
unsigned char c;
|
char c;
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
(se = (unsigned char *)strchr((char *)sb, '\r')) || (se = (unsigned char *)strchr((char *)sb, '\n'));
|
(se = (char *)strchr((char *)sb, '\r')) || (se = (char *)strchr((char *)sb, '\n'));
|
||||||
if(se) {
|
if(se) {
|
||||||
c = *se;
|
c = *se;
|
||||||
*se = 0;
|
*se = 0;
|
||||||
@ -466,7 +412,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
newbuf = myalloc(strlen((char *)req) + strlen((char *)(buf+inbuf)) + 8);
|
newbuf = myalloc(strlen((char *)req) + strlen((char *)(buf+inbuf)) + 8);
|
||||||
if(newbuf){
|
if(newbuf){
|
||||||
sp = (unsigned char *)strchr((char *)req+1, '/');
|
sp = (char *)strchr((char *)req+1, '/');
|
||||||
memcpy(newbuf, req, (sp - req));
|
memcpy(newbuf, req, (sp - req));
|
||||||
sprintf((char*)newbuf + (sp - req), "http://%s%s",sb,sp);
|
sprintf((char*)newbuf + (sp - req), "http://%s%s",sb,sp);
|
||||||
myfree(req);
|
myfree(req);
|
||||||
@ -475,7 +421,7 @@ for(;;){
|
|||||||
if(se)*se = c;
|
if(se)*se = c;
|
||||||
}
|
}
|
||||||
if(ftp && i > 13 && (!strncasecmp((char *)(buf+inbuf), "authorization", 13))){
|
if(ftp && i > 13 && (!strncasecmp((char *)(buf+inbuf), "authorization", 13))){
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -486,19 +432,19 @@ for(;;){
|
|||||||
i = de64(sb, username, 255);
|
i = de64(sb, username, 255);
|
||||||
if(i<=0)continue;
|
if(i<=0)continue;
|
||||||
username[i] = 0;
|
username[i] = 0;
|
||||||
sb = (unsigned char *)strchr((char *)username, ':');
|
sb = (char *)strchr((char *)username, ':');
|
||||||
if(sb){
|
if(sb){
|
||||||
*sb = 0;
|
*sb = 0;
|
||||||
if(param->extpassword)myfree(param->extpassword);
|
if(param->extpassword)myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)sb+1);
|
param->extpassword = (char *)mystrdup((char *)sb+1);
|
||||||
}
|
}
|
||||||
if(param->extusername)myfree(param->extusername);
|
if(param->extusername)myfree(param->extusername);
|
||||||
param->extusername = (unsigned char *)mystrdup((char *)username);
|
param->extusername = (char *)mystrdup((char *)username);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i> 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){
|
if(i> 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -573,7 +519,7 @@ for(;;){
|
|||||||
ckeepalive = 1;
|
ckeepalive = 1;
|
||||||
if(ftpbase) myfree(ftpbase);
|
if(ftpbase) myfree(ftpbase);
|
||||||
ftpbase = NULL;
|
ftpbase = NULL;
|
||||||
if(!(sp = (unsigned char *)strchr((char *)ss, ' '))){RETURN(799);}
|
if(!(sp = (char *)strchr((char *)ss, ' '))){RETURN(799);}
|
||||||
*sp = 0;
|
*sp = 0;
|
||||||
|
|
||||||
decodeurl(ss, 0);
|
decodeurl(ss, 0);
|
||||||
@ -597,10 +543,10 @@ for(;;){
|
|||||||
inftpbuf = FTPBUFSIZE - (20 + inftpbuf);
|
inftpbuf = FTPBUFSIZE - (20 + inftpbuf);
|
||||||
res = ftpcd(param, ftpbase, ftpbuf, &inftpbuf);
|
res = ftpcd(param, ftpbase, ftpbuf, &inftpbuf);
|
||||||
if(res){
|
if(res){
|
||||||
res = ftptype(param, (unsigned char *)"I");
|
res = ftptype(param, (char *)"I");
|
||||||
if(res)RETURN(res);
|
if(res)RETURN(res);
|
||||||
ftpbase[--i] = 0;
|
ftpbase[--i] = 0;
|
||||||
ftps = ftpcommand(param, param->operation == FTP_PUT? (unsigned char *)"PUT" : (unsigned char *)"RETR", ftpbase);
|
ftps = ftpcommand(param, param->operation == FTP_PUT? (char *)"PUT" : (char *)"RETR", ftpbase);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(inftpbuf){
|
if(inftpbuf){
|
||||||
@ -609,12 +555,12 @@ for(;;){
|
|||||||
memcpy(buf+inbuf, "<hr>", 4);
|
memcpy(buf+inbuf, "<hr>", 4);
|
||||||
inbuf += 4;
|
inbuf += 4;
|
||||||
}
|
}
|
||||||
ftps = ftpcommand(param, (unsigned char *)"LIST", NULL);
|
ftps = ftpcommand(param, (char *)"LIST", NULL);
|
||||||
mode = 1;
|
mode = 1;
|
||||||
}
|
}
|
||||||
if(ftps == INVALID_SOCKET){RETURN(780);}
|
if(ftps == INVALID_SOCKET){RETURN(780);}
|
||||||
if(!mode){
|
if(!mode){
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]);
|
||||||
s = param->remsock;
|
s = param->remsock;
|
||||||
param->remsock = ftps;
|
param->remsock = ftps;
|
||||||
if((param->operation == FTP_PUT) && (contentlength64 > 0)) param->waitclient64 = contentlength64;
|
if((param->operation == FTP_PUT) && (contentlength64 > 0)) param->waitclient64 = contentlength64;
|
||||||
@ -635,7 +581,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
|
|
||||||
param->remsock = ftps;
|
param->remsock = ftps;
|
||||||
if(gotres <= 0) for(; (res = sockgetlinebuf(param, SERVER, (unsigned char *)ftpbuf, FTPBUFSIZE - 20, '\n', conf.timeouts[STRING_S])) > 0; i++){
|
if(gotres <= 0) for(; (res = sockgetlinebuf(param, SERVER, (char *)ftpbuf, FTPBUFSIZE - 20, '\n', conf.timeouts[STRING_S])) > 0; i++){
|
||||||
int isdir = 0;
|
int isdir = 0;
|
||||||
int islink = 0;
|
int islink = 0;
|
||||||
int filetoken =-1;
|
int filetoken =-1;
|
||||||
@ -643,9 +589,9 @@ for(;;){
|
|||||||
int modetoken =-1;
|
int modetoken =-1;
|
||||||
int datetoken =-1;
|
int datetoken =-1;
|
||||||
int spaces = 1;
|
int spaces = 1;
|
||||||
unsigned char * tokens[10];
|
char * tokens[10];
|
||||||
unsigned wordlen [10];
|
unsigned wordlen [10];
|
||||||
unsigned char j=0;
|
char j=0;
|
||||||
int space = 1;
|
int space = 1;
|
||||||
|
|
||||||
ftpbuf[res] = 0;
|
ftpbuf[res] = 0;
|
||||||
@ -654,7 +600,7 @@ for(;;){
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(!isnumber(*ftpbuf) && mode == 1) mode = 2;
|
if(!isnumber(*ftpbuf) && mode == 1) mode = 2;
|
||||||
for(sb=(unsigned char *)ftpbuf; *sb; sb++){
|
for(sb=(char *)ftpbuf; *sb; sb++){
|
||||||
if(!space && isspace(*sb)){
|
if(!space && isspace(*sb)){
|
||||||
space = 1;
|
space = 1;
|
||||||
wordlen[j]=(unsigned)(sb-tokens[j]);
|
wordlen[j]=(unsigned)(sb-tokens[j]);
|
||||||
@ -721,7 +667,7 @@ for(;;){
|
|||||||
memcpy(buf+inbuf, " <A HREF=\"", 10);
|
memcpy(buf+inbuf, " <A HREF=\"", 10);
|
||||||
inbuf+=10;
|
inbuf+=10;
|
||||||
sb = NULL;
|
sb = NULL;
|
||||||
if(islink) sb = (unsigned char *)strstr((char *)tokens[filetoken], " -> ");
|
if(islink) sb = (char *)strstr((char *)tokens[filetoken], " -> ");
|
||||||
if(sb) sb+=4;
|
if(sb) sb+=4;
|
||||||
|
|
||||||
else sb=tokens[filetoken];
|
else sb=tokens[filetoken];
|
||||||
@ -760,7 +706,7 @@ for(;;){
|
|||||||
if((bufsize - inbuf) < LINESIZE){
|
if((bufsize - inbuf) < LINESIZE){
|
||||||
if (bufsize > 20000){
|
if (bufsize > 20000){
|
||||||
if(!headsent++){
|
if(!headsent++){
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[9], (int)strlen(proxy_stringtable[9]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[9], (int)strlen(proxy_stringtable[9]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
if((unsigned)socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]) != inbuf){
|
if((unsigned)socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]) != inbuf){
|
||||||
RETURN(781);
|
RETURN(781);
|
||||||
@ -791,7 +737,7 @@ for(;;){
|
|||||||
"Connection: keep-alive\r\n"
|
"Connection: keep-alive\r\n"
|
||||||
"Content-Length: %d\r\n\r\n",
|
"Content-Length: %d\r\n\r\n",
|
||||||
inbuf);
|
inbuf);
|
||||||
socksend(param->clisock, (unsigned char *)ftpbuf, (int)strlen(ftpbuf), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)ftpbuf, (int)strlen(ftpbuf), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]);
|
socksend(param->clisock, buf, inbuf, conf.timeouts[STRING_S]);
|
||||||
if(res){RETURN(res);}
|
if(res){RETURN(res);}
|
||||||
@ -803,7 +749,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(isconnect && param->redirtype != R_HTTP) {
|
if(isconnect && param->redirtype != R_HTTP) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[8], (int)strlen(proxy_stringtable[8]), conf.timeouts[STRING_S]);
|
||||||
if(param->redirectfunc) {
|
if(param->redirectfunc) {
|
||||||
if(req)myfree(req);
|
if(req)myfree(req);
|
||||||
if(buf)myfree(buf);
|
if(buf)myfree(buf);
|
||||||
@ -821,7 +767,7 @@ for(;;){
|
|||||||
else {
|
else {
|
||||||
#ifdef TCP_CORK
|
#ifdef TCP_CORK
|
||||||
int opt = 1;
|
int opt = 1;
|
||||||
so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
|
so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (char *)&opt, sizeof(int));
|
||||||
#endif
|
#endif
|
||||||
redirect = 1;
|
redirect = 1;
|
||||||
res = (int)strlen((char *)req);
|
res = (int)strlen((char *)req);
|
||||||
@ -846,7 +792,7 @@ for(;;){
|
|||||||
else if(anonymous>1){
|
else if(anonymous>1){
|
||||||
sprintf((char*)buf+strlen((char *)buf), "Via: 1.1 ");
|
sprintf((char*)buf+strlen((char *)buf), "Via: 1.1 ");
|
||||||
gethostname((char *)(buf+strlen((char *)buf)), 256);
|
gethostname((char *)(buf+strlen((char *)buf)), 256);
|
||||||
sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(¶m->srv->intsa)), conf.stringtable?conf.stringtable[2]:(unsigned char *)"", conf.stringtable?conf.stringtable[3]:(unsigned char *)"");
|
sprintf((char*)buf+strlen((char *)buf), ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(¶m->srv->intsa)), conf.stringtable?conf.stringtable[2]:(char *)"", conf.stringtable?conf.stringtable[3]:(char *)"");
|
||||||
if(anonymous != 2)myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + strlen((char *)buf), 128);
|
if(anonymous != 2)myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + strlen((char *)buf), 128);
|
||||||
else {
|
else {
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
@ -862,7 +808,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
if(param->extusername){
|
if(param->extusername){
|
||||||
sprintf((char*)buf + strlen((char *)buf), "%s: Basic ", (redirect)?"Proxy-Authorization":"Authorization");
|
sprintf((char*)buf + strlen((char *)buf), "%s: Basic ", (redirect)?"Proxy-Authorization":"Authorization");
|
||||||
sprintf((char*)username, "%.128s:%.128s", param->extusername, param->extpassword?param->extpassword:(unsigned char*)"");
|
sprintf((char*)username, "%.128s:%.128s", param->extusername, param->extpassword?param->extpassword:(char*)"");
|
||||||
en64(username, buf+strlen((char *)buf), (int)strlen((char *)username));
|
en64(username, buf+strlen((char *)buf), (int)strlen((char *)username));
|
||||||
sprintf((char*)buf + strlen((char *)buf), "\r\n");
|
sprintf((char*)buf + strlen((char *)buf), "\r\n");
|
||||||
}
|
}
|
||||||
@ -873,7 +819,7 @@ for(;;){
|
|||||||
#ifdef TCP_CORK
|
#ifdef TCP_CORK
|
||||||
{
|
{
|
||||||
int opt = 0;
|
int opt = 0;
|
||||||
so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (unsigned char *)&opt, sizeof(int));
|
so._setsockopt(param->remsock, IPPROTO_TCP, TCP_CORK, (char *)&opt, sizeof(int));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
param->statscli64 += res;
|
param->statscli64 += res;
|
||||||
@ -904,7 +850,7 @@ for(;;){
|
|||||||
||
|
||
|
||||||
(i> 16 && !strncasecmp((char *)(buf+inbuf), "connection:", 11))
|
(i> 16 && !strncasecmp((char *)(buf+inbuf), "connection:", 11))
|
||||||
)){
|
)){
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -919,7 +865,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
else if(i > 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){
|
else if(i > 15 && (!strncasecmp((char *)(buf+inbuf), "content-length", 14))){
|
||||||
buf[inbuf+i]=0;
|
buf[inbuf+i]=0;
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -935,7 +881,7 @@ for(;;){
|
|||||||
}
|
}
|
||||||
else if(i>25 && (!strncasecmp((char *)(buf+inbuf), "transfer-encoding", 17))){
|
else if(i>25 && (!strncasecmp((char *)(buf+inbuf), "transfer-encoding", 17))){
|
||||||
buf[inbuf+i]=0;
|
buf[inbuf+i]=0;
|
||||||
sb = (unsigned char *)strchr((char *)(buf+inbuf), ':');
|
sb = (char *)strchr((char *)(buf+inbuf), ':');
|
||||||
if(!sb)continue;
|
if(!sb)continue;
|
||||||
++sb;
|
++sb;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
@ -1020,7 +966,7 @@ for(;;){
|
|||||||
if((param->chunked || contentlength64 > 0) && param->operation != HTTP_HEAD && res != 204 && res != 304) {
|
if((param->chunked || contentlength64 > 0) && param->operation != HTTP_HEAD && res != 204 && res != 304) {
|
||||||
do {
|
do {
|
||||||
if(param->chunked){
|
if(param->chunked){
|
||||||
unsigned char smallbuf[32];
|
char smallbuf[32];
|
||||||
while ((i = sockgetlinebuf(param, SERVER, smallbuf, 30, '\n', conf.timeouts[STRING_S])) == 2) {
|
while ((i = sockgetlinebuf(param, SERVER, smallbuf, 30, '\n', conf.timeouts[STRING_S])) == 2) {
|
||||||
if (socksend(param->clisock, smallbuf, i, conf.timeouts[STRING_S]) != i){
|
if (socksend(param->clisock, smallbuf, i, conf.timeouts[STRING_S]) != i){
|
||||||
RETURN(533);
|
RETURN(533);
|
||||||
@ -1086,41 +1032,41 @@ CLEANRET:
|
|||||||
if(param->res != 555 && param->res && param->clisock != INVALID_SOCKET && (param->res < 90 || param->res >=800 || param->res == 100 ||(param->res > 500 && param->res< 800))) {
|
if(param->res != 555 && param->res && param->clisock != INVALID_SOCKET && (param->res < 90 || param->res >=800 || param->res == 100 ||(param->res > 500 && param->res< 800))) {
|
||||||
if((param->res>=509 && param->res < 517) || param->res > 900) while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2);
|
if((param->res>=509 && param->res < 517) || param->res > 900) while( (i = sockgetlinebuf(param, CLIENT, buf, BUFSIZE - 1, '\n', conf.timeouts[STRING_S])) > 2);
|
||||||
if(param->res == 10) {
|
if(param->res == 10) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[2], (int)strlen(proxy_stringtable[2]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[2], (int)strlen(proxy_stringtable[2]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if (res == 700 || res == 701){
|
else if (res == 700 || res == 701){
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[16], (int)strlen(proxy_stringtable[16]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[16], (int)strlen(proxy_stringtable[16]), conf.timeouts[STRING_S]);
|
||||||
socksend(param->clisock, (unsigned char *)ftpbuf, inftpbuf, conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)ftpbuf, inftpbuf, conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 100 || (param->res >10 && param->res < 20) || (param->res >701 && param->res <= 705)) {
|
else if(param->res == 100 || (param->res >10 && param->res < 20) || (param->res >701 && param->res <= 705)) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[1], (int)strlen(proxy_stringtable[1]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[1], (int)strlen(proxy_stringtable[1]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res >=20 && param->res < 30) {
|
else if(param->res >=20 && param->res < 30) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[6], (int)strlen(proxy_stringtable[6]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[6], (int)strlen(proxy_stringtable[6]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res >=30 && param->res < 80) {
|
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]);
|
socksend(param->clisock, (char *)proxy_stringtable[5], (int)strlen(proxy_stringtable[5]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 1 || (!param->srv->needuser && 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]);
|
socksend(param->clisock, (char *)proxy_stringtable[11], (int)strlen(proxy_stringtable[11]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res < 10) {
|
else if(param->res < 10) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[param->srv->usentlm?12:7], (int)strlen(proxy_stringtable[param->srv->usentlm?12:7]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[7], (int)strlen(proxy_stringtable[7]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 999) {
|
else if(param->res == 999) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[4], (int)strlen(proxy_stringtable[4]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[4], (int)strlen(proxy_stringtable[4]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 519) {
|
else if(param->res == 519) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[3], (int)strlen(proxy_stringtable[3]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[3], (int)strlen(proxy_stringtable[3]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 517) {
|
else if(param->res == 517) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[15], (int)strlen(proxy_stringtable[15]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[15], (int)strlen(proxy_stringtable[15]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res == 780) {
|
else if(param->res == 780) {
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[10], (int)strlen(proxy_stringtable[10]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[10], (int)strlen(proxy_stringtable[10]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(param->res >= 511 && param->res<=516){
|
else if(param->res >= 511 && param->res<=516){
|
||||||
socksend(param->clisock, (unsigned char *)proxy_stringtable[0], (int)strlen(proxy_stringtable[0]), conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)proxy_stringtable[0], (int)strlen(proxy_stringtable[0]), conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logurl(param, (char *)buf, (char *)req, ftp);
|
logurl(param, (char *)buf, (char *)req, ftp);
|
||||||
|
72
src/proxy.h
72
src/proxy.h
@ -153,9 +153,9 @@ extern int timetoexit;
|
|||||||
extern struct extparam conf;
|
extern struct extparam conf;
|
||||||
|
|
||||||
int sockmap(struct clientparam * param, int timeo, int usesplice);
|
int sockmap(struct clientparam * param, int timeo, int usesplice);
|
||||||
int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to);
|
int socksend(SOCKET sock, char * buf, int bufsize, int to);
|
||||||
int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
int socksendto(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to);
|
||||||
int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
int sockrecvfrom(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to);
|
||||||
|
|
||||||
|
|
||||||
int sockgetcharcli(struct clientparam * param, int timeosec, int timeousec);
|
int sockgetcharcli(struct clientparam * param, int timeosec, int timeousec);
|
||||||
@ -163,14 +163,14 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec);
|
|||||||
int sockfillbuffcli(struct clientparam * param, unsigned long size, int timeosec);
|
int sockfillbuffcli(struct clientparam * param, unsigned long size, int timeosec);
|
||||||
int sockfillbuffsrv(struct clientparam * param, unsigned long size, int timeosec);
|
int sockfillbuffsrv(struct clientparam * param, unsigned long size, int timeosec);
|
||||||
|
|
||||||
int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to);
|
int sockgetlinebuf(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void initlog(void);
|
void initlog(void);
|
||||||
void dolog(struct clientparam * param, const unsigned char *s);
|
void dolog(struct clientparam * param, const char *s);
|
||||||
int dobuf(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec);
|
int dobuf(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec);
|
||||||
int dobuf2(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
|
int dobuf2(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format);
|
||||||
int doconnect(struct clientparam * param);
|
int doconnect(struct clientparam * param);
|
||||||
int alwaysauth(struct clientparam * param);
|
int alwaysauth(struct clientparam * param);
|
||||||
int ipauth(struct clientparam * param);
|
int ipauth(struct clientparam * param);
|
||||||
@ -181,15 +181,15 @@ void trafcountfunc(struct clientparam *param);
|
|||||||
unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout);
|
unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout);
|
||||||
|
|
||||||
|
|
||||||
int scanaddr(const unsigned char *s, unsigned long * ip, unsigned long * mask);
|
int scanaddr(const char *s, unsigned long * ip, unsigned long * mask);
|
||||||
int myinet_ntop(int af, void *src, char *dst, socklen_t size);
|
int myinet_ntop(int af, void *src, char *dst, socklen_t size);
|
||||||
extern struct nserver nservers[MAXNSERVERS];
|
extern struct nserver nservers[MAXNSERVERS];
|
||||||
extern struct nserver authnserver;
|
extern struct nserver authnserver;
|
||||||
unsigned long getip(unsigned char *name);
|
unsigned long getip(char *name);
|
||||||
unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa);
|
unsigned long getip46(int family, char *name, struct sockaddr *sa);
|
||||||
int afdetect(unsigned char *name);
|
int afdetect(char *name);
|
||||||
unsigned long myresolver(int, unsigned char *, unsigned char *);
|
unsigned long myresolver(int, char *, char *);
|
||||||
unsigned long fakeresolver (int, unsigned char *, unsigned char*);
|
unsigned long fakeresolver (int, char *, char*);
|
||||||
int inithashtable(struct hashtable *hashtable, unsigned nhashsize);
|
int inithashtable(struct hashtable *hashtable, unsigned nhashsize);
|
||||||
void freeparam(struct clientparam * param);
|
void freeparam(struct clientparam * param);
|
||||||
void srvpostfree(struct srvparam * srv);
|
void srvpostfree(struct srvparam * srv);
|
||||||
@ -207,34 +207,34 @@ int reload (void);
|
|||||||
extern int paused;
|
extern int paused;
|
||||||
extern int demon;
|
extern int demon;
|
||||||
|
|
||||||
unsigned char * mycrypt(const unsigned char *key, const unsigned char *salt, unsigned char *buf);
|
char * mycrypt(const char *key, const char *salt, char *buf);
|
||||||
unsigned char * ntpwdhash (unsigned char *szHash, const unsigned char *szPassword, int tohex);
|
char * ntpwdhash (char *szHash, const char *szPassword, int tohex);
|
||||||
int de64 (const unsigned char *in, unsigned char *out, int maxlen);
|
int de64 (const char *in, char *out, int maxlen);
|
||||||
unsigned char* en64 (const unsigned char *in, unsigned char *out, int inlen);
|
char* en64 (const char *in, char *out, int inlen);
|
||||||
void tohex(unsigned char *in, unsigned char *out, int len);
|
void tohex(char *in, char *out, int len);
|
||||||
void fromhex(unsigned char *in, unsigned char *out, int len);
|
void fromhex(char *in, char *out, int len);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ftplogin(struct clientparam *param, char *buf, int *inbuf);
|
int ftplogin(struct clientparam *param, char *buf, int *inbuf);
|
||||||
int ftpcd(struct clientparam *param, unsigned char* path, char *buf, int *inbuf);
|
int ftpcd(struct clientparam *param, char* path, char *buf, int *inbuf);
|
||||||
int ftpsyst(struct clientparam *param, unsigned char *buf, unsigned len);
|
int ftpsyst(struct clientparam *param, char *buf, unsigned len);
|
||||||
int ftppwd(struct clientparam *param, unsigned char *buf, unsigned len);
|
int ftppwd(struct clientparam *param, char *buf, unsigned len);
|
||||||
int ftptype(struct clientparam *param, unsigned char* f_type);
|
int ftptype(struct clientparam *param, char* f_type);
|
||||||
int ftpres(struct clientparam *param, unsigned char * buf, int len);
|
int ftpres(struct clientparam *param, char * buf, int len);
|
||||||
SOCKET ftpcommand(struct clientparam *param, unsigned char * command, unsigned char *arg);
|
SOCKET ftpcommand(struct clientparam *param, char * command, char *arg);
|
||||||
|
|
||||||
|
|
||||||
int text2unicode(const char * text, char * buf, int buflen);
|
int text2unicode(const char * text, char * buf, int buflen);
|
||||||
void unicode2text(const char *unicode, char * buf, int len);
|
void unicode2text(const char *unicode, char * buf, int len);
|
||||||
void genchallenge(struct clientparam *param, char * challenge, char *buf);
|
void genchallenge(struct clientparam *param, char * challenge, char *buf);
|
||||||
void mschap(const unsigned char *win_password,
|
void mschap(const char *win_password,
|
||||||
const unsigned char *challenge, unsigned char *response);
|
const char *challenge, char *response);
|
||||||
|
|
||||||
struct hashtable;
|
struct hashtable;
|
||||||
void hashadd(struct hashtable *ht, const unsigned char* name, unsigned char* value, time_t expires);
|
void hashadd(struct hashtable *ht, const char* name, char* value, time_t expires);
|
||||||
|
|
||||||
int parsehost(int family, unsigned char *host, struct sockaddr *sa);
|
int parsehost(int family, char *host, struct sockaddr *sa);
|
||||||
int parsehostname(char *hostname, struct clientparam *param, unsigned short port);
|
int parsehostname(char *hostname, struct clientparam *param, unsigned short port);
|
||||||
int parseusername(char *username, struct clientparam *param, int extpasswd);
|
int parseusername(char *username, struct clientparam *param, int extpasswd);
|
||||||
int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port);
|
int parseconnusername(char *username, struct clientparam *param, int extpasswd, unsigned short port);
|
||||||
@ -242,7 +242,7 @@ int ACLmatches(struct ace* acentry, struct clientparam * param);
|
|||||||
int checkACL(struct clientparam * param);
|
int checkACL(struct clientparam * param);
|
||||||
int checkpreACL(struct clientparam * param);
|
int checkpreACL(struct clientparam * param);
|
||||||
extern int havelog;
|
extern int havelog;
|
||||||
unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth);
|
unsigned long udpresolve(int af, char * name, char * value, unsigned *retttl, struct clientparam* param, int makeauth);
|
||||||
|
|
||||||
void copyacl (struct ace *ac, struct srvparam *srv);
|
void copyacl (struct ace *ac, struct srvparam *srv);
|
||||||
struct auth * copyauth (struct auth *);
|
struct auth * copyauth (struct auth *);
|
||||||
@ -255,17 +255,17 @@ struct passwords * copypwl (struct passwords *pwl);
|
|||||||
void freepwl(struct passwords *pw);
|
void freepwl(struct passwords *pw);
|
||||||
void copyfilter(struct filter *, struct srvparam *srv);
|
void copyfilter(struct filter *, struct srvparam *srv);
|
||||||
FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param);
|
FILTER_ACTION makefilters (struct srvparam *srv, struct clientparam *param);
|
||||||
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlereqfilters(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handlepredatflt(struct clientparam *param);
|
FILTER_ACTION handlepredatflt(struct clientparam *param);
|
||||||
FILTER_ACTION handledatfltcli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handledatfltcli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
FILTER_ACTION handledatfltsrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
FILTER_ACTION handledatfltsrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
|
|
||||||
void srvinit(struct srvparam * srv, struct clientparam *param);
|
void srvinit(struct srvparam * srv, struct clientparam *param);
|
||||||
void srvinit2(struct srvparam * srv, struct clientparam *param);
|
void srvinit2(struct srvparam * srv, struct clientparam *param);
|
||||||
void srvfree(struct srvparam * srv);
|
void srvfree(struct srvparam * srv);
|
||||||
unsigned char * dologname (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
|
char * dologname (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t);
|
||||||
int readconfig(FILE * fp);
|
int readconfig(FILE * fp);
|
||||||
int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to);
|
int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to);
|
||||||
|
|
||||||
|
@ -25,27 +25,27 @@ void * threadfunc (void *p) {
|
|||||||
fds.revents = 0;
|
fds.revents = 0;
|
||||||
for(i=5+(param->srv->maxchild>>10); i; i--){
|
for(i=5+(param->srv->maxchild>>10); i; i--){
|
||||||
if(so._poll(&fds, 1, 1000*CONNBACK_TO)!=1){
|
if(so._poll(&fds, 1, 1000*CONNBACK_TO)!=1){
|
||||||
dolog(param, (unsigned char *)"Connect back not received, check connback client");
|
dolog(param, (char *)"Connect back not received, check connback client");
|
||||||
i = 0;
|
i = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
|
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
|
||||||
if(param->remsock == INVALID_SOCKET) {
|
if(param->remsock == INVALID_SOCKET) {
|
||||||
dolog(param, (unsigned char *)"Connect back accept() failed");
|
dolog(param, (char *)"Connect back accept() failed");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifndef WITHMAIN
|
#ifndef WITHMAIN
|
||||||
param->req = param->sinsr;
|
param->req = param->sinsr;
|
||||||
if(param->srv->preacl) param->res = checkpreACL(param);
|
if(param->srv->preacl) param->res = checkpreACL(param);
|
||||||
if(param->res){
|
if(param->res){
|
||||||
dolog(param, (unsigned char *)"Connect back ACL failed");
|
dolog(param, (char *)"Connect back ACL failed");
|
||||||
so._closesocket(param->remsock);
|
so._closesocket(param->remsock);
|
||||||
param->remsock = INVALID_SOCKET;
|
param->remsock = INVALID_SOCKET;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(socksendto(param->remsock, (struct sockaddr*)¶m->sinsr, (unsigned char *)"C", 1, CONNBACK_TO) != 1){
|
if(socksendto(param->remsock, (struct sockaddr*)¶m->sinsr, (char *)"C", 1, CONNBACK_TO) != 1){
|
||||||
dolog(param, (unsigned char *)"Connect back sending command failed");
|
dolog(param, (char *)"Connect back sending command failed");
|
||||||
so._closesocket(param->remsock);
|
so._closesocket(param->remsock);
|
||||||
param->remsock = INVALID_SOCKET;
|
param->remsock = INVALID_SOCKET;
|
||||||
continue;
|
continue;
|
||||||
@ -185,10 +185,10 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
struct clientparam * newparam;
|
struct clientparam * newparam;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
unsigned sleeptime;
|
unsigned sleeptime;
|
||||||
unsigned char buf[256];
|
char buf[256];
|
||||||
char *hostname=NULL;
|
char *hostname=NULL;
|
||||||
int opt = 1, isudp = 0, iscbl = 0, iscbc = 0;
|
int opt = 1, isudp = 0, iscbl = 0, iscbc = 0;
|
||||||
unsigned char *cbc_string = NULL, *cbl_string = NULL;
|
char *cbc_string = NULL, *cbl_string = NULL;
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
struct sockaddr_in6 cbsa;
|
struct sockaddr_in6 cbsa;
|
||||||
#else
|
#else
|
||||||
@ -316,28 +316,28 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
#endif
|
#endif
|
||||||
case 'l':
|
case 'l':
|
||||||
myfree(srv->logtarget);
|
myfree(srv->logtarget);
|
||||||
srv->logtarget = (unsigned char *)mystrdup(argv[i] + 2);
|
srv->logtarget = (char *)mystrdup(argv[i] + 2);
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->intsa);
|
getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->intsa);
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
{
|
{
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
struct sockaddr_in6 sa6;
|
struct sockaddr_in6 sa6;
|
||||||
memset(&sa6, 0, sizeof(sa6));
|
memset(&sa6, 0, sizeof(sa6));
|
||||||
error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&sa6);
|
error = !getip46(46, (char *)argv[i]+2, (struct sockaddr *)&sa6);
|
||||||
if(!error) {
|
if(!error) {
|
||||||
if (*SAFAMILY(&sa6)==AF_INET) srv->extsa = sa6;
|
if (*SAFAMILY(&sa6)==AF_INET) srv->extsa = sa6;
|
||||||
else srv->extsa6 = sa6;
|
else srv->extsa6 = sa6;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
error = !getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->extsa);
|
error = !getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->extsa);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv->extNat);
|
getip46(46, (char *)argv[i]+2, (struct sockaddr *)&srv->extNat);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
*SAPORT(&srv->intsa) = htons(atoi(argv[i]+2));
|
*SAPORT(&srv->intsa) = htons(atoi(argv[i]+2));
|
||||||
@ -365,7 +365,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
#endif
|
#endif
|
||||||
case 'f':
|
case 'f':
|
||||||
if(srv->logformat)myfree(srv->logformat);
|
if(srv->logformat)myfree(srv->logformat);
|
||||||
srv->logformat = (unsigned char *)mystrdup(argv[i] + 2);
|
srv->logformat = (char *)mystrdup(argv[i] + 2);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
srv->silent = 1;
|
srv->silent = 1;
|
||||||
@ -374,11 +374,11 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
hostname = argv[i] + 2;
|
hostname = argv[i] + 2;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
cbc_string = (unsigned char *)mystrdup(argv[i] + 2);
|
cbc_string = (char *)mystrdup(argv[i] + 2);
|
||||||
iscbc = 1;
|
iscbc = 1;
|
||||||
break;
|
break;
|
||||||
case 'R':
|
case 'R':
|
||||||
cbl_string = (unsigned char *)mystrdup(argv[i] + 2);
|
cbl_string = (char *)mystrdup(argv[i] + 2);
|
||||||
iscbl = 1;
|
iscbl = 1;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
@ -496,7 +496,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
);
|
);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
srv->target = (unsigned char *)mystrdup(argv[i+1]);
|
srv->target = (char *)mystrdup(argv[i+1]);
|
||||||
#endif
|
#endif
|
||||||
#ifndef STDMAIN
|
#ifndef STDMAIN
|
||||||
}
|
}
|
||||||
@ -507,8 +507,8 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
if(inetd) {
|
if(inetd) {
|
||||||
fcntl(0,F_SETFL,O_NONBLOCK | fcntl(0,F_GETFL));
|
fcntl(0,F_SETFL,O_NONBLOCK | fcntl(0,F_GETFL));
|
||||||
if(!isudp){
|
if(!isudp){
|
||||||
so._setsockopt(0, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg));
|
so._setsockopt(0, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
|
||||||
so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (unsigned char *)&opt, sizeof(int));
|
so._setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
|
||||||
}
|
}
|
||||||
defparam.clisock = 0;
|
defparam.clisock = 0;
|
||||||
if(! (newparam = myalloc (sizeof(defparam)))){
|
if(! (newparam = myalloc (sizeof(defparam)))){
|
||||||
@ -604,7 +604,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
if(iscbl){
|
if(iscbl){
|
||||||
parsehost(srv->family, cbl_string, (struct sockaddr *)&cbsa);
|
parsehost(srv->family, cbl_string, (struct sockaddr *)&cbsa);
|
||||||
if((srv->cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
|
if((srv->cbsock=so._socket(SASOCK(&cbsa), SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) {
|
||||||
dolog(&defparam, (unsigned char *)"Failed to allocate connect back socket");
|
dolog(&defparam, (char *)"Failed to allocate connect back socket");
|
||||||
return -6;
|
return -6;
|
||||||
}
|
}
|
||||||
opt = 1;
|
opt = 1;
|
||||||
@ -617,11 +617,11 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
setopts(srv->cbsock, srv->cbssockopts);
|
setopts(srv->cbsock, srv->cbssockopts);
|
||||||
|
|
||||||
if(so._bind(srv->cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
|
if(so._bind(srv->cbsock, (struct sockaddr*)&cbsa, SASIZE(&cbsa))==-1) {
|
||||||
dolog(&defparam, (unsigned char *)"Failed to bind connect back socket");
|
dolog(&defparam, (char *)"Failed to bind connect back socket");
|
||||||
return -7;
|
return -7;
|
||||||
}
|
}
|
||||||
if(so._listen(srv->cbsock, 1 + (srv->maxchild>>4))==-1) {
|
if(so._listen(srv->cbsock, 1 + (srv->maxchild>>4))==-1) {
|
||||||
dolog(&defparam, (unsigned char *)"Failed to listen connect back socket");
|
dolog(&defparam, (char *)"Failed to listen connect back socket");
|
||||||
return -8;
|
return -8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -766,12 +766,12 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
if(! (newparam = myalloc (sizeof(defparam)))){
|
if(! (newparam = myalloc (sizeof(defparam)))){
|
||||||
if(!isudp) so._closesocket(new_sock);
|
if(!isudp) so._closesocket(new_sock);
|
||||||
defparam.res = 21;
|
defparam.res = 21;
|
||||||
if(!srv->silent)dolog(&defparam, (unsigned char *)"Memory Allocation Failed");
|
if(!srv->silent)dolog(&defparam, (char *)"Memory Allocation Failed");
|
||||||
usleep(SLEEPTIME);
|
usleep(SLEEPTIME);
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
*newparam = defparam;
|
*newparam = defparam;
|
||||||
if(defparam.hostname)newparam->hostname=(unsigned char *)mystrdup((char *)defparam.hostname);
|
if(defparam.hostname)newparam->hostname=(char *)mystrdup((char *)defparam.hostname);
|
||||||
clearstat(newparam);
|
clearstat(newparam);
|
||||||
|
|
||||||
if(!isudp) newparam->clisock = new_sock;
|
if(!isudp) newparam->clisock = new_sock;
|
||||||
@ -827,7 +827,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
if(isudp) while(!srv->fds.events)usleep(SLEEPTIME);
|
if(isudp) while(!srv->fds.events)usleep(SLEEPTIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!srv->silent) dolog(&defparam, (unsigned char *)"Exiting thread");
|
if(!srv->silent) dolog(&defparam, (char *)"Exiting thread");
|
||||||
|
|
||||||
srvfree(srv);
|
srvfree(srv);
|
||||||
pthread_mutex_lock(&srv->counter_mutex);
|
pthread_mutex_lock(&srv->counter_mutex);
|
||||||
@ -853,8 +853,8 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
|
|||||||
srv->version = conf.version + 1;
|
srv->version = conf.version + 1;
|
||||||
srv->paused = conf.paused;
|
srv->paused = conf.paused;
|
||||||
srv->noforce = conf.noforce;
|
srv->noforce = conf.noforce;
|
||||||
srv->logformat = conf.logformat? (unsigned char *)mystrdup((char *)conf.logformat) : NULL;
|
srv->logformat = conf.logformat? (char *)mystrdup((char *)conf.logformat) : NULL;
|
||||||
srv->logtarget = conf.logtarget? (unsigned char *)mystrdup((char *)conf.logtarget) : NULL;
|
srv->logtarget = conf.logtarget? (char *)mystrdup((char *)conf.logtarget) : NULL;
|
||||||
srv->authfunc = conf.authfunc;
|
srv->authfunc = conf.authfunc;
|
||||||
srv->usentlm = 0;
|
srv->usentlm = 0;
|
||||||
srv->maxchild = conf.maxchild;
|
srv->maxchild = conf.maxchild;
|
||||||
@ -887,12 +887,12 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){
|
|||||||
if(srv->logformat){
|
if(srv->logformat){
|
||||||
char *s;
|
char *s;
|
||||||
if(*srv->logformat == '-' && (s = strchr((char *)srv->logformat + 1, '+')) && s[1]){
|
if(*srv->logformat == '-' && (s = strchr((char *)srv->logformat + 1, '+')) && s[1]){
|
||||||
unsigned char* logformat = srv->logformat;
|
char* logformat = srv->logformat;
|
||||||
|
|
||||||
*s = 0;
|
*s = 0;
|
||||||
srv->nonprintable = (unsigned char *)mystrdup((char *)srv->logformat + 1);
|
srv->nonprintable = (char *)mystrdup((char *)srv->logformat + 1);
|
||||||
srv->replace = s[1];
|
srv->replace = s[1];
|
||||||
srv->logformat = (unsigned char *)mystrdup(s + 2);
|
srv->logformat = (char *)mystrdup(s + 2);
|
||||||
*s = '+';
|
*s = '+';
|
||||||
myfree(logformat);
|
myfree(logformat);
|
||||||
}
|
}
|
||||||
@ -999,17 +999,17 @@ void copyacl (struct ace *ac, struct srvparam *srv){
|
|||||||
for(pel = ac->periods; pel; pel = pel->next = itcopy(pel->next, sizeof(struct period)));
|
for(pel = ac->periods; pel; pel = pel->next = itcopy(pel->next, sizeof(struct period)));
|
||||||
ac->users = itcopy(ac->users, sizeof(struct userlist));
|
ac->users = itcopy(ac->users, sizeof(struct userlist));
|
||||||
for(ul = ac->users; ul; ul = ul->next = itcopy(ul->next, sizeof(struct userlist))){
|
for(ul = ac->users; ul; ul = ul->next = itcopy(ul->next, sizeof(struct userlist))){
|
||||||
if(ul->user) ul->user = (unsigned char*)mystrdup((char *)ul->user);
|
if(ul->user) ul->user = (char*)mystrdup((char *)ul->user);
|
||||||
}
|
}
|
||||||
ac->dstnames = itcopy(ac->dstnames, sizeof(struct hostname));
|
ac->dstnames = itcopy(ac->dstnames, sizeof(struct hostname));
|
||||||
for(hst = ac->dstnames; hst; hst = hst->next = itcopy(hst->next, sizeof(struct hostname))){
|
for(hst = ac->dstnames; hst; hst = hst->next = itcopy(hst->next, sizeof(struct hostname))){
|
||||||
if(hst->name) hst->name = (unsigned char*)mystrdup((char *)hst->name);
|
if(hst->name) hst->name = (char*)mystrdup((char *)hst->name);
|
||||||
}
|
}
|
||||||
ac->chains = itcopy(ac->chains, sizeof(struct chain));
|
ac->chains = itcopy(ac->chains, sizeof(struct chain));
|
||||||
for(ch = ac->chains; ch; ch = ch->next = itcopy(ch->next, sizeof(struct chain))){
|
for(ch = ac->chains; ch; ch = ch->next = itcopy(ch->next, sizeof(struct chain))){
|
||||||
if(ch->extuser)ch->extuser = (unsigned char*)mystrdup((char *)ch->extuser);
|
if(ch->extuser)ch->extuser = (char*)mystrdup((char *)ch->extuser);
|
||||||
if(ch->extpass)ch->extpass = (unsigned char*)mystrdup((char *)ch->extpass);
|
if(ch->extpass)ch->extpass = (char*)mystrdup((char *)ch->extpass);
|
||||||
if(ch->exthost)ch->exthost = (unsigned char*)mystrdup((char *)ch->exthost);
|
if(ch->exthost)ch->exthost = (char*)mystrdup((char *)ch->exthost);
|
||||||
}
|
}
|
||||||
if(preacl){
|
if(preacl){
|
||||||
if(ac->dst || ac->ports || ac->users || ac->dstnames || ac->chains|| ac->action>1){
|
if(ac->dst || ac->ports || ac->users || ac->dstnames || ac->chains|| ac->action>1){
|
||||||
@ -1126,7 +1126,7 @@ void freeacl(struct ace *ac){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handlereqfilters(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1137,7 +1137,7 @@ FILTER_ACTION handlereqfilters(struct clientparam *param, unsigned char ** buf_p
|
|||||||
return PASS;
|
return PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1148,7 +1148,7 @@ FILTER_ACTION handlehdrfilterssrv(struct clientparam *param, unsigned char ** bu
|
|||||||
return PASS;
|
return PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handlehdrfilterscli(struct clientparam *param, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1174,7 +1174,7 @@ FILTER_ACTION handlepredatflt(struct clientparam *cparam){
|
|||||||
return PASS;
|
return PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_ACTION handledatfltcli(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handledatfltcli(struct clientparam *cparam, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
#ifndef STDMAIN
|
#ifndef STDMAIN
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
@ -1187,7 +1187,7 @@ FILTER_ACTION handledatfltcli(struct clientparam *cparam, unsigned char ** buf_p
|
|||||||
return PASS;
|
return PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILTER_ACTION handledatfltsrv(struct clientparam *cparam, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
FILTER_ACTION handledatfltsrv(struct clientparam *cparam, char ** buf_p, int * bufsize_p, int offset, int * length_p){
|
||||||
FILTER_ACTION action;
|
FILTER_ACTION action;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
48
src/smtpp.c
48
src/smtpp.c
@ -16,7 +16,7 @@ char ehlo[] = "250-Proxy\r\n"
|
|||||||
"250 DSN\r\n";
|
"250 DSN\r\n";
|
||||||
|
|
||||||
int readreply (struct clientparam* param) {
|
int readreply (struct clientparam* param) {
|
||||||
unsigned char * buf;
|
char * buf;
|
||||||
int res, i, bufsize = 640;
|
int res, i, bufsize = 640;
|
||||||
|
|
||||||
if(!(buf = myalloc(bufsize))) return 0;
|
if(!(buf = myalloc(bufsize))) return 0;
|
||||||
@ -43,7 +43,7 @@ int readreply (struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int readcommand (struct clientparam* param) {
|
int readcommand (struct clientparam* param) {
|
||||||
unsigned char * buf;
|
char * buf;
|
||||||
int res, i, bufsize = 320;
|
int res, i, bufsize = 320;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ int readcommand (struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int readdata (struct clientparam* param) {
|
int readdata (struct clientparam* param) {
|
||||||
unsigned char * buf;
|
char * buf;
|
||||||
int res, i, bufsize = 4096;
|
int res, i, bufsize = 4096;
|
||||||
|
|
||||||
if(!(buf = myalloc(bufsize))) return 0;
|
if(!(buf = myalloc(bufsize))) return 0;
|
||||||
@ -96,25 +96,25 @@ int readdata (struct clientparam* param) {
|
|||||||
|
|
||||||
void * smtppchild(struct clientparam* param) {
|
void * smtppchild(struct clientparam* param) {
|
||||||
int i=0, res;
|
int i=0, res;
|
||||||
unsigned char buf[320];
|
char buf[320];
|
||||||
unsigned char username[256];
|
char username[256];
|
||||||
char * command = NULL;
|
char * command = NULL;
|
||||||
int login = 0;
|
int login = 0;
|
||||||
|
|
||||||
if(socksend(param->clisock, (unsigned char *)"220 Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);}
|
if(socksend(param->clisock, (char *)"220 Proxy\r\n", 11, conf.timeouts[STRING_S])!=11) {RETURN (611);}
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
while(i > 4 && (strncasecmp((char *)buf, "AUTH PLAIN", 10) || !(login = 2)) && (strncasecmp((char *)buf, "AUTH LOGIN", 10) || !(login = 1))){
|
while(i > 4 && (strncasecmp((char *)buf, "AUTH PLAIN", 10) || !(login = 2)) && (strncasecmp((char *)buf, "AUTH LOGIN", 10) || !(login = 1))){
|
||||||
if(!strncasecmp((char *)buf, "QUIT", 4)){
|
if(!strncasecmp((char *)buf, "QUIT", 4)){
|
||||||
socksend(param->clisock, (unsigned char *)"221 Proxy\r\n", 11,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"221 Proxy\r\n", 11,conf.timeouts[STRING_S]);
|
||||||
RETURN(0);
|
RETURN(0);
|
||||||
}
|
}
|
||||||
else if(!strncasecmp((char *)buf, "HELO ", 5)){
|
else if(!strncasecmp((char *)buf, "HELO ", 5)){
|
||||||
socksend(param->clisock, (unsigned char *)"250 Proxy\r\n", 11,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"250 Proxy\r\n", 11,conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(!strncasecmp((char *)buf, "EHLO ", 5)){
|
else if(!strncasecmp((char *)buf, "EHLO ", 5)){
|
||||||
socksend(param->clisock, (unsigned char *)ehlo, sizeof(ehlo) - 1,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)ehlo, sizeof(ehlo) - 1,conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else if(!param->hostname) socksend(param->clisock, (unsigned char *)"571 need AUTH first\r\n", 22, conf.timeouts[STRING_S]);
|
else if(!param->hostname) socksend(param->clisock, (char *)"571 need AUTH first\r\n", 22, conf.timeouts[STRING_S]);
|
||||||
else {
|
else {
|
||||||
login = -1;
|
login = -1;
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
@ -125,7 +125,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
if(!login) {RETURN(662);}
|
if(!login) {RETURN(662);}
|
||||||
if(login == 1){
|
if(login == 1){
|
||||||
socksend(param->clisock, (unsigned char *)"334 VXNlcm5hbWU6\r\n", 18,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"334 VXNlcm5hbWU6\r\n", 18,conf.timeouts[STRING_S]);
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
if(i < 3) {RETURN(663);}
|
if(i < 3) {RETURN(663);}
|
||||||
buf[i-2] = 0;
|
buf[i-2] = 0;
|
||||||
@ -133,7 +133,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
if(i < 1) {RETURN(664);}
|
if(i < 1) {RETURN(664);}
|
||||||
username[i] = 0;
|
username[i] = 0;
|
||||||
parseconnusername((char *)username, param, 0, 25);
|
parseconnusername((char *)username, param, 0, 25);
|
||||||
socksend(param->clisock, (unsigned char *)"334 UGFzc3dvcmQ6\r\n", 18,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"334 UGFzc3dvcmQ6\r\n", 18,conf.timeouts[STRING_S]);
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
if(i < 2) {RETURN(665);}
|
if(i < 2) {RETURN(665);}
|
||||||
buf[i-2] = 0;
|
buf[i-2] = 0;
|
||||||
@ -141,7 +141,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
if(i < 0) {RETURN(666);}
|
if(i < 0) {RETURN(666);}
|
||||||
username[i] = 0;
|
username[i] = 0;
|
||||||
if(param->extpassword) myfree(param->extpassword);
|
if(param->extpassword) myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)username);
|
param->extpassword = (char *)mystrdup((char *)username);
|
||||||
}
|
}
|
||||||
else if(login == 2){
|
else if(login == 2){
|
||||||
if(i > 13) {
|
if(i > 13) {
|
||||||
@ -149,7 +149,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
i = de64(buf+11,username,255);
|
i = de64(buf+11,username,255);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
socksend(param->clisock, (unsigned char *)"334\r\n", 5,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"334\r\n", 5,conf.timeouts[STRING_S]);
|
||||||
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, buf, sizeof(buf) - 10, '\n', conf.timeouts[STRING_S]);
|
||||||
if(i < 3) {RETURN(667);}
|
if(i < 3) {RETURN(667);}
|
||||||
buf[i-2] = 0;
|
buf[i-2] = 0;
|
||||||
@ -161,7 +161,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
res = (int)strlen((char *)username+1) + 2;
|
res = (int)strlen((char *)username+1) + 2;
|
||||||
if(res < i){
|
if(res < i){
|
||||||
if(param->extpassword) myfree(param->extpassword);
|
if(param->extpassword) myfree(param->extpassword);
|
||||||
param->extpassword = (unsigned char *)mystrdup((char *)username + res);
|
param->extpassword = (char *)mystrdup((char *)username + res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,29 +204,29 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
if(i<3) {RETURN(672);}
|
if(i<3) {RETURN(672);}
|
||||||
if(!command || (param->extusername && param->extpassword)){
|
if(!command || (param->extusername && param->extpassword)){
|
||||||
if(!param->extusername || !*param->extusername || !param->extpassword || !*param->extpassword || !login){
|
if(!param->extusername || !*param->extusername || !param->extpassword || !*param->extpassword || !login){
|
||||||
socksend(param->clisock, (unsigned char *)"235 auth required\r\n", 19,conf.timeouts[STRING_S]);
|
socksend(param->clisock, (char *)"235 auth required\r\n", 19,conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
if ((login & 1)) {
|
if ((login & 1)) {
|
||||||
socksend(param->remsock, (unsigned char *)"AUTH LOGIN\r\n", 12, conf.timeouts[STRING_S]);
|
socksend(param->remsock, (char *)"AUTH LOGIN\r\n", 12, conf.timeouts[STRING_S]);
|
||||||
param->statscli64+=12;
|
param->statscli64+=12;
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
||||||
if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(680);}
|
if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(680);}
|
||||||
en64(param->extusername, buf, (int)strlen((char *)param->extusername));
|
en64(param->extusername, buf, (int)strlen((char *)param->extusername));
|
||||||
socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]);
|
socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]);
|
||||||
socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
||||||
param->statscli64+=(i+2);
|
param->statscli64+=(i+2);
|
||||||
param->nwrites+=2;
|
param->nwrites+=2;
|
||||||
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
||||||
if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(681);}
|
if(i<4 || strncasecmp((char *)buf, "334", 3)) {RETURN(681);}
|
||||||
en64(param->extpassword, buf, (int)strlen((char *)param->extpassword));
|
en64(param->extpassword, buf, (int)strlen((char *)param->extpassword));
|
||||||
socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]);
|
socksend(param->remsock, buf, (int)strlen((char *)buf), conf.timeouts[STRING_S]);
|
||||||
socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
||||||
param->statscli64+=(i+2);
|
param->statscli64+=(i+2);
|
||||||
param->nwrites+=2;
|
param->nwrites+=2;
|
||||||
}
|
}
|
||||||
else if((login & 2)){
|
else if((login & 2)){
|
||||||
socksend(param->remsock, (unsigned char *)"AUTH PLAIN\r\n", 12, conf.timeouts[STRING_S]);
|
socksend(param->remsock, (char *)"AUTH PLAIN\r\n", 12, conf.timeouts[STRING_S]);
|
||||||
param->statscli64+=(12);
|
param->statscli64+=(12);
|
||||||
param->nwrites++;
|
param->nwrites++;
|
||||||
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
i = sockgetlinebuf(param, SERVER, buf, sizeof(buf) - 1, '\n', conf.timeouts[STRING_L]);
|
||||||
@ -241,7 +241,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
en64(username, buf, i);
|
en64(username, buf, i);
|
||||||
i = (int)strlen((char *)buf);
|
i = (int)strlen((char *)buf);
|
||||||
socksend(param->remsock, buf, i, conf.timeouts[STRING_S]);
|
socksend(param->remsock, buf, i, conf.timeouts[STRING_S]);
|
||||||
socksend(param->remsock, (unsigned char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
socksend(param->remsock, (char *)"\r\n", 2, conf.timeouts[STRING_S]);
|
||||||
param->statscli64+=(i+2);
|
param->statscli64+=(i+2);
|
||||||
param->nwrites+=2;
|
param->nwrites+=2;
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
if(!strncasecmp(command, "MAIL", 4) || !strncasecmp(command, "RCPT", 4) || !strncasecmp(command, "STARTTLS", 8) || !strncasecmp(command, "TURN", 4)){
|
if(!strncasecmp(command, "MAIL", 4) || !strncasecmp(command, "RCPT", 4) || !strncasecmp(command, "STARTTLS", 8) || !strncasecmp(command, "TURN", 4)){
|
||||||
res = (int)strlen(command);
|
res = (int)strlen(command);
|
||||||
command[res] = 0;
|
command[res] = 0;
|
||||||
res = handlehdrfilterscli(param, (unsigned char **)&command, &res, 0, &res);
|
res = handlehdrfilterscli(param, (char **)&command, &res, 0, &res);
|
||||||
if(res != PASS) {
|
if(res != PASS) {
|
||||||
if(res == HANDLED) res = 2;
|
if(res == HANDLED) res = 2;
|
||||||
else RETURN(677);
|
else RETURN(677);
|
||||||
@ -266,7 +266,7 @@ void * smtppchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
i = (int)strlen(command);
|
i = (int)strlen(command);
|
||||||
if(res != 2) socksend(param->remsock, (unsigned char *)command, i, conf.timeouts[STRING_S]);
|
if(res != 2) socksend(param->remsock, (char *)command, i, conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
#ifndef WITHMAIN
|
#ifndef WITHMAIN
|
||||||
|
|
||||||
@ -296,7 +296,7 @@ CLEANRET:
|
|||||||
}
|
}
|
||||||
else dolog(param, NULL);
|
else dolog(param, NULL);
|
||||||
if(param->clisock != INVALID_SOCKET) {
|
if(param->clisock != INVALID_SOCKET) {
|
||||||
if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (unsigned char *)"571 \r\n", 6,conf.timeouts[STRING_S]);
|
if ((param->res > 0 && param->res < 100) || (param->res > 661 && param->res <700)) socksend(param->clisock, (char *)"571 \r\n", 6,conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
if(command) myfree(command);
|
if(command) myfree(command);
|
||||||
freeparam(param);
|
freeparam(param);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
|
|
||||||
int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to){
|
int socksend(SOCKET sock, char * buf, int bufsize, int to){
|
||||||
int sent = 0;
|
int sent = 0;
|
||||||
int res;
|
int res;
|
||||||
struct pollfd fds;
|
struct pollfd fds;
|
||||||
@ -30,7 +30,7 @@ int socksend(SOCKET sock, unsigned char * buf, int bufsize, int to){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to){
|
int socksendto(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to){
|
||||||
int sent = 0;
|
int sent = 0;
|
||||||
int res;
|
int res;
|
||||||
struct pollfd fds;
|
struct pollfd fds;
|
||||||
@ -52,7 +52,7 @@ int socksendto(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufs
|
|||||||
return sent;
|
return sent;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sockrecvfrom(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to){
|
int sockrecvfrom(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to){
|
||||||
struct pollfd fds;
|
struct pollfd fds;
|
||||||
SASIZETYPE sasize;
|
SASIZETYPE sasize;
|
||||||
int res;
|
int res;
|
||||||
@ -153,7 +153,7 @@ int sockgetcharsrv(struct clientparam * param, int timeosec, int timeousec){
|
|||||||
return (int)*param->srvbuf;
|
return (int)*param->srvbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to){
|
int sockgetlinebuf(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to){
|
||||||
int c;
|
int c;
|
||||||
int i=0;
|
int i=0;
|
||||||
|
|
||||||
|
@ -22,9 +22,9 @@ void * sockschild(struct clientparam* param) {
|
|||||||
unsigned size;
|
unsigned size;
|
||||||
SASIZETYPE sasize;
|
SASIZETYPE sasize;
|
||||||
unsigned short port = 0;
|
unsigned short port = 0;
|
||||||
unsigned char * buf=NULL;
|
char * buf=NULL;
|
||||||
unsigned char c;
|
char c;
|
||||||
unsigned char command=0;
|
char command=0;
|
||||||
struct pollfd fds[3];
|
struct pollfd fds[3];
|
||||||
int ver=0;
|
int ver=0;
|
||||||
int havepass = 0;
|
int havepass = 0;
|
||||||
|
@ -9,26 +9,26 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
unsigned char * strings[] = {
|
char * strings[] = {
|
||||||
/* 00 */ (unsigned char *)"3proxy tiny proxy server " VERSION " stringtable file",
|
/* 00 */ "3proxy tiny proxy server " VERSION " stringtable file",
|
||||||
/* 01 */ (unsigned char *)"3proxy",
|
/* 01 */ "3proxy",
|
||||||
/* 02 */ (unsigned char *)"3proxy tiny proxy server",
|
/* 02 */ "3proxy tiny proxy server",
|
||||||
/* 03 */ (unsigned char *)VERSION " (" BUILDDATE ")",
|
/* 03 */ VERSION " (" BUILDDATE ")",
|
||||||
/* 04 */ (unsigned char *)"3proxy allows to share and control Internet connection and count traffic",
|
/* 04 */ "3proxy allows to share and control Internet connection and count traffic",
|
||||||
/* 05 */ (unsigned char *)"SERVR",
|
/* 05 */ "SERVR",
|
||||||
/* 06 */ (unsigned char *)"PROXY",
|
/* 06 */ "PROXY",
|
||||||
/* 07 */ (unsigned char *)"TCPPM",
|
/* 07 */ "TCPPM",
|
||||||
/* 08 */ (unsigned char *)"POP3P",
|
/* 08 */ "POP3P",
|
||||||
/* 09 */ (unsigned char *)"SOCK4",
|
/* 09 */ "SOCK4",
|
||||||
/* 10 */ (unsigned char *)"SOCK5",
|
/* 10 */ "SOCK5",
|
||||||
/* 11 */ (unsigned char *)"UDPPM",
|
/* 11 */ "UDPPM",
|
||||||
/* 12 */ (unsigned char *)"SOCKS",
|
/* 12 */ "SOCKS",
|
||||||
/* 13 */ (unsigned char *)"SOC45",
|
/* 13 */ "SOC45",
|
||||||
/* 14 */ (unsigned char *)"ADMIN",
|
/* 14 */ "ADMIN",
|
||||||
/* 15 */ (unsigned char *)"DNSPR",
|
/* 15 */ "DNSPR",
|
||||||
/* 16 */ (unsigned char *)"FTPPR",
|
/* 16 */ "FTPPR",
|
||||||
/* 17 */ (unsigned char *)"SMTPP",
|
/* 17 */ "SMTPP",
|
||||||
/* 18 */ (unsigned char *)"ZOMBIE",
|
/* 18 */ "ZOMBIE",
|
||||||
/* 19 */ NULL,
|
/* 19 */ NULL,
|
||||||
/* 20 */ NULL,
|
/* 20 */ NULL,
|
||||||
/* 21 */ NULL,
|
/* 21 */ NULL,
|
||||||
@ -37,12 +37,12 @@ unsigned char * strings[] = {
|
|||||||
/* 24 */ NULL,
|
/* 24 */ NULL,
|
||||||
#ifndef TPROXY_CONF
|
#ifndef TPROXY_CONF
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
/* 25 */ (unsigned char *)"/usr/local/etc/3proxy/3proxy.cfg",
|
/* 25 */ "/usr/local/etc/3proxy/3proxy.cfg",
|
||||||
#else
|
#else
|
||||||
/* 25 */ (unsigned char *)"3proxy.cfg",
|
/* 25 */ "3proxy.cfg",
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
/* 25 */ (unsigned char *)TPROXY_CONF,
|
/* 25 */ TPROXY_CONF,
|
||||||
#endif
|
#endif
|
||||||
/* 26 */ NULL,
|
/* 26 */ NULL,
|
||||||
/* 27 */ NULL,
|
/* 27 */ NULL,
|
||||||
@ -53,7 +53,7 @@ unsigned char * strings[] = {
|
|||||||
/* 32 */ NULL,
|
/* 32 */ NULL,
|
||||||
/* 33 */ NULL,
|
/* 33 */ NULL,
|
||||||
/* 34 */ NULL,
|
/* 34 */ NULL,
|
||||||
/* 35 */ (unsigned char *)
|
/* 35 */
|
||||||
"<table align=\"center\" width=\"75%\"><tr><td>\n"
|
"<table align=\"center\" width=\"75%\"><tr><td>\n"
|
||||||
"<h3>Welcome to 3proxy Web Interface</h3>\n"
|
"<h3>Welcome to 3proxy Web Interface</h3>\n"
|
||||||
"Probably you've noticed interface is very ugly currently.\n"
|
"Probably you've noticed interface is very ugly currently.\n"
|
||||||
|
@ -150,14 +150,14 @@ int
|
|||||||
|
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
#define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
|
#define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
|
||||||
#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
||||||
#define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
|
#define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
|
||||||
#define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
|
#define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
|
||||||
#define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
|
#define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
|
||||||
#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR, (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)))
|
#define SAISNULL(sa) (!memcmp(((struct sockaddr_in *)sa)->sin_family == AF_INET6? (char *)&((struct sockaddr_in6 *)sa)->sin6_addr : (char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr, NULLADDR, (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)))
|
||||||
#else
|
#else
|
||||||
#define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port)
|
#define SAPORT(sa) (&((struct sockaddr_in *)sa)->sin_port)
|
||||||
#define SAADDR(sa) ((unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
#define SAADDR(sa) ((char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
||||||
#define SAADDRLEN(sa) (4)
|
#define SAADDRLEN(sa) (4)
|
||||||
#define SASOCK(sa) (PF_INET)
|
#define SASOCK(sa) (PF_INET)
|
||||||
#define SASIZE(sa) (sizeof(struct sockaddr_in))
|
#define SASIZE(sa) (sizeof(struct sockaddr_in))
|
||||||
@ -199,7 +199,7 @@ struct LOGFUNC;
|
|||||||
struct LOGGER;
|
struct LOGGER;
|
||||||
typedef int (*AUTHFUNC)(struct clientparam * param);
|
typedef int (*AUTHFUNC)(struct clientparam * param);
|
||||||
typedef void * (*REDIRECTFUNC)(struct clientparam * param);
|
typedef void * (*REDIRECTFUNC)(struct clientparam * param);
|
||||||
typedef unsigned long (*RESOLVFUNC)(int af, unsigned char *name, unsigned char *value);
|
typedef unsigned long (*RESOLVFUNC)(int af, char *name, char *value);
|
||||||
typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout);
|
typedef unsigned (*BANDLIMFUNC)(struct clientparam * param, unsigned nbytesin, unsigned nbytesout);
|
||||||
typedef void (*TRAFCOUNTFUNC)(struct clientparam * param);
|
typedef void (*TRAFCOUNTFUNC)(struct clientparam * param);
|
||||||
typedef void * (*EXTENDFUNC) (struct node *node);
|
typedef void * (*EXTENDFUNC) (struct node *node);
|
||||||
@ -249,7 +249,7 @@ struct portlist {
|
|||||||
|
|
||||||
struct userlist {
|
struct userlist {
|
||||||
struct userlist * next;
|
struct userlist * next;
|
||||||
unsigned char * user;
|
char * user;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -263,8 +263,8 @@ typedef enum {
|
|||||||
|
|
||||||
struct passwords {
|
struct passwords {
|
||||||
struct passwords *next;
|
struct passwords *next;
|
||||||
unsigned char * user;
|
char * user;
|
||||||
unsigned char * password;
|
char * password;
|
||||||
int pwtype;
|
int pwtype;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -295,9 +295,9 @@ struct chain {
|
|||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
#endif
|
#endif
|
||||||
unsigned short weight;
|
unsigned short weight;
|
||||||
unsigned char * exthost;
|
char * exthost;
|
||||||
unsigned char * extuser;
|
char * extuser;
|
||||||
unsigned char * extpass;
|
char * extpass;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct period {
|
struct period {
|
||||||
@ -311,7 +311,7 @@ struct period {
|
|||||||
|
|
||||||
struct hostname {
|
struct hostname {
|
||||||
struct hostname *next;
|
struct hostname *next;
|
||||||
unsigned char * name;
|
char * name;
|
||||||
int matchtype;
|
int matchtype;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -375,7 +375,7 @@ struct trafcount {
|
|||||||
struct LOGFUNC {
|
struct LOGFUNC {
|
||||||
struct LOGFUNC* next;
|
struct LOGFUNC* next;
|
||||||
int (*init)(struct LOGGER *logger);
|
int (*init)(struct LOGGER *logger);
|
||||||
int (*dobuf)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s);
|
int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s);
|
||||||
void (*log)(const char * buf, int len, struct LOGGER *logger);
|
void (*log)(const char * buf, int len, struct LOGGER *logger);
|
||||||
void (*rotate)(struct LOGGER *logger);
|
void (*rotate)(struct LOGGER *logger);
|
||||||
void (*flush)(struct LOGGER *logger);
|
void (*flush)(struct LOGGER *logger);
|
||||||
@ -420,7 +420,7 @@ typedef enum {
|
|||||||
typedef void* FILTER_OPEN(void * idata, struct srvparam * param);
|
typedef void* FILTER_OPEN(void * idata, struct srvparam * param);
|
||||||
typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc);
|
typedef FILTER_ACTION FILTER_CLIENT(void *fo, struct clientparam * param, void** fc);
|
||||||
typedef FILTER_ACTION FILTER_PREDATA(void *fc, struct clientparam * param);
|
typedef FILTER_ACTION FILTER_PREDATA(void *fc, struct clientparam * param);
|
||||||
typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
typedef FILTER_ACTION FILTER_BUFFER(void *fc, struct clientparam * param, char ** buf_p, int * bufsize_p, int offset, int * length_p);
|
||||||
typedef void FILTER_CLOSE(void *fo);
|
typedef void FILTER_CLOSE(void *fo);
|
||||||
|
|
||||||
struct filter {
|
struct filter {
|
||||||
@ -487,7 +487,7 @@ struct srvparam {
|
|||||||
pthread_mutex_t counter_mutex;
|
pthread_mutex_t counter_mutex;
|
||||||
struct pollfd fds;
|
struct pollfd fds;
|
||||||
FILE *stdlog;
|
FILE *stdlog;
|
||||||
unsigned char * target;
|
char * target;
|
||||||
#ifdef SO_BINDTODEVICE
|
#ifdef SO_BINDTODEVICE
|
||||||
char * ibindtodevice;
|
char * ibindtodevice;
|
||||||
char * obindtodevice;
|
char * obindtodevice;
|
||||||
@ -497,12 +497,12 @@ struct srvparam {
|
|||||||
struct ace *preacl, *acl;
|
struct ace *preacl, *acl;
|
||||||
struct auth *authfuncs;
|
struct auth *authfuncs;
|
||||||
struct filter *filter;
|
struct filter *filter;
|
||||||
unsigned char * logtarget;
|
char * logtarget;
|
||||||
unsigned char * logformat;
|
char * logformat;
|
||||||
unsigned char * nonprintable;
|
char * nonprintable;
|
||||||
struct LOGGER *log;
|
struct LOGGER *log;
|
||||||
unsigned short targetport;
|
unsigned short targetport;
|
||||||
unsigned char replace;
|
char replace;
|
||||||
time_t time_start;
|
time_t time_start;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -553,7 +553,7 @@ struct clientparam {
|
|||||||
paused,
|
paused,
|
||||||
version;
|
version;
|
||||||
|
|
||||||
unsigned char *hostname,
|
char *hostname,
|
||||||
*username,
|
*username,
|
||||||
*password,
|
*password,
|
||||||
*extusername,
|
*extusername,
|
||||||
@ -610,7 +610,7 @@ struct extparam {
|
|||||||
demon, maxchild, needreload, timetoexit, version, noforce;
|
demon, maxchild, needreload, timetoexit, version, noforce;
|
||||||
int authcachetype, authcachetime;
|
int authcachetype, authcachetime;
|
||||||
int filtermaxsize;
|
int filtermaxsize;
|
||||||
unsigned char **archiver;
|
char **archiver;
|
||||||
ROTATION logtype, countertype;
|
ROTATION logtype, countertype;
|
||||||
char * counterfile;
|
char * counterfile;
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
@ -627,12 +627,12 @@ struct extparam {
|
|||||||
BANDLIMFUNC bandlimfunc;
|
BANDLIMFUNC bandlimfunc;
|
||||||
TRAFCOUNTFUNC trafcountfunc;
|
TRAFCOUNTFUNC trafcountfunc;
|
||||||
void (*prelog)(struct clientparam * param);
|
void (*prelog)(struct clientparam * param);
|
||||||
unsigned char *logtarget, *logformat;
|
char *logtarget, *logformat;
|
||||||
struct filemon * fmon;
|
struct filemon * fmon;
|
||||||
struct filter * filters;
|
struct filter * filters;
|
||||||
struct auth *authfuncs;
|
struct auth *authfuncs;
|
||||||
char* demanddialprog;
|
char* demanddialprog;
|
||||||
unsigned char **stringtable;
|
char **stringtable;
|
||||||
time_t time;
|
time_t time;
|
||||||
unsigned logdumpsrv, logdumpcli;
|
unsigned logdumpsrv, logdumpcli;
|
||||||
char delimchar;
|
char delimchar;
|
||||||
@ -670,7 +670,7 @@ struct dictionary {
|
|||||||
struct commands {
|
struct commands {
|
||||||
struct commands *next;
|
struct commands *next;
|
||||||
char * command;
|
char * command;
|
||||||
int (* handler)(int argc, unsigned char ** argv);
|
int (* handler)(int argc, char ** argv);
|
||||||
int minargs;
|
int minargs;
|
||||||
int maxargs;
|
int maxargs;
|
||||||
};
|
};
|
||||||
@ -694,11 +694,11 @@ extern struct proxydef childdef;
|
|||||||
|
|
||||||
struct child {
|
struct child {
|
||||||
int argc;
|
int argc;
|
||||||
unsigned char **argv;
|
char **argv;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hashentry {
|
struct hashentry {
|
||||||
unsigned char hash[sizeof(unsigned)*4];
|
char hash[sizeof(unsigned)*4];
|
||||||
time_t expires;
|
time_t expires;
|
||||||
struct hashentry *next;
|
struct hashentry *next;
|
||||||
char value[4];
|
char value[4];
|
||||||
@ -763,31 +763,31 @@ struct pluginlink {
|
|||||||
struct auth *authfuncs;
|
struct auth *authfuncs;
|
||||||
struct commands * commandhandlers;
|
struct commands * commandhandlers;
|
||||||
void * (*findbyname)(const char *name);
|
void * (*findbyname)(const char *name);
|
||||||
int (*socksend)(SOCKET sock, unsigned char * buf, int bufsize, int to);
|
int (*socksend)(SOCKET sock, char * buf, int bufsize, int to);
|
||||||
int (*socksendto)(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
int (*socksendto)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to);
|
||||||
int (*sockrecvfrom)(SOCKET sock, struct sockaddr * sin, unsigned char * buf, int bufsize, int to);
|
int (*sockrecvfrom)(SOCKET sock, struct sockaddr * sin, char * buf, int bufsize, int to);
|
||||||
int (*sockgetcharcli)(struct clientparam * param, int timeosec, int timeousec);
|
int (*sockgetcharcli)(struct clientparam * param, int timeosec, int timeousec);
|
||||||
int (*sockgetcharsrv)(struct clientparam * param, int timeosec, int timeousec);
|
int (*sockgetcharsrv)(struct clientparam * param, int timeosec, int timeousec);
|
||||||
int (*sockgetlinebuf)(struct clientparam * param, DIRECTION which, unsigned char * buf, int bufsize, int delim, int to);
|
int (*sockgetlinebuf)(struct clientparam * param, DIRECTION which, char * buf, int bufsize, int delim, int to);
|
||||||
int (*myinet_ntop)(int af, void *src, char *dst, socklen_t size);
|
int (*myinet_ntop)(int af, void *src, char *dst, socklen_t size);
|
||||||
int (*dobuf)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec);
|
int (*dobuf)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec);
|
||||||
int (*dobuf2)(struct clientparam * param, unsigned char * buf, int bufsize, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
|
int (*dobuf2)(struct clientparam * param, char * buf, int bufsize, const char *s, const char * doublec, struct tm* tm, char * format);
|
||||||
int (*scanaddr)(const unsigned char *s, unsigned long * ip, unsigned long * mask);
|
int (*scanaddr)(const char *s, unsigned long * ip, unsigned long * mask);
|
||||||
unsigned long (*getip46)(int family, unsigned char *name, struct sockaddr *sa);
|
unsigned long (*getip46)(int family, char *name, struct sockaddr *sa);
|
||||||
int (*sockmap)(struct clientparam * param, int timeo, int usesplice);
|
int (*sockmap)(struct clientparam * param, int timeo, int usesplice);
|
||||||
int (*ACLMatches)(struct ace* acentry, struct clientparam * param);
|
int (*ACLMatches)(struct ace* acentry, struct clientparam * param);
|
||||||
int (*alwaysauth)(struct clientparam * param);
|
int (*alwaysauth)(struct clientparam * param);
|
||||||
int (*checkACL)(struct clientparam * param);
|
int (*checkACL)(struct clientparam * param);
|
||||||
int (*checkpreACL)(struct clientparam * param);
|
int (*checkpreACL)(struct clientparam * param);
|
||||||
void (*nametohash)(const unsigned char * name, unsigned char *hash);
|
void (*nametohash)(const char * name, char *hash);
|
||||||
unsigned (*hashindex)(const unsigned char* hash);
|
unsigned (*hashindex)(const char* hash);
|
||||||
unsigned char* (*en64)(const unsigned char *in, unsigned char *out, int inlen);
|
char* (*en64)(const char *in, char *out, int inlen);
|
||||||
int (*de64)(const unsigned char *in, unsigned char *out, int maxlen);
|
int (*de64)(const char *in, char *out, int maxlen);
|
||||||
void (*tohex)(unsigned char *in, unsigned char *out, int len);
|
void (*tohex)(char *in, char *out, int len);
|
||||||
void (*fromhex)(unsigned char *in, unsigned char *out, int len);
|
void (*fromhex)(char *in, char *out, int len);
|
||||||
void (*decodeurl)(unsigned char *s, int allowcr);
|
void (*decodeurl)(char *s, int allowcr);
|
||||||
int (*parsestr) (unsigned char *str, unsigned char **argm, int nitems, unsigned char ** buff, int *inbuf, int *bufsize);
|
int (*parsestr) (char *str, char **argm, int nitems, char ** buff, int *inbuf, int *bufsize);
|
||||||
struct ace * (*make_ace) (int argc, unsigned char ** argv);
|
struct ace * (*make_ace) (int argc, char ** argv);
|
||||||
void * (*mallocfunc)(size_t size);
|
void * (*mallocfunc)(size_t size);
|
||||||
void (*freefunc)(void *ptr);
|
void (*freefunc)(void *ptr);
|
||||||
void *(*reallocfunc)(void *ptr, size_t size);
|
void *(*reallocfunc)(void *ptr, size_t size);
|
||||||
@ -804,11 +804,11 @@ struct pluginlink {
|
|||||||
int (*parseusername)(char *username, struct clientparam *param, int extpasswd);
|
int (*parseusername)(char *username, struct clientparam *param, int extpasswd);
|
||||||
int (*parseconnusername)(char *username, struct clientparam *param, int extpasswd, unsigned short port);
|
int (*parseconnusername)(char *username, struct clientparam *param, int extpasswd, unsigned short port);
|
||||||
struct sockfuncs *so;
|
struct sockfuncs *so;
|
||||||
unsigned char * (*dologname) (unsigned char *buf, int bufsize, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
|
char * (*dologname) (char *buf, int bufsize, char *name, const char *ext, ROTATION lt, time_t t);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct counter_header {
|
struct counter_header {
|
||||||
unsigned char sig[4];
|
char sig[4];
|
||||||
time_t updated;
|
time_t updated;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ struct udpmap {
|
|||||||
|
|
||||||
|
|
||||||
void * udppmchild(struct clientparam* param) {
|
void * udppmchild(struct clientparam* param) {
|
||||||
unsigned char *buf = NULL;
|
char *buf = NULL;
|
||||||
int res, i;
|
int res, i;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SASIZETYPE size;
|
SASIZETYPE size;
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
extern FILE *writable;
|
extern FILE *writable;
|
||||||
FILE * confopen();
|
FILE * confopen();
|
||||||
extern void decodeurl(unsigned char *s, int filter);
|
extern void decodeurl(char *s, int filter);
|
||||||
|
|
||||||
struct printparam {
|
struct printparam {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
@ -24,12 +24,12 @@ struct printparam {
|
|||||||
|
|
||||||
static void stdpr(struct printparam* pp, char *buf, int inbuf){
|
static void stdpr(struct printparam* pp, char *buf, int inbuf){
|
||||||
if((pp->inbuf + inbuf > 1024) || !buf) {
|
if((pp->inbuf + inbuf > 1024) || !buf) {
|
||||||
socksend(pp->cp->clisock, (unsigned char *)pp->buf, pp->inbuf, conf.timeouts[STRING_S]);
|
socksend(pp->cp->clisock, (char *)pp->buf, pp->inbuf, conf.timeouts[STRING_S]);
|
||||||
pp->inbuf = 0;
|
pp->inbuf = 0;
|
||||||
if(!buf) return;
|
if(!buf) return;
|
||||||
}
|
}
|
||||||
if(inbuf >= 1000){
|
if(inbuf >= 1000){
|
||||||
socksend(pp->cp->clisock, (unsigned char *)buf, inbuf, conf.timeouts[STRING_S]);
|
socksend(pp->cp->clisock, (char *)buf, inbuf, conf.timeouts[STRING_S]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
memcpy(pp->buf + pp->inbuf, buf, inbuf);
|
memcpy(pp->buf + pp->inbuf, buf, inbuf);
|
||||||
@ -353,7 +353,7 @@ void * adminchild(struct clientparam* param) {
|
|||||||
|
|
||||||
buf = myalloc(LINESIZE);
|
buf = myalloc(LINESIZE);
|
||||||
if(!buf) {RETURN(555);}
|
if(!buf) {RETURN(555);}
|
||||||
i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S]);
|
i = sockgetlinebuf(param, CLIENT, (char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S]);
|
||||||
if(i<5 || ((buf[0]!='G' || buf[1]!='E' || buf[2]!='T' || buf[3]!=' ' || buf[4]!='/') &&
|
if(i<5 || ((buf[0]!='G' || buf[1]!='E' || buf[2]!='T' || buf[3]!=' ' || buf[4]!='/') &&
|
||||||
(buf[0]!='P' || buf[1]!='O' || buf[2]!='S' || buf[3]!='T' || buf[4]!=' ' || buf[5]!='/')))
|
(buf[0]!='P' || buf[1]!='O' || buf[2]!='S' || buf[3]!='T' || buf[4]!=' ' || buf[5]!='/')))
|
||||||
{
|
{
|
||||||
@ -366,7 +366,7 @@ void * adminchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
*sb = 0;
|
*sb = 0;
|
||||||
req = mystrdup(buf + ((*buf == 'P')? 6 : 5));
|
req = mystrdup(buf + ((*buf == 'P')? 6 : 5));
|
||||||
while((i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){
|
while((i = sockgetlinebuf(param, CLIENT, (char *)buf, LINESIZE - 1, '\n', conf.timeouts[STRING_S])) > 2){
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if(i > 19 && (!strncasecmp(buf, "authorization", 13))){
|
if(i > 19 && (!strncasecmp(buf, "authorization", 13))){
|
||||||
sb = strchr(buf, ':');
|
sb = strchr(buf, ':');
|
||||||
@ -378,17 +378,17 @@ void * adminchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
sb+=5;
|
sb+=5;
|
||||||
while(isspace(*sb))sb++;
|
while(isspace(*sb))sb++;
|
||||||
i = de64((unsigned char *)sb, (unsigned char *)username, 255);
|
i = de64((char *)sb, (char *)username, 255);
|
||||||
if(i<=0)continue;
|
if(i<=0)continue;
|
||||||
username[i] = 0;
|
username[i] = 0;
|
||||||
sb = strchr((char *)username, ':');
|
sb = strchr((char *)username, ':');
|
||||||
if(sb){
|
if(sb){
|
||||||
*sb = 0;
|
*sb = 0;
|
||||||
if(param->password)myfree(param->password);
|
if(param->password)myfree(param->password);
|
||||||
param->password = (unsigned char *)mystrdup(sb+1);
|
param->password = (char *)mystrdup(sb+1);
|
||||||
}
|
}
|
||||||
if(param->username) myfree(param->username);
|
if(param->username) myfree(param->username);
|
||||||
param->username = (unsigned char *)mystrdup(username);
|
param->username = (char *)mystrdup(username);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if(i > 15 && (!strncasecmp(buf, "content-length:", 15))){
|
else if(i > 15 && (!strncasecmp(buf, "content-length:", 15))){
|
||||||
@ -542,14 +542,14 @@ void * adminchild(struct clientparam* param) {
|
|||||||
if(!writable || !contentlen || fseek(writable, 0, 0)){
|
if(!writable || !contentlen || fseek(writable, 0, 0)){
|
||||||
error = 1;
|
error = 1;
|
||||||
}
|
}
|
||||||
while(l < contentlen && (i = sockgetlinebuf(param, CLIENT, (unsigned char *)buf, (contentlen - l) > LINESIZE - 1?LINESIZE - 1:contentlen - l, '+', conf.timeouts[STRING_S])) > 0){
|
while(l < contentlen && (i = sockgetlinebuf(param, CLIENT, (char *)buf, (contentlen - l) > LINESIZE - 1?LINESIZE - 1:contentlen - l, '+', conf.timeouts[STRING_S])) > 0){
|
||||||
if(i > (contentlen - l)) i = (contentlen - l);
|
if(((unsigned)i) > (contentlen - l)) i = (int)(contentlen - l);
|
||||||
if(!l){
|
if(!l){
|
||||||
if(i<9 || strncasecmp(buf, "conffile=", 9)) error = 1;
|
if(i<9 || strncasecmp(buf, "conffile=", 9)) error = 1;
|
||||||
}
|
}
|
||||||
if(!error){
|
if(!error){
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
decodeurl((unsigned char *)buf, 1);
|
decodeurl((char *)buf, 1);
|
||||||
fprintf(writable, "%s", l? buf : buf + 9);
|
fprintf(writable, "%s", l? buf : buf + 9);
|
||||||
}
|
}
|
||||||
l += i;
|
l += i;
|
||||||
@ -576,7 +576,7 @@ CLEANRET:
|
|||||||
|
|
||||||
printstr(&pp, NULL);
|
printstr(&pp, NULL);
|
||||||
if(buf) myfree(buf);
|
if(buf) myfree(buf);
|
||||||
dolog(param, (unsigned char *)req);
|
dolog(param, req);
|
||||||
if(req)myfree(req);
|
if(req)myfree(req);
|
||||||
freeparam(param);
|
freeparam(param);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user