X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-mime%2Fmime.c;h=4353e4df5c9e820793085930dc33b275447b54a9;hp=e9234490b965932d0a8b7c5826922385536539a4;hb=774b53097f8c8b62c5101bce8f313d339387a438;hpb=2a2f2f9a5bad73c883b7f9c9b4166d932b6aaf37 diff --git a/lib-mime/mime.c b/lib-mime/mime.c index e923449..4353e4d 100644 --- a/lib-mime/mime.c +++ b/lib-mime/mime.c @@ -16,13 +16,18 @@ * * Copyright © 2006 Pierre Habouzit */ +/* + * Copyright notice from original mutt: + * Copyright (C) 1996-2000 Michael R. Elkins + * Copyright (C) 1999-2000 Thomas Roessler + */ #include #include -#include "mime-types.h" +#include "mime.h" -#include "mutt.h" +#define BOUNDARYLEN 16 const char MimeSpecials[] = "@.,;:<>[]\\\"()?/= \t"; @@ -52,7 +57,7 @@ const char *BodyEncodings[] = { /* rfc822 header parameters */ /****************************************************************************/ -char *parameter_getval(PARAMETER *parm, const char *s) +char *parameter_getval(parameter_t *parm, const char *s) { while (parm) { if (!ascii_strcasecmp(parm->attribute, s)) @@ -62,22 +67,76 @@ char *parameter_getval(PARAMETER *parm, const char *s) return NULL; } -/****************************************************************************/ -/* XXX */ -/****************************************************************************/ +void parameter_setval(parameter_t **p, const char *attribute, const char *value) +{ + 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_delval(parameter_t **p, const char *attribute) +{ + while (*p) { + if (!ascii_strcasecmp(attribute, (*p)->attribute)) { + parameter_t *q = parameter_list_pop(p); + parameter_delete(&q); + return; + } + + p = &(*p)->next; + } +} -void rfc1524_entry_wipe(rfc1524_entry *p) +int parameter_equal(const parameter_t *p1, const parameter_t *p2) { - 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); + 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 envelope_wipe(ENVELOPE *p) { address_list_wipe(&p->return_path); @@ -110,10 +169,36 @@ void envelope_wipe(ENVELOPE *p) string_list_wipe(&p->userhdrs); } +void body_wipe(BODY *b) +{ + if (b->parameter) + parameter_list_wipe(&b->parameter); + + if (b->unlink && b->filename) { + unlink (b->filename); + } + + p_delete(&b->filename); + p_delete(&b->content); + p_delete(&b->xtype); + p_delete(&b->subtype); + p_delete(&b->description); + p_delete(&b->form_name); + + if (b->hdr) { + /* Don't free twice (b->hdr->content = b->parts) */ + b->hdr->content = NULL; + header_delete(&b->hdr); + } + + if (b->parts) + body_list_wipe(&b->parts); +} + void header_wipe(HEADER *h) { envelope_delete(&h->env); - mutt_free_body (&h->content); + body_list_wipe(&h->content); p_delete(&h->maildir_flags); p_delete(&h->tree); p_delete(&h->path); @@ -123,6 +208,35 @@ void header_wipe(HEADER *h) p_delete(&h->data); } + +/****************************************************************************/ +/* misc functions */ +/****************************************************************************/ + +int mutt_is_text_part(BODY * b) +{ + char *s = b->subtype; + + if (mutt_is_application_pgp(b)) + return 0; + + switch (b->type) { + case TYPETEXT: + return 1; + + case TYPEMESSAGE: + return mime_which_token(s, -1) == MIME_DELIVERY_STATUS; + + case TYPEAPPLICATION: + return mime_which_token(s, -1) == MIME_PGP_KEYS; + + default: + return 0; + } +} + +#include "mutt.h" + int url_parse_mailto(ENVELOPE *e, char **body, const char *src) { char *t; @@ -145,11 +259,11 @@ int url_parse_mailto(ENVELOPE *e, char **body, const char *src) *headers++ = '\0'; url_decode(tmp); - e->to = rfc822_parse_adrlist (e->to, tmp); + e->to = rfc822_parse_adrlist(e->to, tmp); tag = headers ? strtok (headers, "&") : NULL; - for (; tag; tag = strtok (NULL, "&")) { + for (; tag; tag = strtok(NULL, "&")) { if ((value = strchr (tag, '='))) *value++ = '\0'; if (!value || !*value) @@ -158,19 +272,18 @@ int url_parse_mailto(ENVELOPE *e, char **body, const char *src) url_decode (tag); url_decode (value); - if (!ascii_strcasecmp (tag, "body")) { + if (mime_which_token(tag, -1) == MIME_BODY) { if (body) m_strreplace(body, value); - } - else { -#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-") - taglen = m_strlen(tag) + m_strlen(SAFEPFX); + } else { +#define SAFEPFX (option(OPTSTRICTMAILTO) ? "" : "X-Mailto-") + taglen = m_strlen(tag) + strlen(SAFEPFX); /* mutt_parse_rfc822_line makes some assumptions */ - snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value); + 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); + 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)) {