From adff68936ab5737b85866ad1fc8c0bc99fad3e44 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 23 Sep 2017 14:51:07 +0100 Subject: [PATCH] [Feature] Allow to insert headers into specific position --- src/libserver/milter.c | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/libserver/milter.c b/src/libserver/milter.c index 47129d9f3..82ace9899 100644 --- a/src/libserver/milter.c +++ b/src/libserver/milter.c @@ -1419,6 +1419,7 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session, ucl_object_iter_t it; struct rspamd_milter_private *priv = session->priv; GString *hname, *hvalue; + gint idx = -1; if (obj && ucl_object_type (obj) == UCL_OBJECT) { elt = ucl_object_lookup (obj, "remove_headers"); @@ -1442,6 +1443,8 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session, /* * add_headers: {"name": "value", ... } * name could have multiple values + * -or- (since 1.7) + * {"name": {"value": "val", "order": 0}, ... } */ if (elt && ucl_object_type (elt) == UCL_OBJECT) { it = NULL; @@ -1458,6 +1461,39 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session, g_string_free (hname, TRUE); g_string_free (hvalue, TRUE); } + else if (ucl_object_type (cur_elt) == UCL_OBJECT) { + const ucl_object_t *val; + + val = ucl_object_lookup (cur_elt, "value"); + + if (val && ucl_object_type (val) == UCL_STRING) { + const ucl_object_t *idx_obj; + + idx_obj = ucl_object_lookup_any (cur_elt, "order", + "index", NULL); + if (idx_obj) { + idx = ucl_object_toint (idx_obj); + } + + hname = g_string_new (ucl_object_key (cur)); + hvalue = g_string_new (ucl_object_tostring (val)); + + if (idx >= 0) { + rspamd_milter_send_action (session, + RSPAMD_MILTER_INSHEADER, + idx, + hname, hvalue); + } + else { + rspamd_milter_send_action (session, + RSPAMD_MILTER_ADDHEADER, + hname, hvalue); + } + + g_string_free (hname, TRUE); + g_string_free (hvalue, TRUE); + } + } } } } @@ -1595,8 +1631,8 @@ rspamd_milter_send_task_results (struct rspamd_milter_session *session, hname = g_string_new (RSPAMD_MILTER_DKIM_HEADER); hvalue = g_string_new (ucl_object_tostring (elt)); - rspamd_milter_send_action (session, RSPAMD_MILTER_ADDHEADER, - hname, hvalue); + rspamd_milter_send_action (session, RSPAMD_MILTER_INSHEADER, + 0, hname, hvalue); g_string_free (hname, TRUE); g_string_free (hvalue, TRUE); } -- 2.39.5