--- sbbs/src/sbbs3/email.cpp 2018/04/24 16:41:24 1.1.1.1 +++ sbbs/src/sbbs3/email.cpp 2018/04/24 16:43:59 1.1.1.2 @@ -2,13 +2,13 @@ /* Synchronet email function - for sending private e-mail */ -/* $Id: email.cpp,v 1.1.1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: email.cpp,v 1.1.1.2 2018/04/24 16:43:59 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 * @@ -43,46 +43,56 @@ /* of message. */ /* Called from functions main_sec, newuser, readmail and scanposts */ /****************************************************************************/ -bool sbbs_t::email(int usernumber, char *top, char *subj, long mode) +bool sbbs_t::email(int usernumber, const char *top, const char *subj, long mode) { - char str[256],str2[256],msgpath[256],title[LEN_TITLE+1],ch - ,buf[SDT_BLOCK_LEN]; - char tmp[512]; - ushort xlat=XLAT_NONE,msgattr=0; - ushort nettype; - int i,j,x,file; - long l; - ulong length,offset,crc=0xffffffffUL; - FILE *instream; - node_t node; - smbmsg_t msg; + char str[256],str2[256],msgpath[256],title[LEN_TITLE+1],ch + ,buf[SDT_BLOCK_LEN]; + char tmp[512]; + char pid[128]; + char* editor=NULL; + ushort msgattr=0; + uint16_t xlat=XLAT_NONE; + ushort nettype; + int i,j,x,file; + long l; + long length; + ulong offset; + uint32_t crc=0xffffffffUL; + FILE* instream; + node_t node; + smbmsg_t msg; SAFECOPY(title,subj); - 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); } + return(false); + } if(usernumber==1 && useron.rest&FLAG('S') && (cfg.node_valuser!=1 || useron.fbacks || useron.emails)) { /* ! val fback */ bprintf(text[R_Feedback],cfg.sys_op); - return(false); } + return(false); + } if(usernumber!=1 && useron.rest&FLAG('E') && (cfg.node_valuser!=usernumber || useron.fbacks || useron.emails)) { bputs(text[R_Email]); - return(false); } + return(false); + } if(!usernumber) { bputs(text[UnknownUser]); - return(false); } + return(false); + } getuserrec(&cfg,usernumber,U_MISC,8,str); l=ahtoul(str); if(l&(DELETED|INACTIVE)) { /* Deleted or Inactive User */ bputs(text[UnknownUser]); - return(false); } + return(false); + } if(l&NETMAIL && cfg.sys_misc&SM_FWDTONET) { getuserrec(&cfg,usernumber,U_NETMAIL,LEN_NETMAIL,str); bprintf(text[UserNetMail],str); - if(yesno(text[ForwardMailQ])) /* Forward to netmail address */ + if(text[ForwardMailQ][0]==0 || yesno(text[ForwardMailQ])) /* Forward to netmail address */ return(netmail(str,subj,mode)); } bprintf(text[Emailing],username(&cfg,usernumber,tmp),usernumber); @@ -93,7 +103,8 @@ bool sbbs_t::email(int usernumber, char if(usernumber==1 && useron.fbacks && fexist(str)) { exec_bin("feedback",&main_csi); if(main_csi.logic!=LOGIC_TRUE) - return(false); } + return(false); + } if(cfg.sys_misc&SM_ANON_EM && useron.exempt&FLAG('A') && !noyes(text[AnonymousQ])) @@ -104,7 +115,7 @@ bool sbbs_t::email(int usernumber, char msg_tmp_fname(useron.xedit, msgpath, sizeof(msgpath)); username(&cfg,usernumber,str2); - if(!writemsg(msgpath,top,title,mode,INVALID_SUB,str2)) { + if(!writemsg(msgpath,top,title,mode,INVALID_SUB,str2,&editor)) { bputs(text[Aborted]); return(false); } @@ -120,35 +131,26 @@ bool sbbs_t::email(int usernumber, char if(fexistcase(str2)) { bputs(text[FileAlreadyThere]); remove(msgpath); - 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]); - remove(msgpath); - return(false); } - backslash(str); - strcat(str,title); - mv(str,str2,1); } - 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]); 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); + } + } bputs(text[WritingIndx]); if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { 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))!=0) { smb_stack(&smb,SMB_STACK_POP); errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); - return(false); } + return(false); + } if(smb_fgetlength(smb.shd_fp)<1) { /* Create it if it doesn't exist */ smb.status.max_crcs=cfg.mail_maxcrcs; @@ -186,29 +192,34 @@ bool sbbs_t::email(int usernumber, 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))!=0) { 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))!=0) { 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 @@ -222,7 +233,8 @@ bool sbbs_t::email(int usernumber, 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); smb_fseek(smb.sdt_fp,offset,SEEK_SET); @@ -238,9 +250,11 @@ bool sbbs_t::email(int usernumber, char buf[j-1]=buf[j-2]=0; if(cfg.mail_maxcrcs) { for(i=0;ihost_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() @@ -325,9 +348,12 @@ bool sbbs_t::email(int usernumber, char && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { sprintf(str,text[EmailNodeMsg],cfg.node_num,useron.alias); putnmsg(&cfg,i,str); - break; } } + break; + } + } if(i>cfg.sys_nodes) { /* User wasn't online, so leave short msg */ sprintf(str,text[UserSentYouMail],useron.alias); - putsmsg(&cfg,usernumber,str); } + putsmsg(&cfg,usernumber,str); + } return(true); }