X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-mime%2Fmime.c;h=98237cf92544d16531eece93f2537a5467ef1f1f;hp=2311083f95c74e159397d65de8b0caa797e7a59e;hb=69f4685e616347559d4ec714fd826d7f97a472ef;hpb=cb4704c68992fe6e12cd153a693508b04bc7a470 diff --git a/lib-mime/mime.c b/lib-mime/mime.c index 2311083..98237cf 100644 --- a/lib-mime/mime.c +++ b/lib-mime/mime.c @@ -17,10 +17,15 @@ * Copyright © 2006 Pierre Habouzit */ +#include +#include + #include "mime-types.h" #include "mutt.h" +#define BOUNDARYLEN 16 + const char MimeSpecials[] = "@.,;:<>[]\\\"()?/= \t"; const char *BodyTypes[] = { @@ -45,30 +50,112 @@ const char *BodyEncodings[] = { "x-uuencoded", }; -void address_wipe(address_t *addr) +/****************************************************************************/ +/* rfc822 header parameters */ +/****************************************************************************/ + +char *parameter_getval(parameter_t *parm, const char *s) +{ + while (parm) { + if (!ascii_strcasecmp(parm->attribute, s)) + return parm->value; + parm = parm->next; + } + return NULL; +} + +void parameter_setval(parameter_t **p, const char *attribute, const char *value) { - p_delete(&addr->personal); - p_delete(&addr->mailbox); - address_delete(&addr->next); + while (*p) { + if (!ascii_strcasecmp(attribute, (*p)->attribute)) { + if (value) { + m_strreplace(&(*p)->value, value); + } else { + parameter_t *q = parameter_list_pop(p); + parameter_delete(&q); + } + return; + } + p = &(*p)->next; + } + + if (value) { + (*p) = parameter_new(); + (*p)->attribute = m_strdup(attribute); + (*p)->value = m_strdup(value); + } } -void parameter_wipe(PARAMETER *param) +void parameter_delval(parameter_t **p, const char *attribute) { - p_delete(¶m->attribute); - p_delete(¶m->value); - parameter_delete(¶m->next); + while (*p) { + if (!ascii_strcasecmp(attribute, (*p)->attribute)) { + parameter_t *q = parameter_list_pop(p); + parameter_delete(&q); + return; + } + + p = &(*p)->next; + } +} + +int parameter_equal(const parameter_t *p1, const parameter_t *p2) +{ + while (p1 && p2) { + if (m_strcmp(p1->attribute, p2->attribute) + || m_strcmp(p1->value, p2->value)) + return 0; + + p1 = p1->next; + p2 = p2->next; + } + + if (p1 || p2) + return 0; + + return 1; +} + +void parameter_set_boundary(parameter_t **parm) +{ + char rs[BOUNDARYLEN + 1]; + int i; + + for (i = 0; i < BOUNDARYLEN; i++) { + rs[i] = __m_b64chars[lrand48() % sizeof(__m_b64chars)]; + } + rs[BOUNDARYLEN] = '\0'; + + parameter_setval(parm, "boundary", rs); +} + + +/****************************************************************************/ +/* XXX */ +/****************************************************************************/ + +void rfc1524_entry_wipe(rfc1524_entry *p) +{ + 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); @@ -86,9 +173,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) @@ -99,8 +186,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; +}