Annotation of sbbs/src/sbbs3/qwktomsg.cpp, revision 1.1.1.2

1.1       root        1: /* qwktomsg.cpp */
                      2: 
                      3: /* Synchronet QWK to SMB message conversion routine */
                      4: 
1.1.1.2 ! root        5: /* $Id: qwktomsg.cpp,v 1.52 2011/09/21 03:10:53 rswindell Exp $ */
1.1       root        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:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2011 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       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: 
1.1.1.2 ! root       41: static void qwk_parse_header_list(smbmsg_t* msg, str_list_t* headers, bool parse_sender_hfields, bool parse_recipient_hfields)
        !            42: {
        !            43:        char*           p;
        !            44:        char            zone[32];
        !            45:        char            value[INI_MAX_VALUE_LEN+1];
        !            46:        int                     i;
        !            47:        uint16_t        net_type;
        !            48:        uint16_t        hfield_type;
        !            49: 
        !            50:        if((p=iniPopKey(headers,ROOT_SECTION,"WhenWritten",value))!=NULL) {
        !            51:                xpDateTime_t dt=isoDateTimeStr_parse(p);
        !            52: 
        !            53:                msg->hdr.when_written.time=xpDateTime_to_time(dt);
        !            54:                msg->hdr.when_written.zone=dt.zone;
        !            55:                sscanf(p,"%*s %s",zone);
        !            56:                if(zone[0])
        !            57:                        msg->hdr.when_written.zone=(ushort)strtoul(zone,NULL,16);
        !            58:        }
        !            59: 
        !            60:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=RECIPIENT),value))!=NULL) {
        !            61:                if(parse_recipient_hfields)
        !            62:                        smb_hfield_str(msg,hfield_type,p);              
        !            63:        }
        !            64: 
        !            65:        /* Recipient net address and type */
        !            66:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=RECIPIENTNETADDR),value))!=NULL) {
        !            67:                if(parse_recipient_hfields) {
        !            68:                        net_type=NET_UNKNOWN;
        !            69:                        smb_hfield_netaddr(msg,hfield_type,p,&net_type);
        !            70:                        smb_hfield_bin(msg,RECIPIENTNETTYPE,net_type);
        !            71:                }
        !            72:        }
        !            73: 
        !            74:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SUBJECT),value))!=NULL)
        !            75:                smb_hfield_str(msg,hfield_type,p);
        !            76: 
        !            77:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SENDER),value))!=NULL) {
        !            78:                if(parse_sender_hfields)
        !            79:                        smb_hfield_str(msg,hfield_type,p);
        !            80:        }
        !            81: 
        !            82:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SENDERNETADDR),value))!=NULL) {
        !            83:                if(parse_sender_hfields) {
        !            84:                        smb_hfield_str(msg,hfield_type,p);
        !            85:                        net_type=NET_UNKNOWN;
        !            86:                        smb_hfield_netaddr(msg,hfield_type,p,&net_type);
        !            87:                        smb_hfield_bin(msg,SENDERNETTYPE,net_type);
        !            88:                }
        !            89:        }
        !            90: 
        !            91:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=RFC822MSGID),value))!=NULL)
        !            92:                smb_hfield_str(msg,hfield_type,p);
        !            93: 
        !            94:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=RFC822REPLYID),value))!=NULL)
        !            95:                smb_hfield_str(msg,hfield_type,p);
        !            96: 
        !            97:        if((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=RFC822REPLYTO),value))!=NULL)
        !            98:                smb_hfield_str(msg,hfield_type,p);
        !            99: 
        !           100:        /* Trace header fields */
        !           101:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SENDERIPADDR),value))!=NULL) {
        !           102:                if(parse_sender_hfields)
        !           103:                        smb_hfield_str(msg,hfield_type,p);
        !           104:        }
        !           105:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SENDERHOSTNAME),value))!=NULL) {
        !           106:                if(parse_sender_hfields)
        !           107:                        smb_hfield_str(msg,hfield_type,p);
        !           108:        }
        !           109:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SENDERPROTOCOL),value))!=NULL) {
        !           110:                if(parse_sender_hfields)
        !           111:                        smb_hfield_str(msg,hfield_type,p);
        !           112:        }
        !           113:        while((p=iniPopKey(headers,ROOT_SECTION,"Organization",value))!=NULL) {
        !           114:                if(parse_sender_hfields)
        !           115:                        smb_hfield_str(msg,SENDERORG,p);
        !           116:        }
        !           117: 
        !           118:        /* FidoNet header fields */
        !           119:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOAREA),value))!=NULL)
        !           120:                smb_hfield_str(msg,hfield_type,p);
        !           121:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOSEENBY),value))!=NULL)
        !           122:                smb_hfield_str(msg,hfield_type,p);
        !           123:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOPATH),value))!=NULL)
        !           124:                smb_hfield_str(msg,hfield_type,p);
        !           125:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOMSGID),value))!=NULL)
        !           126:                smb_hfield_str(msg,hfield_type,p);
        !           127:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOREPLYID),value))!=NULL)
        !           128:                smb_hfield_str(msg,hfield_type,p);
        !           129:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOPID),value))!=NULL)
        !           130:                smb_hfield_str(msg,hfield_type,p);
        !           131:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOFLAGS),value))!=NULL)
        !           132:                smb_hfield_str(msg,hfield_type,p);
        !           133:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOTID),value))!=NULL)
        !           134:                smb_hfield_str(msg,hfield_type,p);
        !           135:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=FIDOCTRL),value))!=NULL)
        !           136:                smb_hfield_str(msg,hfield_type,p);
        !           137: 
        !           138:        /* Synchronet */
        !           139:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=SMB_EDITOR),value))!=NULL)
        !           140:                smb_hfield_str(msg,hfield_type,p);
        !           141: 
        !           142:        /* USENET */
        !           143:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=USENETPATH),value))!=NULL)
        !           144:                smb_hfield_str(msg,hfield_type,p);
        !           145:        while((p=iniPopKey(headers,ROOT_SECTION,smb_hfieldtype(hfield_type=USENETNEWSGROUPS),value))!=NULL)
        !           146:                smb_hfield_str(msg,hfield_type,p);
        !           147: 
        !           148:        /* Others (RFC-822) */
        !           149:        for(i=0;(*headers)[i]!=NULL;i++)
        !           150:                if((*headers)[i][0])
        !           151:                        smb_hfield_str(msg,RFC822HEADER,(*headers)[i]);
        !           152: }
        !           153: 
        !           154: void sbbs_t::qwk_new_msg(smbmsg_t* msg, char* hdrblk, long offset, str_list_t all_headers, bool parse_sender_hfields)
        !           155: {
        !           156:        char str[128];
        !           157:        char to[128];
        !           158:        str_list_t      msg_headers;
        !           159: 
        !           160:        smb_freemsgmem(msg);
        !           161: 
        !           162:        sprintf(str,"%lx",offset);
        !           163:        msg_headers=iniGetSection(all_headers,str);
        !           164: 
        !           165:        memset(msg,0,sizeof(smbmsg_t));         /* Initialize message header */
        !           166:        msg->hdr.version=smb_ver();
        !           167: 
        !           168:        sprintf(to,"%25.25s",(char *)hdrblk+21);     /* To user */
        !           169:        truncsp(to);
        !           170: 
        !           171:        if(msg_headers!=NULL)
        !           172:                qwk_parse_header_list(msg, &msg_headers, parse_sender_hfields, stricmp(to,"NETMAIL")!=0);
        !           173: 
        !           174:        /* Parse the QWK message header: */
        !           175:        if(msg->hdr.when_written.time==0) {
        !           176:                struct          tm tm;
        !           177:                memset(&tm,0,sizeof(tm));
        !           178:                tm.tm_mon = ((hdrblk[8]&0xf)*10)+(hdrblk[9]&0xf);
        !           179:                tm.tm_mday=((hdrblk[11]&0xf)*10)+(hdrblk[12]&0xf);
        !           180:                tm.tm_year=((hdrblk[14]&0xf)*10)+(hdrblk[15]&0xf);
        !           181:                if(tm.tm_year<Y2K_2DIGIT_WINDOW)
        !           182:                        tm.tm_year+=100;
        !           183:                tm.tm_hour=((hdrblk[16]&0xf)*10)+(hdrblk[17]&0xf);
        !           184:                tm.tm_min=((hdrblk[19]&0xf)*10)+(hdrblk[20]&0xf);
        !           185: 
        !           186:                msg->hdr.when_written.time=sane_mktime(&tm);
        !           187:        }
        !           188: 
        !           189:        if(msg->to==NULL)
        !           190:                smb_hfield_str(msg,RECIPIENT,to);
        !           191: 
        !           192:        if(parse_sender_hfields && msg->from==NULL) {
        !           193:                sprintf(str,"%25.25s",hdrblk+46);  
        !           194:                truncsp(str);
        !           195:                smb_hfield_str(msg,SENDER,str);
        !           196:        }
        !           197: 
        !           198:        if(msg->subj==NULL) {
        !           199:                sprintf(str,"%25.25s",hdrblk+71);   /* Subject */
        !           200:                truncsp(str);
        !           201:                smb_hfield_str(msg,SUBJECT,str);
        !           202:        }
        !           203: 
        !           204:        iniFreeStringList(msg_headers);
        !           205: }
        !           206: 
1.1       root      207: /****************************************************************************/
                    208: /* Converts a QWK message packet into a message.                                                       */
1.1.1.2 ! root      209: /* Does *not* free the msgmem                                                                                          */
1.1       root      210: /****************************************************************************/
1.1.1.2 ! root      211: bool sbbs_t::qwk_import_msg(FILE *qwk_fp, char *hdrblk, ulong blocks
        !           212:                                                        ,char fromhub, uint subnum
        !           213:                                                        ,uint touser, smbmsg_t* msg)
1.1       root      214: {
                    215:        char*           body;
                    216:        char*           tail;
1.1.1.2 ! root      217:        char*           qwkbuf;
        !           218:        char            str[256],col=0,lastch=0,*p;
        !           219:        char            from[128];
        !           220:        uint            i,k,lzh=0;
1.1       root      221:        long            bodylen,taillen;
                    222:        bool            header_cont=false;
                    223:        bool            success=false;
1.1.1.2 ! root      224:        uint16_t        net_type;
1.1       root      225:        ushort          xlat=XLAT_NONE;
                    226:        int                     storage=SMB_SELFPACK;
1.1.1.2 ! root      227:        long            dupechk_hashes=SMB_HASH_SOURCE_DUPE;
        !           228:        str_list_t      kludges;
1.1       root      229: 
                    230:        if(subnum!=INVALID_SUB
                    231:                && (hdrblk[0]=='*' || hdrblk[0]=='+' || cfg.sub[subnum]->misc&SUB_PONLY))
1.1.1.2 ! root      232:                msg->hdr.attr|=MSG_PRIVATE;
1.1       root      233:        if(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_AONLY)
1.1.1.2 ! root      234:                msg->hdr.attr|=MSG_ANONYMOUS;
1.1       root      235:        if(subnum==INVALID_SUB && cfg.sys_misc&SM_DELREADM)
1.1.1.2 ! root      236:                msg->hdr.attr|=MSG_KILLREAD;
1.1       root      237:        if((fromhub || useron.rest&FLAG('Q')) &&
                    238:                (hdrblk[0]=='*' || hdrblk[0]=='-' || hdrblk[0]=='`'))
1.1.1.2 ! root      239:                msg->hdr.attr|=MSG_READ;
1.1       root      240: 
                    241:        if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->mod_ar[0]
1.1.1.2 ! root      242:                && chk_ar(cfg.sub[subnum]->mod_ar,&useron,&client))
        !           243:                msg->hdr.attr|=MSG_MODERATED;
1.1       root      244:        if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->misc&SUB_SYSPERM
                    245:                && sub_op(subnum))
1.1.1.2 ! root      246:                msg->hdr.attr|=MSG_PERMANENT;
1.1       root      247: 
1.1.1.2 ! root      248:        if(!(useron.rest&FLAG('Q')) && !fromhub && msg->hdr.when_written.zone==0)
        !           249:                msg->hdr.when_written.zone=sys_timezone(&cfg);
1.1       root      250: 
1.1.1.2 ! root      251:        msg->hdr.when_imported.time=time(NULL);
        !           252:        msg->hdr.when_imported.zone=sys_timezone(&cfg);
1.1       root      253: 
                    254:        hdrblk[116]=0;  // don't include number of blocks in "re: msg number"
                    255:        if(!(useron.rest&FLAG('Q')) && !fromhub)
1.1.1.2 ! root      256:                msg->hdr.thread_back=atol((char *)hdrblk+108);
1.1       root      257: 
                    258:        if(subnum==INVALID_SUB) {               /* E-mail */
                    259:                if(cfg.sys_misc&SM_FASTMAIL)
                    260:                        storage=SMB_FASTALLOC;
                    261: 
                    262:                /* duplicate message-IDs must be allowed in mail database */
                    263:                dupechk_hashes&=~(1<<SMB_HASH_SOURCE_MSG_ID);
                    264: 
                    265:                sprintf(str,"%u",touser);
1.1.1.2 ! root      266:                smb_hfield_str(msg,RECIPIENTEXT,str); 
1.1       root      267:        } else {
                    268:                if(cfg.sub[subnum]->misc&SUB_HYPER)
                    269:                        storage = SMB_HYPERALLOC;
                    270:                else if(cfg.sub[subnum]->misc&SUB_FAST)
                    271:                        storage = SMB_FASTALLOC;
                    272: 
                    273:                if(cfg.sub[subnum]->misc&SUB_LZH)
                    274:                        xlat=XLAT_LZH;
                    275:        }
                    276: 
                    277:        /********************************/
                    278:        /* Convert the QWK message text */
                    279:        /********************************/
                    280: 
1.1.1.2 ! root      281:        if((qwkbuf=(char *)malloc((blocks-1)*QWK_BLOCK_LEN))==NULL) {
        !           282:                errormsg(WHERE,ERR_ALLOC,"QWK msg buf",(blocks-1)*QWK_BLOCK_LEN);
1.1       root      283:                return(false); 
                    284:        }
                    285: 
1.1.1.2 ! root      286:        if(fread(qwkbuf,QWK_BLOCK_LEN,blocks-1,qwk_fp) != blocks-1) {
        !           287:                free(qwkbuf);
        !           288:                errormsg(WHERE,ERR_READ,"QWK msg blocks",(blocks-1)*QWK_BLOCK_LEN);
        !           289:        }
        !           290: 
1.1       root      291:        bodylen=0;
                    292:        if((body=(char *)malloc((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) {
1.1.1.2 ! root      293:                free(qwkbuf);
1.1       root      294:                errormsg(WHERE,ERR_ALLOC,"QWK msg body",(blocks-1L)*QWK_BLOCK_LEN*2L);
                    295:                return(false); 
                    296:        }
                    297: 
                    298:        taillen=0;
                    299:        if((tail=(char *)malloc((blocks-1L)*QWK_BLOCK_LEN*2L))==NULL) {
1.1.1.2 ! root      300:                free(qwkbuf);
1.1       root      301:                free(body);
                    302:                errormsg(WHERE,ERR_ALLOC,"QWK msg tail",(blocks-1L)*QWK_BLOCK_LEN*2L);
                    303:                return(false); 
                    304:        }
                    305: 
1.1.1.2 ! root      306:        kludges=strListInit();
1.1       root      307: 
1.1.1.2 ! root      308:        for(k=0;k<(blocks-1)*QWK_BLOCK_LEN;k++) {
        !           309:                if(qwkbuf[k]==0)
        !           310:                        continue;
        !           311:                if(bodylen==0 
        !           312:                        && (qwkbuf[k]=='@' 
        !           313:                                || (((useron.qwk&QWK_EXT) || subnum==INVALID_SUB)
        !           314:                                        && (strnicmp(qwkbuf+k,"To:",3)==0 
        !           315:                                        ||  strnicmp(qwkbuf+k,"From:",5)==0 
        !           316:                                        ||  strnicmp(qwkbuf+k,"Subject:",8)==0)))) {
        !           317:                        if((p=strchr(qwkbuf+k, QWK_NEWLINE))==NULL) {
        !           318:                                body[bodylen++]=qwkbuf[k];
1.1       root      319:                                continue;
                    320:                        }
1.1.1.2 ! root      321:                        *p=0;   /* Converts QWK_NEWLINE to NUL */
        !           322:                        strListPush(&kludges, qwkbuf+k);
        !           323:                        k+=strlen(qwkbuf+k);
        !           324:                        continue;
        !           325:                }
        !           326:                if(!taillen && qwkbuf[k]==' ' && col==3 && bodylen>=3
        !           327:                        && body[bodylen-3]=='-' && body[bodylen-2]=='-'
        !           328:                        && body[bodylen-1]=='-') {
        !           329:                        bodylen-=3;
        !           330:                        strcpy(tail,"--- ");    /* DO NOT USE SAFECOPY */
        !           331:                        taillen=4;
        !           332:                        col++;
        !           333:                        continue; 
        !           334:                }
        !           335:                if(qwkbuf[k]==QWK_NEWLINE) {            /* expand QWK_NEWLINE to crlf */
        !           336:                        if(!bodylen && !taillen)                /* Ignore blank lines at top of message */
        !           337:                                continue;
        !           338:                        if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-'
        !           339:                                && body[bodylen-2]=='-' && body[bodylen-1]=='-') {
1.1       root      340:                                bodylen-=3;
1.1.1.2 ! root      341:                                strcpy(tail,"---");     /* DO NOT USE SAFECOPY */
        !           342:                                taillen=3; 
1.1       root      343:                        }
1.1.1.2 ! root      344:                        col=0;
        !           345:                        if(taillen) {
        !           346:                                tail[taillen++]=CR;
        !           347:                                tail[taillen++]=LF; 
1.1       root      348:                        }
1.1.1.2 ! root      349:                        else {
        !           350:                                body[bodylen++]=CR;
        !           351:                                body[bodylen++]=LF; 
1.1       root      352:                        }
1.1.1.2 ! root      353:                        continue; 
        !           354:                }
        !           355:                /* beep restrict */
        !           356:                if(!fromhub && qwkbuf[k]==BEL && useron.rest&FLAG('B'))   
        !           357:                        continue;
        !           358:                /* ANSI restriction */
        !           359:                if(!fromhub && (qwkbuf[k]==CTRL_A || qwkbuf[k]==ESC)
        !           360:                        && useron.rest&FLAG('A'))
        !           361:                        continue;
        !           362:                if(qwkbuf[k]!=1 && lastch!=1)
        !           363:                        col++;
        !           364:                if(lastch==CTRL_A && !valid_ctrl_a_code(qwkbuf[k])) {
        !           365:                        if(taillen) taillen--;
        !           366:                        else            bodylen--;
        !           367:                        lastch=0;
        !           368:                        continue; 
        !           369:                }
        !           370:                lastch=qwkbuf[k];
        !           371:                if(taillen)
        !           372:                        tail[taillen++]=qwkbuf[k];
        !           373:                else
        !           374:                        body[bodylen++]=qwkbuf[k]; 
        !           375:        } 
        !           376:        free(qwkbuf);
1.1       root      377: 
                    378:        while(bodylen && body[bodylen-1]==' ') bodylen--; /* remove trailing spaces */
                    379:        if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF)
                    380:                bodylen-=2;
                    381: 
                    382:        while(taillen && tail[taillen-1]<=' ') taillen--; /* remove trailing garbage */
                    383: 
1.1.1.2 ! root      384:        /* Parse QWK Kludges (QWKE standard and SyncQNET legacy) here: */
1.1       root      385:        if(useron.rest&FLAG('Q') || fromhub) {      /* QWK Net */
1.1.1.2 ! root      386:                if((p=iniGetString(kludges,ROOT_SECTION,"@VIA",NULL,NULL)) != NULL) {
1.1       root      387:                        if(!fromhub)
                    388:                                set_qwk_flag(QWK_VIA);
                    389:                        if(route_circ(p,cfg.sys_id)) {
                    390:                                bprintf("\r\nCircular message path: %s\r\n",p);
1.1.1.2 ! root      391:                                lprintf(LOG_ERR,"Circular message path: %s from %s"
1.1       root      392:                                        ,p,fromhub ? cfg.qhub[fromhub-1]->id:useron.alias);
1.1.1.2 ! root      393:                                strListFree(&kludges);
        !           394:                                free(body);
        !           395:                                free(tail);
1.1       root      396:                                return(false); 
                    397:                        }
1.1.1.2 ! root      398:                        SAFEPRINTF2(str,"%s/%s"
1.1       root      399:                                ,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,p);
                    400:                        strupr(str);
                    401:                        update_qwkroute(str); 
                    402:                }
                    403:                else {
                    404:                        if(fromhub)
1.1.1.2 ! root      405:                                SAFECOPY(str,cfg.qhub[fromhub-1]->id);
1.1       root      406:                        else
1.1.1.2 ! root      407:                                SAFECOPY(str,useron.alias); 
1.1       root      408:                }
1.1.1.2 ! root      409:                /* From network type & address: */
1.1       root      410:                strupr(str);
1.1.1.2 ! root      411:                net_type=NET_QWK;
        !           412:                smb_hfield_netaddr(msg, SENDERNETADDR, str, &net_type);
        !           413:                smb_hfield_bin(msg,SENDERNETTYPE,net_type);
        !           414: 
1.1       root      415:        } else {
                    416:                sprintf(str,"%u",useron.number);
1.1.1.2 ! root      417:                smb_hfield_str(msg,SENDEREXT,str);
1.1       root      418:                if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME)
1.1.1.2 ! root      419:                        SAFECOPY(from,useron.name);
1.1       root      420:                else
1.1.1.2 ! root      421:                        SAFECOPY(from,useron.alias);
        !           422:                smb_hfield_str(msg,SENDER,from);
1.1       root      423:        }
1.1.1.2 ! root      424:        if((p=iniGetString(kludges,ROOT_SECTION,"@MSGID",NULL,NULL)) != NULL) {
1.1       root      425:                if(!fromhub)
                    426:                        set_qwk_flag(QWK_MSGID);
                    427:                truncstr(p," ");                                /* Truncate at first space char */
1.1.1.2 ! root      428:                if(msg->id==NULL)
        !           429:                        smb_hfield_str(msg,RFC822MSGID,p);
1.1       root      430:        }
1.1.1.2 ! root      431:        if((p=iniGetString(kludges,ROOT_SECTION,"@REPLY",NULL,NULL)) != NULL) {
1.1       root      432:                if(!fromhub)
                    433:                        set_qwk_flag(QWK_MSGID);
                    434:                truncstr(p," ");                                /* Truncate at first space char */
1.1.1.2 ! root      435:                if(msg->reply_id==NULL)
        !           436:                        smb_hfield_str(msg,RFC822REPLYID,p);
1.1       root      437:        }
1.1.1.2 ! root      438:        if((p=iniGetString(kludges,ROOT_SECTION,"@TZ",NULL,NULL)) != NULL) {
1.1       root      439:                if(!fromhub)
                    440:                        set_qwk_flag(QWK_TZ);
1.1.1.2 ! root      441:                msg->hdr.when_written.zone=(short)ahtoul(p); 
1.1       root      442:        }
1.1.1.2 ! root      443:        if((p=iniGetString(kludges,ROOT_SECTION,"@REPLYTO",NULL,NULL)) != NULL) {
        !           444:                if(msg->replyto==NULL)
        !           445:                        smb_hfield_str(msg,REPLYTO,p);
        !           446:        }
        !           447:        /* QWKE standard: */
        !           448:        if((p=iniGetString(kludges,ROOT_SECTION,"Subject",NULL,NULL)) != NULL)
        !           449:                smb_hfield_replace_str(msg,SUBJECT,p);
        !           450:        if((p=iniGetString(kludges,ROOT_SECTION,"To",NULL,NULL)) != NULL)
        !           451:                smb_hfield_replace_str(msg,RECIPIENT,p);
        !           452:        if((useron.rest&FLAG('Q'))
        !           453:                && (p=iniGetString(kludges,ROOT_SECTION,"From",NULL,NULL)) != NULL)
        !           454:                smb_hfield_replace_str(msg,SENDER,p);
        !           455: 
        !           456:        strListFree(&kludges);
1.1       root      457: 
1.1.1.2 ! root      458:        /* smb_addmsg requires ASCIIZ strings */
1.1       root      459:        body[bodylen]=0;
                    460:        tail[taillen]=0;
                    461: 
                    462:        if(online==ON_REMOTE)
                    463:                bputs(text[WritingIndx]);
                    464: 
                    465:        if(smb.status.max_crcs==0)      /* no CRC checking means no body text dupe checking */
                    466:                dupechk_hashes&=~(1<<SMB_HASH_SOURCE_BODY);
                    467: 
1.1.1.2 ! root      468:        if((i=smb_addmsg(&smb,msg,storage,dupechk_hashes,xlat,(uchar*)body,(uchar*)tail))==SMB_SUCCESS)
1.1       root      469:                success=true;
                    470:        else if(i==SMB_DUPE_MSG) {
                    471:                bprintf("\r\n!%s\r\n",smb.last_error);
                    472:                if(!fromhub) {
                    473:                        if(subnum==INVALID_SUB) {
1.1.1.2 ! root      474:                                SAFEPRINTF2(str,"%s duplicate e-mail attempt (%s)",useron.alias,smb.last_error);
        !           475:                                logline(LOG_NOTICE,"E!",str); 
1.1       root      476:                        } else {
1.1.1.2 ! root      477:                                SAFEPRINTF4(str,"%s duplicate message attempt in %s %s (%s)"
1.1       root      478:                                        ,useron.alias
                    479:                                        ,cfg.grp[cfg.sub[subnum]->grp]->sname
                    480:                                        ,cfg.sub[subnum]->lname
                    481:                                        ,smb.last_error);
1.1.1.2 ! root      482:                                logline(LOG_NOTICE,"P!",str); 
1.1       root      483:                        }
                    484:                }
                    485:        }
                    486:        else 
                    487:                errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error);
                    488: 
                    489:        free(body);
                    490:        free(tail);
                    491: 
                    492:        return(success);
                    493: }
1.1.1.2 ! root      494: 

unix.superglobalmegacorp.com

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