]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Rework] Rework URL structure: user field
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 6 Mar 2020 11:27:24 +0000 (11:27 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 9 Mar 2020 10:46:11 +0000 (10:46 +0000)
src/libserver/protocol.c
src/libserver/re_cache.c
src/libserver/url.c
src/libserver/url.h
src/lua/lua_url.c

index ee5cc1f4d66fa311dbf07e2d84fcaa050a3b50a5..4c1a94d9947c823b8c07f5d7dfedeffcbb3dc902 100644 (file)
@@ -994,9 +994,8 @@ emails_protocol_cb (gpointer key, gpointer value, gpointer ud)
        struct rspamd_url *url = value;
        ucl_object_t *obj;
 
-       if (url->userlen > 0 && url->hostlen > 0 &&
-                       url->host == url->user + url->userlen + 1) {
-               obj = ucl_object_fromlstring (url->user,
+       if (url->userlen > 0 && url->hostlen > 0) {
+               obj = ucl_object_fromlstring (rspamd_url_user_unsafe (url),
                                url->userlen + url->hostlen + 1);
                ucl_array_append (cb->top, obj);
        }
index 862ffc351d431a98b2e3e113f61957e7ac77976a..995af8ddf169becf9fbaa228c98dab1f4c73f593 100644 (file)
@@ -1223,7 +1223,7 @@ rspamd_re_cache_exec_re (struct rspamd_task *task,
                                        continue;
                                }
 
-                               in = url->user;
+                               in = rspamd_url_user_unsafe (url);
                                len = url->userlen + 1 + url->hostlen;
                                scvec[i] = (guchar *) in;
                                lenvec[i++] = len;
index f4c5783abb87654a858668fe2eaa0775e08a95a4..a2a9d852fe98295cbd3dffef166d83e199031247 100644 (file)
@@ -1874,7 +1874,7 @@ rspamd_url_shift (struct rspamd_url *uri, gsize nlen,
        switch (field) {
        case UF_SCHEMA:
                if (uri->userlen > 0) {
-                       uri->user -= shift;
+                       uri->usershift -= shift;
                }
                if (uri->hostlen > 0) {
                        uri->host -= shift;
@@ -2038,7 +2038,7 @@ rspamd_url_parse (struct rspamd_url *uri,
                                uri->fragmentlen = complen;
                                break;
                        case UF_USERINFO:
-                               uri->user = comp;
+                               uri->usershift = u.field_data[i].off;
                                uri->userlen = complen;
                                break;
                        default:
@@ -3382,7 +3382,7 @@ rspamd_email_hash (gconstpointer u)
        }
 
        if (url->userlen > 0) {
-               rspamd_cryptobox_fast_hash_update (&st, url->user, url->userlen);
+               rspamd_cryptobox_fast_hash_update (&st, rspamd_url_user_unsafe(url), url->userlen);
        }
 
        return (guint)rspamd_cryptobox_fast_hash_final (&st);
@@ -3404,8 +3404,9 @@ rspamd_emails_cmp (gconstpointer a, gconstpointer b)
                                return FALSE;
                        }
                        else {
-                               return rspamd_lc_cmp (u1->user, u2->user, u1->userlen) ==
-                                               0;
+                               return (rspamd_lc_cmp (rspamd_url_user_unsafe(u1),
+                                               rspamd_url_user_unsafe(u2),
+                                               u1->userlen) == 0);
                        }
                }
                else {
@@ -3606,7 +3607,7 @@ static const unsigned char rspamd_url_encoding_classes[256] = {
 
 #define CHECK_URL_COMPONENT(beg, len, flags) do { \
        for (i = 0; i < (len); i ++) { \
-               if ((rspamd_url_encoding_classes[(beg)[i]] & (flags)) == 0) { \
+               if ((rspamd_url_encoding_classes[(guchar)(beg)[i]] & (flags)) == 0) { \
                        dlen += 2; \
                } \
        } \
@@ -3614,10 +3615,10 @@ static const unsigned char rspamd_url_encoding_classes[256] = {
 
 #define ENCODE_URL_COMPONENT(beg, len, flags) do { \
        for (i = 0; i < (len) && dend > d; i ++) { \
-               if ((rspamd_url_encoding_classes[(beg)[i]] & (flags)) == 0) { \
+               if ((rspamd_url_encoding_classes[(guchar)(beg)[i]] & (flags)) == 0) { \
                        *d++ = '%'; \
-                       *d++ = hexdigests[((beg)[i] >> 4) & 0xf]; \
-                       *d++ = hexdigests[(beg)[i] & 0xf]; \
+                       *d++ = hexdigests[(guchar)((beg)[i] >> 4) & 0xf]; \
+                       *d++ = hexdigests[(guchar)(beg)[i] & 0xf]; \
                } \
                else { \
                        *d++ = (beg)[i]; \
@@ -3638,7 +3639,7 @@ rspamd_url_encode (struct rspamd_url *url, gsize *pdlen,
 
        CHECK_URL_COMPONENT ((guchar *)url->host, url->hostlen,
                        RSPAMD_URL_FLAGS_HOSTSAFE);
-       CHECK_URL_COMPONENT ((guchar *)url->user, url->userlen,
+       CHECK_URL_COMPONENT (rspamd_url_user_unsafe(url), url->userlen,
                        RSPAMD_URL_FLAGS_USERSAFE);
        CHECK_URL_COMPONENT ((guchar *)url->data, url->datalen,
                        RSPAMD_URL_FLAGS_PATHSAFE);
@@ -3677,7 +3678,7 @@ rspamd_url_encode (struct rspamd_url *url, gsize *pdlen,
        }
 
        if (url->userlen > 0) {
-               ENCODE_URL_COMPONENT ((guchar *)url->user, url->userlen,
+               ENCODE_URL_COMPONENT (rspamd_url_user_unsafe (url), url->userlen,
                                RSPAMD_URL_FLAGS_USERSAFE);
                *d++ = ':';
        }
index 53c4abbebec7ef901c5823ff2b55914850089b63..78330d8143df9cae82d44d14f2016791cc1a6174 100644 (file)
@@ -47,7 +47,9 @@ struct rspamd_url {
        guint protocol;
        guint port;
 
-       gchar *user;
+       guint usershift;
+       guint userlen;
+
        gchar *host;
        gchar *data;
        gchar *query;
@@ -58,7 +60,6 @@ struct rspamd_url {
        struct rspamd_url *phished_url;
 
        guint protocollen;
-       guint userlen;
        guint hostlen;
        guint datalen;
        guint querylen;
@@ -71,6 +72,9 @@ struct rspamd_url {
        guint count;
 };
 
+#define rspamd_url_user(u) ((u)->userlen > 0 ? (u)->string + (u)->usershift : NULL)
+#define rspamd_url_user_unsafe(u) ((u)->string + (u)->usershift)
+
 enum uri_errno {
        URI_ERRNO_OK = 0,           /* Parsing went well */
        URI_ERRNO_EMPTY,        /* The URI string was empty */
index 0bd4f1c7e830cf368cdd86cd895df2eec2e73834..7b0dee89b84ac20d6a1b94e3174e4b36a4d874c1 100644 (file)
@@ -198,8 +198,8 @@ lua_url_get_user (lua_State *L)
        LUA_TRACE_POINT;
        struct rspamd_lua_url *url = lua_check_url (L, 1);
 
-       if (url != NULL && url->url->user != NULL) {
-               lua_pushlstring (L, url->url->user, url->url->userlen);
+       if (url != NULL && rspamd_url_user (url->url) != NULL) {
+               lua_pushlstring (L, rspamd_url_user (url->url), url->url->userlen);
        }
        else {
                lua_pushnil (L);
@@ -307,7 +307,10 @@ lua_url_tostring (lua_State *L)
                if (url->url->protocol == PROTOCOL_MAILTO) {
                        gchar *tmp = g_malloc (url->url->userlen + 1 +
                                                                   url->url->hostlen);
-                       memcpy (tmp, url->url->user, url->url->userlen);
+                       if (url->url->userlen) {
+                               memcpy (tmp, url->url->string + url->url->usershift, url->url->userlen);
+                       }
+
                        tmp[url->url->userlen] = '@';
                        memcpy (tmp + url->url->userlen + 1, url->url->host,
                                        url->url->hostlen);
@@ -675,7 +678,7 @@ lua_url_to_table (lua_State *L)
 
                if (u->userlen > 0) {
                        lua_pushstring (L, "user");
-                       lua_pushlstring (L, u->user, u->userlen);
+                       lua_pushlstring (L, rspamd_url_user (u), u->userlen);
                        lua_settable (L, -3);
                }