*** src/ipopd/ipop3d.c.orig Tue May 22 01:23:47 2007 --- src/ipopd/ipop3d.c Mon Jul 23 17:46:53 2007 *************** *** 36,41 **** --- 36,46 ---- #include #include "c-client.h" + #ifdef DRAC_AUTH + #include + #include + #include + #endif /* DRAC_AUTH */ #define CRLF PSOUT ("\015\012") /* primary output terpri */ *************** *** 65,70 **** --- 70,81 ---- /* Global storage */ + #ifdef DRAC_AUTH + #define DRACTIMEOUT 10*60 /* check every 10 minutes */ + time_t lastdrac = 0; /* time of last drac check */ + extern char *getenv (); + #endif /* DRAC_AUTH */ + char *version = "98"; /* edit number of this server */ short state = AUTHORIZATION; /* server state */ short critical = NIL; /* non-zero if in critical code */ *************** *** 98,104 **** int mbxopen (char *mailbox); long blat (char *text,long lines,unsigned long size,STRING *st); void rset (); ! /* Main program */ int main (int argc,char *argv[]) --- 109,161 ---- int mbxopen (char *mailbox); long blat (char *text,long lines,unsigned long size,STRING *st); void rset (); ! #ifdef DRAC_AUTH ! void drac_auth(); ! #endif /* DRAC_AUTH */ ! ! #ifdef DRAC_AUTH ! /* DRAC Authorization ! */ ! void drac_auth () ! { ! if (time (0) > lastdrac + DRACTIMEOUT) ! { ! FILE *dracconf; ! char host[100]; ! char *drachost; ! char *err; ! char *p; ! ! if ( (dracconf = fopen(ETC_DIR "/dracd.host", "r")) == NULL) ! { ! syslog (LOG_INFO, "dracd: error opening %s/dracd.host config file",ETC_DIR); ! exit(1); ! } ! ! fgets(host, 100, dracconf); ! p = strchr(host, '\n'); ! if(p != NULL) ! *p = '\0'; ! fclose(dracconf); ! ! if( drachost = (host) ) ! { ! struct sockaddr_in sin; ! int sinlen = sizeof (struct sockaddr_in); ! char *client = getpeername (0,(struct sockaddr *) &sin,(void *) &sinlen) ? ! "UNKNOWN" : inet_ntoa (sin.sin_addr); ! ! lastdrac = time(0); ! ! if (dracauth(drachost, inet_addr(client), &err) != 0) ! syslog (LOG_INFO, err); ! else ! syslog (LOG_INFO, "dracd: authorized ip %s", client); ! } ! } ! } ! #endif /* DRAC_AUTH */ ! /* Main program */ int main (int argc,char *argv[]) *************** *** 111,117 **** (((s = strrchr (argv[0],'/')) || (s = strrchr (argv[0],'\\'))) ? s+1 : argv[0]) : "ipop3d"; /* set service name before linkage */ ! mail_parameters (NIL,SET_SERVICENAME,(void *) "pop"); #include "linkage.c" /* initialize server */ server_init (pgmname,"pop3","pop3s",clkint,kodint,hupint,trmint); --- 168,174 ---- (((s = strrchr (argv[0],'/')) || (s = strrchr (argv[0],'\\'))) ? s+1 : argv[0]) : "ipop3d"; /* set service name before linkage */ ! mail_parameters (NIL,SET_SERVICENAME,(void *) "pop3"); #include "linkage.c" /* initialize server */ server_init (pgmname,"pop3","pop3s",clkint,kodint,hupint,trmint); *************** *** 215,223 **** syslog (LOG_INFO,"AUTHENTICATE %s failure host=%.80s",s, tcp_clienthost ()); } ! else if ((state = mbxopen ("INBOX")) == TRANSACTION) syslog (LOG_INFO,"Auth user=%.80s host=%.80s nmsgs=%ld/%ld", user,tcp_clienthost (),nmsgs,stream->nmsgs); else syslog (LOG_INFO,"Auth user=%.80s host=%.80s no mailbox", user,tcp_clienthost ()); } --- 272,284 ---- syslog (LOG_INFO,"AUTHENTICATE %s failure host=%.80s",s, tcp_clienthost ()); } ! else if ((state = mbxopen ("INBOX")) == TRANSACTION) { ! #ifdef DRAC_AUTH ! drac_auth(); ! #endif /* DRAC_AUTH */ syslog (LOG_INFO,"Auth user=%.80s host=%.80s nmsgs=%ld/%ld", user,tcp_clienthost (),nmsgs,stream->nmsgs); + } else syslog (LOG_INFO,"Auth user=%.80s host=%.80s no mailbox", user,tcp_clienthost ()); } *************** *** 247,255 **** PSOUT ("-ERR Missing APOP argument\015\012"); else if (!(user = apop_login (challenge,s,t,argc,argv))) PSOUT ("-ERR Bad APOP\015\012"); ! else if ((state = mbxopen ("INBOX")) == TRANSACTION) syslog (LOG_INFO,"APOP user=%.80s host=%.80s nmsgs=%ld/%ld", user,tcp_clienthost (),nmsgs,stream->nmsgs); else syslog (LOG_INFO,"APOP user=%.80s host=%.80s no mailbox", user,tcp_clienthost ()); } --- 308,320 ---- PSOUT ("-ERR Missing APOP argument\015\012"); else if (!(user = apop_login (challenge,s,t,argc,argv))) PSOUT ("-ERR Bad APOP\015\012"); ! else if ((state = mbxopen ("INBOX")) == TRANSACTION) { ! #ifdef DRAC_AUTH ! drac_auth(); ! #endif /* DRAC_AUTH */ syslog (LOG_INFO,"APOP user=%.80s host=%.80s nmsgs=%ld/%ld", user,tcp_clienthost (),nmsgs,stream->nmsgs); + } else syslog (LOG_INFO,"APOP user=%.80s host=%.80s no mailbox", user,tcp_clienthost ()); } *************** *** 609,614 **** --- 674,682 ---- /* attempt the login */ if (server_login (user,pass,t,argc,argv)) { int ret = mbxopen ("INBOX"); + #ifdef DRAC_AUTH + drac_auth(); + #endif /* DRAC_AUTH */ if (ret == TRANSACTION) /* mailbox opened OK? */ syslog (LOG_INFO,"%sLogin user=%.80s host=%.80s nmsgs=%ld/%ld", t ? "Admin " : "",user,tcp_clienthost (),nmsgs,stream->nmsgs);