--- sbbs/src/sbbs3/netmail.cpp 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/netmail.cpp 2018/04/24 16:43:36 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet network mail-related functions */ -/* $Id: netmail.cpp,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ +/* $Id: netmail.cpp,v 1.1.1.2 2018/04/24 16:43:36 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 2005 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 * @@ -40,11 +40,13 @@ /****************************************************************************/ /****************************************************************************/ -bool sbbs_t::inetmail(char *into, char *subj, long mode) +bool sbbs_t::inetmail(const char *into, const char *subj, long mode) { char str[256],str2[256],msgpath[256],title[256],name[256],ch ,buf[SDT_BLOCK_LEN],*p,addr[256]; char tmp[512]; + char pid[128]; + char* editor=NULL; char your_addr[128]; ushort xlat=XLAT_NONE,net=NET_INTERNET; int i,j,x,file; @@ -53,26 +55,29 @@ bool sbbs_t::inetmail(char *into, char * FILE *instream; smbmsg_t msg; - 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); } - strcpy(name,into); - strcpy(addr,into); - strcpy(title,subj); + SAFECOPY(name,into); + SAFECOPY(addr,into); + SAFECOPY(title,subj); if((!SYSOP && !(cfg.inetmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M')) { bputs(text[NoNetMailAllowed]); - return(false); } + return(false); + } if(cfg.inetmail_cost && !(useron.exempt&FLAG('S'))) { if(useron.cdt+useron.freecdtulcmd[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]); remove(msgpath); - 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],title,ultoac(l,tmp)); else { bprintf(text[FileNotReceived],title); remove(msgpath); - return(false); } } + return(false); + } + } if((i=smb_stack(&smb,SMB_STACK_PUSH))!=SMB_SUCCESS) { errormsg(WHERE,ERR_OPEN,"MAIL",i); - return(false); } + return(false); + } sprintf(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; if((i=smb_open(&smb))!=SMB_SUCCESS) { smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ smb.status.max_crcs=cfg.mail_maxcrcs; @@ -165,30 +167,35 @@ bool sbbs_t::inetmail(char *into, char * if((i=smb_create(&smb))!=SMB_SUCCESS) { smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return(false); } } + errormsg(WHERE,ERR_CREATE,smb.file,i,smb.last_error); + return(false); + } + } if((i=smb_locksmbhdr(&smb))!=SMB_SUCCESS) { smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(false); } + errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); + return(false); + } - length=flength(msgpath)+2; /* +2 for translation string */ + length=(long)flength(msgpath)+2; /* +2 for translation string */ if(length&0xfff00000UL) { smb_unlocksmbhdr(&smb); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_LEN,msgpath,length); - return(false); } + return(false); + } if((i=smb_open_da(&smb))!=SMB_SUCCESS) { smb_unlocksmbhdr(&smb); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } if(cfg.sys_misc&SM_FASTMAIL) offset=smb_fallocdat(&smb,length,1); else @@ -202,7 +209,8 @@ bool sbbs_t::inetmail(char *into, char * smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return(false); } + return(false); + } setvbuf(instream,NULL,_IOFBF,2*1024); fseek(smb.sdt_fp,offset,SEEK_SET); @@ -217,7 +225,8 @@ bool sbbs_t::inetmail(char *into, char * if(j>1 && (j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) buf[j-1]=buf[j-2]=0; fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } + x=SDT_BLOCK_LEN; + } fflush(smb.sdt_fp); fclose(instream); @@ -235,8 +244,7 @@ bool sbbs_t::inetmail(char *into, char * smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); smb_hfield_str(&msg,RECIPIENTNETADDR,addr); - strcpy(str,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); - smb_hfield_str(&msg,SENDER,str); + smb_hfield_str(&msg,SENDER,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); sprintf(str,"%u",useron.number); smb_hfield_str(&msg,SENDEREXT,str); @@ -248,9 +256,15 @@ bool sbbs_t::inetmail(char *into, char * /* Security logging */ msg_client_hfields(&msg,&client); + smb_hfield_str(&msg,SENDERSERVER,startup->host_name); smb_hfield_str(&msg,SUBJECT,title); - strcpy(str,title); + + /* Generate FidoNet Program Identifier */ + smb_hfield_str(&msg,FIDOPID,msg_program_id(pid)); + + if(editor!=NULL) + smb_hfield_str(&msg,SMB_EDITOR,editor); smb_dfield(&msg,TEXT_BODY,length); @@ -286,28 +300,31 @@ bool sbbs_t::inetmail(char *into, char * return(true); } -bool sbbs_t::qnetmail(char *into, char *subj, long mode) +bool sbbs_t::qnetmail(const char *into, const char *subj, long mode) { char str[256],msgpath[128],title[128],to[128],fulladdr[128] ,buf[SDT_BLOCK_LEN],*addr; char tmp[512]; + char pid[128]; + char* editor=NULL; ushort xlat=XLAT_NONE,net=NET_QWK,touser; int i,j,x,file; ulong length,offset; FILE *instream; smbmsg_t msg; - 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); } - strcpy(to,into); - strcpy(title,subj); + SAFECOPY(to,into); + SAFECOPY(title,subj); if(useron.rest&FLAG('M')) { bputs(text[NoNetMailAllowed]); - return(false); } + return(false); + } addr=strrchr(to,'@'); if(!addr) { @@ -335,20 +352,23 @@ bool sbbs_t::qnetmail(char *into, char * nodesync(); sprintf(msgpath,"%snetmail.msg",cfg.node_dir); - if(!writemsg(msgpath,nulstr,title,mode|WM_QWKNET,INVALID_SUB,to)) { + if(!writemsg(msgpath,nulstr,title,mode|WM_QWKNET,INVALID_SUB,to,&editor)) { bputs(text[Aborted]); - return(false); } + return(false); + } if((i=smb_stack(&smb,SMB_STACK_PUSH))!=SMB_SUCCESS) { errormsg(WHERE,ERR_OPEN,"MAIL",i); - return(false); } + return(false); + } sprintf(smb.file,"%smail",cfg.data_dir); smb.retry_time=cfg.smb_retry_time; smb.subnum=INVALID_SUB; if((i=smb_open(&smb))!=SMB_SUCCESS) { smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ smb.status.max_crcs=cfg.mail_maxcrcs; @@ -359,29 +379,34 @@ bool sbbs_t::qnetmail(char *into, char * smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_CREATE,smb.file,i,smb.last_error); - return(false); } } + return(false); + } + } if((i=smb_locksmbhdr(&smb))!=SMB_SUCCESS) { smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); - return(false); } + return(false); + } - length=flength(msgpath)+2; /* +2 for translation string */ + length=(long)flength(msgpath)+2; /* +2 for translation string */ if(length&0xfff00000UL) { smb_unlocksmbhdr(&smb); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_LEN,msgpath,length); - return(false); } + return(false); + } if((i=smb_open_da(&smb))!=SMB_SUCCESS) { smb_unlocksmbhdr(&smb); smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } if(cfg.sys_misc&SM_FASTMAIL) offset=smb_fallocdat(&smb,length,1); else @@ -395,7 +420,8 @@ bool sbbs_t::qnetmail(char *into, char * smb_close(&smb); smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return(false); } + return(false); + } setvbuf(instream,NULL,_IOFBF,2*1024); fseek(smb.sdt_fp,offset,SEEK_SET); @@ -410,7 +436,8 @@ bool sbbs_t::qnetmail(char *into, char * if(j>1 && (j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) buf[j-1]=buf[j-2]=0; fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } + x=SDT_BLOCK_LEN; + } fflush(smb.sdt_fp); fclose(instream); @@ -437,9 +464,16 @@ bool sbbs_t::qnetmail(char *into, char * /* Security logging */ msg_client_hfields(&msg,&client); + smb_hfield_str(&msg,SENDERSERVER,startup->host_name); smb_hfield_str(&msg,SUBJECT,title); + /* Generate FidoNet Program Identifier */ + smb_hfield_str(&msg,FIDOPID,msg_program_id(pid)); + + if(editor!=NULL) + smb_hfield_str(&msg,SMB_EDITOR,editor); + smb_dfield(&msg,TEXT_BODY,length); i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); // calls smb_unlocksmbhdr()