Skip to content
Snippets Groups Projects
Commit e0b84113 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Complete the support for multiple files (FileList) in subject of netmails

... also the support for multiple spaces or commas separating each filename.

Oh, FTS-1, how did I miss thee?
parent 25ed5ec7
No related branches found
No related tags found
No related merge requests found
Pipeline #7132 passed
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define FIDO_TLD ".fidonet" /* Fake top-level domain for gating netmail through SMTP */ #define FIDO_TLD ".fidonet" /* Fake top-level domain for gating netmail through SMTP */
#define FIDO_ORIGIN_PREFIX_FORM_1 "\r * Origin: " #define FIDO_ORIGIN_PREFIX_FORM_1 "\r * Origin: "
#define FIDO_ORIGIN_PREFIX_FORM_2 "\n * Origin: " #define FIDO_ORIGIN_PREFIX_FORM_2 "\n * Origin: "
#define FIDO_FILELIST_SEP " ," /* FTS-1 */
#define FIDO_PING_NAME "PING" /* 'To' username for PING netmail (FTS-5001) */ #define FIDO_PING_NAME "PING" /* 'To' username for PING netmail (FTS-5001) */
#define FIDO_AREAMGR_NAME "AreaFix" /* De-facto pseudo-standard */ #define FIDO_AREAMGR_NAME "AreaFix" /* De-facto pseudo-standard */
#define FIDO_CONFMGR_NAME "ConfMgr" /* FSC-0057 */ #define FIDO_CONFMGR_NAME "ConfMgr" /* FSC-0057 */
......
...@@ -1217,7 +1217,7 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con ...@@ -1217,7 +1217,7 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con
} }
fputc(FIDO_STORED_MSG_TERMINATOR, fp); fputc(FIDO_STORED_MSG_TERMINATOR, fp);
lprintf(LOG_INFO, "Created NetMail (%s)%s from %s (%s) to %s (%s), attr: %04hX%s, subject: %s" lprintf(LOG_INFO, "Created NetMail (%s)%s from %s (%s) to %s (%s), attr: %04hX%s, subject: %s"
,getfname(fname), (hdr.attr&FIDO_FILE) ? " with attachment" : "" ,getfname(fname), (hdr.attr&FIDO_FILE) ? " with attachment(s)" : ""
,from, smb_faddrtoa(&faddr, tmp), to, smb_faddrtoa(&dest, NULL), hdr.attr, fmsgattr_str(hdr.attr), subject); ,from, smb_faddrtoa(&faddr, tmp), to, smb_faddrtoa(&dest, NULL), hdr.attr, fmsgattr_str(hdr.attr), subject);
return fclose(fp); return fclose(fp);
} }
...@@ -4332,10 +4332,21 @@ bool pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inb ...@@ -4332,10 +4332,21 @@ bool pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inb
free(fmsgbuf); free(fmsgbuf);
return false; return false;
} }
if(hdr->attr&FIDO_FILE) { /* File attachment (only a single file supported) */ if(hdr->attr&FIDO_FILE) { /* File attachment */
char fname[FIDO_SUBJ_LEN]; char filelist[FIDO_SUBJ_LEN];
SAFECOPY(fname, getfname(hdr->subj)); SAFECOPY(filelist, hdr->subj);
SAFEPRINTF2(hdr->subj, "%s%s", inbound, fname); /* Fix the file path in the subject */ *hdr->subj = '\0';
char* token;
/* Fix the file path(s) in the subject (also removing commas and extra spaces) */
for(token = strtok(filelist, FIDO_FILELIST_SEP); token != NULL; token = strtok(NULL, FIDO_FILELIST_SEP)) {
char* fname = getfname(token);
if(*hdr->subj == '\0')
snprintf(hdr->subj, sizeof hdr->subj, "%s%s", inbound, fname);
else {
SAFECAT(hdr->subj, " ");
SAFECAT(hdr->subj, fname); // Only include path for first file
}
}
} }
const uint16_t remove_attrs = FIDO_CRASH | FIDO_LOCAL | FIDO_HOLD; const uint16_t remove_attrs = FIDO_CRASH | FIDO_LOCAL | FIDO_HOLD;
if(hdr->attr&remove_attrs) { if(hdr->attr&remove_attrs) {
...@@ -4362,8 +4373,9 @@ bool pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inb ...@@ -4362,8 +4373,9 @@ bool pkt_to_msg(FILE* fidomsg, fmsghdr_t* hdr, const char* info, const char* inb
/**************************************/ /**************************************/
int import_netmail(const char* path, const fmsghdr_t* inhdr, FILE* fp, const char* inbound) int import_netmail(const char* path, const fmsghdr_t* inhdr, FILE* fp, const char* inbound)
{ {
char info[512],str[256],tmp[256],subj[256] char info[512],str[256];
,*fmsgbuf=NULL,*p,*tp,*sp; char tmp[MAX_PATH + 1];
char *fmsgbuf=NULL,*p,*tp;
int i,match,usernumber = 0; int i,match,usernumber = 0;
ulong length; ulong length;
fidoaddr_t addr; fidoaddr_t addr;
...@@ -4617,34 +4629,29 @@ int import_netmail(const char* path, const fmsghdr_t* inhdr, FILE* fp, const cha ...@@ -4617,34 +4629,29 @@ int import_netmail(const char* path, const fmsghdr_t* inhdr, FILE* fp, const cha
putsmsg(&scfg,usernumber,str); putsmsg(&scfg,usernumber,str);
} }
if(hdr.attr&FIDO_FILE) { /* File attachment */ if(hdr.attr&FIDO_FILE) { /* File attachment */
SAFECOPY(subj,hdr.subj); char filelist[FIDO_SUBJ_LEN];
tp=subj; SAFECOPY(filelist, hdr.subj);
while(1) { char* token;
p=strchr(tp,' '); for(token = strtok(filelist, FIDO_FILELIST_SEP); token != NULL; token = strtok(NULL, FIDO_FILELIST_SEP)) {
if(p) *p=0; char fpath[MAX_PATH + 1];
sp=strrchr(tp,'/'); /* sp is slash pointer */ char* fname = getfname(token);
if(!sp) sp=strrchr(tp,'\\'); lprintf(LOG_INFO, "Processing attached file: %s", fname);
if(sp) tp=sp+1; snprintf(fpath, sizeof fpath, "%s%s", inbound, fname);
lprintf(LOG_INFO, "Processing attached file: %s", tp); if(!fexistcase(fpath)) {
SAFEPRINTF2(str,"%s%s", inbound, tp); lprintf(LOG_WARNING, "Attached file not found in expected inbound: %s", fpath);
if(!fexistcase(str)) {
lprintf(LOG_WARNING, "Attached file not found in expected inbound: %s", str);
if(inbound == cfg.inbound) if(inbound == cfg.inbound)
inbound = cfg.secure_inbound; inbound = cfg.secure_inbound;
else else
inbound = cfg.inbound; inbound = cfg.inbound;
SAFEPRINTF2(str,"%s%s", inbound, tp); SAFEPRINTF2(fpath, "%s%s", inbound, fname);
} }
SAFEPRINTF2(tmp,"%sfile/%04u.in",scfg.data_dir,usernumber); SAFEPRINTF2(tmp,"%sfile/%04u.in",scfg.data_dir,usernumber);
(void)mkpath(tmp); (void)mkpath(tmp);
backslash(tmp); backslash(tmp);
SAFECAT(tmp,tp); SAFECAT(tmp, fname);
lprintf(LOG_DEBUG, "Moving attachment from %s to %s", str, tmp); lprintf(LOG_DEBUG, "Moving attachment from %s to %s", fpath, tmp);
if((i = mv(str,tmp,0)) != 0) if((i = mv(fpath, tmp,0)) != 0)
lprintf(LOG_ERR, "ERROR %d moving attached file from %s to %s for NetMail %s", i, str, tmp, info); lprintf(LOG_ERR, "ERROR %d moving attached file from %s to %s for NetMail %s", i, fpath, tmp, info);
if(!p)
break;
tp=p+1;
} }
} }
netmail++; netmail++;
...@@ -5509,7 +5516,7 @@ void pack_netmail(void) ...@@ -5509,7 +5516,7 @@ void pack_netmail(void)
char filelist[FIDO_SUBJ_LEN]; char filelist[FIDO_SUBJ_LEN];
SAFECOPY(filelist, hdr.subj); SAFECOPY(filelist, hdr.subj);
char* token; char* token;
for(token = strtok(filelist, " ,"); token != NULL; token = strtok(NULL, " ,")) for(token = strtok(filelist, FIDO_FILELIST_SEP); token != NULL; token = strtok(NULL, FIDO_FILELIST_SEP))
fprintf(fp,"%s\n",getfname(token)); fprintf(fp,"%s\n",getfname(token));
fclose(fp); fclose(fp);
if(write_flofile(req, addr,/* bundle: */false, cfg.use_outboxes, /* del_file: */true, hdr.attr)) if(write_flofile(req, addr,/* bundle: */false, cfg.use_outboxes, /* del_file: */true, hdr.attr))
...@@ -5601,7 +5608,7 @@ void pack_netmail(void) ...@@ -5601,7 +5608,7 @@ void pack_netmail(void)
char filelist[FIDO_SUBJ_LEN]; char filelist[FIDO_SUBJ_LEN];
SAFECOPY(filelist, hdr.subj); SAFECOPY(filelist, hdr.subj);
char* token; char* token;
for(token = strtok(filelist, " ,"); token != NULL; token = strtok(NULL, " ,")) { for(token = strtok(filelist, FIDO_FILELIST_SEP); token != NULL; token = strtok(NULL, FIDO_FILELIST_SEP)) {
char fpath[MAX_PATH + 1]; char fpath[MAX_PATH + 1];
char* fname = getfname(token); char* fname = getfname(token);
if(path[0] == '\0' && fname != token) { if(path[0] == '\0' && fname != token) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment