]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Try to process images before text part heuristic
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 15 Apr 2020 14:19:52 +0000 (15:19 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 15 Apr 2020 14:19:52 +0000 (15:19 +0100)
src/libmime/images.c
src/libmime/images.h
src/libmime/message.c

index 218e947fc583ea33e495efdad892f242ce40d8be..c54f5845a8db1aa1905b384389118569034caa49 100644 (file)
@@ -43,7 +43,24 @@ static const guint8 jpg_sig_exif[] = {0xff, 0xe1};
 static const guint8 gif_signature[] = {'G', 'I', 'F', '8'};
 static const guint8 bmp_signature[] = {'B', 'M'};
 
-static void process_image (struct rspamd_task *task, struct rspamd_mime_part *part);
+static bool process_image (struct rspamd_task *task, struct rspamd_mime_part *part);
+
+
+bool
+rspamd_images_process_mime_part_maybe (struct rspamd_task *task,
+                                                                                       struct rspamd_mime_part *part)
+{
+       if (part->part_type == RSPAMD_MIME_PART_UNDEFINED) {
+               if (part->detected_type &&
+                       strcmp (part->detected_type, "image") == 0 &&
+                       part->parsed_data.len > 0) {
+
+                       return process_image (task, part);
+               }
+       }
+
+       return false;
+}
 
 void
 rspamd_images_process (struct rspamd_task *task)
@@ -52,14 +69,7 @@ rspamd_images_process (struct rspamd_task *task)
        struct rspamd_mime_part *part;
 
        PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, parts), i, part) {
-               if (part->part_type == RSPAMD_MIME_PART_UNDEFINED) {
-                       if (part->detected_type &&
-                               strcmp (part->detected_type, "image") == 0 &&
-                               part->parsed_data.len > 0) {
-
-                               process_image (task, part);
-                       }
-               }
+               rspamd_images_process_mime_part_maybe (task, part);
        }
 
 }
@@ -592,7 +602,7 @@ rspamd_maybe_process_image (rspamd_mempool_t *pool,
        return img;
 }
 
-static void
+static bool
 process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
 {
        struct rspamd_image *img;
@@ -612,7 +622,11 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
 
                part->part_type = RSPAMD_MIME_PART_IMAGE;
                part->specific.img = img;
+
+               return true;
        }
+
+       return false;
 }
 
 const gchar *
index 964a1b35af0544e4f61cf29b0803cac6edf077e1..887f30a37bfe2664eeba7feea6397412af954a7d 100644 (file)
@@ -39,6 +39,15 @@ struct rspamd_image {
  */
 void rspamd_images_process (struct rspamd_task *task);
 
+/**
+ * Process image if possible in a single mime part
+ * @param task
+ * @param part
+ * @return
+ */
+bool rspamd_images_process_mime_part_maybe (struct rspamd_task *task,
+               struct rspamd_mime_part *part);
+
 /*
  * Link embedded images to the HTML parts
  */
index 4847c4046ed5581a6806542bbade98b7e728fbdb..4b00d2dd0575689a33f590068865d5a288c8b6e1 100644 (file)
@@ -1464,6 +1464,10 @@ rspamd_message_process (struct rspamd_task *task)
                        lua_settop (L, funcs_top);
                }
 
+               /* Try to detect image before checking for text */
+               rspamd_images_process_mime_part_maybe (task, part);
+
+               /* Still no content detected, try text heuristic */
                if (part->part_type == RSPAMD_MIME_PART_UNDEFINED) {
                        rspamd_message_process_text_part_maybe (task, part);
                }
@@ -1601,7 +1605,6 @@ rspamd_message_process (struct rspamd_task *task)
                }
        }
 
-       rspamd_images_process (task);
        rspamd_images_link (task);
 
        rspamd_tokenize_meta_words (task);