--- sbbs/sbbs3/un_rep.cpp 2018/04/24 16:39:34 1.1.1.1 +++ sbbs/sbbs3/un_rep.cpp 2018/04/24 16:39:44 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet QWK replay (REP) packet unpacking routine */ -/* $Id: un_rep.cpp,v 1.1.1.1 2018/04/24 16:39:34 root Exp $ */ +/* $Id: un_rep.cpp,v 1.1.1.2 2018/04/24 16:39:44 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 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2004 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 * @@ -43,10 +43,13 @@ /****************************************************************************/ bool sbbs_t::unpack_rep(char* repfile) { - char str[256],fname[128] + char str[MAX_PATH+1],fname[MAX_PATH+1] ,*AttemptedToUploadREPpacket="Attempted to upload REP packet"; char tmp[512]; - char block[128]; + char from[26]; + char to[26]; + char inbox[MAX_PATH+1]; + char block[QWK_BLOCK_LEN]; int file; uint i,j,k,lastsub=INVALID_SUB; long l,size,misc; @@ -56,12 +59,16 @@ bool sbbs_t::unpack_rep(char* repfile) FILE* rep; DIR* dir; DIRENT* dirent; + BOOL twit_list; + + sprintf(fname,"%stwitlist.cfg",cfg.ctrl_dir); + twit_list=fexist(fname); if(repfile!=NULL) strcpy(str,repfile); else sprintf(str,"%s%s.rep",cfg.temp_dir,cfg.sys_id); - if(!fexist(str)) { + if(!fexistcase(str)) { bputs(text[QWKReplyNotReceived]); logline("U!",AttemptedToUploadREPpacket); logline(nulstr,"REP file not received"); @@ -73,7 +80,7 @@ bool sbbs_t::unpack_rep(char* repfile) if(k>=cfg.total_fextrs) k=0; ex=EX_OUTL|EX_OUTR; - if(!online) + if(online!=ON_REMOTE) ex|=EX_OFFLINE; i=external(cmdstr(cfg.fextr[k]->cmd,str,ALLFILES,NULL),ex); if(i) { @@ -83,7 +90,7 @@ bool sbbs_t::unpack_rep(char* repfile) return(false); } sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.sys_id); - if(!fexist(str)) { + if(!fexistcase(str)) { bputs(text[QWKReplyNotReceived]); logline("U!",AttemptedToUploadREPpacket); logline(nulstr,"MSG file not received"); @@ -94,7 +101,7 @@ bool sbbs_t::unpack_rep(char* repfile) return(false); } size=filelength(file); - fread(block,128,1,rep); + fread(block,QWK_BLOCK_LEN,1,rep); if(strnicmp((char *)block,cfg.sys_id,strlen(cfg.sys_id))) { fclose(rep); bputs(text[QWKReplyNotReceived]); @@ -108,127 +115,148 @@ bool sbbs_t::unpack_rep(char* repfile) /********************/ bputs(text[QWKUnpacking]); - for(l=128;l=cfg.level_emailperday[useron.level] && !(useron.rest&FLAG('Q'))) { bputs(text[TooManyEmailsToday]); - continue; } + continue; + } j=atoi(str); if(j && j>lastuser(&cfg)) j=0; - if(!j && - (!stricmp(str,"SYSOP") - || !stricmp(str,cfg.sys_id) - || !stricmp(str,cfg.sys_op))) - j=1; if(!j) - j=matchuser(&cfg,str); + j=matchuser(&cfg,str,TRUE /* sysop_alias */); if(!j) { bputs(text[UnknownUser]); - continue; } + continue; + } if(j==1 && useron.rest&FLAG('S')) { bprintf(text[R_Feedback],cfg.sys_op); - continue; } + continue; + } getuserrec(&cfg,j,U_MISC,8,str); misc=ahtoul(str); if(misc&NETMAIL && cfg.sys_misc&SM_FWDTONET) { getuserrec(&cfg,j,U_NETMAIL,LEN_NETMAIL,str); qwktonetmail(rep,block,str,0); - continue; } + continue; + } sprintf(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; if(lastsub!=INVALID_SUB) { smb_close(&smb); - lastsub=INVALID_SUB; } + lastsub=INVALID_SUB; + } + smb.subnum=INVALID_SUB; if((k=smb_open(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error); - continue; } + continue; + } if(!filelength(fileno(smb.shd_fp))) { smb.status.max_crcs=cfg.mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; + smb.status.max_msgs=0; smb.status.max_age=cfg.mail_maxage; smb.status.attr=SMB_EMAIL; if((k=smb_create(&smb))!=0) { smb_close(&smb); errormsg(WHERE,ERR_CREATE,smb.file,k); - continue; } } + continue; + } + } if((k=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); errormsg(WHERE,ERR_LOCK,smb.file,k); - continue; } + continue; + } if((k=smb_getstatus(&smb))!=0) { smb_close(&smb); errormsg(WHERE,ERR_READ,smb.file,k); - continue; } + continue; + } smb_unlocksmbhdr(&smb); if(!qwktomsg(rep,block,0,INVALID_SUB,j)) { smb_close(&smb); - continue; } + continue; + } smb_close(&smb); if(j==1) { useron.fbacks++; logon_fbacks++; putuserrec(&cfg,useron.number,U_FBACKS,5 - ,ultoa(useron.fbacks,tmp,10)); } + ,ultoa(useron.fbacks,tmp,10)); + } else { useron.emails++; logon_emails++; putuserrec(&cfg,useron.number,U_EMAILS,5 - ,ultoa(useron.emails,tmp,10)); } + ,ultoa(useron.emails,tmp,10)); + } useron.etoday++; putuserrec(&cfg,useron.number,U_ETODAY,5 ,ultoa(useron.etoday,tmp,10)); bprintf(text[Emailed],username(&cfg,j,tmp),j); - sprintf(str,"E-mailed %s #%d",username(&cfg,j,tmp),j); + sprintf(str,"%s sent e-mail to %s #%d" + ,useron.alias,username(&cfg,j,tmp),j); logline("E+",str); if(useron.rest&FLAG('Q')) { sprintf(tmp,"%-25.25s",block+46); - truncsp(tmp); } + truncsp(tmp); + } else strcpy(tmp,useron.alias); for(k=1;k<=cfg.sys_nodes;k++) { /* Tell user, if online */ @@ -238,11 +266,15 @@ bool sbbs_t::unpack_rep(char* repfile) || node.status==NODE_QUIET)) { sprintf(str,text[EmailNodeMsg] ,cfg.node_num,tmp); - putnmsg(k,str); - break; } } + putnmsg(&cfg,k,str); + break; + } + } if(k>cfg.sys_nodes) { sprintf(str,text[UserSentYouMail],tmp); - putsmsg(&cfg,j,str); } } /* end of email */ + putsmsg(&cfg,j,str); + } + } /* end of email */ /**************************/ else { /* message on a sub-board */ @@ -253,33 +285,39 @@ bool sbbs_t::unpack_rep(char* repfile) if(cfg.sub[usrsub[j][k]]->qwkconf==n) break; if(k=usrgrps) { if(n<1000) { /* version 1 method, start at 101 */ j=n/100; - k=n-(j*100); } + k=n-(j*100); + } else { /* version 2 method, start at 1001 */ j=n/1000; - k=n-(j*1000); } + k=n-(j*1000); + } j--; /* j is group */ k--; /* k is sub */ if(j>=usrgrps || k>=usrsubs[j] || cfg.sub[usrsub[j][k]]->qwkconf) { bprintf(text[QWKInvalidConferenceN],n); - sprintf(str,"Invalid conference number %d",n); + sprintf(str,"%s: Invalid conference number %lu",useron.alias,n); logline("P!",str); - continue; } } + continue; + } + } n=usrsub[j][k]; /* if posting, add to new-scan config for QWKnet nodes automatically */ if(useron.rest&FLAG('Q')) - sub_cfg[n]|=SUB_CFG_NSCAN; + subscan[n].cfg|=SUB_CFG_NSCAN; sprintf(str,"%-25.25s","SBBS"); if(!strnicmp((char *)block+21,str,25)) { /* to SBBS, config stuff */ qwkcfgline((char *)block+71,n); - continue; } + continue; + } if(!SYSOP && cfg.sub[n]->misc&SUB_QNET) { /* QWK Netted */ sprintf(str,"%-25.25s","DROP"); /* Drop from new-scan? */ @@ -287,39 +325,46 @@ bool sbbs_t::unpack_rep(char* repfile) continue; sprintf(str,"%-25.25s","ADD"); /* Add to new-scan? */ if(!strnicmp((char *)block+71,str,25)) /* don't allow post */ - continue; } + continue; + } if(useron.rest&FLAG('Q') && !(cfg.sub[n]->misc&SUB_QNET)) { bputs(text[CantPostOnSub]); logline("P!","Attempted to post on non-QWKnet sub"); - continue; } + continue; + } if(useron.rest&FLAG('P')) { bputs(text[R_Post]); logline("P!","Post attempted"); - continue; } + continue; + } if(useron.ptoday>=cfg.level_postsperday[useron.level] && !(useron.rest&FLAG('Q'))) { bputs(text[TooManyPostsToday]); - continue; } + continue; + } if(useron.rest&FLAG('N') && cfg.sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) { bputs(text[CantPostOnSub]); logline("P!","Networked post attempted"); - continue; } + continue; + } if(!chk_ar(cfg.sub[n]->post_ar,&useron)) { bputs(text[CantPostOnSub]); logline("P!","Post attempted"); - continue; } + continue; + } if((block[0]=='*' || block[0]=='+') && !(cfg.sub[n]->misc&SUB_PRIV)) { bputs(text[PrivatePostsNotAllowed]); logline("P!","Private post attempt"); - continue; } + continue; + } if(block[0]=='*' || block[0]=='+' /* Private post */ || cfg.sub[n]->misc&SUB_PONLY) { @@ -328,26 +373,35 @@ bool sbbs_t::unpack_rep(char* repfile) if(!strnicmp((char *)block+21,str,25) || !strnicmp((char *)block+21,tmp,25)) { /* to blank */ bputs(text[NoToUser]); /* or all */ - continue; } } + continue; + } + } if(!SYSOP && !(useron.rest&FLAG('Q'))) { sprintf(str,"%-25.25s","SYSOP"); if(!strnicmp((char *)block+21,str,25)) { sprintf(str,"%-25.25s",username(&cfg,1,tmp)); - memcpy((char *)block+21,str,25); } } /* change from sysop */ - /* to user name */ - - #if 0 /* TWIT FILTER */ - sprintf(str,"%25.25s",block+46); /* From user */ - truncsp(str); - - if(!stricmp(str,"Lee Matherne") - || !stricmp(str,"Big Joe") - ) { - bprintf(text[Posted],cfg.grp[cfg.sub[n]->grp]->sname - ,cfg.sub[n]->lname); - continue; } - #endif + memcpy((char *)block+21,str,25); /* change from sysop */ + } /* to user name */ + } + + /* 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)) { + sprintf(str,"Filtering post from %s to %s on %s %s" + ,from + ,to + ,cfg.grp[cfg.sub[n]->grp]->sname,cfg.sub[n]->lname); + logline("P!",str); + continue; + } + } if(n!=lastsub) { if(lastsub!=INVALID_SUB) @@ -355,9 +409,11 @@ bool sbbs_t::unpack_rep(char* repfile) lastsub=INVALID_SUB; sprintf(smb.file,"%s%s",cfg.sub[n]->data_dir,cfg.sub[n]->code); smb.retry_time=cfg.smb_retry_time; + smb.subnum=n; if((j=smb_open(&smb))!=0) { errormsg(WHERE,ERR_OPEN,smb.file,j,smb.last_error); - continue; } + continue; + } if(!filelength(fileno(smb.shd_fp))) { smb.status.max_crcs=cfg.sub[n]->maxcrcs; @@ -368,20 +424,25 @@ bool sbbs_t::unpack_rep(char* repfile) smb_close(&smb); lastsub=INVALID_SUB; errormsg(WHERE,ERR_CREATE,smb.file,j); - continue; } } + continue; + } + } if((j=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); lastsub=INVALID_SUB; errormsg(WHERE,ERR_LOCK,smb.file,j); - continue; } + continue; + } if((j=smb_getstatus(&smb))!=0) { smb_close(&smb); lastsub=INVALID_SUB; errormsg(WHERE,ERR_READ,smb.file,j); - continue; } + continue; + } smb_unlocksmbhdr(&smb); - lastsub=n; } + lastsub=n; + } if(!qwktomsg(rep,block,0,n,0)) continue; @@ -393,13 +454,14 @@ bool sbbs_t::unpack_rep(char* repfile) putuserrec(&cfg,useron.number,U_PTODAY,5,ultoa(useron.ptoday,str,10)); bprintf(text[Posted],cfg.grp[cfg.sub[n]->grp]->sname ,cfg.sub[n]->lname); - sprintf(str,"Posted on %s/%s",cfg.grp[cfg.sub[n]->grp]->sname - ,cfg.sub[n]->lname); - if(cfg.sub[n]->misc&SUB_FIDO && cfg.sub[n]->echomail_sem[0]) /* semaphore */ - if((file=nopen(cmdstr(cfg.sub[n]->echomail_sem,nulstr,nulstr,NULL) - ,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); - logline("P+",str); } } /* end of public message */ + sprintf(str,"%s posted on %s %s" + ,useron.alias,cfg.grp[cfg.sub[n]->grp]->sname,cfg.sub[n]->lname); + signal_sub_sem(&cfg,n); + logline("P+",str); + if(!(useron.rest&FLAG('Q'))) + user_event(EVENT_POST); + } /* end of public message */ + } update_qwkroute(NULL); /* Write ROUTE.DAT */ @@ -409,28 +471,32 @@ bool sbbs_t::unpack_rep(char* repfile) if(useron.rest&FLAG('Q')) { /* QWK Net Node */ sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.sys_id); - remove(str); + if(fexistcase(str)) + remove(str); sprintf(str,"%s%s.rep",cfg.temp_dir,cfg.sys_id); - remove(str); + if(fexistcase(str)) + remove(str); dir=opendir(cfg.temp_dir); - while((dirent=readdir(dir))!=NULL) { /* Extra files */ - // Create directory if necessary - sprintf(str,"%sqnet/%s.in",cfg.data_dir,useron.alias); - _mkdir(str); + while(dir!=NULL && (dirent=readdir(dir))!=NULL) { /* Extra files */ // Move files sprintf(str,"%s%s",cfg.temp_dir,dirent->d_name); if(isdir(str)) continue; - sprintf(fname,"%sqnet/%s.in/%s",cfg.data_dir,useron.alias,dirent->d_name); + + // Create directory if necessary + sprintf(inbox,"%sqnet/%s.in",cfg.data_dir,useron.alias); + MKDIR(inbox); + + sprintf(fname,"%s/%s",inbox,dirent->d_name); mv(str,fname,1); sprintf(str,text[ReceivedFileViaQWK],dirent->d_name,useron.alias); putsmsg(&cfg,1,str); } - closedir(dir); + if(dir!=NULL) + closedir(dir); sprintf(str,"%sqnet-rep.now",cfg.data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); + ftouch(str); } bputs(text[QWKUnpacked]);