Move (un)?lists and (un)subscribe to MAlias.
[apps/madmutt.git] / lib-mime / rfc822parse.c
index e399bb7..fa0beaa 100644 (file)
  * please see the file GPL in the top level source directory.
  */
 
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-
 #include <lib-lib/lib-lib.h>
 
 #include "recvattach.h"
-
 #include "charset.h"
 #include "mime.h"
 
@@ -123,8 +116,8 @@ string_list_t *mutt_parse_references(char *s, int in_reply_to)
                 o = NULL;
             } else {
                 new = p_new(char, n + m + 1);
-                strcpy(new, o);
-                strcpy(new + n, s);
+                m_strcpy(new, n + m + 1, o);
+                m_strcpy(new + n, m + 1, s);
             }
         }
 
@@ -234,12 +227,10 @@ static parameter_t *parse_parameters(const char *s)
 
             s++;
             for (i = 0; *s && i < ssizeof(buffer) - 1; i++, s++) {
-                if (!option(OPTSTRICTMIME)) {
-                    /* As iso-2022-* has a characer of '"' with non-ascii state,
-                     * ignore it. */
-                    if (*s == 0x1b && i < ssizeof(buffer) - 2) {
-                        state_ascii = s[1] == '(' && (s[2] == 'B' || s[2] == 'J');
-                    }
+                /* As iso-2022-* has a characer of '"' with non-ascii state,
+                 * ignore it. */
+                if (*s == 0x1b && i < ssizeof(buffer) - 2) {
+                    state_ascii = s[1] == '(' && (s[2] == 'B' || s[2] == 'J');
                 }
                 if (state_ascii && *s == '"')
                     break;
@@ -309,7 +300,7 @@ void mutt_parse_content_type(char *s, BODY *ct)
          * field, so we can attempt to convert the type to BODY here.
          */
         switch (ct->type) {
-            char buffer[SHORT_STRING];
+            char buffer[STRING];
 
           case TYPETEXT:
             ct->subtype = m_strdup("plain");
@@ -340,9 +331,7 @@ void mutt_parse_content_type(char *s, BODY *ct)
         pc = parameter_getval(ct->parameter, "charset");
         if (!pc) {
             parameter_setval(&ct->parameter, "charset",
-                             option(OPTSTRICTMIME)
-                             ? "us-ascii"
-                             : charset_getfirst(AssumedCharset));
+                             charset_getfirst(MCharset.assumed_charset));
         }
     }
 }
@@ -449,7 +438,7 @@ void mutt_parse_part(FILE *fp, BODY *b)
         if (b->subtype) {
             fseeko(fp, b->offset, SEEK_SET);
 
-            if (mutt_is_message_type(b->type, b->subtype)) {
+            if (mutt_is_message_type(b)) {
                 b->parts = mutt_parse_messageRFC822(fp, b);
             } else
             if (mime_which_token(b->subtype, -1) == MIME_EXTERNAL_BODY) {
@@ -619,7 +608,7 @@ uncomment_timezone(char *buf, size_t buflen, const char *tz)
 time_t mutt_parse_date(const char *s, HEADER *h)
 {
     int zhours = 0, zminutes = 0, zoccident = 0;
-    char scratch[SHORT_STRING];
+    char scratch[STRING];
     struct tm tm;
     int count = 0;
     char *p;
@@ -636,7 +625,7 @@ time_t mutt_parse_date(const char *s, HEADER *h)
     p_clear(&tm, 1);
 
     while ((p = strtok (p, " \t")) != NULL) {
-        char tzstr[SHORT_STRING];
+        char tzstr[STRING];
         const char *ptz;
 
         switch (count) {
@@ -806,7 +795,7 @@ string_list_t **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, cha
 
       case MIME_LIST_POST:
         /* RFC 2369.  FIXME: We should ignore whitespace, but don't. */
-        if (strncmp(p, "NO", 2)) {
+        if (m_strncmp(p, "NO", 2)) {
             char *beg, *end;
 
             for (beg = strchr (p, '<'); beg; beg = strchr (end, ',')) {
@@ -968,8 +957,8 @@ string_list_t **mutt_parse_rfc822_line(ENVELOPE *e, HEADER *hdr, char *line, cha
         /* restore the original line */
         line[m_strlen(line)] = ':';
 
-        if (weed && option(OPTWEED) && mutt_matches_ignore(line, Ignore)
-        && !mutt_matches_ignore(line, UnIgnore)) {
+        if (weed && string_list_contains(Ignore, line, "*")
+        && !string_list_contains(UnIgnore, line, "*")) {
             break;
         }
 
@@ -1032,46 +1021,29 @@ mutt_read_rfc822_header(FILE *f, HEADER *hdr, short user_hdrs, short weed)
 
         p = strpbrk(line, ": \t");
         if (!p || *p != ':') {
-            char return_path[LONG_STRING];
-            time_t t;
-
             /* some bogus MTAs will quote the original "From " line */
-            if (!m_strncmp(">From ", line, 6))
+            if (!m_strncmp(">From ", line, 6) || !m_strncmp("From ", line, 5))
                 continue;               /* just ignore */
 
-            if (is_from(line, return_path, sizeof(return_path), &t)) {
-                /* MH somtimes has the From_ line in the middle of the header! */
-                if (hdr && !hdr->received)
-                    hdr->received = t - mutt_local_tz(t);
-                continue;
-            }
-
             fseeko(f, loc, 0);
             break;                    /* end of header */
         }
 
-        if (mutt_match_spam_list(line, SpamList, buf, sizeof(buf))) {
-            if (!rx_list_match(NoSpamList, line)) {
-                /* if spam tag already exists, figure out how to amend it */
-                if (e->spam && *buf) {
-                    if (SpamSep) {
-                        /* If SpamSep defined, append with separator */
-                        mutt_buffer_addstr(e->spam, SpamSep);
-                        mutt_buffer_addstr(e->spam, buf);
-                    } else {
-                        /* else overwrite */
-                        mutt_buffer_reset(e->spam);
-                        mutt_buffer_addstr(e->spam, buf);
-                    }
-                }
-                else if (!e->spam && *buf) {
-                    /* spam tag is new, and match expr is non-empty; copy */
-                    e->spam = mutt_buffer_from(NULL, buf);
-                }
-                else if (!e->spam) {
-                    /* match expr is empty; plug in null string if no existing tag */
-                    e->spam = mutt_buffer_from(NULL, "");
+        if (rx_list_match2(SpamList, line, buf, sizeof(buf))
+        && !rx_list_match(NoSpamList, line))
+        {
+            /* if spam tag already exists, figure out how to amend it */
+            if (e->spam && *buf) {
+                if (Mime.spam_separator) {
+                    mutt_buffer_addstr(e->spam, Mime.spam_separator);
+                } else {
+                    mutt_buffer_reset(e->spam);
                 }
+                mutt_buffer_addstr(e->spam, buf);
+            }
+
+            if (!e->spam) {
+                e->spam = mutt_buffer_from(NULL, buf);
             }
         }
 
@@ -1172,9 +1144,6 @@ static int count_body_parts (BODY *body, int flags)
 
 int mutt_count_body_parts(HEADER *hdr, int flags)
 {
-    if (!option(OPTCOUNTATTACH))
-        return 0;
-
     if (hdr->attach_valid && !(flags & M_PARTS_RECOUNT))
         return hdr->attach_total;