From 8f9af5c40f3a37ffb7b56462d39bcfee7a9f015b Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 24 Nov 2025 12:02:03 +0000 Subject: [PATCH] [Project] Process injected parts as normal parts --- src/libmime/message.c | 20 ++++++++++++++++++++ src/libmime/message.h | 9 +++++++++ src/lua/lua_task.c | 8 ++++++++ 3 files changed, 37 insertions(+) diff --git a/src/libmime/message.c b/src/libmime/message.c index caeaf4c05e..0410a50706 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -1115,6 +1115,26 @@ rspamd_message_process_text_part_maybe(struct rspamd_task *task, return TRUE; } +void rspamd_message_process_injected_text_part(struct rspamd_task *task, + struct rspamd_mime_text_part *text_part, + uint16_t *cur_url_order) +{ + /* Process plain text (no HTML support for injected parts yet) */ + if (!rspamd_message_process_plain_text_part(task, text_part)) { + return; + } + + /* Normalize text */ + rspamd_normalize_text_part(task, text_part); + + /* Extract URLs - always use FIND_ALL for injected parts (plain text) */ + rspamd_url_text_extract(task->task_pool, task, text_part, cur_url_order, + RSPAMD_URL_FIND_ALL); + + /* Create words for Bayes/stats */ + rspamd_mime_part_create_words(task, text_part); +} + /* Creates message from various data using libmagic to detect type */ static void rspamd_message_from_data(struct rspamd_task *task, const unsigned char *start, diff --git a/src/libmime/message.h b/src/libmime/message.h index 1016761512..19606a8c0f 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -219,6 +219,15 @@ gboolean rspamd_message_parse(struct rspamd_task *task); */ void rspamd_message_process(struct rspamd_task *task); +/** + * Process an injected text part (URL extraction, words, normalization) + * @param task + * @param text_part the injected text part to process + * @param cur_url_order pointer to current URL order counter + */ +void rspamd_message_process_injected_text_part(struct rspamd_task *task, + struct rspamd_mime_text_part *text_part, + uint16_t *cur_url_order); /** * Converts string to cte diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index ffd3b9bb2f..09c947c7a7 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -2876,6 +2876,7 @@ lua_task_inject_part(lua_State *L) txt_part->raw.len = content_len; txt_part->parsed = txt_part->raw; txt_part->utf_content = txt_part->raw; + txt_part->utf_stripped_text = (UText) UTEXT_INITIALIZER; txt_part->real_charset = "utf-8"; /* Add to message */ @@ -2883,6 +2884,13 @@ lua_task_inject_part(lua_State *L) g_ptr_array_add(task->message->parts, part); g_ptr_array_add(task->message->text_parts, txt_part); + /* Process injected text part fully (URLs, words, normalization) */ + if (task->cfg && task->message) { + /* Use high order number to ensure injected URLs are after original ones */ + uint16_t cur_url_order = 10000; + rspamd_message_process_injected_text_part(task, txt_part, &cur_url_order); + } + lua_pushboolean(L, true); } else { -- 2.47.3