--- sbbs/src/sbbs3/fido.cpp 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/fido.cpp 2018/04/24 16:43:04 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet FidoNet-related routines */ -/* $Id: fido.cpp,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: fido.cpp,v 1.1.1.2 2018/04/24 16:43:04 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 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 * @@ -35,6 +35,9 @@ * Note: If this box doesn't appear square, then you need to fix your tabs. * ****************************************************************************/ +/* TODO: This file is made up almost *entirely* of copy/pasted crap and */ +/* it needs to go away - FTN netmail should be handled by sbbsecho anyway. */ + #include "sbbs.h" #include "qwk.h" @@ -52,12 +55,14 @@ void pt_zone_kludge(fmsghdr_t hdr,int fi if(hdr.destpoint) { sprintf(str,"\1TOPT %hu\r" ,hdr.destpoint); - write(fido,str,strlen(str)); } + write(fido,str,strlen(str)); + } if(hdr.origpoint) { sprintf(str,"\1FMPT %hu\r" ,hdr.origpoint); - write(fido,str,strlen(str)); } + write(fido,str,strlen(str)); + } } bool sbbs_t::lookup_netuser(char *into) @@ -86,9 +91,11 @@ bool sbbs_t::lookup_netuser(char *into) if(strstr(name,to) && yesno(q)) { fclose(stream); sprintf(into,"%s@%s",str,str+27); - return(true); } + return(true); + } if(sys_status&SS_ABORT) - break; } + break; + } fclose(stream); return(false); } @@ -96,7 +103,7 @@ bool sbbs_t::lookup_netuser(char *into) /****************************************************************************/ /* Send FidoNet/QWK/Internet NetMail from BBS */ /****************************************************************************/ -bool sbbs_t::netmail(char *into, char *title, long mode) +bool sbbs_t::netmail(const char *into, const char *title, long mode) { char str[256],subj[128],to[256],fname[128],*buf,*p,ch; char tmp[512]; @@ -107,7 +114,7 @@ bool sbbs_t::netmail(char *into, char *t fmsghdr_t hdr; struct tm tm; - if(useron.etoday>=cfg.level_emailperday[useron.level] && !SYSOP) { + if(useron.etoday>=cfg.level_emailperday[useron.level] && !SYSOP && !(useron.exempt&FLAG('M'))) { bputs(text[TooManyEmailsToday]); return(false); } @@ -122,7 +129,8 @@ bool sbbs_t::netmail(char *into, char *t if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) { mode&=~WM_FILE; qnetmail(to,title,mode|WM_NETMAIL); - return(false); } + return(false); + } if(!cfg.total_faddrs || p==NULL || !strchr(p+1,'/')) { if(!p && cfg.dflt_faddr.zone) addr=cfg.dflt_faddr; @@ -224,35 +232,25 @@ bool sbbs_t::netmail(char *into, char *t strcpy(subj,str); if(fexistcase(str)) { bputs(text[FileAlreadyThere]); - return(false); } -#if 0 /* no such thing as local logon */ - if(online==ON_LOCAL) { /* Local upload */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) { - bputs(text[Aborted]); - return(false); - } - backslash(str); - strcat(str,fname); - if(mv(str,subj,1)) - return(false); - } else -#endif + return(false); + } { /* Remote */ xfer_prot_menu(XFER_UPLOAD); mnemonics(text[ProtocolOrQuit]); strcpy(str,"Q"); for(x=0;xulcmd[0] && chk_ar(cfg.prot[x]->ar,&useron)) { + if(cfg.prot[x]->ulcmd[0] && chk_ar(cfg.prot[x]->ar,&useron,&client)) { sprintf(tmp,"%c",cfg.prot[x]->mnemonic); - strcat(str,tmp); } + strcat(str,tmp); + } ch=(char)getkeys(str,0); if(ch=='Q' || sys_status&SS_ABORT) { bputs(text[Aborted]); - return(false); } + return(false); + } for(x=0;xulcmd[0] && cfg.prot[x]->mnemonic==ch - && chk_ar(cfg.prot[x]->ar,&useron)) + && chk_ar(cfg.prot[x]->ar,&useron,&client)) break; if(x0) bprintf(text[FileNBytesReceived],fname,ultoac(l,tmp)); else { @@ -274,76 +272,96 @@ bool sbbs_t::netmail(char *into, char *t && !strnicmp(p,"CR:",3)) { /* Crash over-ride by sysop */ p+=3; /* skip CR: */ if(*p==' ') p++; /* skip extra space if it exists */ - hdr.attr|=FIDO_CRASH; } + hdr.attr|=FIDO_CRASH; + } if((SYSOP || useron.exempt&FLAG('F')) && !strnicmp(p,"FR:",3)) { /* File request */ p+=3; /* skip FR: */ if(*p==' ') p++; - hdr.attr|=FIDO_FREQ; } + hdr.attr|=FIDO_FREQ; + } if((SYSOP || useron.exempt&FLAG('F')) && !strnicmp(p,"RR:",3)) { /* Return receipt request */ p+=3; /* skip RR: */ if(*p==' ') p++; - hdr.attr|=FIDO_RRREQ; } + hdr.attr|=FIDO_RRREQ; + } if((SYSOP || useron.exempt&FLAG('F')) && !strnicmp(p,"FA:",3)) { /* File Attachment */ p+=3; /* skip FA: */ if(*p==' ') p++; - hdr.attr|=FIDO_FILE; } + hdr.attr|=FIDO_FILE; + } SAFECOPY(hdr.subj,p); sprintf(str,"%sNETMAIL.MSG", cfg.node_dir); if((file=nopen(str,O_RDONLY))==-1) { errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(false); } - length=filelength(file); + return(false); + } + length=(long)filelength(file); if((buf=(char *)malloc(length))==NULL) { close(file); errormsg(WHERE,ERR_ALLOC,str,length); - return(false); } + return(false); + } read(file,buf,length); close(file); + md(cfg.netmail_dir); cc_sent=0; while(1) { for(i=1;i;i++) { sprintf(str,"%s%u.msg", cfg.netmail_dir,i); if(!fexistcase(str)) - break; } + break; + } if(!i) { bputs(text[TooManyEmailsToday]); - return(false); } + return(false); + } if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) { errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL); - return(false); } + return(false); + } write(fido,&hdr,sizeof(hdr)); pt_zone_kludge(hdr,fido); if(cfg.netmail_misc&NMAIL_DIRECT) { - sprintf(str,"\1FLAGS DIR\r\n"); - write(fido,str,strlen(str)); } + SAFECOPY(str,"\1FLAGS DIR\r\n"); + write(fido,str,strlen(str)); + } if(mode&WM_FILE) { - sprintf(str,"\1FLAGS KFS\r\n"); - write(fido,str,strlen(str)); } + SAFECOPY(str,"\1FLAGS KFS\r\n"); + write(fido,str,strlen(str)); + } if(cc_sent) { - sprintf(str,"* Originally to: %s\r\n\r\n",into); - write(fido,str,strlen(str)); } + SAFEPRINTF(str,"* Originally to: %s\r\n\r\n",into); + write(fido,str,strlen(str)); + } l=0L; while(l=length || toupper(buf[l])=='Z') /* EOF */ + break; + if((ch=ctrl_a_to_ascii_char(buf[l])) != 0) + write(fido,&ch,1); + } else if(buf[l]!=LF) { if((uchar)buf[l]==0x8d) /* r0dent i converted to normal i */ buf[l]='i'; - write(fido,buf+l,1); } - l++; } + write(fido,buf+l,1); + } + l++; + } l=0; write(fido,&l,1); /* Null terminator */ close(fido); @@ -370,10 +388,12 @@ bool sbbs_t::netmail(char *into, char *t for(l=0;l999999L) { errormsg(WHERE,ERR_CHK,"QWK blocks",n); - return; } + return; + } if((qwkbuf=(char *)malloc(n*QWK_BLOCK_LEN))==NULL) { errormsg(WHERE,ERR_ALLOC,nulstr,n*QWK_BLOCK_LEN); - return; } + return; + } memcpy((char *)qwkbuf,block,QWK_BLOCK_LEN); fread(qwkbuf+QWK_BLOCK_LEN,n-1,QWK_BLOCK_LEN,rep); if(into==NULL) sprintf(to,"%-128.128s",(char *)qwkbuf+QWK_BLOCK_LEN); /* To user on first line */ else - strcpy(to,into); + SAFECOPY(to,into); p=strchr(to,QWK_NEWLINE); /* chop off at first CR */ if(p) *p=0; - strcpy(name,to); + SAFECOPY(name,to); p=strchr(name,'@'); if(p) *p=0; truncsp(name); @@ -452,7 +485,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha p=strrchr(to,'@'); /* Find '@' in name@addr */ if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) { /* QWKnet */ qnet=1; - *p=0; } + *p=0; + } else if(p==NULL || !isdigit(*(p+1)) || !cfg.total_faddrs) { if(p==NULL && cfg.dflt_faddr.zone) fidoaddr=cfg.dflt_faddr; @@ -464,24 +498,28 @@ void sbbs_t::qwktonetmail(FILE *rep, cha else { bputs(text[InvalidNetMailAddr]); free(qwkbuf); - return; } } + return; + } + } else { fidoaddr=atofaddr(&cfg,p+1); /* Get fido address */ *p=0; /* Chop off address */ - } + } if(!inet && !qnet && /* FidoNet */ ((!SYSOP && !(cfg.netmail_misc&NMAIL_ALLOW)) || !cfg.total_faddrs)) { bputs(text[NoNetMailAllowed]); free(qwkbuf); - return; } + return; + } truncsp(to); /* Truncate off space */ if(!stricmp(to,"SBBS") && !SYSOP && qnet) { free(qwkbuf); - return; } + return; + } l=QWK_BLOCK_LEN; /* Start of message text */ @@ -489,7 +527,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha if(into==NULL) { /* If name@addr on first line, skip first line */ while(l<(n*QWK_BLOCK_LEN) && qwkbuf[l]!=QWK_NEWLINE) l++; - l++; } + l++; + } memset(&msg,0,sizeof(smbmsg_t)); msg.hdr.version=smb_ver(); @@ -509,20 +548,23 @@ void sbbs_t::qwktonetmail(FILE *rep, cha sprintf(senderaddr,"%s/%s" ,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,cp); strupr(senderaddr); - smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); } + smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); + } else { if(fromhub) - strcpy(senderaddr, cfg.qhub[fromhub-1]->id); + SAFECOPY(senderaddr, cfg.qhub[fromhub-1]->id); else - strcpy(senderaddr, useron.alias); + SAFECOPY(senderaddr, useron.alias); strupr(senderaddr); - smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); } - sprintf(sender,"%.25s",block+46); } /* From name */ + smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); + } + sprintf(sender,"%.25s",block+46); /* From name */ + } else { /* Not Networked */ msg.hdr.when_written.zone=sys_timezone(&cfg); sprintf(str,"%u",useron.number); smb_hfield(&msg,SENDEREXT,strlen(str),str); - strcpy(sender,(qnet || cfg.inetmail_misc&NMAIL_ALIAS) + SAFECOPY(sender,(qnet || cfg.inetmail_misc&NMAIL_ALIAS) ? useron.alias : useron.name); } truncsp(sender); @@ -538,7 +580,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha l+=strlen(str)+1; cp=str+4; while(*cp && *cp<=' ') cp++; - msg.hdr.when_written.zone=(short)ahtoul(cp); } + msg.hdr.when_written.zone=(short)ahtoul(cp); + } else msg.hdr.when_written.zone=sys_timezone(&cfg); memset(&tm,0,sizeof(tm)); @@ -574,15 +617,15 @@ void sbbs_t::qwktonetmail(FILE *rep, cha smb_hfield(&msg,SENDER,strlen(cfg.sys_id),cfg.sys_id); msg.idx.from=0; msg.idx.to=useron.number; - strcpy(to,sender); - strcpy(fulladdr,senderaddr); - sprintf(str,"BADADDR: %s",addr); + SAFECOPY(to,sender); + SAFECOPY(fulladdr,senderaddr); + SAFEPRINTF(str,"BADADDR: %s",addr); smb_hfield(&msg,SUBJECT,strlen(str),str); net=NET_NONE; smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net); } /* This is required for fixsmb to be able to rebuild the index */ - sprintf(str,"%u",msg.idx.to); + SAFEPRINTF(str,"%u",msg.idx.to); smb_hfield_str(&msg,RECIPIENTEXT,str); smb_hfield(&msg,RECIPIENT,strlen(name),name); @@ -590,9 +633,11 @@ void sbbs_t::qwktonetmail(FILE *rep, cha smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); truncsp(fulladdr); - smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr); + if(fulladdr[0]) + smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr); - bprintf(text[NetMailing],to,fulladdr,sender,cfg.sys_id); } + bprintf(text[NetMailing],to,fulladdr,sender,cfg.sys_id); + } if(inet) { /* Internet E-mail */ @@ -601,12 +646,15 @@ void sbbs_t::qwktonetmail(FILE *rep, cha bputs(text[NotEnoughCredits]); free(qwkbuf); smb_freemsgmem(&msg); - return; } + return; + } sprintf(str,text[NetMailCostContinueQ],cfg.inetmail_cost); if(noyes(str)) { free(qwkbuf); smb_freemsgmem(&msg); - return; } } + return; + } + } net=NET_INTERNET; smb_hfield(&msg,RECIPIENT,strlen(name),name); @@ -616,7 +664,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha bprintf(text[NetMailing],name,to ,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name - ,cfg.sys_inetaddr); } + ,cfg.sys_inetaddr); + } if(qnet || inet) { @@ -626,7 +675,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha errormsg(WHERE,ERR_OPEN,"MAIL",i); free(qwkbuf); smb_freemsgmem(&msg); - return; } + return; + } sprintf(smb.file,"%smail", cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; @@ -635,7 +685,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(qwkbuf); smb_freemsgmem(&msg); - return; } + return; + } if(smb_fgetlength(smb.shd_fp)<1L) { /* Create it if it doesn't exist */ smb.status.max_crcs=cfg.mail_maxcrcs; @@ -648,7 +699,9 @@ void sbbs_t::qwktonetmail(FILE *rep, cha errormsg(WHERE,ERR_CREATE,smb.file,i,smb.last_error); free(qwkbuf); smb_freemsgmem(&msg); - return; } } + return; + } + } length=n*256L; // Extra big for CRLF xlat, was (n-1L)*256L (03/16/96) @@ -660,7 +713,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha errormsg(WHERE,ERR_LEN,str,length); free(qwkbuf); smb_freemsgmem(&msg); - return; } + return; + } if((i=smb_open_da(&smb))!=0) { smb_close(&smb); @@ -668,7 +722,8 @@ void sbbs_t::qwktonetmail(FILE *rep, cha errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); free(qwkbuf); smb_freemsgmem(&msg); - return; } + return; + } if(cfg.sys_misc&SM_FASTMAIL) offset=smb_fallocdat(&smb,length,1); else @@ -685,9 +740,11 @@ void sbbs_t::qwktonetmail(FILE *rep, cha if(qwkbuf[l]==QWK_NEWLINE) { smb_fwrite(&smb,crlf,2,smb.sdt_fp); m+=2; - continue; } + continue; + } smb_fputc(qwkbuf[l],smb.sdt_fp); - m++; } + m++; + } for(ch=0;mid : useron.alias); strupr(tmp); - strcat(str,tmp); } + strcat(str,tmp); + } else - strcpy(str,cfg.netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); + SAFECOPY(str,cfg.netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); SAFECOPY(hdr.from,str); SAFECOPY(hdr.to,to); @@ -756,11 +817,14 @@ void sbbs_t::qwktonetmail(FILE *rep, cha if(useron.cdt+useron.freecdt=length || toupper(qwkbuf[l])=='Z') /* EOF */ + break; + if((ch=ctrl_a_to_ascii_char(qwkbuf[l])) != 0) + write(fido,&ch,1); + } else if(qwkbuf[l]!=LF) { if(qwkbuf[l]==QWK_NEWLINE) /* QWK cr/lf char converted to hard CR */ qwkbuf[l]=CR; - write(fido,(char *)qwkbuf+l,1); } - l++; } + write(fido,(char *)qwkbuf+l,1); + } + l++; + } l=0; write(fido,&l,1); /* Null terminator */ close(fido); @@ -893,13 +976,15 @@ faddr_t atofaddr(scfg_t* cfg, char *str) addr.zone=addr.net=addr.node=addr.point=0; if((p=strchr(str,':'))!=NULL) { addr.zone=atoi(str); - addr.net=atoi(p+1); } + addr.net=atoi(p+1); + } else { if(cfg->total_faddrs) addr.zone=cfg->faddr[0].zone; else addr.zone=1; - addr.net=atoi(str); } + addr.net=atoi(str); + } if(!addr.zone) /* no such thing as zone 0 */ addr.zone=1; if((p=strchr(str,'/'))!=NULL) @@ -909,7 +994,8 @@ faddr_t atofaddr(scfg_t* cfg, char *str) addr.net=cfg->faddr[0].net; else addr.net=1; - addr.node=atoi(str); } + addr.node=atoi(str); + } if((p=strchr(str,'.'))!=NULL) addr.point=atoi(p+1); return(addr);