]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Process injected parts as normal parts
authorVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 24 Nov 2025 12:02:03 +0000 (12:02 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Mon, 24 Nov 2025 12:02:03 +0000 (12:02 +0000)
src/libmime/message.c
src/libmime/message.h
src/lua/lua_task.c

index caeaf4c05e91ff370d1f57e23ccba7f98369a33f..0410a50706ad4530b5ed64a4276e763e9118da8a 100644 (file)
@@ -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,
index 10167615124eda94c35af1f833a1231313439619..19606a8c0fe41623a9f25b7f19859492960b74c5 100644 (file)
@@ -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
index ffd3b9bb2f12784a12be482320ad4e2d5a93f241..09c947c7a71e05e42cbf43eedd4fb3d9798f39ab 100644 (file)
@@ -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 {