From 2197686e13fcdd3b6d330961033a0b6c04943176 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 4 Apr 2019 10:16:48 +0100 Subject: [PATCH] [Minor] Try to support rewritten from in dkim signing --- src/libserver/dkim.c | 29 +++++++++++++++++++++++++++++ src/lua/lua_task.c | 7 +++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 8100f8ee3..9f5cabf6e 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -106,6 +106,7 @@ struct rspamd_dkim_common_ctx { gsize len; gint header_canon_type; gint body_canon_type; + gboolean is_sign; GPtrArray *hlist; GHashTable *htable; /* header -> count mapping */ EVP_MD_CTX *headers_hash; @@ -2195,6 +2196,33 @@ rspamd_dkim_canonize_header (struct rspamd_dkim_common_ctx *ctx, (gint)rh->raw_len, rh->raw_value); } else { + if (ctx->is_sign && (rh->type & RSPAMD_HEADER_FROM)) { + /* Special handling of the From handling when rewrite is done */ + gboolean has_rewrite = FALSE; + guint i; + struct rspamd_email_address *addr; + + PTR_ARRAY_FOREACH (task->from_mime, i, addr) { + if ((addr->flags & RSPAMD_EMAIL_ADDR_ORIGINAL) + && !(addr->flags & RSPAMD_EMAIL_ADDR_ALIASED)) { + has_rewrite = TRUE; + } + } + + if (has_rewrite) { + PTR_ARRAY_FOREACH (task->from_mime, i, addr) { + if (!(addr->flags & RSPAMD_EMAIL_ADDR_ORIGINAL)) { + if (!rspamd_dkim_canonize_header_relaxed (ctx, addr->raw, + header_name, FALSE)) { + return FALSE; + } + + return TRUE; + } + } + } + } + if (!rspamd_dkim_canonize_header_relaxed (ctx, rh->value, header_name, FALSE)) { return FALSE; @@ -2842,6 +2870,7 @@ rspamd_create_dkim_sign_context (struct rspamd_task *task, nctx->common.header_canon_type = headers_canon; nctx->common.body_canon_type = body_canon; nctx->common.type = type; + nctx->common.is_sign = TRUE; if (type != RSPAMD_DKIM_ARC_SEAL) { if (!rspamd_dkim_parse_hdrlist_common (&nctx->common, headers, diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index d8ba74ec0..ad11f2b41 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -2906,10 +2906,13 @@ lua_import_email_address (lua_State *L, struct rspamd_task *task, lua_gettable (L, pos); if (lua_type (L, -1) == LUA_TSTRING) { + gchar *cpy; p = lua_tolstring (L, -1, &len); - addr->raw = (const gchar *)rspamd_mempool_alloc (task->task_pool, len); - memcpy ((gchar *)addr->raw, p, len); + cpy = rspamd_mempool_alloc (task->task_pool, len + 1); + memcpy (cpy, p, len); + cpy[len] = '\0'; addr->raw_len = len; + addr->raw = cpy; } else { /* Construct raw addr */ -- 2.39.5