pager.c pattern.c postpone.c query.c \
recvattach.c recvcmd.c rfc1524.c rfc3676.c \
score.c send.c sendlib.c sidebar.c sort.c state.c status.c \
- thread.c url.c utf8.c wcwidth.c account.c
+ thread.c utf8.c wcwidth.c account.c
madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \
-Limap -limap -Lpop -lpop $(LIBNNTP) \
EXTRA_madmutt_SOURCES = \
account.c mutt_sasl.c dotlock.c remailer.c \
- alias.h browser.h mbyte.h remailer.h url.h state.h \
+ alias.h browser.h mbyte.h remailer.h state.h \
mutt_idna.h mutt_libesmtp.c sidebar.h state.h
EXTRA_DIST = config.rpath COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO \
#include <lib-lib/str.h>
#include <lib-lib/ascii.h>
#include <lib-lib/macros.h>
+#include <lib-lib/url.h>
#include <lib-ui/enter.h>
#include "mutt.h"
#include "account.h"
-#include "url.h"
-
/* mutt_account_match: compare account info (host/port/user/login) */
int mutt_account_match (const ACCOUNT * a1, const ACCOUNT * a2)
#ifndef _MUTT_ACCOUNT_H_
#define _MUTT_ACCOUNT_H_ 1
-#include "url.h"
+#include <lib-lib/url.h>
/* account types */
enum {
#include <lib-lib/mem.h>
#include <lib-lib/file.h>
#include <lib-lib/str.h>
+#include <lib-lib/url.h>
#include "mutt.h"
#include "imap_private.h"
#include "mx_imap.h"
-#include "url.h"
int imap_is_magic (const char* path, struct stat* st) {
url_scheme_t s;
#include <lib-lib/mem.h>
#include <lib-lib/ascii.h>
+#include <lib-lib/url.h>
#include "mutt.h"
#include "mx.h" /* for M_IMAP */
-#include "url.h"
#include "imap_private.h"
#include <lib-sys/mutt_ssl.h>
}
else if (pgpout) {
FGETCONV *fc;
- int c;
rewind (pgpout);
state_set_prefix (s);
liblib_a_SOURCES = mem.h str.h ascii.h buffer.h hash.h list.h file.h mapping.h \
str.c ascii.c buffer.c hash.c list.c file.c mapping.c \
\
- date.h debug.h rx.h \
- date.c debug.c rx.c
+ date.h debug.h rx.h url.h \
+ date.c debug.c rx.c url.c
noinst_HEADERS = mem.h str.h ascii.h buffer.h hash.h list.h file.h mapping.h \
- date.h debug.h rx.h
+ date.h debug.h rx.h url.h
-include ../cflags.mk
--- /dev/null
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * Copyright © 2006 Pierre Habouzit
+ */
+/*
+ * Copyright notice from original mutt:
+ * Copyright (C) 2000 Thomas Roessler <roessler@does-not-exist.org>
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
+
+/*
+ * A simple URL parser.
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+
+#include <lib-lib/mem.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/mapping.h>
+#include <lib-lib/url.h>
+
+#include <lib-mime/mime.h>
+
+#include "mutt.h"
+
+static struct mapping_t UrlMap[] = {
+ {"file", U_FILE},
+ {"imap", U_IMAP},
+ {"imaps", U_IMAPS},
+ {"pop", U_POP},
+ {"pops", U_POPS},
+ {"nntp", U_NNTP},
+ {"news", U_NNTP},
+ {"nntps", U_NNTPS},
+ {"snews", U_NNTPS},
+ {"mailto", U_MAILTO},
+ {NULL, U_UNKNOWN}
+};
+
+/* decode url escaping */
+char *url_decode(char *p)
+{
+ char *q = p;
+
+ if (!p)
+ return NULL;
+
+ while (*q) {
+ if (*q == '%' && hexval(q[1]) >= 0 && hexval(q[2]) >= 0) {
+ *p++ = (hexval(q[1]) << 4) | hexval(q[2]);
+ q += 3;
+ } else {
+ *p++ = *q++;
+ }
+ }
+
+ *p = '\0';
+ return p;
+}
+
+url_scheme_t url_check_scheme(const char *s)
+{
+ char sbuf[STRING];
+ char *t;
+ int i;
+
+ if (!s || !(t = strchr(s, ':')))
+ return U_UNKNOWN;
+
+ m_strncpy(sbuf, sizeof(sbuf), s, t - s);
+ i = mutt_getvaluebyname(sbuf, UrlMap);
+ return i == -1 ? U_UNKNOWN : i;
+}
+
+/* ciss_parse_userhost: fill in components of ciss with info from src. Note
+ * these are pointers into src, which is altered with '\0's. Port of 0
+ * means no port given.
+ * FIXME: THIS IS TASTELESS
+ */
+static char *ciss_parse_userhost(ciss_url_t *ciss, char *src)
+{
+ char *t;
+ char *p;
+ char *path;
+
+ ciss->user = NULL;
+ ciss->pass = NULL;
+ ciss->host = NULL;
+ ciss->port = 0;
+
+ if (strncmp(src, "//", 2))
+ return src;
+
+ src += 2;
+
+ if ((path = strchr(src, '/')))
+ *path++ = '\0';
+
+ if ((t = strrchr(src, '@'))) {
+ *t = '\0';
+ if ((p = strchr (src, ':'))) {
+ *p = '\0';
+ ciss->pass = p + 1;
+ url_decode (ciss->pass);
+ }
+ ciss->user = src;
+ url_decode (ciss->user);
+ t++;
+ }
+ else
+ t = src;
+
+ if ((p = strchr (t, ':'))) {
+ *p++ = '\0';
+ ciss->port = atoi (p);
+ }
+ else
+ ciss->port = 0;
+
+ ciss->host = t;
+ url_decode(ciss->host);
+ return path;
+}
+
+/* url_parse_ciss: Fill in ciss_url_t. char* elements are pointers into src,
+ * which is modified by this call (duplicate it first if you need to).
+ * FIXME: THIS IS TASTELESS
+ */
+int url_parse_ciss(ciss_url_t *ciss, char *src)
+{
+ ciss->scheme = url_check_scheme(src);
+ if (ciss->scheme == U_UNKNOWN)
+ return -1;
+
+ ciss->path = ciss_parse_userhost(ciss, strchr(src, ':') + 1);
+ url_decode(ciss->path);
+
+ return 0;
+}
+
+/* url_ciss_tostring: output the URL string for a given CISS object. */
+int url_ciss_tostring(ciss_url_t *ciss, char *dst, ssize_t len, int flags)
+{
+ ssize_t l = 0;
+
+ if (ciss->scheme == U_UNKNOWN)
+ return -1;
+
+ snprintf(dst, len, "%s:", mutt_getnamebyvalue(ciss->scheme, UrlMap));
+
+ if (ciss->host) {
+ l = m_strcat(dst, len, "//");
+
+ if (ciss->user) {
+ if ((flags & U_DECODE_PASSWD) && ciss->pass) {
+ l += snprintf(dst + l, len - l, "%s:%s@", ciss->user, ciss->pass);
+ } else {
+ l += snprintf(dst + l, len - l, "%s@", ciss->user);
+ }
+ }
+
+ if (ciss->port) {
+ l += snprintf(dst + l, len - l, "%s:%hu/", ciss->host, ciss->port);
+ } else {
+ l += snprintf(dst + l, len - l, "%s/", ciss->host);
+ }
+ }
+
+ l += m_strcpy(dst + l, len - l, ciss->path);
+
+ return 0;
+}
--- /dev/null
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * Copyright © 2006 Pierre Habouzit
+ */
+/*
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
+ */
+
+#ifndef MUTT_LIB_LIB_URL_H
+#define MUTT_LIB_LIB_URL_H
+
+#include <unistd.h>
+
+typedef enum url_scheme {
+ U_FILE,
+ U_POP,
+ U_POPS,
+ U_IMAP,
+ U_IMAPS,
+ U_NNTP,
+ U_NNTPS,
+ U_MAILTO,
+ U_UNKNOWN
+} url_scheme_t;
+
+#define U_DECODE_PASSWD (1)
+
+typedef struct ciss_url {
+ url_scheme_t scheme;
+ char *user;
+ char *pass;
+ char *host;
+ int port;
+ char *path;
+} ciss_url_t;
+
+char *url_decode(char *);
+
+url_scheme_t url_check_scheme (const char *s);
+int url_parse_ciss(ciss_url_t *ciss, char *src);
+int url_ciss_tostring(ciss_url_t *ciss, char *dst, ssize_t len, int flags);
+
+#endif /* MUTT_LIB_LIB_URL_H */
* Copyright © 2006 Pierre Habouzit
*/
+#include <lib-lib/ascii.h>
+#include <lib-lib/url.h>
+
#include "mime-types.h"
#include "mutt.h"
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;
+
+ LIST **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;
+}
#define TYPE(X) ((X->type == TYPEOTHER) && (X->xtype != NULL) ? X->xtype : BodyTypes[(X->type)])
#define ENCODING(X) BodyEncodings[(X)]
+int url_parse_mailto(ENVELOPE *e, char **body, const char *src);
+
/****************************************************************************/
/* RFC 822 */
/* Standard for ARPA Internet Text Messages */
#include <lib-lib/buffer.h>
#include <lib-lib/date.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include "recvattach.h"
-#include "url.h"
-
#include "mime.h"
#include <lib-lib/macros.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include <lib-sys/mutt_signal.h>
+#include <lib-mime/mime.h>
+
#include <lib-ui/curses.h>
#include "mutt.h"
#include "sort.h"
#include <lib-crypt/crypt.h>
#include "keymap.h"
-#include "url.h"
#include "mutt_idna.h"
#include "xterm.h"
#include <lib-lib/buffer.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include <lib-mime/mime.h>
#include "mutt.h"
#include "mx.h"
-#include "url.h"
#include "attach.h"
#include "version.h"
#include <lib-lib/macros.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include <lib-sys/unix.h>
#include "thread.h"
#include "copy.h"
#include "keymap.h"
-#include "url.h"
#include "sidebar.h"
#include "compress.h"
#include <lib-lib/mem.h>
#include <lib-lib/str.h>
+#include <lib-lib/url.h>
#include "mutt.h"
#include "nntp.h"
#include "mx_nntp.h"
-#include "url.h"
static int nntp_is_magic (const char* path, struct stat* st) {
url_scheme_t s = url_check_scheme (NONULL (path));
#include <lib-lib/mem.h>
#include <lib-lib/str.h>
+#include <lib-lib/url.h>
#include "mutt.h"
#include "pop.h"
#include "mx.h"
#include "mx_pop.h"
-
-#include "url.h"
-
static int pop_is_magic (const char* path, struct stat* st) {
url_scheme_t s = url_check_scheme (NONULL (path));
return ((s == U_POP || s == U_POPS) ? M_POP : -1);
#include <lib-lib/ascii.h>
#include <lib-lib/macros.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include "mutt.h"
#include "mx.h"
-#include "url.h"
#include "pop.h"
#if defined (USE_SSL) || defined (USE_GNUTLS)
# include <lib-sys/mutt_ssl.h>
#include <lib-lib/macros.h>
#include <lib-lib/file.h>
#include <lib-lib/debug.h>
+#include <lib-lib/url.h>
#include <lib-mime/mime.h>
#include "mx.h"
#include <lib-crypt/crypt.h>
#include "mutt_idna.h"
-#include "url.h"
#include "attach.h"
#ifdef USE_NNTP
+++ /dev/null
-/*
- * Copyright notice from original mutt:
- * Copyright (C) 2000 Thomas Roessler <roessler@does-not-exist.org>
- *
- * This file is part of mutt-ng, see http://www.muttng.org/.
- * It's licensed under the GNU General Public License,
- * please see the file GPL in the top level source directory.
- */
-
-/*
- * A simple URL parser.
- */
-
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <lib-lib/mem.h>
-#include <lib-lib/ascii.h>
-#include <lib-lib/mapping.h>
-
-#include <lib-mime/mime.h>
-
-#include "mutt.h"
-#include "url.h"
-
-
-#include <ctype.h>
-
-static struct mapping_t UrlMap[] = {
- {"file", U_FILE},
- {"imap", U_IMAP},
- {"imaps", U_IMAPS},
- {"pop", U_POP},
- {"pops", U_POPS},
- {"nntp", U_NNTP},
- {"news", U_NNTP},
- {"nntps", U_NNTPS},
- {"snews", U_NNTPS},
- {"mailto", U_MAILTO},
- {NULL, U_UNKNOWN}
-};
-
-
-static void url_pct_decode (char *s)
-{
- char *d;
-
- if (!s)
- return;
-
- for (d = s; *s; s++) {
- if (*s == '%' && hexval (s[1]) >= 0 && hexval (s[2]) >= 0) {
- *d++ = (hexval (s[1]) << 4) | (hexval (s[2]));
- s += 2;
- }
- else
- *d++ = *s;
- }
- *d = '\0';
-}
-
-url_scheme_t url_check_scheme (const char *s)
-{
- char sbuf[STRING];
- char *t;
- int i;
-
- if (!s || !(t = strchr (s, ':')))
- return U_UNKNOWN;
- if ((t - s) + 1 >= sizeof (sbuf))
- return U_UNKNOWN;
-
- m_strcpy(sbuf, t - s + 1, s);
- for (t = sbuf; *t; t++)
- *t = ascii_tolower (*t);
-
- if ((i = mutt_getvaluebyname (sbuf, UrlMap)) == -1)
- return U_UNKNOWN;
- else
- return (url_scheme_t) i;
-}
-
-int url_parse_file (char *d, const char *src, size_t dl)
-{
- if (ascii_strncasecmp (src, "file:", 5))
- return -1;
- else if (!ascii_strncasecmp (src, "file://", 7)) /* we don't support remote files */
- return -1;
- else
- m_strcpy(d, dl, src + 5);
-
- url_pct_decode (d);
- return 0;
-}
-
-/* ciss_parse_userhost: fill in components of ciss with info from src. Note
- * these are pointers into src, which is altered with '\0's. Port of 0
- * means no port given. */
-static char *ciss_parse_userhost (ciss_url_t * ciss, char *src)
-{
- char *t;
- char *p;
- char *path;
-
- ciss->user = NULL;
- ciss->pass = NULL;
- ciss->host = NULL;
- ciss->port = 0;
-
- if (strncmp (src, "//", 2))
- return src;
-
- src += 2;
-
- if ((path = strchr (src, '/')))
- *path++ = '\0';
-
- if ((t = strrchr (src, '@'))) {
- *t = '\0';
- if ((p = strchr (src, ':'))) {
- *p = '\0';
- ciss->pass = p + 1;
- url_pct_decode (ciss->pass);
- }
- ciss->user = src;
- url_pct_decode (ciss->user);
- t++;
- }
- else
- t = src;
-
- if ((p = strchr (t, ':'))) {
- *p++ = '\0';
- ciss->port = atoi (p);
- }
- else
- ciss->port = 0;
-
- ciss->host = t;
- url_pct_decode (ciss->host);
- return path;
-}
-
-/* url_parse_ciss: Fill in ciss_url_t. char* elements are pointers into src,
- * which is modified by this call (duplicate it first if you need to). */
-int url_parse_ciss (ciss_url_t * ciss, char *src)
-{
- char *tmp;
-
- if ((ciss->scheme = url_check_scheme (src)) == U_UNKNOWN)
- return -1;
-
- tmp = strchr (src, ':') + 1;
-
- ciss->path = ciss_parse_userhost (ciss, tmp);
- url_pct_decode (ciss->path);
-
- return 0;
-}
-
-/* url_ciss_tostring: output the URL string for a given CISS object. */
-
-int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags)
-{
- long l;
-
- if (ciss->scheme == U_UNKNOWN)
- return -1;
-
- snprintf (dest, len, "%s:", mutt_getnamebyvalue (ciss->scheme, UrlMap));
-
- if (ciss->host) {
- m_strcat(dest, len, "//");
- len -= (l = m_strlen(dest));
- dest += l;
-
- if (ciss->user) {
- if (flags & U_DECODE_PASSWD && ciss->pass)
- snprintf (dest, len, "%s:%s@", ciss->user, ciss->pass);
- else
- snprintf (dest, len, "%s@", ciss->user);
-
- len -= (l = m_strlen(dest));
- dest += l;
- }
-
- if (ciss->port)
- snprintf (dest, len, "%s:%hu/", ciss->host, ciss->port);
- else
- snprintf (dest, len, "%s/", ciss->host);
- }
-
- if (ciss->path)
- m_strcat(dest, len, ciss->path);
-
- return 0;
-}
-
-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;
-
- LIST **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_pct_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_pct_decode (tag);
- url_pct_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;
-}
+++ /dev/null
-/*
- * Copyright notice from original mutt:
- * [none]
- *
- * This file is part of mutt-ng, see http://www.muttng.org/.
- * It's licensed under the GNU General Public License,
- * please see the file GPL in the top level source directory.
- */
-
-#ifndef _URL_H
-# define _URL_H
-
-#include <lib-mime/mime.h>
-
-typedef enum url_scheme {
- U_FILE,
- U_POP,
- U_POPS,
- U_IMAP,
- U_IMAPS,
- U_NNTP,
- U_NNTPS,
- U_MAILTO,
- U_UNKNOWN
-} url_scheme_t;
-
-#define U_DECODE_PASSWD (1)
-
-typedef struct ciss_url {
- url_scheme_t scheme;
- char *user;
- char *pass;
- char *host;
- unsigned short port;
- char *path;
-} ciss_url_t;
-
-url_scheme_t url_check_scheme (const char *s);
-int url_parse_file (char *d, const char *src, size_t dl);
-int url_parse_ciss (ciss_url_t * ciss, char *src);
-int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags);
-int url_parse_mailto (ENVELOPE * e, char **body, const char *src);
-
-#endif