|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.