diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-02 09:38:02 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-02 11:42:36 +0100 |
commit | 14e6824f07ad6f265121c6f1c97c39bad70f08ac (patch) | |
tree | 5bc6d9201061173821266b9f6f68525183c9b778 | |
parent | ffb05ee3a0bbf1732d0ab8f06b27138f1d6f51a9 (diff) | |
download | rspamd-14e6824f07ad6f265121c6f1c97c39bad70f08ac.tar.gz rspamd-14e6824f07ad6f265121c6f1c97c39bad70f08ac.zip |
Improve support of IP based URLs.
-rw-r--r-- | src/libserver/url.c | 55 | ||||
-rw-r--r-- | src/libserver/url.h | 1 |
2 files changed, 50 insertions, 6 deletions
diff --git a/src/libserver/url.c b/src/libserver/url.c index 3f4d9a258..2567b536c 100644 --- a/src/libserver/url.c +++ b/src/libserver/url.c @@ -1004,6 +1004,53 @@ rspamd_tld_trie_callback (int strnum, int textpos, void *context) return 1; } +static gboolean +rspamd_url_is_ip (struct rspamd_url *uri, rspamd_mempool_t *pool) +{ + const gchar *p, *end; + gchar buf[INET6_ADDRSTRLEN + 1]; + struct in_addr in4; + struct in6_addr in6; + gboolean ret = FALSE; + + p = uri->host; + end = p + uri->hostlen; + + if (*p == '[' && *(end - 1) == ']') { + p ++; + end --; + } + + if (end - p > (gint)sizeof (buf) - 1) { + return FALSE; + } + + rspamd_strlcpy (buf, p, end - p + 1); + + if (inet_pton (AF_INET, buf, &in4) == 1) { + uri->host = rspamd_mempool_alloc (pool, INET_ADDRSTRLEN + 1); + memset (uri->host, 0, INET_ADDRSTRLEN + 1); + inet_ntop (AF_INET, &in4, uri->host, INET_ADDRSTRLEN); + uri->hostlen = strlen (uri->host); + uri->tld = uri->host; + uri->tldlen = uri->hostlen; + uri->is_numeric = TRUE; + ret = TRUE; + } + else if (inet_pton (AF_INET6, buf, &in6) == 1) { + uri->host = rspamd_mempool_alloc (pool, INET6_ADDRSTRLEN + 1); + memset (uri->host, 0, INET6_ADDRSTRLEN + 1); + inet_ntop (AF_INET6, &in6, uri->host, INET6_ADDRSTRLEN); + uri->hostlen = strlen (uri->host); + uri->tld = uri->host; + uri->tldlen = uri->hostlen; + uri->is_numeric = TRUE; + ret = TRUE; + } + + return ret; +} + enum uri_errno rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len, rspamd_mempool_t *pool) @@ -1164,12 +1211,8 @@ rspamd_url_parse (struct rspamd_url *uri, gchar *uristring, gsize len, if (acism_lookup (url_scanner->search_trie, uri->host, uri->hostlen, rspamd_tld_trie_callback, uri, &state, true) == 0) { /* Ignore URL's without TLD if it is not a numeric URL */ - for (i = 0; i < uri->hostlen; i ++) { - t = uri->host[i]; - - if (g_ascii_isalpha (t)) { - return URI_ERRNO_BAD_FORMAT; - } + if (!rspamd_url_is_ip (uri, pool)) { + return URI_ERRNO_BAD_FORMAT; } } diff --git a/src/libserver/url.h b/src/libserver/url.h index 1faead3f2..8666b8c9f 100644 --- a/src/libserver/url.h +++ b/src/libserver/url.h @@ -36,6 +36,7 @@ struct rspamd_url { guint urllen; gboolean is_phished; /* URI maybe phishing */ + gboolean is_numeric; /* URI contains IP address */ }; enum uri_errno { |