X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-mime%2Fmime.c;h=3a8a9ede50589c175fa4ce9c4b9e7b1a939b6369;hp=238bdbbc99cd023d9f4de6dcef98d62a10416a90;hb=fdb93a08e305b8755260144807e4d45106a9cb9f;hpb=22601f25ede6703ba7cd06ee84eddd2045308570 diff --git a/lib-mime/mime.c b/lib-mime/mime.c index 238bdbb..3a8a9ed 100644 --- a/lib-mime/mime.c +++ b/lib-mime/mime.c @@ -17,8 +17,13 @@ * Copyright © 2006 Pierre Habouzit */ +#include +#include + #include "mime-types.h" +#include "mutt.h" + const char MimeSpecials[] = "@.,;:<>[]\\\"()?/= \t"; const char *BodyTypes[] = { @@ -43,30 +48,28 @@ const char *BodyEncodings[] = { "x-uuencoded", }; -void address_wipe(address_t *addr) -{ - p_delete(&addr->personal); - p_delete(&addr->mailbox); - address_delete(&addr->next); -} - -void parameter_wipe(PARAMETER *param) +void rfc1524_entry_wipe(rfc1524_entry *p) { - p_delete(¶m->attribute); - p_delete(¶m->value); - parameter_delete(¶m->next); + p_delete(&p->command); + p_delete(&p->testcommand); + p_delete(&p->composecommand); + p_delete(&p->composetypecommand); + p_delete(&p->editcommand); + p_delete(&p->printcommand); + p_delete(&p->nametemplate); + p_delete(&p->convert); } void envelope_wipe(ENVELOPE *p) { - address_delete(&p->return_path); - address_delete(&p->from); - address_delete(&p->to); - address_delete(&p->cc); - address_delete(&p->bcc); - address_delete(&p->sender); - address_delete(&p->reply_to); - address_delete(&p->mail_followup_to); + address_list_wipe(&p->return_path); + address_list_wipe(&p->from); + address_list_wipe(&p->to); + address_list_wipe(&p->cc); + address_list_wipe(&p->bcc); + address_list_wipe(&p->sender); + address_list_wipe(&p->reply_to); + address_list_wipe(&p->mail_followup_to); p_delete(&p->list_post); p_delete(&p->subject); @@ -84,9 +87,9 @@ void envelope_wipe(ENVELOPE *p) #endif mutt_buffer_free (&p->spam); - mutt_free_list(&p->references); - mutt_free_list(&p->in_reply_to); - mutt_free_list(&p->userhdrs); + string_list_wipe(&p->references); + string_list_wipe(&p->in_reply_to); + string_list_wipe(&p->userhdrs); } void header_wipe(HEADER *h) @@ -97,8 +100,68 @@ void header_wipe(HEADER *h) p_delete(&h->tree); p_delete(&h->path); #ifdef MIXMASTER - mutt_free_list(&h->chain); + string_list_wipe(&h->chain); #endif p_delete(&h->data); } +int url_parse_mailto(ENVELOPE *e, char **body, const char *src) +{ + char *t; + char *tmp; + char *headers; + char *tag, *value; + char scratch[HUGE_STRING]; + + int taglen; + + string_list_t **last = &e->userhdrs; + + if (!(t = strchr (src, ':'))) + return -1; + + if ((tmp = m_strdup(t + 1)) == NULL) + return -1; + + if ((headers = strchr (tmp, '?'))) + *headers++ = '\0'; + + url_decode(tmp); + e->to = rfc822_parse_adrlist (e->to, tmp); + + tag = headers ? strtok (headers, "&") : NULL; + + for (; tag; tag = strtok (NULL, "&")) { + if ((value = strchr (tag, '='))) + *value++ = '\0'; + if (!value || !*value) + continue; + + url_decode (tag); + url_decode (value); + + if (!ascii_strcasecmp (tag, "body")) { + if (body) + m_strreplace(body, value); + } + else { +#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-") + taglen = m_strlen(tag) + m_strlen(SAFEPFX); + /* mutt_parse_rfc822_line makes some assumptions */ + snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value); +#undef SAVEPFX + scratch[taglen] = '\0'; + value = vskipspaces(&scratch[taglen + 1]); + last = mutt_parse_rfc822_line (e, NULL, scratch, value, 0, 0, last); + /* if $strict_mailto is set, force editing headers to let + * users have a look at what we got */ + if (!option (OPTSTRICTMAILTO)) { + set_option (OPTXMAILTO); + set_option (OPTEDITHDRS); + } + } + } + + p_delete(&tmp); + return 0; +}