mirror of
https://github.com/3proxy/3proxy.git
synced 2025-05-18 18:32:46 +08:00
intermediate commit
This commit is contained in:
parent
eb829b062b
commit
a4f95462b3
48
src/3proxy.c
48
src/3proxy.c
@ -271,51 +271,6 @@ void cyclestep(void){
|
||||
}
|
||||
if(conf.logname) {
|
||||
if(timechanged(conf.logtime, conf.time, conf.logtype)) {
|
||||
if(conf.stdlog) conf.stdlog = freopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.time), "a", conf.stdlog);
|
||||
else conf.stdlog = fopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.time), "a");
|
||||
conf.logtime = conf.time;
|
||||
if(conf.logtype != NONE && conf.rotate) {
|
||||
int t;
|
||||
t = 1;
|
||||
switch(conf.logtype){
|
||||
case ANNUALLY:
|
||||
t = t * 12;
|
||||
case MONTHLY:
|
||||
t = t * 4;
|
||||
case WEEKLY:
|
||||
t = t * 7;
|
||||
case DAILY:
|
||||
t = t * 24;
|
||||
case HOURLY:
|
||||
t = t * 60;
|
||||
case MINUTELY:
|
||||
t = t * 60;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dologname (tmpbuf, conf.logname, (conf.archiver)?conf.archiver[1]:NULL, conf.logtype, (conf.logtime - t * conf.rotate));
|
||||
remove ((char *) tmpbuf);
|
||||
if(conf.archiver) {
|
||||
int i;
|
||||
*tmpbuf = 0;
|
||||
for(i = 2; i < conf.archiverc && strlen((char *)tmpbuf) < 512; i++){
|
||||
strcat((char *)tmpbuf, " ");
|
||||
if(!strcmp((char *)conf.archiver[i], "%A")){
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
dologname (tmpbuf + strlen((char *)tmpbuf), conf.logname, conf.archiver[1], conf.logtype, (conf.logtime - t));
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
}
|
||||
else if(!strcmp((char *)conf.archiver[i], "%F")){
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
dologname (tmpbuf+strlen((char *)tmpbuf), conf.logname, NULL, conf.logtype, (conf.logtime-t));
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
}
|
||||
else
|
||||
strcat((char *)tmpbuf, (char *)conf.archiver[i]);
|
||||
}
|
||||
system((char *)tmpbuf+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(conf.counterd >= 0 && conf.trafcounter) {
|
||||
@ -512,11 +467,10 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
|
||||
pthread_mutex_init(&hash_mutex, NULL);
|
||||
pthread_mutex_init(&tc_mutex, NULL);
|
||||
pthread_mutex_init(&pwl_mutex, NULL);
|
||||
pthread_mutex_init(&log_mutex, NULL);
|
||||
#ifndef NORADIUS
|
||||
pthread_mutex_init(&rad_mutex, NULL);
|
||||
#endif
|
||||
|
||||
initlog();
|
||||
freeconf(&conf);
|
||||
res = readconfig(fp);
|
||||
conf.version++;
|
||||
|
@ -26,50 +26,52 @@ ftp$(OBJSUFFICS): ftp.c proxy.h structures.h
|
||||
sockgetchar$(OBJSUFFICS): sockgetchar.c proxy.h structures.h
|
||||
$(CC) $(CFLAGS) sockgetchar.c
|
||||
|
||||
proxy$(OBJSUFFICS): proxy.c proxy.h structures.h proxymain.c
|
||||
proxy$(OBJSUFFICS): proxy.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP $(DEFINEOPTION)ANONYMOUS proxy.c
|
||||
|
||||
pop3p$(OBJSUFFICS): pop3p.c proxy.h structures.h proxymain.c
|
||||
pop3p$(OBJSUFFICS): pop3p.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP pop3p.c
|
||||
|
||||
smtpp$(OBJSUFFICS): smtpp.c proxy.h structures.h proxymain.c
|
||||
smtpp$(OBJSUFFICS): smtpp.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP smtpp.c
|
||||
|
||||
ftppr$(OBJSUFFICS): ftppr.c proxy.h structures.h proxymain.c
|
||||
ftppr$(OBJSUFFICS): ftppr.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP ftppr.c
|
||||
|
||||
tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c
|
||||
tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP tcppm.c
|
||||
|
||||
socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c
|
||||
socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP socks.c
|
||||
|
||||
udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c
|
||||
udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c log.c
|
||||
$(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP udppm.c
|
||||
|
||||
|
||||
|
||||
3proxy$(OBJSUFFICS): 3proxy.c proxy.h structures.h
|
||||
$(CC) $(CFLAGS) 3proxy.c
|
||||
|
||||
$(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
$(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
$(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
$(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
$(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
$(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
$(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
|
||||
$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS)
|
||||
$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
|
||||
|
||||
mainfunc$(OBJSUFFICS): proxy.h structures.h proxymain.c
|
||||
$(CC) $(COUT)mainfunc$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)MODULEMAINFUNC=mainfunc proxymain.c
|
||||
|
152
src/auth.c
152
src/auth.c
@ -1341,155 +1341,3 @@ unsigned long fakeresolver (int af, unsigned char *name, unsigned char * value){
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef NOODBC
|
||||
|
||||
SQLHENV henv = NULL;
|
||||
SQLHSTMT hstmt = NULL;
|
||||
SQLHDBC hdbc = NULL;
|
||||
char * sqlstring = NULL;
|
||||
|
||||
|
||||
void close_sql(){
|
||||
if(hstmt) {
|
||||
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
|
||||
hstmt = NULL;
|
||||
}
|
||||
if(hdbc){
|
||||
SQLDisconnect(hdbc);
|
||||
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
|
||||
hdbc = NULL;
|
||||
}
|
||||
if(henv) {
|
||||
SQLFreeHandle(SQL_HANDLE_ENV, henv);
|
||||
henv = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int attempt = 0;
|
||||
time_t attempt_time = 0;
|
||||
|
||||
int init_sql(char * s){
|
||||
SQLRETURN retcode;
|
||||
char * datasource;
|
||||
char * username;
|
||||
char * password;
|
||||
char * string;
|
||||
|
||||
if(!s) return 0;
|
||||
if(!sqlstring || strcmp(sqlstring, s)){
|
||||
string = sqlstring;
|
||||
sqlstring=mystrdup(s);
|
||||
if(string)myfree(string);
|
||||
}
|
||||
|
||||
if(hstmt || hdbc || henv) close_sql();
|
||||
attempt++;
|
||||
attempt_time = time(0);
|
||||
if(!henv){
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
|
||||
if (!henv || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)){
|
||||
henv = NULL;
|
||||
return 0;
|
||||
}
|
||||
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
|
||||
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if(!hdbc){
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
|
||||
if (!hdbc || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)) {
|
||||
hdbc = NULL;
|
||||
SQLFreeHandle(SQL_HANDLE_ENV, henv);
|
||||
henv = NULL;
|
||||
return 0;
|
||||
}
|
||||
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)15, 0);
|
||||
}
|
||||
string = mystrdup(sqlstring);
|
||||
if(!string) return 0;
|
||||
datasource = strtok(string, ",");
|
||||
username = strtok(NULL, ",");
|
||||
password = strtok(NULL, ",");
|
||||
|
||||
|
||||
/* Connect to data source */
|
||||
retcode = SQLConnect(hdbc, (SQLCHAR*) datasource, (SQLSMALLINT)strlen(datasource),
|
||||
(SQLCHAR*) username, (SQLSMALLINT)((username)?strlen(username):0),
|
||||
(SQLCHAR*) password, (SQLSMALLINT)((password)?strlen(password):0));
|
||||
|
||||
myfree(string);
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){
|
||||
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
|
||||
hdbc = NULL;
|
||||
SQLFreeHandle(SQL_HANDLE_ENV, henv);
|
||||
henv = NULL;
|
||||
return 0;
|
||||
}
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){
|
||||
close_sql();
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sqlerr (char *buf){
|
||||
if(conf.stdlog){
|
||||
fprintf(conf.stdlog, "%s\n", buf);
|
||||
fflush(conf.stdlog);
|
||||
}
|
||||
pthread_mutex_unlock(&log_mutex);
|
||||
}
|
||||
|
||||
unsigned char statbuf[8192];
|
||||
|
||||
void logsql(struct clientparam * param, const unsigned char *s) {
|
||||
SQLRETURN ret;
|
||||
int len;
|
||||
|
||||
|
||||
if(param->nolog) return;
|
||||
pthread_mutex_lock(&log_mutex);
|
||||
len = dobuf(param, statbuf, s, (unsigned char *)"\'");
|
||||
|
||||
if(attempt > 5){
|
||||
time_t t;
|
||||
|
||||
t = time(0);
|
||||
if (t - attempt_time < 180){
|
||||
sqlerr((char *)statbuf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(!hstmt){
|
||||
if(!init_sql(sqlstring)) {
|
||||
sqlerr((char *)statbuf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(hstmt){
|
||||
ret = SQLExecDirect(hstmt, (SQLCHAR *)statbuf, (SQLINTEGER)len);
|
||||
if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){
|
||||
close_sql();
|
||||
if(!init_sql(sqlstring)){
|
||||
sqlerr((char *)statbuf);
|
||||
return;
|
||||
}
|
||||
if(hstmt) {
|
||||
ret = SQLExecDirect(hstmt, (SQLCHAR *)statbuf, (SQLINTEGER)len);
|
||||
if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){
|
||||
sqlerr((char *)statbuf);
|
||||
return;
|
||||
}
|
||||
attempt = 0;
|
||||
}
|
||||
}
|
||||
attempt = 0;
|
||||
}
|
||||
pthread_mutex_unlock(&log_mutex);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -293,13 +293,14 @@ typedef struct radius_packet_t {
|
||||
uint8_t id;
|
||||
uint16_t length;
|
||||
uint8_t vector[AUTH_VECTOR_LEN];
|
||||
uint8_t data[4096];
|
||||
uint8_t data[2048];
|
||||
} radius_packet_t;
|
||||
|
||||
#define RETURN(xxx) { res = xxx; goto CLEANRET; }
|
||||
|
||||
int radsend(struct clientparam * param, int auth, int stop){
|
||||
#define packet (*(radius_packet_t *buf))
|
||||
|
||||
int radbuf(struct clientparam * param, unsigned char * buf, int auth, int stop){
|
||||
int loop;
|
||||
int id;
|
||||
int res = 4;
|
||||
@ -308,15 +309,7 @@ int radsend(struct clientparam * param, int auth, int stop){
|
||||
int total_length;
|
||||
int len;
|
||||
int op;
|
||||
#ifdef NOIPV6
|
||||
struct sockaddr_in saremote;
|
||||
#else
|
||||
struct sockaddr_in6 saremote;
|
||||
#endif
|
||||
struct pollfd fds[1];
|
||||
char vector[AUTH_VECTOR_LEN];
|
||||
radius_packet_t packet, rpacket;
|
||||
SASIZETYPE salen;
|
||||
int data_len;
|
||||
uint8_t *vendor_len;
|
||||
int count=0;
|
||||
@ -325,9 +318,8 @@ int radsend(struct clientparam * param, int auth, int stop){
|
||||
int vendorlen=0;
|
||||
char buf[64];
|
||||
|
||||
|
||||
if(!radiussecret || !nradservers) {
|
||||
return 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(&packet, 0, sizeof(packet));
|
||||
@ -526,6 +518,38 @@ int radsend(struct clientparam * param, int auth, int stop){
|
||||
md5_calc(packet.vector, (u_char *)&packet, total_length + len);
|
||||
}
|
||||
memcpy(vector, packet.vector, AUTH_VECTOR_LEN);
|
||||
return total_length;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int radsend(const char *buf, int total_length, int auth){
|
||||
|
||||
int loop;
|
||||
int id;
|
||||
int res = 4;
|
||||
SOCKET sockfd = -1;
|
||||
unsigned char *ptr;
|
||||
int len;
|
||||
int op;
|
||||
#ifdef NOIPV6
|
||||
struct sockaddr_in saremote;
|
||||
#else
|
||||
struct sockaddr_in6 saremote;
|
||||
#endif
|
||||
struct pollfd fds[1];
|
||||
char vector[AUTH_VECTOR_LEN];
|
||||
radius_packet_t packet, rpacket;
|
||||
SASIZETYPE salen;
|
||||
int data_len;
|
||||
uint8_t *vendor_len;
|
||||
int count=0;
|
||||
uint8_t *attr;
|
||||
long vendor=0;
|
||||
int vendorlen=0;
|
||||
char buf[64];
|
||||
|
||||
|
||||
|
||||
for (loop = 0; loop < nradservers && loop < MAXRADIUS; loop++) {
|
||||
SOCKET remsock;
|
||||
@ -656,14 +680,20 @@ CLEANRET:
|
||||
}
|
||||
|
||||
int radauth(struct clientparam * param){
|
||||
radius_packet_t packet;
|
||||
int len;
|
||||
/*radsend(param, 0, 0);*/
|
||||
return radsend(param, 1, 0);
|
||||
len = radbuf(param, buf, 1, 0);
|
||||
return len?radsend(buf, len, 1):4;
|
||||
}
|
||||
|
||||
void logradius(struct clientparam * param, const unsigned char *s) {
|
||||
radsend(param, 0, 1);
|
||||
if(param->trafcountfunc)(*param->trafcountfunc)(param);
|
||||
clearstat(param);
|
||||
|
||||
int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){
|
||||
return radbuf(param, buf, 0, 1);
|
||||
}
|
||||
|
||||
void logradius(const unsigned char *buf, int len, LOGGER *logger){
|
||||
if(len)radsend(buf, len, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -116,7 +116,6 @@ struct extparam conf = {
|
||||
NULL,
|
||||
NULL,
|
||||
doconnect,
|
||||
lognone,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL, NULL,
|
||||
|
@ -295,7 +295,7 @@ static int h_log(int argc, unsigned char ** argv){
|
||||
}
|
||||
if(argc > 1) {
|
||||
if(!strcmp((char *) argv[1], "/dev/null")) {
|
||||
conf.logfunc = lognone;
|
||||
conf.logfunc = NULL;
|
||||
return 0;
|
||||
}
|
||||
if(!notchanged) conf.logtarget = (unsigned char *)mystrdup((char *)argv[1]);
|
||||
@ -1780,7 +1780,7 @@ void freeconf(struct extparam *confp){
|
||||
logname = confp->logname;
|
||||
confp->logname = NULL;
|
||||
*/
|
||||
confp->logfunc = lognone;
|
||||
confp->logfunc = NULL;
|
||||
logformat = confp->logformat;
|
||||
confp->logformat = NULL;
|
||||
confp->rotate = 0;
|
||||
|
@ -523,7 +523,7 @@ static void * ef_server_childcount(struct node * node){
|
||||
}
|
||||
|
||||
static void * ef_server_log(struct node * node){
|
||||
if(((struct srvparam *)node->value) -> logfunc == lognone) return "none";
|
||||
if(((struct srvparam *)node->value) -> logfunc == NULL) return "none";
|
||||
#ifndef NORADIUS
|
||||
else if(((struct srvparam *)node->value) -> logfunc == logradius) return "radius";
|
||||
#endif
|
||||
|
@ -333,4 +333,5 @@ struct proxydef childdef = {
|
||||
" -hdefault_host[:port] - use this host and port as default if no host specified\n"
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
381
src/log.c
381
src/log.c
@ -6,9 +6,6 @@
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include "proxy.h"
|
||||
pthread_mutex_t log_mutex;
|
||||
int havelog = 0;
|
||||
@ -17,19 +14,95 @@ int havelog = 0;
|
||||
struct clientparam logparam;
|
||||
struct srvparam logsrv;
|
||||
|
||||
struct LOGGER;
|
||||
|
||||
void(*prelog)(struct clientparam * param) = NULL;
|
||||
|
||||
#ifdef WITHMAIN
|
||||
#define HAVERADIUS 0
|
||||
#define HAVESQL 0
|
||||
#else
|
||||
int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s);
|
||||
void logradius(const char * buf, int len, struct LOGGER *logger);
|
||||
#define HAVERADIUS 1
|
||||
|
||||
#ifndef NOODBC
|
||||
#undef HAVESQL
|
||||
#define HAVESQL 1
|
||||
static int sqlinit(const char * selector, int logtype, struct LOGGER *logger);
|
||||
static void sqllog(const char * buf, int len, struct LOGGER *logger);
|
||||
static void sqlrotate(struct LOGGER *logger);
|
||||
static void sqlclose(struct LOGGER *logger);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define HAVESYSLOG 0
|
||||
#else
|
||||
#define HAVESYSLOG 1
|
||||
static int sysloginit(const char * selector, int logtype, struct LOGGER *logger);
|
||||
static void logsyslog(const char * buf, int len, struct LOGGER *logger);
|
||||
static void syslogrotate(struct LOGGER *logger);
|
||||
static void syslogclose(struct LOGGER *logger);
|
||||
#endif
|
||||
|
||||
static int stdloginit(const char * selector, int logtype, struct LOGGER *logger);
|
||||
static void stdlog(const char * buf, int len, struct LOGGER *logger);
|
||||
static void stdlogrotate(struct LOGGER *logger);
|
||||
static void stdlogclose(struct LOGGER *logger);
|
||||
|
||||
|
||||
|
||||
struct LOGFUNC logfuncs = {
|
||||
#if HAVESYSLOG > 0
|
||||
{logfuncs+1+HAVESYSLOG, sysloginit, stddobuf, logsyslog, syslogrotate, syslogclose, "@"},
|
||||
#endif
|
||||
#if HAVERADIUS > 0
|
||||
{logfuncs+1+HAVESYSLOG+HAVERADIUS, NULL, raddobuf, logradius, NULL, NULL, "radius"},
|
||||
#endif
|
||||
#if HAVESQL > 0
|
||||
{logfuncs+1+HAVESYSLOG+HAVERADIUS+HAVESQL, sqlinit, sqldobuf, sqllog, sqlrotate, sqlclose, "&"},
|
||||
#endif
|
||||
{NULL, stdloginit, stddobuf, stdlog, stdlogrotate, stdlogclose, ""}
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct LOGGER *loggers = NULL;
|
||||
|
||||
struct stdlogdata{
|
||||
FILE *fp;
|
||||
} errld= {stderr};
|
||||
|
||||
struct LOGGER {
|
||||
char * selector;
|
||||
void * data;
|
||||
struct LOGFUNC *logfunc;
|
||||
int rotate;
|
||||
time_t rotated;
|
||||
int registered;
|
||||
} errlogger = {"errlogger", &errld, logfuncs+1+HAVESYSLOG+HAVERADIUS+HAVESQL, 0, 0, 1};
|
||||
|
||||
|
||||
void initlog(void){
|
||||
srvinit(&logsrv, &logparam);
|
||||
pthread_mutex_init(&log_mutex, NULL);
|
||||
}
|
||||
|
||||
void dolog(struct clientparam * param, const unsigned char *s){
|
||||
static int init = 0;
|
||||
|
||||
if(param)param->srv->logfunc(param, s);
|
||||
else {
|
||||
if(!init){
|
||||
srvinit(&logsrv, &logparam);
|
||||
init = 1;
|
||||
}
|
||||
logstdout(&logparam, s);
|
||||
/* TODO: dobuf */
|
||||
/* TODO: spooling */
|
||||
if(!param){
|
||||
stdlog(s, strlen(s), &stdlogger);
|
||||
}
|
||||
else if(!param->nolog && param->srv->logtarget){
|
||||
if(prelog)prelog(param);
|
||||
param->srv->logfunc(param, s);
|
||||
}
|
||||
if(param->trafcountfunc)(*param->trafcountfunc)(param);
|
||||
clearstat(param);
|
||||
}
|
||||
|
||||
|
||||
@ -318,37 +391,285 @@ int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *
|
||||
|
||||
time(&t);
|
||||
if(!param) return 0;
|
||||
if(param->trafcountfunc)(*param->trafcountfunc)(param);
|
||||
format = param->srv->logformat?(char *)param->srv->logformat : DEFLOGFORMAT;
|
||||
tm = (*format == 'G' || *format == 'g')?
|
||||
gmtime(&t) : localtime(&t);
|
||||
i = dobuf2(param, buf, s, doublec, tm, format + 1);
|
||||
clearstat(param);
|
||||
return i;
|
||||
}
|
||||
|
||||
void lognone(struct clientparam * param, const unsigned char *s) {
|
||||
if(param->trafcountfunc)(*param->trafcountfunc)(param);
|
||||
clearstat(param);
|
||||
|
||||
static int stdloginit(const char * selector, int logtype, struct LOGGER *logger){
|
||||
char tmpuf[1024];
|
||||
struct stdlogdata *lp;
|
||||
lp = myalloc(sizeof(struct stdlogdata));
|
||||
if(!lp) return 1;
|
||||
logger->data = lp;
|
||||
if(!selector || !*selector){
|
||||
logger-rotate = NONE;
|
||||
lp->fp = stdout;
|
||||
}
|
||||
else {
|
||||
logger->rotate = logtype;
|
||||
lp->fp = fopen((char *)dologname (tmpbuf, conf.logname, NULL, logtype, time(NULL)), "a");
|
||||
if(!lp->fp){
|
||||
myfree(lp);
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void logstdout(struct clientparam * param, const unsigned char *s) {
|
||||
FILE *log;
|
||||
unsigned char tmpbuf[8192];
|
||||
|
||||
dobuf(param, tmpbuf, s, NULL);
|
||||
log = param->srv->stdlog?param->srv->stdlog:conf.stdlog?conf.stdlog:stdout;
|
||||
if(!param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) {
|
||||
perror("printf()");
|
||||
};
|
||||
if(log != conf.stdlog)fflush(log);
|
||||
int stddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){
|
||||
return dobuf(param, buf, s, NULL);
|
||||
}
|
||||
#ifndef _WIN32
|
||||
void logsyslog(struct clientparam * param, const unsigned char *s) {
|
||||
|
||||
unsigned char tmpbuf[8192];
|
||||
dobuf(param, tmpbuf, s, NULL);
|
||||
if(!param->nolog)syslog(LOG_INFO, "%s", tmpbuf);
|
||||
void stdlog(struct clientparam * param, const unsigned char *s, struct LOGGER *logger) {
|
||||
FILE *log = (struct stdlogdata *)logger->data;
|
||||
|
||||
fprintf(log, "%s\n", buf);
|
||||
if(log == stdout || log == stderr)fflush(log);
|
||||
}
|
||||
|
||||
static void stdlogrotate(struct LOGGER *logger){
|
||||
char tmpuf[1024];
|
||||
struct stdlogdata *lp = (struct stdlogdata)logger->data;
|
||||
if(lp->fp) lp->fp = freopen((char *)dologname (tmpbuf, logger->selector, NULL, logger->rotate, conf.time), "a", lp->fp);
|
||||
else lp->fp = fopen((char *)dologname (tmpbuf, logger->selector, NULL, logger->rotate, conf.time), "a");
|
||||
conf.logtime = conf.time;
|
||||
if(logger->rotate) {
|
||||
int t;
|
||||
t = 1;
|
||||
switch(logger->rotate){
|
||||
case ANNUALLY:
|
||||
t = t * 12;
|
||||
case MONTHLY:
|
||||
t = t * 4;
|
||||
case WEEKLY:
|
||||
t = t * 7;
|
||||
case DAILY:
|
||||
t = t * 24;
|
||||
case HOURLY:
|
||||
t = t * 60;
|
||||
case MINUTELY:
|
||||
t = t * 60;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dologname (tmpbuf, logger->selector, (conf.archiver)?conf.archiver[1]:NULL, logger->rotate, (conf.logtime - t * conf.rotate));
|
||||
remove ((char *) tmpbuf);
|
||||
if(conf.archiver) {
|
||||
int i;
|
||||
*tmpbuf = 0;
|
||||
for(i = 2; i < conf.archiverc && strlen((char *)tmpbuf) < 512; i++){
|
||||
strcat((char *)tmpbuf, " ");
|
||||
if(!strcmp((char *)conf.archiver[i], "%A")){
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
dologname (tmpbuf + strlen((char *)tmpbuf), logger->selector, conf.archiver[1], logger->rotate, (conf.logtime - t));
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
}
|
||||
else if(!strcmp((char *)conf.archiver[i], "%F")){
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
dologname (tmpbuf+strlen((char *)tmpbuf), logger->selector, NULL, logger->rotate, (conf.logtime-t));
|
||||
strcat((char *)tmpbuf, "\"");
|
||||
}
|
||||
else
|
||||
strcat((char *)tmpbuf, (char *)conf.archiver[i]);
|
||||
}
|
||||
system((char *)tmpbuf+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void stdlogclose(struct LOGGER *logger){
|
||||
fclose(((struct stdlogdata *)logger->data)->fp);
|
||||
myfree(((struct stdlogdata *)logger->data)->fp);
|
||||
}
|
||||
|
||||
#if HAVESYSLOG > 0
|
||||
|
||||
static int sysloginit(const char * selector, int logtype, struct LOGGER *logger){
|
||||
openlog(selector+1, LOG_PID, LOG_DAEMON);
|
||||
logger->rotate = logtype;
|
||||
logger->data = NULL;
|
||||
}
|
||||
|
||||
static void logsyslog(const char * buf, int len, struct LOGGER *logger) {
|
||||
|
||||
syslog((param->res >= 90 && param->res<=99)?LOG_NOTICE:(param->res?LOG_WARNING:LOG_INFO), "%s", buf);
|
||||
}
|
||||
|
||||
static void syslogrotate(struct LOGGER *logger){
|
||||
closelog();
|
||||
openlog(logger->selector+1, LOG_PID, LOG_DAEMON);
|
||||
}
|
||||
|
||||
static void syslogclose(struct LOGGER *logger){
|
||||
closelog();
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#if HAVESQL > 0
|
||||
|
||||
struct sqldata {
|
||||
SQLHENV henv;
|
||||
SQLHSTMT hstmt;
|
||||
SQLHDBC hdbc;
|
||||
int attempt;
|
||||
time_t attempt_time;
|
||||
};
|
||||
|
||||
|
||||
|
||||
static int sqlinit(const char * selector, int logtype, struct LOGGER *logger);
|
||||
static void sqllog(struct clientparam * param, const unsigned char *s, LOGGER *logger);
|
||||
static void sqlrotate(struct LOGGER *logger);
|
||||
|
||||
|
||||
int sqlinit2(struct sqldata * sd, char * source){
|
||||
SQLRETURN retcode;
|
||||
char * datasource;
|
||||
char * username;
|
||||
char * password;
|
||||
char * string;
|
||||
int ret = 0;
|
||||
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sd->henv);
|
||||
if (!henv || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)){
|
||||
return 1;
|
||||
}
|
||||
retcode = SQLSetEnvAttr(sd->henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
|
||||
ret = 2;
|
||||
goto CLOSEENV:
|
||||
}
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &sd->hdbc);
|
||||
if (!sd->hdbc || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)) {
|
||||
ret = 3;
|
||||
goto CLOSEENV:
|
||||
}
|
||||
SQLSetConnectAttr(sd->hdbc, SQL_LOGIN_TIMEOUT, (void*)15, 0);
|
||||
|
||||
string = mystrdup(source);
|
||||
if(!string) goto CLOSEHDBC;
|
||||
datasource = strtok(string, ",");
|
||||
username = strtok(NULL, ",");
|
||||
password = strtok(NULL, ",");
|
||||
|
||||
|
||||
/* Connect to data source */
|
||||
retcode = SQLConnect(sd->hdbc, (SQLCHAR*) datasource, (SQLSMALLINT)strlen(datasource),
|
||||
(SQLCHAR*) username, (SQLSMALLINT)((username)?strlen(username):0),
|
||||
(SQLCHAR*) password, (SQLSMALLINT)((password)?strlen(password):0));
|
||||
|
||||
myfree(string);
|
||||
|
||||
|
||||
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){
|
||||
ret = 4;
|
||||
goto CLOSEHDBC;
|
||||
}
|
||||
|
||||
retcode = SQLAllocHandle(SQL_HANDLE_STMT, sd->hdbc, &sd->hstmt);
|
||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){
|
||||
sd->hstmt = 0;
|
||||
ret = 5;
|
||||
goto CLOSEHDBC;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
CLOSEHDBC:
|
||||
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
|
||||
sd->hdbc = 0;
|
||||
CLOSEENV:
|
||||
SQLFreeHandle(SQL_HANDLE_ENV, henv);
|
||||
sd->henv = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sqlinit(const char * selector, int logtype, struct LOGGER *logger){
|
||||
struct sqldata *sd;
|
||||
int res
|
||||
|
||||
logger->rotate = logtype;
|
||||
sd = (struct sqldata *)myalloc(sizeof(struct sqldata));
|
||||
memset(sd, 0, sizeof(struct sqldata));
|
||||
loger->data = sd;
|
||||
if(!(res = sqlinit2(sd, selector+1))) {
|
||||
myfree(sd);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
int sqldobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){
|
||||
return dobuf(param, buf, s, (unsigned char *)"\'");
|
||||
}
|
||||
|
||||
|
||||
static void sqllog(const char * buf, int len, struct LOGGER *logger){
|
||||
SQLRETURN ret;
|
||||
struct sqldata *sd = (struct sqldata *)logger->data;
|
||||
|
||||
|
||||
if(sd->attempt > 5){
|
||||
if (conf.time - sd->attempt_time < 180){
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(sd->attempt){
|
||||
sd->attempt++;
|
||||
sqlrotate(logger);
|
||||
|
||||
if(!sd->hstmt){
|
||||
sd->attempt_time=conf.time;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ret = SQLExecDirect(sd->hstmt, (SQLCHAR *)buf, (SQLINTEGER)len);
|
||||
if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){
|
||||
sqlrotate(logger);
|
||||
if(sd->hstmt) {
|
||||
ret = SQLExecDirect(hstmt, (SQLCHAR *)buf, (SQLINTEGER)len);
|
||||
if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){
|
||||
sd->attempt++;
|
||||
sd->attempt_time=conf.time;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
sd->attempt=0;
|
||||
}
|
||||
|
||||
static void sqlrotate(struct LOGGER *logger){
|
||||
struct sqldata * sd;
|
||||
sqlclose(logger);
|
||||
sd = (struct sqldata *)myalloc(sizeof(struct sqldata));
|
||||
memset(sd, 0, sizeof(struct sqldata));
|
||||
loger->data = sd;
|
||||
sqlinit2(sd, logger->selector+1)
|
||||
}
|
||||
|
||||
static void sqlclose(struct LOGGER *logger){
|
||||
struct sqldata *sd = (struct sqldata *)loger->data;
|
||||
if(sd->hstmt) {
|
||||
SQLFreeHandle(SQL_HANDLE_STMT, sd->hstmt);
|
||||
sd->hstmt = NULL;
|
||||
}
|
||||
if(sd->hdbc){
|
||||
SQLDisconnect(sd->hdbc);
|
||||
SQLFreeHandle(SQL_HANDLE_DBC, sd->hdbc);
|
||||
sd->hdbc = NULL;
|
||||
}
|
||||
if(sd->henv) {
|
||||
SQLFreeHandle(SQL_HANDLE_ENV, sd->henv);
|
||||
sd->henv = NULL;
|
||||
}
|
||||
myfree(sd);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
@ -73,7 +73,10 @@ struct symbol symbols[] = {
|
||||
{symbols+46, "decodeurl", (void *) decodeurl},
|
||||
{symbols+47, "parsestr", (void *) parsestr},
|
||||
{symbols+48, "make_ace", (void *) make_ace},
|
||||
{symbols+49, "freeacl", (void *) freeacl},
|
||||
{symbols+49, "freeacl", (void *) freeacl}
|
||||
{symbols+50, "dolog", (void *) dolog},
|
||||
{symbols+50, "logfuncs", (void *) logfuncs},
|
||||
{symbols+50, "prelog", (void *) prelog},
|
||||
{NULL, "", NULL}
|
||||
};
|
||||
|
||||
|
@ -22,6 +22,9 @@ static struct commands ldap_trafgroup_handler;
|
||||
static struct commands ldap_attrsgroup_handler;
|
||||
static struct commands ldap_dircount_handler;
|
||||
|
||||
static void (*dolog)(struct clientparam * param, const unsigned char *s);
|
||||
|
||||
|
||||
static char *attrs[] = { NULL, NULL};
|
||||
static char *ldap_group_attr;
|
||||
static char *ldap_access;
|
||||
@ -109,7 +112,7 @@ static int ldapfunc(struct clientparam *param)
|
||||
ld = ldap_init( ldap_serv, 389 );
|
||||
if ( ld == NULL )
|
||||
{
|
||||
param->srv->logfunc(param,"Error ldap_init: No init lib ldap");
|
||||
dolog(param,"Error ldap_init: No init lib ldap");
|
||||
/*ldap_perror( ld, "Error ldap_init" ); */
|
||||
return 7;
|
||||
}
|
||||
@ -133,7 +136,7 @@ static int ldapfunc(struct clientparam *param)
|
||||
|
||||
if ( rc != LDAP_SUCCESS )
|
||||
{
|
||||
param->srv->logfunc(param,"Error ldap_bind: No connect ldap catalog");
|
||||
dolog(param,"Error ldap_bind: No connect ldap catalog");
|
||||
ldap_unbind_s(ld);
|
||||
return 7;
|
||||
}
|
||||
@ -144,7 +147,7 @@ static int ldapfunc(struct clientparam *param)
|
||||
|
||||
if ( ld == NULL )
|
||||
{
|
||||
param->srv->logfunc(param,"Error ldap_init: No init lib ldap");
|
||||
dolog(param,"Error ldap_init: No init lib ldap");
|
||||
/*ldap_perror( ld, "Error ldap_init" ); */
|
||||
return 7;
|
||||
}
|
||||
@ -153,7 +156,7 @@ static int ldapfunc(struct clientparam *param)
|
||||
|
||||
if ( rc != LDAP_SUCCESS )
|
||||
{
|
||||
param->srv->logfunc(param, "Error ldap_bind: Not authorize in ldap\
|
||||
dolog(param, "Error ldap_bind: Not authorize in ldap\
|
||||
catalog, checked option \'ldapconnect\' ");
|
||||
ldap_unbind_s(ld);
|
||||
return 7;
|
||||
@ -472,6 +475,9 @@ PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink,
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
dolog=pluginlink->findbyname("dolog");
|
||||
|
||||
already_loaded = 1;
|
||||
|
||||
mypluginlink=pluginlink;
|
||||
|
@ -28,6 +28,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc;
|
||||
static void (*dolog)(struct clientparam * param, const unsigned char *s);
|
||||
|
||||
static struct pluginlink * pl;
|
||||
|
||||
@ -238,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);
|
||||
if ( ServerConn == NULL || ServerCert == NULL ) {
|
||||
param->res = 8011;
|
||||
param->srv->logfunc(param, (unsigned char *)"SSL handshake to server failed");
|
||||
if(ServerConn == NULL) param->srv->logfunc(param, (unsigned char *)"ServerConn is NULL");
|
||||
if(ServerCert == NULL) param->srv->logfunc(param, (unsigned char *)"ServerCert is NULL");
|
||||
if(errSSL)param->srv->logfunc(param, (unsigned char *)errSSL);
|
||||
dolog(param, (unsigned char *)"SSL handshake to server failed");
|
||||
if(ServerConn == NULL) dolog(param, (unsigned char *)"ServerConn is NULL");
|
||||
if(ServerCert == NULL) dolog(param, (unsigned char *)"ServerCert is NULL");
|
||||
if(errSSL)dolog(param, (unsigned char *)errSSL);
|
||||
return 1;
|
||||
}
|
||||
FakeCert = ssl_copy_cert(ServerCert);
|
||||
if ( FakeCert == NULL ) {
|
||||
param->res = 8012;
|
||||
_ssl_cert_free(ServerCert);
|
||||
param->srv->logfunc(param, (unsigned char *)"Failed to create certificate copy");
|
||||
dolog(param, (unsigned char *)"Failed to create certificate copy");
|
||||
ssl_conn_free(ServerConn);
|
||||
return 2;
|
||||
}
|
||||
ClientConn = ssl_handshake_to_client(param->clisock, FakeCert, &errSSL);
|
||||
if ( ClientConn == NULL ) {
|
||||
param->res = 8012;
|
||||
param->srv->logfunc(param, (unsigned char *)"Handshake to client failed");
|
||||
if(errSSL)param->srv->logfunc(param, (unsigned char *)errSSL);
|
||||
dolog(param, (unsigned char *)"Handshake to client failed");
|
||||
if(errSSL)dolog(param, (unsigned char *)errSSL);
|
||||
_ssl_cert_free(ServerCert);
|
||||
_ssl_cert_free(FakeCert);
|
||||
ssl_conn_free(ServerConn);
|
||||
@ -382,6 +383,8 @@ PLUGINAPI int PLUGINCALL ssl_plugin (struct pluginlink * pluginlink,
|
||||
int argc, char** argv){
|
||||
|
||||
pl = pluginlink;
|
||||
dolog=pluginlink->findbyname("dolog");
|
||||
|
||||
if(!ssl_loaded){
|
||||
ssl_loaded = 1;
|
||||
pthread_mutex_init(&ssl_mutex, NULL);
|
||||
|
@ -54,7 +54,6 @@ static FILTER_ACTION transparent_filter_client(void *fo, struct clientparam * pa
|
||||
}
|
||||
#else
|
||||
#error No SO_ORIGINAL_DST defined
|
||||
param->srv->logfunc(param, (unsigned char *)"transparent_plugin: No SO_ORIGINAL_DST defined");
|
||||
return REJECT;
|
||||
#endif
|
||||
#else
|
||||
|
@ -69,4 +69,5 @@ struct proxydef childdef = {
|
||||
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
@ -1141,4 +1141,5 @@ struct proxydef childdef = {
|
||||
"-a1 - anonymous proxy with random client IP spoofing\r\n"
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
14
src/proxy.h
14
src/proxy.h
@ -166,21 +166,10 @@ int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char *
|
||||
|
||||
|
||||
|
||||
|
||||
void initlog(void);
|
||||
void dolog(struct clientparam * param, const unsigned char *s);
|
||||
int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec);
|
||||
int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format);
|
||||
extern FILE * stdlog;
|
||||
void logstdout(struct clientparam * param, const unsigned char *s);
|
||||
void logsyslog(struct clientparam * param, const unsigned char *s);
|
||||
void lognone(struct clientparam * param, const unsigned char *s);
|
||||
void logradius(struct clientparam * param, const unsigned char *s);
|
||||
|
||||
#ifndef NOSQL
|
||||
void logsql(struct clientparam * param, const unsigned char *s);
|
||||
int init_sql(char * s);
|
||||
void close_sql();
|
||||
#endif
|
||||
int doconnect(struct clientparam * param);
|
||||
int alwaysauth(struct clientparam * param);
|
||||
int ipauth(struct clientparam * param);
|
||||
@ -203,7 +192,6 @@ int inithashtable(struct hashtable *hashtable, unsigned nhashsize);
|
||||
void freeparam(struct clientparam * param);
|
||||
void clearstat(struct clientparam * param);
|
||||
void dumpcounters(struct trafcount *tl, int counterd);
|
||||
|
||||
int startconnlims (struct clientparam *param);
|
||||
void stopconnlims (struct clientparam *param);
|
||||
|
||||
|
@ -288,7 +288,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
||||
}
|
||||
#else
|
||||
srv.needuser = 0;
|
||||
pthread_mutex_init(&log_mutex, NULL);
|
||||
initlog();
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
@ -313,7 +313,6 @@ int MODULEMAINFUNC (int argc, char** argv){
|
||||
break;
|
||||
#endif
|
||||
case 'l':
|
||||
srv.logfunc = logstdout;
|
||||
if(srv.logtarget) myfree(srv.logtarget);
|
||||
srv.logtarget = (unsigned char *)mystrdup(argv[i] + 2);
|
||||
if(argv[i][2]) {
|
||||
@ -867,7 +866,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
|
||||
memset(srv, 0, sizeof(struct srvparam));
|
||||
srv->version = conf.version + 1;
|
||||
srv->paused = conf.paused;
|
||||
srv->logfunc = havelog?conf.logfunc:lognone;
|
||||
srv->logfunc = havelog?conf.logfunc:NULL;
|
||||
srv->noforce = conf.noforce;
|
||||
srv->logformat = conf.logformat? (unsigned char *)mystrdup((char *)conf.logformat) : NULL;
|
||||
srv->authfunc = conf.authfunc;
|
||||
@ -963,6 +962,24 @@ void srvfree(struct srvparam * srv){
|
||||
|
||||
void freeparam(struct clientparam * param) {
|
||||
if(param->res == 2) return;
|
||||
if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
|
||||
so._shutdown(param->ctrlsocksrv, SHUT_RDWR);
|
||||
so._closesocket(param->ctrlsocksrv);
|
||||
}
|
||||
if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) {
|
||||
so._shutdown(param->ctrlsock, SHUT_RDWR);
|
||||
so._closesocket(param->ctrlsock);
|
||||
}
|
||||
if(param->remsock != INVALID_SOCKET) {
|
||||
so._shutdown(param->remsock, SHUT_RDWR);
|
||||
so._closesocket(param->remsock);
|
||||
}
|
||||
if(param->clisock != INVALID_SOCKET) {
|
||||
so._shutdown(param->clisock, SHUT_RDWR);
|
||||
so._closesocket(param->clisock);
|
||||
}
|
||||
myfree(param->clibuf);
|
||||
myfree(param->srvbuf);
|
||||
if(param->datfilterssrv) myfree(param->datfilterssrv);
|
||||
#ifndef STDMAIN
|
||||
if(param->reqfilters) myfree(param->reqfilters);
|
||||
@ -979,8 +996,6 @@ void freeparam(struct clientparam * param) {
|
||||
}
|
||||
if(conf.connlimiter && (param->res != 95 || param->remsock != INVALID_SOCKET)) stopconnlims(param);
|
||||
#endif
|
||||
if(param->clibuf) myfree(param->clibuf);
|
||||
if(param->srvbuf) myfree(param->srvbuf);
|
||||
if(param->srv){
|
||||
pthread_mutex_lock(¶m->srv->counter_mutex);
|
||||
if(param->prev){
|
||||
@ -999,22 +1014,6 @@ void freeparam(struct clientparam * param) {
|
||||
if(param->password) myfree(param->password);
|
||||
if(param->extusername) myfree(param->extusername);
|
||||
if(param->extpassword) myfree(param->extpassword);
|
||||
if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) {
|
||||
so._shutdown(param->ctrlsocksrv, SHUT_RDWR);
|
||||
so._closesocket(param->ctrlsocksrv);
|
||||
}
|
||||
if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) {
|
||||
so._shutdown(param->ctrlsock, SHUT_RDWR);
|
||||
so._closesocket(param->ctrlsock);
|
||||
}
|
||||
if(param->remsock != INVALID_SOCKET) {
|
||||
so._shutdown(param->remsock, SHUT_RDWR);
|
||||
so._closesocket(param->remsock);
|
||||
}
|
||||
if(param->clisock != INVALID_SOCKET) {
|
||||
so._shutdown(param->clisock, SHUT_RDWR);
|
||||
so._closesocket(param->clisock);
|
||||
}
|
||||
myfree(param);
|
||||
}
|
||||
|
||||
|
@ -313,4 +313,5 @@ struct proxydef childdef = {
|
||||
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
@ -464,4 +464,5 @@ struct proxydef childdef = {
|
||||
"-N(EXTERNAL_IP) External NAT address to report to client for BIND\n"
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
@ -188,8 +188,7 @@ struct node;
|
||||
struct symbol;
|
||||
struct pluginlink;
|
||||
struct srvparam;
|
||||
|
||||
typedef void (*LOGFUNC)(struct clientparam * param, const unsigned char *);
|
||||
struct LOGFUNC;
|
||||
typedef int (*AUTHFUNC)(struct clientparam * param);
|
||||
typedef void * (*REDIRECTFUNC)(struct clientparam * param);
|
||||
typedef unsigned long (*RESOLVFUNC)(int af, unsigned char *name, unsigned char *value);
|
||||
@ -364,6 +363,24 @@ struct trafcount {
|
||||
time_t updated;
|
||||
};
|
||||
|
||||
struct LOGFUNC {
|
||||
struct LOGFUNC* next;
|
||||
int (*init)(const char * selector, int logtype, struct LOGGER *logger);
|
||||
int (*dobuf)(struct clientparam * param, unsigned char * buf, const unsigned char *s);
|
||||
int (*log)(const char * buf, int len, struct LOGGER *logger);
|
||||
int (*rotate)(struct LOGGER *logger);
|
||||
int (*close)(struct LOGGER *logger);
|
||||
char* prefix;
|
||||
};
|
||||
struct LOGGER {
|
||||
char * selector;
|
||||
void * data;
|
||||
struct LOGFUNC *logfunc;
|
||||
int rotate;
|
||||
time_t rotated;
|
||||
};
|
||||
extern struct LOGFUNC logfuncs;
|
||||
extern void(*prelog)(struct clientparam * param);
|
||||
struct nserver {
|
||||
#ifndef NOIPV6
|
||||
struct sockaddr_in6 addr;
|
||||
@ -418,7 +435,6 @@ struct srvparam {
|
||||
struct srvparam *prev;
|
||||
struct clientparam *child;
|
||||
PROXYSERVICE service;
|
||||
LOGFUNC logfunc;
|
||||
AUTHFUNC authfunc;
|
||||
PROXYFUNC pf;
|
||||
SOCKET srvsock, cbsock;
|
||||
@ -589,7 +605,6 @@ struct extparam {
|
||||
struct passwords *pwl;
|
||||
struct auth * authenticate;
|
||||
AUTHFUNC authfunc;
|
||||
LOGFUNC logfunc;
|
||||
BANDLIMFUNC bandlimfunc;
|
||||
TRAFCOUNTFUNC trafcountfunc;
|
||||
unsigned char *logtarget, *logformat;
|
||||
|
@ -37,4 +37,5 @@ struct proxydef childdef = {
|
||||
""
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
@ -116,4 +116,5 @@ struct proxydef childdef = {
|
||||
" -s single packet UDP service for request/reply (DNS-like) services\n"
|
||||
};
|
||||
#include "proxymain.c"
|
||||
#include "log.c"
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user