/* $Id: bbsmail.c,v 1.3 2002/06/06 21:34:14 in2 Exp $ */ #define _BBS_UTIL_C_ #include "bbs.h" #define LOG_FILE (BBSHOME "/etc/mailog") #ifdef HMM_USE_ANTI_SPAM extern char *notitle[], *nofrom[], *nocont[]; #endif extern userec_t xuser; int mailalertuid(int tuid) { userinfo_t *uentp=NULL; if(tuid>0 && (uentp = (userinfo_t *)search_ulist(tuid)) ) uentp->mailalert=1; return 0; } void mailog(msg) char *msg; { FILE *fp; if ((fp = fopen(LOG_FILE, "a"))) { time_t now; struct tm *p; time(&now); p = localtime(&now); fprintf(fp, "%02d/%02d/%02d %02d:%02d:%02d %s\n", p->tm_year % 100, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, msg); fclose(fp); } } int mail2bbs(userid) char *userid; { int uid; fileheader_t mymail; char genbuf[256], title[80], sender[80], filename[80], *ip, *ptr; time_t tmp_time; struct stat st; FILE *fout; /* check if the userid is in our bbs now */ if (!(uid=getuser(userid)) ) { sprintf(genbuf, "BBS user <%s> not existed", userid); puts(genbuf); mailog(genbuf); return -1;//EX_NOUSER; } if(xuser.userlevel&PERM_NOOUTMAIL) return -1; sprintf(filename, BBSHOME "/home/%c/%s", userid[0], userid); if (stat(filename, &st) == -1) { if (mkdir(filename, 0755) == -1) { printf("mail box create error %s \n", filename); return -1; } } else if (!(st.st_mode & S_IFDIR)) { printf("mail box error\n"); return -1; } // printf("dir: %s\n", filename); /* allocate a file for the new mail */ stampfile(filename, &mymail); // printf("file: %s\n", filename); /* copy the stdin to the specified file */ /* parse header */ while (fgets(genbuf, 255, stdin)) { if (!strncmp(genbuf, "From", 4)) { if ((ip = strchr(genbuf, '<')) && (ptr = strrchr(ip, '>'))) { *ptr = '\0'; if (ip[-1] == ' ') ip[-1] = '\0'; ptr = (char *) strchr(genbuf, ' '); while (*ptr == ' ') ptr++; sprintf(sender, "%s (%s)", ip + 1, ptr); } else { strtok(genbuf, " \t\n\r"); ptr= strtok(NULL, " \t\n\r"); if(ptr) strcpy(sender, ptr); } continue; } if (!strncmp(genbuf, "Subject: ", 9)) { strcpy(title, genbuf + 9); continue; } if (genbuf[0] == '\n') break; } if ((ptr = strchr(sender, '\n'))) *ptr = '\0'; if ((ptr = strchr(title, '\n'))) *ptr = '\0'; if (strchr(sender, '@') == NULL) /* 由 local host 寄信 */ { strcat(sender, "@" MYHOSTNAME); } time(&tmp_time); #ifdef HMM_USE_ANTI_SPAM for (n = 0; notitle[n]; n++) if (strstr(title, notitle[n])) { sprintf(genbuf, "Title <%s> not accepted", title); puts(genbuf); mailog(genbuf); return -1; } for (n = 0; nofrom[n]; n++) if (strstr(sender, nofrom[n])) { sprintf(genbuf, "From <%s> not accepted", sender); puts(genbuf); mailog(genbuf); return -1; } #endif if ((fout = fopen(filename, "w")) == NULL) { printf("Cannot open %s\n", filename); return -1; } if (!title[0]) sprintf(title, "來自 %.64s", sender); title[TTLEN] = 0; fprintf(fout, "作者: %s\n標題: %s\n時間: %s\n", sender, title, ctime(&tmp_time)); while (fgets(genbuf, 255, stdin)) { #ifdef HMM_USE_ANTI_SPAM for (n = 0; nocont[n]; n++) if (strstr(genbuf, nocont[n])) { fclose(fout); unlink(filename); sprintf(genbuf, "Content <%s> not accepted", nocont[n]); puts(genbuf); mailog(genbuf); return -1; } #endif fputs(genbuf, fout); } fclose(fout); sprintf(genbuf, "%s => %s", sender, userid); mailog(genbuf); /* append the record to the MAIL control file */ strcpy(mymail.title, title); if (strtok(sender, " .@\t\n\r")) strcat(sender, "."); sender[IDLEN + 1] = '\0'; strcpy(mymail.owner, sender); sprintf(genbuf, BBSHOME "/home/%c/%s/.DIR", userid[0], userid); mailalertuid(uid); return append_record(genbuf, &mymail, sizeof(mymail)); } int main(int argc, char* argv[]) { char receiver[256]; /* argv[1] is userid in bbs */ if (argc < 2) { printf("Usage:\t%s \n", argv[0]); exit(-1); } (void) setgid(BBSGID); (void) setuid(BBSUID); if(passwd_mmap()) exit(-1); strcpy(receiver, argv[1]); strtok(receiver,"."); if (mail2bbs(receiver)) { /* eat mail queue */ while (fgets(receiver, sizeof(receiver), stdin)) ; } return 0; }