--- sbbs/src/sbbs3/readmsgs.cpp 2018/04/24 16:41:23 1.1 +++ sbbs/src/sbbs3/readmsgs.cpp 2018/04/24 16:43:15 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet public message reading function */ -/* $Id: readmsgs.cpp,v 1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: readmsgs.cpp,v 1.1.1.2 2018/04/24 16:43:15 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 2006 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2011 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 * @@ -39,7 +39,7 @@ int sbbs_t::sub_op(uint subnum) { - return(SYSOP || (cfg.sub[subnum]->op_ar[0] && chk_ar(cfg.sub[subnum]->op_ar,&useron))); + return(is_user_subop(&cfg, subnum, &useron, &client)); } @@ -84,9 +84,8 @@ long sbbs_t::listmsgs(uint subnum, long return(listed); } -char *binstr(uchar *buf, ushort length) +char *binstr(uchar *buf, ushort length, char* str) { - static char str[512]; char tmp[128]; int i; @@ -100,6 +99,10 @@ char *binstr(uchar *buf, ushort length) for(i=0;i= 100) { + strcat(str,"..."); + break; + } } return(str); } @@ -108,6 +111,7 @@ char *binstr(uchar *buf, ushort length) void sbbs_t::msghdr(smbmsg_t* msg) { int i; + char str[512]; CRLF; @@ -115,13 +119,17 @@ void sbbs_t::msghdr(smbmsg_t* msg) for(i=0;itotal_hfields;i++) bprintf("%-16.16s %s\r\n" ,smb_hfieldtype(msg->hfield[i].type) - ,binstr((uchar *)msg->hfield_dat[i],msg->hfield[i].length)); + ,binstr((uchar *)msg->hfield_dat[i],msg->hfield[i].length,str)); /* fixed fields */ - bprintf("%-16.16s %s %s\r\n","when_written" - ,timestr((time_t *)&msg->hdr.when_written.time), smb_zonestr(msg->hdr.when_written.zone,NULL)); - bprintf("%-16.16s %s %s\r\n","when_imported" - ,timestr((time_t *)&msg->hdr.when_imported.time), smb_zonestr(msg->hdr.when_imported.zone,NULL)); + bprintf("%-16.16s %08lX %04hX %.24s %s\r\n","when_written" + ,msg->hdr.when_written.time, msg->hdr.when_written.zone + ,timestr(msg->hdr.when_written.time) + ,smb_zonestr(msg->hdr.when_written.zone,NULL)); + bprintf("%-16.16s %08lX %04hX %.24s %s\r\n","when_imported" + ,msg->hdr.when_imported.time, msg->hdr.when_imported.zone + ,timestr(msg->hdr.when_imported.time) + ,smb_zonestr(msg->hdr.when_imported.zone,NULL)); bprintf("%-16.16s %04Xh\r\n","type" ,msg->hdr.type); bprintf("%-16.16s %04Xh\r\n","version" ,msg->hdr.version); bprintf("%-16.16s %04Xh\r\n","attr" ,msg->hdr.attr); @@ -143,12 +151,12 @@ void sbbs_t::msghdr(smbmsg_t* msg) if(msg->hdr.times_downloaded) bprintf("%-16.16s %lu\r\n" ,"times_downloaded" ,msg->hdr.times_downloaded); if(msg->hdr.last_downloaded) - bprintf("%-16.16s %s\r\n" ,"last_downloaded" ,timestr((time_t*)&msg->hdr.last_downloaded)); + bprintf("%-16.16s %s\r\n" ,"last_downloaded" ,timestr(msg->hdr.last_downloaded)); /* convenience integers */ if(msg->expiration) bprintf("%-16.16s %s\r\n" ,"expiration" - ,timestr((time_t *)&msg->expiration)); + ,timestr(msg->expiration)); if(msg->priority) bprintf("%-16.16s %lu\r\n" ,"priority" ,msg->priority); if(msg->cost) @@ -165,7 +173,7 @@ void sbbs_t::msghdr(smbmsg_t* msg) /****************************************************************************/ /****************************************************************************/ -post_t * sbbs_t::loadposts(long *posts, uint subnum, ulong ptr, long mode) +post_t * sbbs_t::loadposts(int32_t *posts, uint subnum, ulong ptr, long mode) { char name[128]; ushort aliascrc,namecrc,sysop; @@ -181,11 +189,11 @@ post_t * sbbs_t::loadposts(long *posts, (*posts)=0; if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - errormsg(WHERE,ERR_LOCK,smb.file,i); /* adds while we're reading */ + errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); /* adds while we're reading */ return(NULL); } - total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); /* total msgs in sub */ + total=(long)filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); /* total msgs in sub */ if(!total) { /* empty */ smb_unlocksmbhdr(&smb); @@ -334,23 +342,27 @@ static int get_start_msg(sbbs_t* sbbs, s /* Returns 0 if normal completion, 1 if aborted. */ /* Called from function main_sec */ /****************************************************************************/ -int sbbs_t::scanposts(uint subnum, long mode, char *find) +int sbbs_t::scanposts(uint subnum, long mode, const char *find) { char str[256],str2[256],do_find=true,mismatches=0 ,done=0,domsg=1,*buf,*p; + char subj[128]; char find_buf[128]; char tmp[128]; int i; + int quit=0; uint usub,ugrp,reads=0; uint lp=0; long org_mode=mode; - ulong msgs,last,l; + ulong msgs,l; + uint32_t last; post_t *post; smbmsg_t msg; + find_buf[0]=0; cursubnum=subnum; /* for ARS */ - if(!chk_ar(cfg.sub[subnum]->read_ar,&useron)) { - bprintf("\1n\r\nYou can't read messages on %s %s\r\n" + if(!chk_ar(cfg.sub[subnum]->read_ar,&useron,&client)) { + bprintf(text[CantReadSub] ,cfg.grp[cfg.sub[subnum]->grp]->sname,cfg.sub[subnum]->sname); return(0); } @@ -451,13 +463,13 @@ int sbbs_t::scanposts(uint subnum, long if((i=smb_locksmbhdr(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); + errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); smb_stack(&smb,SMB_STACK_POP); return(0); } if((i=smb_getstatus(&smb))!=0) { smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); + errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); smb_stack(&smb,SMB_STACK_POP); return(0); } @@ -503,12 +515,12 @@ int sbbs_t::scanposts(uint subnum, long msg.idx.subj=post[smb.curmsg].subj; if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); + errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); break; } if((i=smb_getstatus(&smb))!=0) { smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); + errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error); break; } smb_unlocksmbhdr(&smb); @@ -565,8 +577,11 @@ int sbbs_t::scanposts(uint subnum, long domsg=0; continue; } - strupr((char *)buf); - if(!strstr((char *)buf,find) && !strstr(msg.subj,find)) { + strupr(buf); + strip_ctrl(buf, buf); + SAFECOPY(subj,msg.subj); + strupr(subj); + if(!strstr(buf,find) && !strstr(subj,find)) { free(buf); if(smb.curmsgpost_ar,&useron)) { + if(!chk_ar(cfg.sub[subnum]->post_ar,&useron,&client)) { bputs(text[CantPostOnSub]); break; } - quotemsg(&msg,0); + if(msg.hdr.attr&MSG_NOREPLY && !sub_op(subnum)) { + bputs(text[CantReplyToMsg]); + break; + } + quotemsg(&msg,/* include tails: */FALSE); FREE_AND_NULL(post); postmsg(subnum,&msg,WM_QUOTE); if(mode&SCAN_TOYOU) domsg=1; break; case 'B': /* Skip sub-board */ - if(mode&SCAN_NEW && !noyes(text[RemoveFromNewScanQ])) + if(mode&SCAN_NEW && text[RemoveFromNewScanQ][0] && !noyes(text[RemoveFromNewScanQ])) subscan[subnum].cfg&=~SUB_CFG_NSCAN; if(msg.total_hfields) smb_freemsgmem(&msg); @@ -696,7 +742,7 @@ int sbbs_t::scanposts(uint subnum, long break; } if(cfg.sub[subnum]->misc&SUB_DELLAST && smb.curmsg!=(smb.msgs-1)) { - bputs("\1n\r\nCan only delete last message.\r\n"); + bputs(text[CantDeleteMsg]); domsg=0; break; } @@ -709,7 +755,7 @@ int sbbs_t::scanposts(uint subnum, long } } if(msg.hdr.attr&MSG_PERMANENT) { - bputs("\1n\r\nMessage is marked permanent.\r\n"); + bputs(text[CantDeleteMsg]); domsg=0; break; } @@ -725,7 +771,7 @@ int sbbs_t::scanposts(uint subnum, long msg.idx.attr^=MSG_DELETE; msg.hdr.attr=msg.idx.attr; if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); + errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); smb_unlockmsghdr(&smb,&msg); if(i==0 && msg.idx.attr&MSG_DELETE) { sprintf(str,"%s removed post from %s %s" @@ -752,13 +798,12 @@ int sbbs_t::scanposts(uint subnum, long case 'E': /* edit last post */ if(!sub_op(subnum)) { if(!(cfg.sub[subnum]->misc&SUB_EDIT)) { - bputs("\1n\r\nCan't edit messages on this message base.\r\n"); - // bputs(text[CantDeletePosts]); + bputs(text[CantEditMsg]); domsg=0; break; } if(cfg.sub[subnum]->misc&SUB_EDITLAST && smb.curmsg!=(smb.msgs-1)) { - bputs("\1n\r\nCan only edit last message.\r\n"); + bputs(text[CantEditMsg]); domsg=0; break; } @@ -778,9 +823,9 @@ int sbbs_t::scanposts(uint subnum, long if((i=get_start_msg(this,&smb))<0) break; bputs(text[SearchStringPrompt]); - if(!getstr(find_buf,40,K_LINE|K_UPPER)) + if(!getstr(find_buf,40,K_LINE|K_UPPER|K_EDIT|K_AUTODEL)) break; - if(yesno(text[DisplaySubjectsOnlyQ])) + if(text[DisplaySubjectsOnlyQ][0] && yesno(text[DisplaySubjectsOnlyQ])) searchposts(subnum,post,(long)i,smb.msgs,find_buf); else { smb.curmsg=i; @@ -802,8 +847,8 @@ int sbbs_t::scanposts(uint subnum, long break; case 'M': /* Reply to last post in mail */ domsg=0; - if(msg.hdr.attr&MSG_ANONYMOUS && !sub_op(subnum)) { - bputs(text[CantReplyToAnonMsg]); + if(msg.hdr.attr&(MSG_NOREPLY|MSG_ANONYMOUS) && !sub_op(subnum)) { + bputs(text[CantReplyToMsg]); break; } if(!sub_op(subnum) && msg.hdr.attr&MSG_PRIVATE @@ -812,23 +857,27 @@ int sbbs_t::scanposts(uint subnum, long break; sprintf(str2,text[Regarding] ,msg.subj - ,timestr((time_t *)&msg.hdr.when_written.time)); + ,timestr(msg.hdr.when_written.time)); if(msg.from_net.addr==NULL) - strcpy(str,msg.from); + SAFECOPY(str,msg.from); else if(msg.from_net.type==NET_FIDO) - sprintf(str,"%s@%s",msg.from + SAFEPRINTF2(str,"%s@%s",msg.from ,smb_faddrtoa((faddr_t *)msg.from_net.addr,tmp)); - else if(msg.from_net.type==NET_INTERNET) - strcpy(str,(char *)msg.from_net.addr); + else if(msg.from_net.type==NET_INTERNET || strchr((char*)msg.from_net.addr,'@')!=NULL) { + if(msg.replyto_net.type==NET_INTERNET) + SAFECOPY(str,(char *)msg.replyto_net.addr); + else + SAFECOPY(str,(char *)msg.from_net.addr); + } else - sprintf(str,"%s@%s",msg.from,(char *)msg.from_net.addr); + SAFEPRINTF2(str,"%s@%s",msg.from,(char *)msg.from_net.addr); bputs(text[Email]); if(!getstr(str,60,K_EDIT|K_AUTODEL)) break; FREE_AND_NULL(post); - quotemsg(&msg,1); - if(msg.from_net.type==NET_INTERNET && strchr(str,'@')) + quotemsg(&msg,/* include tails: */TRUE); + if(smb_netaddr_type(str)==NET_INTERNET) inetmail(str,msg.subj,WM_QUOTE|WM_NETMAIL); else { p=strrchr(str,'@'); @@ -838,7 +887,7 @@ int sbbs_t::scanposts(uint subnum, long i=atoi(str); if(!i) { if(cfg.sub[subnum]->misc&SUB_NAME) - i=userdatdupe(0,U_NAME,LEN_NAME,str,0); + i=userdatdupe(0,U_NAME,LEN_NAME,str); else i=matchuser(&cfg,str,TRUE /* sysop_alias */); } @@ -848,7 +897,7 @@ int sbbs_t::scanposts(uint subnum, long break; case 'P': /* Post message on sub-board */ domsg=0; - if(!chk_ar(cfg.sub[subnum]->post_ar,&useron)) + if(!chk_ar(cfg.sub[subnum]->post_ar,&useron,&client)) bputs(text[CantPostOnSub]); else { FREE_AND_NULL(post); @@ -856,13 +905,9 @@ int sbbs_t::scanposts(uint subnum, long } break; case 'Q': /* Quit */ - if(msg.total_hfields) - smb_freemsgmem(&msg); - if(post) - free(post); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(1); + quit=1; + done=1; + break; case 'T': /* List titles of next ten messages */ domsg=0; if(!smb.msgs) @@ -891,7 +936,7 @@ int sbbs_t::scanposts(uint subnum, long while(online) { if(!(useron.misc&EXPERT)) menu("sysmscan"); - bprintf("\r\n\1y\1hOperator: \1w"); + bputs(text[OperatorPrompt]); strcpy(str,"?CEHMPQUV"); if(SYSOP) strcat(str,"S"); @@ -901,8 +946,10 @@ int sbbs_t::scanposts(uint subnum, long menu("sysmscan"); continue; case 'P': /* Purge user */ + if(noyes(text[AreYouSureQ])) + break; purgeuser(cfg.sub[subnum]->misc&SUB_NAME - ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0) + ? userdatdupe(0,U_NAME,LEN_NAME,msg.from) : matchuser(&cfg,msg.from,FALSE)); break; case 'C': /* Change message attributes */ @@ -917,7 +964,7 @@ int sbbs_t::scanposts(uint subnum, long if(loadmsg(&msg,msg.idx.number)) { msg.hdr.attr=msg.idx.attr=i; if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); + errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); smb_unlockmsghdr(&smb,&msg); } smb_unlocksmbhdr(&smb); @@ -948,7 +995,7 @@ int sbbs_t::scanposts(uint subnum, long msg.idx.attr|=MSG_DELETE; msg.hdr.attr=msg.idx.attr; if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); + errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); } smb_unlockmsghdr(&smb,&msg); } @@ -968,7 +1015,7 @@ int sbbs_t::scanposts(uint subnum, long break; case 'U': /* User edit */ useredit(cfg.sub[subnum]->misc&SUB_NAME - ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0) + ? userdatdupe(0,U_NAME,LEN_NAME,msg.from) : matchuser(&cfg,msg.from,TRUE /* sysop_alias */)); break; case 'V': /* Validate message */ @@ -981,7 +1028,7 @@ int sbbs_t::scanposts(uint subnum, long msg.idx.attr|=MSG_VALIDATED; msg.hdr.attr=msg.idx.attr; if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); + errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); smb_unlockmsghdr(&smb,&msg); } smb_unlocksmbhdr(&smb); @@ -1091,32 +1138,38 @@ int sbbs_t::scanposts(uint subnum, long case '?': menu("msgscan"); domsg=0; - break; } } + break; + } + } if(msg.total_hfields) smb_freemsgmem(&msg); if(post) free(post); - if(!(org_mode&(SCAN_CONST|SCAN_TOYOU|SCAN_FIND)) && !(cfg.sub[subnum]->misc&SUB_PONLY) - && reads && chk_ar(cfg.sub[subnum]->post_ar,&useron) + if(!quit + && !(org_mode&(SCAN_CONST|SCAN_TOYOU|SCAN_FIND)) && !(cfg.sub[subnum]->misc&SUB_PONLY) + && reads && chk_ar(cfg.sub[subnum]->post_ar,&useron,&client) && text[Post][0] && !(useron.rest&FLAG('P'))) { sprintf(str,text[Post],cfg.grp[cfg.sub[subnum]->grp]->sname ,cfg.sub[subnum]->lname); if(!noyes(str)) postmsg(subnum,0,0); } + if(!(org_mode&(SCAN_CONST|SCAN_TOYOU|SCAN_FIND)) + && !(subscan[subnum].cfg&SUB_CFG_NSCAN) && text[AddSubToNewScanQ][0] && yesno(text[AddSubToNewScanQ])) + subscan[subnum].cfg|=SUB_CFG_NSCAN; smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - return(0); + return(quit); } /****************************************************************************/ /* This function lists all messages in sub-board */ /* Returns number of messages found/displayed. */ /****************************************************************************/ -long sbbs_t::listsub(uint subnum, long mode, long start, char* search) +long sbbs_t::listsub(uint subnum, long mode, long start, const char* search) { int i; - long posts; + int32_t posts; long displayed; post_t *post; @@ -1156,9 +1209,10 @@ long sbbs_t::listsub(uint subnum, long m /* Returns number of messages found. */ /****************************************************************************/ long sbbs_t::searchposts(uint subnum, post_t *post, long start, long posts - , char *search) + , const char *search) { - char *buf,ch; + char* buf,ch; + char subj[128]; long l,found=0; smbmsg_t msg; @@ -1173,8 +1227,11 @@ long sbbs_t::searchposts(uint subnum, po smb_freemsgmem(&msg); continue; } - strupr((char *)buf); - if(strstr((char *)buf,search) || strstr(msg.subj,search)) { + strupr(buf); + strip_ctrl(buf, buf); + SAFECOPY(subj,msg.subj); + strupr(subj); + if(strstr(buf,search) || strstr(subj,search)) { if(!found) CRLF; if(msg.hdr.attr&MSG_DELETE)