Annotation of sbbs/sbbs3/netmail.cpp, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.