*** authenticate.c.ORIG Mon Jul 19 14:38:13 1999 --- authenticate.c Tue Jul 27 16:00:18 1999 *************** *** 35,45 **** #include "authenticate.h" #ifndef MAILSPOOLDIR ! #define MAILSPOOLDIR "/var/spool/mail/" /* watch the trailing / */ #endif #ifndef MAILSPOOLHASH ! #define MAILSPOOLHASH 0 /* 2 would deliver to /var/spool/mail/b/a/bar */ #endif /*#define MAILSPOOLHOME "/.mail" /* watch the leading / */ /* delivers to $HOME/.mail */ --- 35,63 ---- #include "authenticate.h" + #ifndef VIRTUALHOSTDB + #define VIRTUALHOSTDB "/var/local/cucipop/vpop.db" + #endif + + #ifndef VIRTUALUSER + #define VIRTUALUSER "pop" + #endif + + #ifdef VIRTUALSERVER + #include "sdb.h" + + char*auth_logname; + extern char*virtualdomain; + + const char virtualhostdb[]=VIRTUALHOSTDB, + virtualuser[]=VIRTUALUSER; + #endif /* VIRTUALSERVER */ + #ifndef MAILSPOOLDIR ! #define MAILSPOOLDIR "/var/pop/" /* watch the trailing / */ #endif #ifndef MAILSPOOLHASH ! #define MAILSPOOLHASH 2 /* 2 would deliver to /var/spool/mail/b/a/bar */ #endif /*#define MAILSPOOLHOME "/.mail" /* watch the leading / */ /* delivers to $HOME/.mail */ *************** *** 59,67 **** *str+='a'-'A'; /* cast it to lowercase */ } ! static const struct passwd*cgetpwnam(user,sock)const char*const user; const int sock; ! { return getpwnam(user); /* this should be selfexplanatory :-) */ } static const struct passwd*cgetpwuid(uid,sock)const uid_t uid;const int sock; --- 77,125 ---- *str+='a'-'A'; /* cast it to lowercase */ } ! #ifdef VIRTUALSERVER ! static void getlogname(user,sock)const char*user;const int sock; ! { ! int namelen;const char*retval=""; ! if(virtualdomain) ! retval=virtualdomain; ! if(auth_logname= /* memory leak when out of memory */ ! realloc(auth_logname,(namelen=strlen(retval))+1+strlen(user)+1)) ! { strcpy(auth_logname,retval)[namelen]='/'; ! strcpy(auth_logname+namelen+1,user); ! } ! } ! #endif /* VIRTUALSERVER */ ! ! static const struct passwd*cgetpwnam(user,sock)const char* user; const int sock; ! { ! #ifdef VIRTUALSERVER ! DB_ENV dbenv;DB*db; ! struct passwd*pw=0; ! memset(&dbenv,0,sizeof dbenv); ! if(!db_appinit(0,0,&dbenv,0)) ! { if(!db_open(virtualhostdb,DB_HASH,DB_RDONLY,0666,&dbenv,(void*)0,&db)) ! { getlogname(user,sock); ! if(auth_logname) ! { DBT k,d;int foundentry; ! memset(&k,0,sizeof k);memset(&d,0,sizeof d); ! k.size=strlen(k.data=auth_logname); ! if(foundentry=db->get(db,0,&k,&d,0)) ! { k.size=strlen(strcpy(auth_logname,user)); ! foundentry=db->get(db,0,&k,&d,0); /* fallback check */ ! } ! if(!foundentry&&(pw=getpwnam(virtualuser))) ! pw->pw_name=(char*)user; ! } ! db->close(db,0); ! } ! db_appexit(&dbenv); ! } ! return pw; ! #else ! return getpwnam(user); /* this should be selfexplanatory :-) */ ! #endif /* VIRTUALSERVER */ } static const struct passwd*cgetpwuid(uid,sock)const uid_t uid;const int sock; *************** *** 157,174 **** strcpy(pass->mbox+i,mailfile); #else { static const char mailspooldir[]=MAILSPOOLDIR; ! if(!(pass->mbox=malloc( ! STRLEN(mailspooldir)+MAILSPOOLHASH*2+strlen(pass->pw->pw_name)+1))) return ""; strcpy(pass->mbox,mailspooldir); ! ;{ char*p,*n;size_t i;int c; ! for(p=pass->mbox+STRLEN(mailspooldir),n=pass->pw->pw_name, i=MAILSPOOLHASH;i--;*p++='/') { if(*n) c= *n++; *p++=c; } ! strcpy(p,pass->pw->pw_name); } #endif /* MAILSPOOLHOME */ } --- 215,242 ---- strcpy(pass->mbox+i,mailfile); #else { static const char mailspooldir[]=MAILSPOOLDIR; ! #ifdef VIRTUALSERVER ! char*logname=auth_logname; ! #else ! char*logname=pass->pw->pw_name; ! #endif /* VIRTUALSERVER */ ! if(!logname||!(pass->mbox=malloc( ! STRLEN(mailspooldir)+MAILSPOOLHASH*2+strlen(logname)+1))) return ""; strcpy(pass->mbox,mailspooldir); ! strcat(pass->mbox,logname); ! ;{ char*p,*n,*u;size_t i;int c; ! if(u=strchr(logname,'/')) ! u++; ! else ! u=logname; ! for(p=strrchr(pass->mbox,'/')+1,n=u, i=MAILSPOOLHASH;i--;*p++='/') { if(*n) c= *n++; *p++=c; } ! strcpy(p,u); } #endif /* MAILSPOOLHOME */ } *** procmail.c.ORIG Mon Jul 19 15:22:15 1999 --- procmail.c Thu Jul 22 15:55:35 1999 *************** *** 59,64 **** --- 59,67 ---- char*themail,*thebody; /* the head and body of the mail */ uid_t uid; gid_t gid,sgid; + #ifdef VIRTUALSERVER + char*virtualdomain; + #endif /* VIRTUALSERVER */ static auth_identity*savepass(spass,uid)auth_identity*const spass; const uid_t uid; *************** *** 111,119 **** --- 114,124 ---- #ifdef USEflock elog(", flock()"); #endif + #ifndef VIRTUALSERVER elog("\nDefault rcfile:\t\t");elog(pmrc); elog("\nYour system mailbox:\t"); elog(auth_mailboxname(auth_finduid(getuid(),0))); + #endif elog(newline); return EXIT_SUCCESS; case HELPOPT1:case HELPOPT2:elog(pmusage);elog(PM_HELP); *************** *** 144,149 **** --- 149,157 ---- else if(chp2=(char*)argv[argc+1]) { argc++; setarg: *argv1=chp2;restargv=argv1;crestarg=1; + #ifdef VIRTUALSERVER + virtualdomain=strdup(*argv1); + #endif /* VIRTUALSERVER */ } else nlog("Missing argument\n");