|
|
1.1 ! root 1: /* netmail.cpp */ ! 2: ! 3: /* Synchronet network mail-related functions */ ! 4: ! 5: /* $Id: netmail.cpp,v 1.6 2000/12/31 03:41:55 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: #include "qwk.h" ! 40: ! 41: /****************************************************************************/ ! 42: /****************************************************************************/ ! 43: bool sbbs_t::inetmail(char *into, char *subj, long mode) ! 44: { ! 45: char str[256],str2[256],msgpath[256],title[256],name[256],ch ! 46: ,buf[SDT_BLOCK_LEN],*p,addr[256],*uname_p; ! 47: char tmp[512]; ! 48: char your_addr[128]; ! 49: ushort xlat=XLAT_NONE,net=NET_INTERNET; ! 50: int i,j,x,file; ! 51: long l; ! 52: ulong length,offset; ! 53: FILE *instream; ! 54: smbmsg_t msg; ! 55: ! 56: if(useron.etoday>=cfg.level_emailperday[useron.level] && !SYSOP) { ! 57: bputs(text[TooManyEmailsToday]); ! 58: return(false); ! 59: } ! 60: ! 61: strcpy(name,into); ! 62: strcpy(addr,into); ! 63: strcpy(title,subj); ! 64: ! 65: if((!SYSOP && !(cfg.inetmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M')) { ! 66: bputs(text[NoNetMailAllowed]); ! 67: return(false); } ! 68: ! 69: if(cfg.inetmail_cost && !(useron.exempt&FLAG('S'))) { ! 70: if(useron.cdt+useron.freecdt<cfg.inetmail_cost) { ! 71: bputs(text[NotEnoughCredits]); ! 72: return(false); } ! 73: sprintf(str,text[NetMailCostContinueQ],cfg.inetmail_cost); ! 74: if(noyes(str)) ! 75: return(false); } ! 76: ! 77: /* Get destination user name */ ! 78: p=strrchr(name,'@'); ! 79: if(!p) ! 80: p=strrchr(name,'!'); ! 81: if(p) { ! 82: *p=0; ! 83: truncsp(name); } ! 84: ! 85: /* Get this user's internet mailing address */ ! 86: uname_p=cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name; ! 87: if(strchr(uname_p,'.')) ! 88: sprintf(your_addr,"\"%s\"@",uname_p); ! 89: else { ! 90: sprintf(your_addr,"%s@",uname_p); ! 91: for(i=0;your_addr[i];i++) ! 92: if(your_addr[i]==' ' || your_addr[i]&0x80) ! 93: your_addr[i]='.'; ! 94: strlwr(your_addr); ! 95: } ! 96: strcat(your_addr,cfg.sys_inetaddr); ! 97: ! 98: bprintf(text[InternetMailing],addr,your_addr); ! 99: action=NODE_SMAL; ! 100: nodesync(); ! 101: ! 102: sprintf(msgpath,"%snetmail.msg",cfg.node_dir); ! 103: if(!writemsg(msgpath,nulstr,title,mode,0,into)) { ! 104: bputs(text[Aborted]); ! 105: return(false); } ! 106: ! 107: if(mode&WM_FILE) { ! 108: sprintf(str2,"%sfile/%04u.out",cfg.data_dir,useron.number); ! 109: _mkdir(str2); ! 110: sprintf(str2,"%sfile/%04u.out/%s",cfg.data_dir,useron.number,title); ! 111: if(fexist(str2)) { ! 112: bputs(text[FileAlreadyThere]); ! 113: remove(msgpath); ! 114: return(false); } ! 115: if(online==ON_LOCAL) { /* Local upload */ ! 116: bputs(text[EnterPath]); ! 117: if(!getstr(str,60,K_LINE|K_UPPER)) { ! 118: bputs(text[Aborted]); ! 119: remove(msgpath); ! 120: return(false); } ! 121: backslash(str); ! 122: strcat(str,title); ! 123: mv(str,str2,1); } ! 124: else { /* Remote */ ! 125: menu("ulprot"); ! 126: mnemonics(text[ProtocolOrQuit]); ! 127: strcpy(str,"Q"); ! 128: for(x=0;x<cfg.total_prots;x++) ! 129: if(cfg.prot[x]->ulcmd[0] && chk_ar(cfg.prot[x]->ar,&useron)) { ! 130: sprintf(tmp,"%c",cfg.prot[x]->mnemonic); ! 131: strcat(str,tmp); } ! 132: ch=(char)getkeys(str,0); ! 133: if(ch=='Q' || sys_status&SS_ABORT) { ! 134: bputs(text[Aborted]); ! 135: remove(msgpath); ! 136: return(false); } ! 137: for(x=0;x<cfg.total_prots;x++) ! 138: if(cfg.prot[x]->ulcmd[0] && cfg.prot[x]->mnemonic==ch ! 139: && chk_ar(cfg.prot[x]->ar,&useron)) ! 140: break; ! 141: if(x<cfg.total_prots) /* This should be always */ ! 142: protocol(cmdstr(cfg.prot[x]->ulcmd,str2,nulstr,NULL),0); } ! 143: l=flength(str2); ! 144: if(l>0) ! 145: bprintf(text[FileNBytesReceived],title,ultoac(l,tmp)); ! 146: else { ! 147: bprintf(text[FileNotReceived],title); ! 148: remove(msgpath); ! 149: return(false); } } ! 150: ! 151: if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { ! 152: errormsg(WHERE,ERR_OPEN,"MAIL",i); ! 153: return(false); } ! 154: sprintf(smb.file,"%smail",cfg.data_dir); ! 155: smb.retry_time=cfg.smb_retry_time; ! 156: if((i=smb_open(&smb))!=0) { ! 157: smb_stack(&smb,SMB_STACK_POP); ! 158: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 159: return(false); } ! 160: ! 161: if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ ! 162: smb.status.max_crcs=cfg.mail_maxcrcs; ! 163: smb.status.max_age=cfg.mail_maxage; ! 164: smb.status.max_msgs=MAX_SYSMAIL; ! 165: smb.status.attr=SMB_EMAIL; ! 166: if((i=smb_create(&smb))!=0) { ! 167: smb_close(&smb); ! 168: smb_stack(&smb,SMB_STACK_POP); ! 169: errormsg(WHERE,ERR_CREATE,smb.file,i); ! 170: return(false); } } ! 171: ! 172: if((i=smb_locksmbhdr(&smb))!=0) { ! 173: smb_close(&smb); ! 174: smb_stack(&smb,SMB_STACK_POP); ! 175: errormsg(WHERE,ERR_LOCK,smb.file,i); ! 176: return(false); } ! 177: ! 178: length=flength(msgpath)+2; /* +2 for translation string */ ! 179: ! 180: if(length&0xfff00000UL) { ! 181: smb_unlocksmbhdr(&smb); ! 182: smb_close(&smb); ! 183: smb_stack(&smb,SMB_STACK_POP); ! 184: errormsg(WHERE,ERR_LEN,msgpath,length); ! 185: return(false); } ! 186: ! 187: if((i=smb_open_da(&smb))!=0) { ! 188: smb_unlocksmbhdr(&smb); ! 189: smb_close(&smb); ! 190: smb_stack(&smb,SMB_STACK_POP); ! 191: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 192: return(false); } ! 193: if(cfg.sys_misc&SM_FASTMAIL) ! 194: offset=smb_fallocdat(&smb,length,1); ! 195: else ! 196: offset=smb_allocdat(&smb,length,1); ! 197: smb_close_da(&smb); ! 198: ! 199: if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 ! 200: || (instream=fdopen(file,"rb"))==NULL) { ! 201: smb_freemsgdat(&smb,offset,length,1); ! 202: smb_unlocksmbhdr(&smb); ! 203: smb_close(&smb); ! 204: smb_stack(&smb,SMB_STACK_POP); ! 205: errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); ! 206: return(false); } ! 207: ! 208: setvbuf(instream,NULL,_IOFBF,2*1024); ! 209: fseek(smb.sdt_fp,offset,SEEK_SET); ! 210: xlat=XLAT_NONE; ! 211: fwrite(&xlat,2,1,smb.sdt_fp); ! 212: x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ ! 213: while(!feof(instream)) { ! 214: memset(buf,0,x); ! 215: j=fread(buf,1,x,instream); ! 216: if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) ! 217: buf[j-1]=buf[j-2]=0; ! 218: fwrite(buf,j,1,smb.sdt_fp); ! 219: x=SDT_BLOCK_LEN; } ! 220: fflush(smb.sdt_fp); ! 221: fclose(instream); ! 222: ! 223: memset(&msg,0,sizeof(smbmsg_t)); ! 224: memcpy(msg.hdr.id,"SHD\x1a",4); ! 225: msg.hdr.version=smb_ver(); ! 226: if(mode&WM_FILE) ! 227: msg.hdr.auxattr|=MSG_FILEATTACH; ! 228: msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); ! 229: msg.hdr.when_written.zone=msg.hdr.when_imported.zone=cfg.sys_timezone; ! 230: ! 231: msg.hdr.offset=offset; ! 232: ! 233: net=NET_INTERNET; ! 234: smb_hfield(&msg,RECIPIENT,strlen(name),name); ! 235: msg.idx.to=0; /* Out-bound NetMail set to 0 */ ! 236: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); ! 237: smb_hfield(&msg,RECIPIENTNETADDR,strlen(addr),addr); ! 238: ! 239: strcpy(str,cfg.inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); ! 240: smb_hfield(&msg,SENDER,strlen(str),str); ! 241: ! 242: sprintf(str,"%u",useron.number); ! 243: smb_hfield(&msg,SENDEREXT,strlen(str),str); ! 244: msg.idx.from=useron.number; ! 245: ! 246: /* ! 247: smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net); ! 248: smb_hfield(&msg,SENDERNETADDR,strlen(sys_inetaddr),sys_inetaddr); ! 249: */ ! 250: ! 251: smb_hfield(&msg,SUBJECT,strlen(title),title); ! 252: strcpy(str,title); ! 253: strlwr(str); ! 254: msg.idx.subj=crc16(str); ! 255: ! 256: smb_dfield(&msg,TEXT_BODY,length); ! 257: ! 258: smb_unlocksmbhdr(&smb); ! 259: i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); ! 260: smb_close(&smb); ! 261: smb_stack(&smb,SMB_STACK_POP); ! 262: ! 263: smb_freemsgmem(&msg); ! 264: if(i) { ! 265: smb_freemsgdat(&smb,offset,length,1); ! 266: errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); ! 267: return(false); } ! 268: ! 269: if(mode&WM_FILE && online==ON_REMOTE) ! 270: autohangup(); ! 271: ! 272: if(cfg.inetmail_sem[0]) /* update semaphore file */ ! 273: if((file=nopen(cmdstr(cfg.inetmail_sem,nulstr,nulstr,NULL) ! 274: ,O_WRONLY|O_CREAT|O_TRUNC))!=-1) ! 275: close(file); ! 276: if(!(useron.exempt&FLAG('S'))) ! 277: subtract_cdt(&cfg,&useron,cfg.inetmail_cost); ! 278: ! 279: useron.emails++; ! 280: logon_emails++; ! 281: putuserrec(&cfg,useron.number,U_EMAILS,5,ultoa(useron.emails,tmp,10)); ! 282: useron.etoday++; ! 283: putuserrec(&cfg,useron.number,U_ETODAY,5,ultoa(useron.etoday,tmp,10)); ! 284: ! 285: sprintf(str,"Sent Internet Mail to %s (%s)",name,addr); ! 286: logline("EN",str); ! 287: return(true); ! 288: } ! 289: ! 290: bool sbbs_t::qnetmail(char *into, char *subj, long mode) ! 291: { ! 292: char str[256],msgpath[128],title[128],to[128],fulladdr[128] ! 293: ,buf[SDT_BLOCK_LEN],*addr; ! 294: char tmp[512]; ! 295: ushort xlat=XLAT_NONE,net=NET_QWK,touser; ! 296: int i,j,x,file; ! 297: ulong length,offset; ! 298: FILE *instream; ! 299: smbmsg_t msg; ! 300: ! 301: if(useron.etoday>=cfg.level_emailperday[useron.level] && !SYSOP) { ! 302: bputs(text[TooManyEmailsToday]); ! 303: return(false); ! 304: } ! 305: ! 306: strcpy(to,into); ! 307: strcpy(title,subj); ! 308: ! 309: if(useron.rest&FLAG('M')) { ! 310: bputs(text[NoNetMailAllowed]); ! 311: return(false); } ! 312: ! 313: addr=strrchr(to,'@'); ! 314: if(!addr) { ! 315: bputs("Invalid netmail address\r\n"); ! 316: return(false); } ! 317: *addr=0; ! 318: addr++; ! 319: strupr(addr); ! 320: truncsp(addr); ! 321: touser=qwk_route(addr,fulladdr); ! 322: if(!fulladdr[0]) { ! 323: bputs("Invalid netmail address\r\n"); ! 324: return(false); } ! 325: ! 326: truncsp(to); ! 327: if(!stricmp(to,"SBBS") && !SYSOP) { ! 328: bputs("Invalid netmail address\r\n"); ! 329: return(false); } ! 330: bprintf(text[NetMailing],to,fulladdr ! 331: ,useron.alias,cfg.sys_id); ! 332: action=NODE_SMAL; ! 333: nodesync(); ! 334: ! 335: sprintf(msgpath,"%snetmali.msg",cfg.node_dir); ! 336: if(!writemsg(msgpath,nulstr,title,mode|WM_QWKNET,0,to)) { ! 337: bputs(text[Aborted]); ! 338: return(false); } ! 339: ! 340: if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { ! 341: errormsg(WHERE,ERR_OPEN,"MAIL",i); ! 342: return(false); } ! 343: sprintf(smb.file,"%smail",cfg.data_dir); ! 344: smb.retry_time=cfg.smb_retry_time; ! 345: if((i=smb_open(&smb))!=0) { ! 346: smb_stack(&smb,SMB_STACK_POP); ! 347: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 348: return(false); } ! 349: ! 350: if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ ! 351: smb.status.max_crcs=cfg.mail_maxcrcs; ! 352: smb.status.max_msgs=MAX_SYSMAIL; ! 353: smb.status.max_age=cfg.mail_maxage; ! 354: smb.status.attr=SMB_EMAIL; ! 355: if((i=smb_create(&smb))!=0) { ! 356: smb_close(&smb); ! 357: smb_stack(&smb,SMB_STACK_POP); ! 358: errormsg(WHERE,ERR_CREATE,smb.file,i,smb.last_error); ! 359: return(false); } } ! 360: ! 361: if((i=smb_locksmbhdr(&smb))!=0) { ! 362: smb_close(&smb); ! 363: smb_stack(&smb,SMB_STACK_POP); ! 364: errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error); ! 365: return(false); } ! 366: ! 367: length=flength(msgpath)+2; /* +2 for translation string */ ! 368: ! 369: if(length&0xfff00000UL) { ! 370: smb_unlocksmbhdr(&smb); ! 371: smb_close(&smb); ! 372: smb_stack(&smb,SMB_STACK_POP); ! 373: errormsg(WHERE,ERR_LEN,msgpath,length); ! 374: return(false); } ! 375: ! 376: if((i=smb_open_da(&smb))!=0) { ! 377: smb_unlocksmbhdr(&smb); ! 378: smb_close(&smb); ! 379: smb_stack(&smb,SMB_STACK_POP); ! 380: errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error); ! 381: return(false); } ! 382: if(cfg.sys_misc&SM_FASTMAIL) ! 383: offset=smb_fallocdat(&smb,length,1); ! 384: else ! 385: offset=smb_allocdat(&smb,length,1); ! 386: smb_close_da(&smb); ! 387: ! 388: if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 ! 389: || (instream=fdopen(file,"rb"))==NULL) { ! 390: smb_freemsgdat(&smb,offset,length,1); ! 391: smb_unlocksmbhdr(&smb); ! 392: smb_close(&smb); ! 393: smb_stack(&smb,SMB_STACK_POP); ! 394: errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); ! 395: return(false); } ! 396: ! 397: setvbuf(instream,NULL,_IOFBF,2*1024); ! 398: fseek(smb.sdt_fp,offset,SEEK_SET); ! 399: xlat=XLAT_NONE; ! 400: fwrite(&xlat,2,1,smb.sdt_fp); ! 401: x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ ! 402: while(!feof(instream)) { ! 403: memset(buf,0,x); ! 404: j=fread(buf,1,x,instream); ! 405: if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) ! 406: buf[j-1]=buf[j-2]=0; ! 407: fwrite(buf,j,1,smb.sdt_fp); ! 408: x=SDT_BLOCK_LEN; } ! 409: fflush(smb.sdt_fp); ! 410: fclose(instream); ! 411: ! 412: memset(&msg,0,sizeof(smbmsg_t)); ! 413: memcpy(msg.hdr.id,"SHD\x1a",4); ! 414: msg.hdr.version=smb_ver(); ! 415: if(mode&WM_FILE) ! 416: msg.hdr.auxattr|=MSG_FILEATTACH; ! 417: msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); ! 418: msg.hdr.when_written.zone=msg.hdr.when_imported.zone=cfg.sys_timezone; ! 419: ! 420: msg.hdr.offset=offset; ! 421: ! 422: net=NET_QWK; ! 423: smb_hfield(&msg,RECIPIENT,strlen(to),to); ! 424: msg.idx.to=touser; ! 425: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); ! 426: smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr); ! 427: ! 428: smb_hfield(&msg,SENDER,strlen(useron.alias),useron.alias); ! 429: ! 430: sprintf(str,"%u",useron.number); ! 431: smb_hfield(&msg,SENDEREXT,strlen(str),str); ! 432: msg.idx.from=useron.number; ! 433: ! 434: smb_hfield(&msg,SUBJECT,strlen(title),title); ! 435: strcpy(str,title); ! 436: strlwr(str); ! 437: msg.idx.subj=crc16(str); ! 438: ! 439: smb_dfield(&msg,TEXT_BODY,length); ! 440: ! 441: smb_unlocksmbhdr(&smb); ! 442: i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); ! 443: smb_close(&smb); ! 444: smb_stack(&smb,SMB_STACK_POP); ! 445: ! 446: smb_freemsgmem(&msg); ! 447: if(i) { ! 448: smb_freemsgdat(&smb,offset,length,1); ! 449: errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); ! 450: return(false); } ! 451: ! 452: useron.emails++; ! 453: logon_emails++; ! 454: putuserrec(&cfg,useron.number,U_EMAILS,5,ultoa(useron.emails,tmp,10)); ! 455: useron.etoday++; ! 456: putuserrec(&cfg,useron.number,U_ETODAY,5,ultoa(useron.etoday,tmp,10)); ! 457: ! 458: sprintf(str,"Sent QWK NetMail to %s (%s)",to,fulladdr); ! 459: logline("EN",str); ! 460: return(true); ! 461: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.