diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-09-09 11:20:29 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-09-09 13:51:26 +0100 |
commit | 9866dd42600ac87b638323f3f9bcec8195c3ab22 (patch) | |
tree | 93a22373933bf7b5074f9c0f64130b5aad20ea2d /src/libserver | |
parent | 0625542be15f6e3a9cc6209ce544adaa2a51bc30 (diff) | |
download | rspamd-9866dd42600ac87b638323f3f9bcec8195c3ab22.tar.gz rspamd-9866dd42600ac87b638323f3f9bcec8195c3ab22.zip |
[Feature] Allow to use dictionaries for compression
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/cfg_file.h | 4 | ||||
-rw-r--r-- | src/libserver/cfg_rcl.c | 13 | ||||
-rw-r--r-- | src/libserver/task.c | 41 |
3 files changed, 54 insertions, 4 deletions
diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index 7ce7f98a4..9a0fa0d22 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -417,7 +417,9 @@ struct rspamd_config { struct rspamd_config_post_load_script *on_load; /**< list of scripts executed on config load */ gchar *ssl_ca_path; /**< path to CA certs */ - gchar *ssl_ciphers; /**< set of preferred ciphers */ + gchar *ssl_ciphers; /**< set of preferred ciphers */ + gchar *zstd_input_dictionary; /**< path to zstd input dictionary */ + gchar *zstd_output_dictionary; /**< path to zstd output dictionary */ ref_entry_t ref; /**< reference counter */ }; diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 0cca28575..c89392207 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -1974,6 +1974,19 @@ rspamd_rcl_config_init (struct rspamd_config *cfg) G_STRUCT_OFFSET (struct rspamd_config, max_message), RSPAMD_CL_FLAG_INT_SIZE, "Maximum size of the message to be scanned"); + rspamd_rcl_add_default_handler (sub, + "zstd_input_dictionary", + rspamd_rcl_parse_struct_string, + G_STRUCT_OFFSET (struct rspamd_config, zstd_input_dictionary), + RSPAMD_CL_FLAG_STRING_PATH, + "Dictionary for zstd inbound protocol compression"); + rspamd_rcl_add_default_handler (sub, + "zstd_output_dictionary", + rspamd_rcl_parse_struct_string, + G_STRUCT_OFFSET (struct rspamd_config, zstd_output_dictionary), + RSPAMD_CL_FLAG_STRING_PATH, + "Dictionary for outbound zstd compression"); + /* New DNS configuration */ ssub = rspamd_rcl_add_section_doc (&sub->subsections, "dns", NULL, NULL, UCL_OBJECT, FALSE, TRUE, diff --git a/src/libserver/task.c b/src/libserver/task.c index f24ee0858..d4b5cb696 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -492,6 +492,44 @@ rspamd_task_load_message (struct rspamd_task *task, ZSTD_outBuffer zout; guchar *out; gsize outlen, r; + gulong dict_id; + + tok = rspamd_task_get_request_header (task, "dictionary"); + + if (tok != NULL) { + /* We need to use custom dictionary */ + if (!rspamd_strtoul (tok->begin, tok->len, &dict_id)) { + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Non numeric dictionary"); + + return FALSE; + } + + if (!task->cfg->libs_ctx->in_dict) { + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Unknown dictionary, undefined locally"); + + return FALSE; + } + + if (task->cfg->libs_ctx->in_dict->id != dict_id) { + g_set_error (&task->err, rspamd_task_quark(), RSPAMD_PROTOCOL_ERROR, + "Unknown dictionary, invalid dictionary id"); + + return FALSE; + } + + zstream = ZSTD_createDStream (); + g_assert (zstream != NULL); + g_assert (!ZSTD_isError (ZSTD_initDStream_usingDict(zstream, + task->cfg->libs_ctx->in_dict->dict, + task->cfg->libs_ctx->in_dict->size))); + } + else { + zstream = ZSTD_createDStream (); + g_assert (zstream != NULL); + g_assert (!ZSTD_isError (ZSTD_initDStream (zstream))); + } zin.pos = 0; zin.src = start; @@ -502,9 +540,6 @@ rspamd_task_load_message (struct rspamd_task *task, } out = g_malloc (outlen); - zstream = ZSTD_createDStream (); - g_assert (zstream != NULL); - g_assert (!ZSTD_isError (ZSTD_initDStream (zstream))); zout.dst = out; zout.pos = 0; zout.size = outlen; |