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