--- sbbs/src/sbbs3/un_qwk.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/un_qwk.cpp 2018/04/24 16:43:37 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet QWK unpacking routine */ -/* $Id: un_qwk.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: un_qwk.cpp,v 1.1.1.2 2018/04/24 16:43:37 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2010 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -45,12 +45,11 @@ bool sbbs_t::unpack_qwk(char *packet,uin { char str[MAX_PATH+1],fname[MAX_PATH+1]; char tmp[512]; - char from[26]; - char to[26]; char inbox[MAX_PATH+1]; uchar block[QWK_BLOCK_LEN]; int k,file; uint i,j,n,lastsub=INVALID_SUB; + uint usernum; uint blocks; long l,size,misc; ulong t; @@ -61,37 +60,65 @@ bool sbbs_t::unpack_qwk(char *packet,uin DIR* dir; DIRENT* dirent; FILE* qwk; - BOOL twit_list; + FILE* fp; + smbmsg_t msg; + str_list_t headers=NULL; + str_list_t ip_can=NULL; + str_list_t host_can=NULL; + str_list_t subject_can=NULL; + str_list_t twit_list=NULL; + const char* hostname; - sprintf(fname,"%stwitlist.cfg",cfg.ctrl_dir); - twit_list=fexist(fname); + memset(&msg,0,sizeof(msg)); start=time(NULL); - if((l=flength(packet))<1) { + if((l=(long)flength(packet))<1) { errormsg(WHERE,ERR_LEN,packet,l); return(false); } + delfiles(cfg.temp_dir,ALLFILES); i=external(cmdstr(cfg.qhub[hubnum]->unpack,packet,ALLFILES,NULL),EX_OFFLINE); if(i) { errormsg(WHERE,ERR_EXEC,cmdstr(cfg.qhub[hubnum]->unpack,packet,ALLFILES,NULL),i); return(false); } - sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir); + SAFEPRINTF(str,"%sMESSAGES.DAT",cfg.temp_dir); if(!fexistcase(str)) { - sprintf(str,"%s doesn't contain MESSAGES.DAT (%s)",packet,str); - errorlog(str); + lprintf(LOG_WARNING,"%s doesn't contain MESSAGES.DAT (%s)",packet,str); return(false); } if((qwk=fnopen(&file,str,O_RDONLY))==NULL) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); return(false); } - size=filelength(file); + size=(long)filelength(file); + + SAFEPRINTF(str,"%sHEADERS.DAT",cfg.temp_dir); + if(fexistcase(str)) { + if((fp=fopen(str,"r")) == NULL) + errormsg(WHERE,ERR_OPEN,str,O_RDONLY); + else { + headers=iniReadFile(fp); + fclose(fp); + } + remove(str); + } + /********************/ /* Process messages */ /********************/ eprintf(LOG_INFO,"Importing QWK Network Packet: %s",packet); + ip_can=trashcan_list(&cfg,"ip"); + host_can=trashcan_list(&cfg,"host"); + subject_can=trashcan_list(&cfg,"subject"); + + SAFEPRINTF(fname,"%stwitlist.cfg",cfg.ctrl_dir); + if((fp=fopen(fname,"r"))!=NULL) { + twit_list=strListReadFile(fp,NULL,128); + fclose(fp); + } + for(l=QWK_BLOCK_LEN;l cfg.max_qwkmsgage) { + eprintf(LOG_NOTICE,"!Filtering QWK message from %s due to age: %u days" + ,msg.from + ,(now-msg.hdr.when_written.time)/(24*60*60)); + logline(LOG_NOTICE,"P!",str); + continue; + } + + if(findstr_in_list(msg.from_ip,ip_can)) { + eprintf(LOG_NOTICE,"!Filtering QWK message from %s due to blocked IP: %s" + ,msg.from + ,msg.from_ip); + continue; + } + + hostname=getHostNameByAddr(msg.from_host); + if(findstr_in_list(hostname,host_can)) { + eprintf(LOG_NOTICE,"!Filtering QWK message from %s due to blocked hostname: %s" + ,msg.from + ,hostname); + continue; + } + + if(findstr_in_list(msg.subj,subject_can)) { + eprintf(LOG_NOTICE,"!Filtering QWK message from %s due to filtered subject: %s" + ,msg.from + ,msg.subj); + continue; + } + if(!n) { /* NETMAIL */ - sprintf(str,"%25.25s",block+21); - truncsp(str); - eprintf(LOG_INFO,"NetMail from %s to %s", cfg.qhub[hubnum]->id, str); - if(!stricmp(str,"NETMAIL")) { /* QWK to FidoNet NetMail */ + eprintf(LOG_INFO,"QWK NetMail from %s to %s", cfg.qhub[hubnum]->id, msg.to); + if(!stricmp(msg.to,"NETMAIL")) { /* QWK to FidoNet NetMail */ qwktonetmail(qwk,(char *)block,NULL,hubnum+1); continue; } - if(strchr(str,'@')) { - qwktonetmail(qwk,(char *)block,str,hubnum+1); + if(strchr(msg.to,'@')) { + qwktonetmail(qwk,(char *)block,msg.to,hubnum+1); continue; } - j=atoi(str); - if(j && j>lastuser(&cfg)) - j=0; - if(!j) - j=matchuser(&cfg,str,TRUE /* sysop_alias */); - if(!j) { - eprintf(LOG_NOTICE,"!NetMail from %s to UNKNOWN USER: %s", cfg.qhub[hubnum]->id, str); + usernum=atoi(msg.to); + if(usernum && usernum>lastuser(&cfg)) + usernum=0; + if(!usernum) + usernum=matchuser(&cfg,msg.to,TRUE /* sysop_alias */); + if(!usernum) { + eprintf(LOG_NOTICE,"!QWK NetMail from %s to UNKNOWN USER: %s", cfg.qhub[hubnum]->id, msg.to); continue; } - getuserrec(&cfg,j,U_MISC,8,str); + getuserrec(&cfg,usernum,U_MISC,8,str); misc=ahtoul(str); if(misc&NETMAIL && cfg.sys_misc&SM_FWDTONET) { - getuserrec(&cfg,j,U_NETMAIL,LEN_NETMAIL,str); + getuserrec(&cfg,usernum,U_NETMAIL,LEN_NETMAIL,str); qwktonetmail(qwk,(char*)block,str,hubnum+1); continue; } @@ -164,29 +222,27 @@ bool sbbs_t::unpack_qwk(char *packet,uin smb.status.attr=SMB_EMAIL; if((k=smb_create(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_CREATE,smb.file,k); + errormsg(WHERE,ERR_CREATE,smb.file,k,smb.last_error); smb_stack(&smb,SMB_STACK_POP); continue; } } if((k=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,k); + errormsg(WHERE,ERR_LOCK,smb.file,k,smb.last_error); smb_stack(&smb,SMB_STACK_POP); continue; } if((k=smb_getstatus(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,k); + errormsg(WHERE,ERR_READ,smb.file,k,smb.last_error); smb_stack(&smb,SMB_STACK_POP); continue; } smb_unlocksmbhdr(&smb); - if(qwktomsg(qwk,(char *)block,hubnum+1,INVALID_SUB,j)) { - sprintf(tmp,"%-25.25s",block+46); - truncsp(tmp); - sprintf(str,text[UserSentYouMail],tmp); - putsmsg(&cfg,j,str); + if(qwk_import_msg(qwk,(char *)block,blocks,hubnum+1,INVALID_SUB,usernum,&msg)) { + SAFEPRINTF(str,text[UserSentYouMail],msg.from); + putsmsg(&cfg,usernum,str); tmsgs++; } smb_close(&smb); @@ -198,7 +254,7 @@ bool sbbs_t::unpack_qwk(char *packet,uin if(cfg.qhub[hubnum]->conf[j]==n) break; if(j>=cfg.qhub[hubnum]->subs) { /* ignore messages for subs not in config */ - eprintf(LOG_NOTICE,"!Message from %s on UNKNOWN CONFERENCE NUMBER: %u" + eprintf(LOG_NOTICE,"!Message from %s on UNKNOWN QWK CONFERENCE NUMBER: %u" ,cfg.qhub[hubnum]->id, n); continue; } @@ -206,21 +262,12 @@ bool sbbs_t::unpack_qwk(char *packet,uin j=cfg.qhub[hubnum]->sub[j]; /* TWIT FILTER */ - if(twit_list) { - sprintf(fname,"%stwitlist.cfg",cfg.ctrl_dir); - - sprintf(from,"%25.25s",block+46); /* From user */ - truncsp(from); - sprintf(to,"%25.25s",block+21); /* To user */ - truncsp(to); - - if(findstr(from,fname) || findstr(to,fname)) { - eprintf(LOG_NOTICE,"!Filtering post from %s to %s on %s %s" - ,from - ,to - ,cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname); - continue; - } + if(findstr_in_list(msg.from,twit_list) || findstr_in_list(msg.to,twit_list)) { + eprintf(LOG_NOTICE,"!Filtering QWK post from %s to %s on %s %s" + ,msg.from + ,msg.to + ,cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname); + continue; } if(j!=lastsub) { @@ -229,12 +276,12 @@ bool sbbs_t::unpack_qwk(char *packet,uin t=time(NULL)-startsub; if(t<1) t=1; - eprintf(LOG_INFO,"Imported %lu msgs in %lu seconds (%lu msgs/sec)", msgs,t,msgs/t); + eprintf(LOG_INFO,"Imported %lu QWK msgs in %lu seconds (%lu msgs/sec)", msgs,t,msgs/t); } msgs=0; startsub=time(NULL); - eprintf(LOG_INFO,"Importing messages from %s into %s %s" + eprintf(LOG_INFO,"Importing QWK messages from %s into %s %s" ,cfg.qhub[hubnum]->id, cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname); if(lastsub!=INVALID_SUB) @@ -254,52 +301,54 @@ bool sbbs_t::unpack_qwk(char *packet,uin smb.status.attr=cfg.sub[j]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; if((k=smb_create(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_CREATE,smb.file,k); + errormsg(WHERE,ERR_CREATE,smb.file,k,smb.last_error); continue; } } if((k=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,k); + errormsg(WHERE,ERR_LOCK,smb.file,k,smb.last_error); continue; } if((k=smb_getstatus(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,k); + errormsg(WHERE,ERR_READ,smb.file,k,smb.last_error); continue; } smb_unlocksmbhdr(&smb); lastsub=j; } - if(!qwktomsg(qwk,(char *)block,hubnum+1,j,0)) { -// eprintf("!QWKTOMSG failed"); - continue; + if(qwk_import_msg(qwk,(char *)block,blocks,hubnum+1,/*subnum: */j,/*touser: */0,&msg)) { + signal_sub_sem(&cfg,j); + msgs++; + tmsgs++; } - - signal_sub_sem(&cfg,j); -/* - eprintf("Message from %s Posted on %s %s" - ,cfg.qhub[hubnum]->id,cfg.grp[cfg.sub[j]->grp]->sname,cfg.sub[j]->lname); -*/ - msgs++; - tmsgs++; } update_qwkroute(NULL); /* Write ROUTE.DAT */ + smb_freemsgmem(&msg); fclose(qwk); + + iniFreeStringList(headers); + + strListFree(&ip_can); + strListFree(&host_can); + strListFree(&subject_can); + strListFree(&twit_list); + if(lastsub!=INVALID_SUB) smb_close(&smb); delfiles(cfg.temp_dir,"*.NDX"); - sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir); + SAFEPRINTF(str,"%sMESSAGES.DAT",cfg.temp_dir); remove(str); - sprintf(str,"%sDOOR.ID",cfg.temp_dir); + SAFEPRINTF(str,"%sDOOR.ID",cfg.temp_dir); remove(str); - sprintf(str,"%sCONTROL.DAT",cfg.temp_dir); + SAFEPRINTF(str,"%sCONTROL.DAT",cfg.temp_dir); remove(str); - sprintf(str,"%sNETFLAGS.DAT",cfg.temp_dir); + SAFEPRINTF(str,"%sNETFLAGS.DAT",cfg.temp_dir); remove(str); dir=opendir(cfg.temp_dir); @@ -329,6 +378,9 @@ bool sbbs_t::unpack_qwk(char *packet,uin eprintf(LOG_INFO,"Finished Importing QWK Network Packet from %s: " "(%lu msgs) in %lu seconds (%lu msgs/sec)" ,cfg.qhub[hubnum]->id, tmsgs, t, tmsgs/t); + /* trigger timed event with internal code of 'qnet-qwk' to run */ + sprintf(str,"%sqnet-qwk.now",cfg.data_dir); + ftouch(str); } delfiles(cfg.temp_dir,ALLFILES); return(true);