EMAIL: Improved MIME attachment handling.

This commit is contained in:
Bobbi Webber-Manners 2020-08-17 21:52:59 -04:00
parent 76b30e919e
commit 5a464b0da5

View File

@ -856,7 +856,7 @@ void email_pager(struct emailhdrs *h) {
const int8_t *b = b64dec - 43; const int8_t *b = b64dec - 43;
FILE *attachfp; FILE *attachfp;
uint16_t linecount, chars; uint16_t linecount, chars;
uint8_t mime_enc, mime_binary, eof, screennum, maxscreennum; uint8_t mime_enc, mime_binary, mime_hasfile, eof, screennum, maxscreennum;
char c, *readp, *writep; char c, *readp, *writep;
clrscr2(); clrscr2();
sprintf(filename, "%s/%s/EMAIL.%u", cfg_emaildir, curr_mbox, h->emailnum); sprintf(filename, "%s/%s/EMAIL.%u", cfg_emaildir, curr_mbox, h->emailnum);
@ -875,6 +875,9 @@ restart:
readp = linebuf; readp = linebuf;
writep = linebuf; writep = linebuf;
attachfp = NULL; attachfp = NULL;
mime_enc = ENC_7BIT;
mime_binary = 0;
mime_hasfile = 0;
if (sbackfp) if (sbackfp)
fclose(sbackfp); fclose(sbackfp);
_filetype = PRODOS_T_BIN; _filetype = PRODOS_T_BIN;
@ -914,7 +917,7 @@ restart:
if ((mime >= 1) && (!strncmp(writep, "--", 2))) { if ((mime >= 1) && (!strncmp(writep, "--", 2))) {
if (attachfp) if (attachfp)
fclose(attachfp); fclose(attachfp);
if ((mime == 4) && mime_binary) { if ((mime == 4) && mime_hasfile) {
putchar(BACKSPACE); // Erase spinner putchar(BACKSPACE); // Erase spinner
puts("[OK]"); puts("[OK]");
} }
@ -922,6 +925,7 @@ restart:
mime = 2; mime = 2;
mime_enc = ENC_7BIT; mime_enc = ENC_7BIT;
mime_binary = 0; mime_binary = 0;
mime_hasfile = 0;
readp = writep = NULL; readp = writep = NULL;
} else if ((mime < 4) && (mime >= 2)) { } else if ((mime < 4) && (mime >= 2)) {
if (!strncasecmp(writep, "Content-Type: ", 14)) { if (!strncasecmp(writep, "Content-Type: ", 14)) {
@ -947,6 +951,7 @@ restart:
mime = 1; mime = 1;
} }
} else if (strstr(writep, "filename=")) { } else if (strstr(writep, "filename=")) {
mime_hasfile = 1;
sprintf(filename, "%s/ATTACHMENTS/%s", sprintf(filename, "%s/ATTACHMENTS/%s",
cfg_emaildir, strstr(writep, "filename=") + 9); cfg_emaildir, strstr(writep, "filename=") + 9);
sanitize_filename(filename); sanitize_filename(filename);
@ -959,9 +964,12 @@ restart:
attachfp = NULL; attachfp = NULL;
} else if ((mime == 3) && (!strncmp(writep, "\r", 1))) { } else if ((mime == 3) && (!strncmp(writep, "\r", 1))) {
mime = 4; mime = 4;
if (!attachfp && mime_binary) { if (!attachfp && mime_hasfile) {
mime_enc = ENC_SKIP; // Skip over MIME parts user chose to skip
printf("** Skipping %s ", filename);
} else if (!attachfp && mime_binary) {
mime_enc = ENC_SKIP; // Skip over binary MIME parts with no filename mime_enc = ENC_SKIP; // Skip over binary MIME parts with no filename
fputs("Skipping ", stdout); printf("\n");
} }
} }
readp = writep = NULL; readp = writep = NULL;
@ -989,11 +997,11 @@ restart:
readp = writep = NULL; readp = writep = NULL;
break; break;
} }
if (mime_binary && !(linecount % 10)) if (mime_hasfile && !(linecount % 10))
spinner(); spinner();
} }
if (readp) { if (readp) {
if ((mime == 0) || ((mime == 4) && !mime_binary)) { if ((mime == 0) || ((mime == 4) && !mime_hasfile)) {
do { do {
c = word_wrap_line(stdout, &readp, 80, 0); c = word_wrap_line(stdout, &readp, 80, 0);
if (*cursorrow == 22) if (*cursorrow == 22)
@ -1007,7 +1015,7 @@ restart:
} else } else
writep = NULL; writep = NULL;
} }
if ((mime == 4) && mime_binary) { if ((mime == 4) && mime_hasfile) {
if (attachfp) if (attachfp)
fwrite(readp, 1, chars, attachfp); fwrite(readp, 1, chars, attachfp);
readp = writep = NULL; readp = writep = NULL;