* Copyright © 2006 Pierre Habouzit
*/
+#include <lib-lib/ascii.h>
+#include <lib-lib/url.h>
+
#include "mime-types.h"
#include "mutt.h"
"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)
-{
- p_delete(¶m->attribute);
- p_delete(¶m->value);
- parameter_delete(¶m->next);
-}
-
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);
#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)
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;
+}