diff --git a/src/sbbs3/qwk.cpp b/src/sbbs3/qwk.cpp index 6612bb2fbd237225c07d95f9c62bce97f560acf0..ae96654954ea6b191033a15916f2074f2686790f 100644 --- a/src/sbbs3/qwk.cpp +++ b/src/sbbs3/qwk.cpp @@ -957,7 +957,7 @@ uint sbbs_t::resolve_qwkconf(uint n, int hubnum) } bool sbbs_t::qwk_voting(str_list_t* ini, long offset, smb_net_type_t net_type, const char* qnet_id - , uint confnum, int hubnum) + , uint confnum, msg_filters filters, int hubnum) { char* section; char location[128]; @@ -977,7 +977,7 @@ bool sbbs_t::qwk_voting(str_list_t* ini, long offset, smb_net_type_t net_type, c strListFree(§ion_list); return false; } - result = qwk_vote(*ini, section, net_type, qnet_id, confnum, hubnum); + result = qwk_vote(*ini, section, net_type, qnet_id, confnum, filters, hubnum); iniRemoveSection(ini, section); iniRemoveSection(ini, location); strListFree(§ion_list); @@ -989,15 +989,18 @@ void sbbs_t::qwk_handle_remaining_votes(str_list_t* ini, smb_net_type_t net_type str_list_t section_list = iniGetSectionList(*ini, /* prefix: */NULL); for(int i=0; section_list != NULL && section_list[i] != NULL; i++) { + lprintf(LOG_WARNING, "Remaining QWK VOTING.DAT section: %s", section_list[i]); +#if 0 // (problematic) Backwards-compatibility hack that shouldn't be necessary any more if(strnicmp(section_list[i], "poll:", 5) == 0 || strnicmp(section_list[i], "vote:", 5) == 0 || strnicmp(section_list[i], "close:", 6) == 0) qwk_vote(*ini, section_list[i], net_type, qnet_id, /* confnum: */0, hubnum); +#endif } strListFree(§ion_list); } -bool sbbs_t::qwk_vote(str_list_t ini, const char* section, smb_net_type_t net_type, const char* qnet_id, uint confnum, int hubnum) +bool sbbs_t::qwk_vote(str_list_t ini, const char* section, smb_net_type_t net_type, const char* qnet_id, uint confnum, msg_filters filters, int hubnum) { char* p; int result; @@ -1023,10 +1026,6 @@ bool sbbs_t::qwk_vote(str_list_t ini, const char* section, smb_net_type_t net_ty errormsg(WHERE, ERR_CHK, "conference number (voting not allowed)", confnum, section); return false; } - if((result = smb_open_sub(&cfg, &smb, smb.subnum)) != SMB_SUCCESS) { - errormsg(WHERE, ERR_OPEN, smb.file, 0, smb.last_error); - return false; - } smbmsg_t msg; ZERO_VAR(msg); @@ -1076,6 +1075,16 @@ bool sbbs_t::qwk_vote(str_list_t ini, const char* section, smb_net_type_t net_ty while((p=iniGetString(ini,section, smb_hfieldtype(SENDERORG), NULL, NULL)) != NULL) smb_hfield_str(&msg, SENDERORG, p); + if(qwk_msg_filtered(&msg, filters)) { + smb_freemsgmem(&msg); + return false; + } + + if((result = smb_open_sub(&cfg, &smb, smb.subnum)) != SMB_SUCCESS) { + errormsg(WHERE, ERR_OPEN, smb.file, 0, smb.last_error); + return false; + } + if(strnicmp(section, "poll:", 5) == 0) { smb_hfield_str(&msg, RFC822MSGID, section + 5); @@ -1148,7 +1157,7 @@ bool sbbs_t::qwk_vote(str_list_t ini, const char* section, smb_net_type_t net_ty return result == SMB_SUCCESS; } -bool sbbs_t::qwk_msg_filtered(smbmsg_t* msg, str_list_t ip_can, str_list_t host_can, str_list_t subject_can, str_list_t twit_list) +bool sbbs_t::qwk_msg_filtered(smbmsg_t* msg, msg_filters filters) { uint32_t now = time32(NULL); @@ -1160,7 +1169,7 @@ bool sbbs_t::qwk_msg_filtered(smbmsg_t* msg, str_list_t ip_can, str_list_t host_ return true; } - if(findstr_in_list(msg->from_ip,ip_can)) { + if(findstr_in_list(msg->from_ip, filters.ip_can)) { lprintf(LOG_NOTICE,"!Filtering QWK message from %s due to blocked IP: %s" ,msg->from ,msg->from_ip); @@ -1168,21 +1177,21 @@ bool sbbs_t::qwk_msg_filtered(smbmsg_t* msg, str_list_t ip_can, str_list_t host_ } const char* hostname=getHostNameByAddr(msg->from_host); - if(findstr_in_list(hostname,host_can)) { + if(findstr_in_list(hostname, filters.host_can)) { lprintf(LOG_NOTICE,"!Filtering QWK message from %s due to blocked hostname: %s" ,msg->from ,hostname); return true; } - if(findstr_in_list(msg->subj,subject_can)) { + if(findstr_in_list(msg->subj, filters.subject_can)) { lprintf(LOG_NOTICE,"!Filtering QWK message from %s due to filtered subject: %s" ,msg->from ,msg->subj); return true; } - if(findstr_in_list(msg->from,twit_list) || findstr_in_list(msg->to,twit_list)) { + if(findstr_in_list(msg->from, filters.twit_list) || findstr_in_list(msg->to, filters.twit_list)) { lprintf(LOG_NOTICE,"!Filtering QWK message from '%s' to '%s'" ,msg->from ,msg->to); @@ -1193,7 +1202,7 @@ bool sbbs_t::qwk_msg_filtered(smbmsg_t* msg, str_list_t ip_can, str_list_t host_ char fidoaddr[64]; char str[128]; SAFEPRINTF2(str, "%s@%s", msg->from, smb_netaddrstr(&msg->from_net, fidoaddr)); - if(findstr_in_list(str, twit_list)) { + if(findstr_in_list(str, filters.twit_list)) { lprintf(LOG_NOTICE,"!Filtering QWK message from '%s' to '%s'" ,str ,msg->to); diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 0f2119dc7da2285262c32866682731dc875027e6..911ab3953e5c4047ce2ce591847b385027e90abc 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1134,10 +1134,16 @@ public: void qwkcfgline(char *buf,uint subnum); bool set_qwk_flag(ulong flag); uint resolve_qwkconf(uint confnum, int hubnum=-1); - bool qwk_vote(str_list_t ini, const char* section, smb_net_type_t, const char* qnet_id, uint confnum, int hubnum); - bool qwk_voting(str_list_t* ini, long offset, smb_net_type_t, const char* qnet_id, uint confnum, int hubnum = -1); + struct msg_filters { + str_list_t ip_can; + str_list_t host_can; + str_list_t subject_can; + str_list_t twit_list; + }; + bool qwk_msg_filtered(smbmsg_t* msg, msg_filters); + bool qwk_vote(str_list_t ini, const char* section, smb_net_type_t, const char* qnet_id, uint confnum, msg_filters, int hubnum); + bool qwk_voting(str_list_t* ini, long offset, smb_net_type_t, const char* qnet_id, uint confnum, msg_filters, int hubnum = -1); void qwk_handle_remaining_votes(str_list_t* ini, smb_net_type_t, const char* qnet_id, int hubnum = -1); - bool qwk_msg_filtered(smbmsg_t* msg, str_list_t ip_can, str_list_t host_can, str_list_t subject_can, str_list_t twit_list=NULL); /* pack_qwk.cpp */ bool pack_qwk(char *packet, ulong *msgcnt, bool prepack); diff --git a/src/sbbs3/un_qwk.cpp b/src/sbbs3/un_qwk.cpp index 7218c961442a9853a8b7228fd28911ded68bbcd5..197cf6aac37ca5d6b186c22b8ead7f9a45fb8c98 100644 --- a/src/sbbs3/un_qwk.cpp +++ b/src/sbbs3/un_qwk.cpp @@ -62,11 +62,8 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) smbmsg_t msg; str_list_t headers=NULL; str_list_t voting=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; link_list_t user_list={0}; + msg_filters msg_filters{}; memset(&msg,0,sizeof(msg)); @@ -135,12 +132,12 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) /********************/ lprintf(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"); + msg_filters.ip_can = trashcan_list(&cfg,"ip"); + msg_filters.host_can = trashcan_list(&cfg,"host"); + msg_filters.subject_can = trashcan_list(&cfg,"subject"); SAFEPRINTF(fname,"%stwitlist.cfg",cfg.ctrl_dir); - twit_list = findstr_list(fname); + msg_filters.twit_list = findstr_list(fname); for(l=QWK_BLOCK_LEN;l<size;l+=blocks*QWK_BLOCK_LEN) { if(terminated) { @@ -166,7 +163,7 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) n=(uint)block[123]|(((uint)block[124])<<8); /* conference number */ if(blocks<2) { if(block[0] == 'V' && blocks == 1 && voting != NULL) { /* VOTING DATA */ - if(!qwk_voting(&voting, l, NET_QWK, cfg.qhub[hubnum]->id, n, hubnum)) { + if(!qwk_voting(&voting, l, NET_QWK, cfg.qhub[hubnum]->id, n, msg_filters, hubnum)) { lprintf(LOG_WARNING, "QWK vote failure, offset %lu in %s", l, packet); errors++; } @@ -184,9 +181,6 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) continue; } - if(qwk_msg_filtered(&msg, ip_can, host_can, subject_can)) - continue; - if(!n) { /* NETMAIL */ lprintf(LOG_INFO,"QWK NetMail from %s to %s", cfg.qhub[hubnum]->id, msg.to); if(!stricmp(msg.to,"NETMAIL")) { /* QWK to FidoNet NetMail */ @@ -279,9 +273,8 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) continue; } - /* TWIT FILTER */ - if(qwk_msg_filtered(&msg, /* ip_can: */NULL, /* host_can: */NULL, /* subject_can: */NULL, twit_list)) - continue; + if(qwk_msg_filtered(&msg, msg_filters)) + continue; if(j!=lastsub) { @@ -367,10 +360,10 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) iniFreeStringList(headers); iniFreeStringList(voting); - strListFree(&ip_can); - strListFree(&host_can); - strListFree(&subject_can); - strListFree(&twit_list); + strListFree(&msg_filters.ip_can); + strListFree(&msg_filters.host_can); + strListFree(&msg_filters.subject_can); + strListFree(&msg_filters.twit_list); listFree(&user_list); delfiles(cfg.temp_dir,"*.NDX"); diff --git a/src/sbbs3/un_rep.cpp b/src/sbbs3/un_rep.cpp index 18dc112284f5ab806428dccd05fac7ad84aadf65..9eac98f80adcf67d833c297a9f986fbe1255adc6 100644 --- a/src/sbbs3/un_rep.cpp +++ b/src/sbbs3/un_rep.cpp @@ -52,11 +52,8 @@ bool sbbs_t::unpack_rep(char* repfile) smbmsg_t msg; str_list_t headers=NULL; str_list_t voting=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; link_list_t user_list={0}; + msg_filters msg_filters{}; const char* AttemptedToUploadREPpacket="Attempted to upload REP packet"; memset(&msg,0,sizeof(msg)); @@ -167,12 +164,12 @@ bool sbbs_t::unpack_rep(char* repfile) bputs(text[QWKUnpacking]); } - ip_can=trashcan_list(&cfg,"ip"); - host_can=trashcan_list(&cfg,"host"); - subject_can=trashcan_list(&cfg,"subject"); + msg_filters.ip_can = trashcan_list(&cfg,"ip"); + msg_filters.host_can = trashcan_list(&cfg,"host"); + msg_filters.subject_can = trashcan_list(&cfg,"subject"); SAFEPRINTF(fname,"%stwitlist.cfg",cfg.ctrl_dir); - twit_list = findstr_list(fname); + msg_filters.twit_list = findstr_list(fname); now=time(NULL); for(l=QWK_BLOCK_LEN;l<size;l+=blocks*QWK_BLOCK_LEN) { @@ -197,7 +194,7 @@ bool sbbs_t::unpack_rep(char* repfile) long confnum = atol((char *)block+1); if(blocks<2) { if(block[0] == 'V' && blocks == 1 && voting != NULL) { /* VOTING DATA */ - if(!qwk_voting(&voting, l, (useron.rest&FLAG('Q')) ? NET_QWK : NET_NONE, /* QWKnet ID : */useron.alias, confnum)) { + if(!qwk_voting(&voting, l, (useron.rest&FLAG('Q')) ? NET_QWK : NET_NONE, /* QWKnet ID : */useron.alias, confnum, msg_filters)) { lprintf(LOG_WARNING, "QWK vote failure, offset %ld of %s", l, getfname(msg_fname)); errors++; } @@ -217,9 +214,6 @@ bool sbbs_t::unpack_rep(char* repfile) continue; } - if(qwk_msg_filtered(&msg, ip_can, host_can, subject_can)) - continue; - if(confnum == 0) { /* E-mail */ if(msg.from == NULL) bprintf("E-mail to %s: %s\r\n", msg.to, msg.subj); @@ -433,8 +427,8 @@ bool sbbs_t::unpack_rep(char* repfile) } #endif - /* TWIT FILTER */ - if(qwk_msg_filtered(&msg, /* ip_can: */NULL, /* host_can: */NULL, /* subject_can: */NULL, twit_list)) + + if(qwk_msg_filtered(&msg, msg_filters)) continue; if(n!=lastsub) { @@ -522,10 +516,10 @@ bool sbbs_t::unpack_rep(char* repfile) iniFreeStringList(headers); iniFreeStringList(voting); - strListFree(&ip_can); - strListFree(&host_can); - strListFree(&subject_can); - strListFree(&twit_list); + strListFree(&msg_filters.ip_can); + strListFree(&msg_filters.host_can); + strListFree(&msg_filters.subject_can); + strListFree(&msg_filters.twit_list); listFree(&user_list); if(lastsub!=INVALID_SUB)