diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-08-11 15:06:07 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-08-11 15:06:07 +0100 |
commit | 84eb4e2058760559f739af68690d4ff452401e22 (patch) | |
tree | 2bb60c9bc0aac014b5c6bbe3fa9a2b2f67484a07 /src/libserver | |
parent | 2ac98f03beac0facc269cee548de60283a569666 (diff) | |
download | rspamd-84eb4e2058760559f739af68690d4ff452401e22.tar.gz rspamd-84eb4e2058760559f739af68690d4ff452401e22.zip |
Use arguments splitting for files scanning.
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/protocol.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c index a87d8751e..ff28ba5f5 100644 --- a/src/libserver/protocol.c +++ b/src/libserver/protocol.c @@ -29,6 +29,7 @@ #include "cfg_rcl.h" #include "message.h" #include "utlist.h" +#include "http.h" /* Max line size */ #define OUTBUFSIZ BUFSIZ @@ -148,10 +149,12 @@ rspamd_protocol_handle_url (struct rspamd_task *task, struct rspamd_http_message *msg) { GList *cur; + GHashTable *query_args; struct custom_command *cmd; struct http_parser_url u; const gchar *p; gsize pathlen; + GString lookup, *res; if (msg->url == NULL || msg->url->len == 0) { g_set_error (&task->err, rspamd_protocol_quark(), 400, "missing command"); @@ -250,31 +253,30 @@ rspamd_protocol_handle_url (struct rspamd_task *task, if (u.field_set & (1 << UF_QUERY)) { /* In case if we have a query, we need to store it somewhere */ - task->msg.start = msg->url->str + u.field_data[UF_QUERY].off; - task->msg.len = u.field_data[UF_QUERY].len; - - /* Check URL query parameters */ - p = memchr (task->msg.start, '=', task->msg.len); - - if (p != NULL) { - if (p != task->msg.start && - (memcmp (task->msg.start, "file", - (p - task->msg.start)) == 0 || - memcmp (task->msg.start, "path", - (p - task->msg.start)) == 0)) { - task->msg.start = p + 1; - task->msg.len -= (p - task->msg.start) + 1; - task->flags |= RSPAMD_TASK_FLAG_FILE; - } - else { - msg_err ("invalid query parameter: %*s", task->msg.len, - task->msg.start); - } + query_args = rspamd_http_message_parse_query (msg); + + lookup.str = (gchar *)"file"; + lookup.len = sizeof ("file") - 1; + + res = g_hash_table_lookup (query_args, &lookup); + + if (res == NULL) { + lookup.str = (gchar *)"path"; + lookup.len = sizeof ("path") - 1; + res = g_hash_table_lookup (query_args, &lookup); + } + + if (res == NULL) { + /* Treat the whole query as path */ + task->msg.start = msg->url->str + u.field_data[UF_QUERY].off; + task->msg.len = u.field_data[UF_QUERY].len; } else { - /* Just file url afterwards */ - task->flags |= RSPAMD_TASK_FLAG_FILE; + task->msg.start = rspamd_mempool_strdup (task->task_pool, res->str); + task->msg.len = res->len; } + + g_hash_table_unref (query_args); } return TRUE; |