--- sbbs/src/sbbs3/sbbsecho.c 2018/04/24 16:41:24 1.1.1.1 +++ sbbs/src/sbbs3/sbbsecho.c 2018/04/24 16:43:58 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */ -/* $Id: sbbsecho.c,v 1.1.1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: sbbsecho.c,v 1.1.1.2 2018/04/24 16:43:58 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 * @@ -72,7 +72,6 @@ smb_t *smb,*email; long misc=(IMPORT_PACKETS|IMPORT_NETMAIL|IMPORT_ECHOMAIL|EXPORT_ECHOMAIL |DELETE_NETMAIL|DELETE_PACKETS); ulong netmail=0; -int log_level=LOG_NOTICE; char tmp[256],pkt_type=0; int secure,cur_smb=0; FILE *fidologfile=NULL; @@ -141,7 +140,7 @@ int lprintf(int level, char *fmat, ...) truncsp(sbuf); printf("%s\n",sbuf); - if(level<=log_level) + if(level<=cfg.log_level) logprintf("%s",sbuf); return(chcount); } @@ -165,7 +164,9 @@ void logprintf(char *str, ...) now=time(NULL); gm=localtime(&now); fprintf(fidologfile,"%02u/%02u/%02u %02u:%02u:%02u %s\n" - ,gm->tm_mon+1,gm->tm_mday,TM_YEAR(gm->tm_year),gm->tm_hour,gm->tm_min,gm->tm_sec + ,(scfg.sys_misc&SM_EURODATE) ? gm->tm_mday : gm->tm_mon+1 + ,(scfg.sys_misc&SM_EURODATE) ? gm->tm_mon+1 : gm->tm_mday + ,TM_YEAR(gm->tm_year),gm->tm_hour,gm->tm_min,gm->tm_sec ,buf); } @@ -346,9 +347,9 @@ int write_flofile(char *attachment, fadd else if(attr&ATTR_DIRECT) ch='d'; else ch='f'; if(dest.zone==sys_faddr.zone) /* Default zone, use default outbound */ - strcpy(outbound,cfg.outbound); + SAFECOPY(outbound,cfg.outbound); else { /* Inter-zone outbound is OUTBOUND.XXX */ - sprintf(outbound,"%.*s.%03x" + SAFEPRINTF3(outbound,"%.*s.%03x" ,(int)strlen(cfg.outbound)-1,cfg.outbound,dest.zone); MKDIR(outbound); backslash(outbound); @@ -435,6 +436,7 @@ int create_netmail(char *to, char *subje if(i=cfg.nodecfgs) { + lprintf(LOG_NOTICE,"Areafix not configured for %s", smb_faddrtoa(&addr,NULL)); create_netmail(to,"Areafix Request" ,"Your node is not configured for Areafix, please contact your hub.\r\n",addr,FALSE); sprintf(body,"An areafix request was made by node %s.\r\nThis node " "is not currently configured for areafix.\r\n" ,smb_faddrtoa(&addr,NULL)); - return(body); } + lprintf(LOG_DEBUG,"areafix debug, nodes=%u",cfg.nodecfgs); + { + int j; + for(j=0;j=scfg.total_subs) { lprintf(LOG_ERR,"ERROR line %d getlastmsg %d",__LINE__,subnum); - bail(1); } + bail(1); + return 0; + } sprintf(smbfile.file,"%s%s",scfg.sub[subnum]->data_dir,scfg.sub[subnum]->code); smbfile.retry_time=scfg.smb_retry_time; if((i=smb_open(&smbfile))!=SMB_SUCCESS) { lprintf(LOG_ERR,"ERROR %d line %d opening %s",i,__LINE__,smbfile.file); - return(0); } + return(0); + } if(!filelength(fileno(smbfile.shd_fp))) { /* Empty base */ if(ptr) (*ptr)=0; smb_close(&smbfile); - return(0); } + return(0); + } smb_close(&smbfile); if(ptr) (*ptr)=smbfile.status.last_msg; return(smbfile.status.total_msgs); @@ -1957,10 +2000,10 @@ ulong loadmsgs(post_t** post, ulong ptr) if(idx.number==0) /* invalid message number, ignore */ continue; - if(idx.number<=ptr || idx.attr&MSG_DELETE) + if(idx.number<=ptr || (idx.attr&MSG_DELETE)) continue; - if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED)) + if((idx.attr&MSG_MODERATED) && !(idx.attr&MSG_VALIDATED)) break; (*post)[l++]=idx; @@ -2201,6 +2244,7 @@ char* getfmsg(FILE *stream, ulong *outle if((fbuf=(char *)malloc(length+1))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating %lu bytes of memory",__LINE__,length+1); bail(1); + return(NULL); } fseek(stream,start,SEEK_SET); @@ -2235,7 +2279,7 @@ int fmsgtosmsg(uchar* fbuf, fmsghdr_t fm ushort xlat=XLAT_NONE,net; ulong l,m,length,bodylen,taillen,crc; ulong save; - long dupechk_hashes=SMB_HASH_SOURCE_ALL; + long dupechk_hashes=SMB_HASH_SOURCE_DUPE; faddr_t faddr,origaddr,destaddr; smb_t* smbfile; char fname[MAX_PATH+1]; @@ -2314,7 +2358,7 @@ int fmsgtosmsg(uchar* fbuf, fmsghdr_t fm } ch=fbuf[l]; - if(ch==1 && cr) { /* kludge line */ + if(ch==CTRL_A && cr) { /* kludge line */ if(!strncmp((char *)fbuf+l+1,"TOPT ",5)) destaddr.point=atoi((char *)fbuf+l+6); @@ -2484,6 +2528,8 @@ int fmsgtosmsg(uchar* fbuf, fmsghdr_t fm net=NET_FIDO; /* Record origin address */ if(net) { + if(origaddr.zone==0) + origaddr.zone = sys_faddr.zone; smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); smb_hfield(&msg,SENDERNETADDR,sizeof(fidoaddr_t),&origaddr); } @@ -2514,11 +2560,14 @@ int fmsgtosmsg(uchar* fbuf, fmsghdr_t fm msg.idx.number=smbfile->status.last_msg+1; /* needed for MSG-ID generation */ /* Generate default (RFC822) message-id (always) */ - SAFECOPY(msg_id,get_msgid(&scfg,subnum,&msg)); + get_msgid(&scfg,subnum,&msg,msg_id,sizeof(msg_id)); smb_hfield_str(&msg,RFC822MSGID,msg_id); } if(smbfile->status.max_crcs==0) dupechk_hashes&=~(1<=0 && subnum==cfg.area[cfg.badecho].sub) + dupechk_hashes=SMB_HASH_SOURCE_NONE; i=smb_addmsg(smbfile, &msg, storage, dupechk_hashes, xlat, sbody, stail); @@ -2546,7 +2595,7 @@ void getzpt(FILE *stream, fmsghdr_t *hdr for(i=0;idestpoint=atoi(buf+i+6); else if(!strncmp(buf+i+1,"FMPT ",5)) @@ -2866,7 +2915,9 @@ void gen_psb(addrlist_t *seenbys,addrlis ,sizeof(faddr_t)*(seenbys->addrs+1)))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating memory for message " "seenbys.",__LINE__); - bail(1); } + bail(1); + return; + } memcpy(&seenbys->addr[seenbys->addrs],&addr,sizeof(faddr_t)); seenbys->addrs++; ++i; } @@ -2875,13 +2926,17 @@ void gen_psb(addrlist_t *seenbys,addrlis p1=strstr(p+10,"\nSEEN-BY:"); if(!p1) break; - p=p1; } } + p=p1; + } + } else { if((seenbys->addr=(faddr_t *)realloc(seenbys->addr ,sizeof(faddr_t)))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating memory for message seenbys." ,__LINE__); - bail(1); } + bail(1); + return; + } memset(&seenbys->addr[0],0,sizeof(faddr_t)); } if(paths->addr) { @@ -2921,19 +2976,25 @@ void gen_psb(addrlist_t *seenbys,addrlis ,sizeof(faddr_t)*(paths->addrs+1)))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating memory for message " "paths.",__LINE__); - bail(1); } + bail(1); + return; + } memcpy(&paths->addr[paths->addrs],&addr,sizeof(faddr_t)); paths->addrs++; ++i; } if((p1=strstr(p+7,"\1PATH:"))==NULL) break; - p=p1; } } + p=p1; + } + } else { if((paths->addr=(faddr_t *)realloc(paths->addr ,sizeof(faddr_t)))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating memory for message paths." ,__LINE__); - bail(1); } + bail(1); + return; + } memset(&paths->addr[0],0,sizeof(faddr_t)); } } @@ -3073,11 +3134,13 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t a attach_bundles(); if(!(misc&FLO_MAILER)) attachment(0,faddr,ATTACHMENT_NETMAIL); - return; } + return; + } if(fbuf==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating fbuf",__LINE__); - return; } + return; + } /* We want to see if there's already a packet open for this area. */ /* If not, we'll open a new one. Once we have a packet, we'll add */ /* messages to it as they come in. If necessary, we'll close an */ @@ -3089,7 +3152,7 @@ void pkt_to_pkt(uchar *fbuf,areasbbs_t a check_psb(&seenbys,area.uplink[j])))) continue; node=matchnode(area.uplink[j],0); - if(node=scfg.total_faddrs && !(misc&IGNORE_ADDRESS)) { - printf("Wrong address"); + printf("Foreign address"); if(!path[0]) { printf(" - "); pkt_to_msg(fidomsg,&hdr,info); @@ -3322,11 +3390,11 @@ int import_netmail(char *path,fmsghdr_t printf("Orphaned"); return(1); } - if(hdr.attr&FIDO_RECV && !(misc&IGNORE_RECV)) { + if((hdr.attr&FIDO_RECV) && !(misc&IGNORE_RECV)) { printf("Already received"); return(3); } - if(hdr.attr&FIDO_LOCAL && !(misc&LOCAL_NETMAIL)) { + if((hdr.attr&FIDO_LOCAL) && !(misc&LOCAL_NETMAIL)) { printf("Created locally"); return(4); } @@ -3341,7 +3409,10 @@ int import_netmail(char *path,fmsghdr_t email->retry_time=scfg.smb_retry_time; if((i=smb_open(email))!=SMB_SUCCESS) { lprintf(LOG_ERR,"ERROR %d line %d opening %s",i,__LINE__,email->file); - bail(1); } } + bail(1); + return -1; + } + } if(!filelength(fileno(email->shd_fp))) { email->status.max_crcs=scfg.mail_maxcrcs; @@ -3350,7 +3421,10 @@ int import_netmail(char *path,fmsghdr_t email->status.attr=SMB_EMAIL; if((i=smb_create(email))!=SMB_SUCCESS) { lprintf(LOG_ERR,"ERROR %d creating %s",i,email->file); - bail(1); } } + bail(1); + return -1; + } + } if(!stricmp(hdr.to,"AREAFIX") || !stricmp(hdr.to,"SBBSECHO")) { fmsgbuf=getfmsg(fidomsg,NULL); @@ -3493,6 +3567,7 @@ int import_netmail(char *path,fmsghdr_t void export_echomail(char *sub_code,faddr_t addr) { char str[1025],tear,cr; + char msgid[256]; char* buf=NULL; char* minus; uchar* fmsgbuf=NULL; @@ -3510,6 +3585,7 @@ void export_echomail(char *sub_code,fadd areasbbs_t fakearea; addrlist_t msg_seen,msg_path; clock_t start_tick=0,export_ticks=0; + time_t tt; memset(&msg_seen,0,sizeof(addrlist_t)); memset(&msg_path,0,sizeof(addrlist_t)); @@ -3543,12 +3619,12 @@ void export_echomail(char *sub_code,fadd if(!addr.zone && !(misc&IGNORE_MSGPTRS)) { sprintf(str,"%s%s.sfp",scfg.sub[i]->data_dir,scfg.sub[i]->code); if((file=nopen(str,O_RDONLY))!=-1) { - read(file,&ptr,sizeof(time_t)); + read(file,&ptr,4); close(file); } } msgs=getlastmsg(i,&lastmsg,0); if(!msgs || (!addr.zone && !(misc&IGNORE_MSGPTRS) && ptr>=lastmsg)) { - lprintf(LOG_INFO,"No new messages."); + lprintf(LOG_DEBUG,"No new messages."); if(ptr>lastmsg && !addr.zone && !(misc&LEAVE_MSGPTRS)) { lprintf(LOG_DEBUG,"Fixing new-scan pointer."); sprintf(str,"%s%s.sfp",scfg.sub[i]->data_dir,scfg.sub[i]->code); @@ -3638,10 +3714,11 @@ void export_echomail(char *sub_code,fadd SAFECOPY(hdr.from,msg.from); - tm=localtime((time_t *)&msg.hdr.when_written.time); - sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" - ,tm->tm_mday,mon[tm->tm_mon],TM_YEAR(tm->tm_year) - ,tm->tm_hour,tm->tm_min,tm->tm_sec); + tt=msg.hdr.when_written.time; + if((tm=localtime(&tt)) != NULL) + sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" + ,tm->tm_mday,mon[tm->tm_mon],TM_YEAR(tm->tm_year) + ,tm->tm_hour,tm->tm_min,tm->tm_sec); SAFECOPY(hdr.to,msg.to); @@ -3680,7 +3757,7 @@ void export_echomail(char *sub_code,fadd f+=sprintf(fmsgbuf+f,"\1FLAGS %.256s\r", msg.ftn_flags); f+=sprintf(fmsgbuf+f,"\1MSGID: %.256s\r" - ,ftn_msgid(scfg.sub[i],&msg)); + ,ftn_msgid(scfg.sub[i],&msg,msgid,sizeof(msgid))); if(msg.ftn_reply!=NULL) /* use original REPLYID */ f+=sprintf(fmsgbuf+f,"\1REPLY: %.256s\r", msg.ftn_reply); @@ -3694,7 +3771,7 @@ void export_echomail(char *sub_code,fadd smb_getmsghdr(&smb[cur_smb],&orig_msg); smb_unlockmsghdr(&smb[cur_smb],&orig_msg); f+=sprintf(fmsgbuf+f,"\1REPLY: %.256s\r" - ,ftn_msgid(scfg.sub[i],&orig_msg)); + ,ftn_msgid(scfg.sub[i],&orig_msg,msgid,sizeof(msgid))); } } if(msg.ftn_pid!=NULL) /* use original PID */ @@ -3711,12 +3788,17 @@ void export_echomail(char *sub_code,fadd f+=sprintf(fmsgbuf+f,"\1%.512s\r",(char*)msg.hfield_dat[l]); for(l=0,cr=1;buf[l] && fmisc&SUB_ASCII || misc&ASCII_ONLY) { + if((scfg.sub[i]->misc&SUB_ASCII) || (misc&ASCII_ONLY)) { if(buf[l]<' ' && buf[l]!='\r' && buf[l]!='\n') /* Ctrl ascii */ buf[l]='.'; /* converted to '.' */ - if((uchar)buf[l]>0x7f) /* extended ASCII */ - buf[l]='*'; } /* converted to '*' */ + if((uchar)buf[l]&0x80) /* extended ASCII */ + buf[l]=exascii_to_ascii_char(buf[l]); + } fmsgbuf[f++]=buf[l]; } @@ -3864,10 +3947,11 @@ int main(int argc, char **argv) addrlist_t msg_seen,msg_path; areasbbs_t fakearea,curarea; char *usage="\n" - "usage: sbbsecho [cfg_file] [-switches] [sub_code]\n" + "usage: sbbsecho [cfg_file] [-switches] [sub_code] [address]\n" "\n" "where: cfg_file is the filename of config file (default is ctrl/sbbsecho.cfg)\n" " sub_code is the internal code for a sub-board (default is ALL subs)\n" + " address is the link to export for (default is ALL links)\n" "\n" "valid switches:\n" "\n" @@ -3887,13 +3971,18 @@ int main(int argc, char **argv) if((email=(smb_t *)malloc(sizeof(smb_t)))==NULL) { printf("ERROR allocating memory for email.\n"); - bail(1); } + bail(1); + return -1; + } memset(email,0,sizeof(smb_t)); if((smb=(smb_t *)malloc(MAX_OPEN_SMBS*sizeof(smb_t)))==NULL) { printf("ERROR allocating memory for smbs.\n"); - bail(1); } + bail(1); + return -1; + } for(i=0;imisc&SUB_PRIV)) { + if((hdr.attr&FIDO_PRIVATE) && !(scfg.sub[cfg.area[i].sub]->misc&SUB_PRIV)) { if(misc&IMPORT_PRIVATE) hdr.attr&=~FIDO_PRIVATE; else { @@ -4611,7 +4720,8 @@ int main(int argc, char **argv) if(j==0) { /* Successful import */ echomail++; cfg.area[i].imported++; - if(misc&NOTIFY_RECEIPT && (m=matchname(hdr.to))!=0) { + /* Should this check if the user has access to the echo in question? */ + if(i!=cfg.badecho && misc&NOTIFY_RECEIPT && (m=matchname(hdr.to))!=0) { sprintf(str ,"\7\1n\1hSBBSecho: \1m%.*s \1n\1msent you EchoMail on " "\1h%s \1n\1m%s\1n\r\n" @@ -4696,7 +4806,7 @@ int main(int argc, char **argv) glob(str,0,NULL,&g); for(f=0;f