From 93208aa960574b21dd2c5ceb70e1344b64671add Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Thu, 4 Feb 2021 21:14:57 -0800 Subject: [PATCH] Support quoted filenames in message subjects "Old style" (e.g. FTN netmail) attachments put the filename(s) in the message subject. Supported quoted-filenames in the message subject (i.e. to support filenames with spaces in them) in addition to the traditional space-delimited filenames. Mixing quoted and space-delimited filenames (for multiple attached files) in a single message subject is supported. --- src/sbbs3/mailsrvr.c | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index 93037dc07a..d901716a17 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -877,33 +877,40 @@ static ulong sockmimetext(SOCKET socket, const char* prot, CRYPT_SESSION sess, s static ulong sockmsgtxt(SOCKET socket, const char* prot, CRYPT_SESSION sess, smbmsg_t* msg, char* msgtxt, ulong maxlines) { - char filepath[MAX_PATH+1]; + char dirname[MAX_PATH + 1]; + char filepath[MAX_PATH + 1]; ulong retval; char* boundary=NULL; - unsigned i; str_list_t file_list=NULL; - str_list_t split; if(msg->hdr.auxattr&MSG_FILEATTACH) { + if(msg->idx.to != 0) + SAFEPRINTF2(dirname, "%sfile/%04u.in", scfg.data_dir, msg->idx.to); + else + SAFEPRINTF2(dirname, "%sfile/%04u.out", scfg.data_dir, msg->idx.from); boundary = mimegetboundary(); file_list = strListInit(); - /* Parse subject (if necessary) */ - if(!strListCount(file_list)) { /* filename(s) stored in subject */ - split=strListSplitCopy(NULL,msg->subj," "); - if(split!=NULL) { - for(i=0;split[i];i++) { - if(msg->idx.to!=0) - SAFEPRINTF3(filepath,"%sfile/%04u.in/%s" - ,scfg.data_dir,msg->idx.to,getfname(truncsp(split[i]))); - else - SAFEPRINTF3(filepath,"%sfile/%04u.out/%s" - ,scfg.data_dir,msg->idx.from,getfname(truncsp(split[i]))); - strListPush(&file_list,filepath); - } - strListFree(&split); + /* filename(s) in subject */ + char* p = msg->subj; + SKIP_WHITESPACE(p); + while(*p != '\0') { + char delim = ' '; + if(*p == '"') { + delim = '"'; + p++; } + char* tp = strchr(p, delim); + if(tp == NULL && delim != ' ') + break; + *tp = '\0'; + SAFEPRINTF2(filepath, "%s/%s", dirname, getfname(truncsp(p))); + strListPush(&file_list, filepath); + if(tp == NULL) + break; + p = tp + 1; + SKIP_WHITESPACE(p); } } -- GitLab