]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Add support to search archives by magic
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 21 Jul 2016 14:08:50 +0000 (15:08 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 21 Jul 2016 14:09:39 +0000 (15:09 +0100)
Issue: #717
Reported by: @moisseev

src/libmime/archives.c

index b9a8f81b406a455ca3f48cb03b50808f6887aa80..2bae067be9a71453439f4b5125e3bbb313f333db 100644 (file)
@@ -553,7 +553,8 @@ end:
 }
 
 static gboolean
-rspamd_archive_cheat_detect (struct rspamd_mime_part *part, const gchar *str)
+rspamd_archive_cheat_detect (struct rspamd_mime_part *part, const gchar *str,
+               const guchar *magic_start, gsize magic_len)
 {
        GMimeContentType *ct;
        const gchar *fname, *p;
@@ -580,6 +581,13 @@ rspamd_archive_cheat_detect (struct rspamd_mime_part *part, const gchar *str)
                }
        }
 
+       if (magic_start != NULL) {
+               if (part->content->len > magic_len && memcmp (part->content->data,
+                               magic_start, magic_len) == 0) {
+                       return TRUE;
+               }
+       }
+
        return FALSE;
 }
 
@@ -588,15 +596,19 @@ rspamd_archives_process (struct rspamd_task *task)
 {
        guint i;
        struct rspamd_mime_part *part;
+       const guchar rar_magic[] = {0x52, 0x61, 0x72, 0x21, 0x1A, 0x07};
+       const guchar zip_magic[] = {0x50, 0x4b, 0x03, 0x04};
 
        for (i = 0; i < task->parts->len; i ++) {
                part = g_ptr_array_index (task->parts, i);
 
                if (part->content->len > 0) {
-                       if (rspamd_archive_cheat_detect (part, "zip")) {
+                       if (rspamd_archive_cheat_detect (part, "zip",
+                                       zip_magic, sizeof (zip_magic))) {
                                rspamd_archive_process_zip (task, part);
                        }
-                       else if (rspamd_archive_cheat_detect (part, "rar")) {
+                       else if (rspamd_archive_cheat_detect (part, "rar",
+                                       rar_magic, sizeof (rar_magic))) {
                                rspamd_archive_process_rar (task, part);
                        }
                }