]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Core: Rework images processing API
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 15 Jan 2019 11:07:46 +0000 (11:07 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 15 Jan 2019 11:07:46 +0000 (11:07 +0000)
src/libmime/images.c
src/libmime/images.h
src/libserver/html.c
src/libserver/html.h

index c4d20b4ad316028aba6767b2bab0e1f6719a5967..b9a54b1a0feea770dfe65791a42e2d7eec575303 100644 (file)
@@ -92,14 +92,14 @@ detect_image_type (rspamd_ftok_t *data)
 
 
 static struct rspamd_image *
-process_png_image (struct rspamd_task *task, rspamd_ftok_t *data)
+process_png_image (rspamd_mempool_t *pool, rspamd_ftok_t *data)
 {
        struct rspamd_image *img;
        guint32 t;
        const guint8 *p;
 
        if (data->len < 24) {
-               msg_info_task ("bad png detected (maybe striped)");
+               msg_info_pool ("bad png detected (maybe striped)");
                return NULL;
        }
 
@@ -107,11 +107,11 @@ process_png_image (struct rspamd_task *task, rspamd_ftok_t *data)
        /* Skip signature and read header section */
        p = data->begin + 12;
        if (memcmp (p, "IHDR", 4) != 0) {
-               msg_info_task ("png doesn't begins with IHDR section");
+               msg_info_pool ("png doesn't begins with IHDR section");
                return NULL;
        }
 
-       img = rspamd_mempool_alloc0 (task->task_pool, sizeof (struct rspamd_image));
+       img = rspamd_mempool_alloc0 (pool, sizeof (struct rspamd_image));
        img->type = IMAGE_TYPE_PNG;
        img->data = data;
 
@@ -126,13 +126,13 @@ process_png_image (struct rspamd_task *task, rspamd_ftok_t *data)
 }
 
 static struct rspamd_image *
-process_jpg_image (struct rspamd_task *task, rspamd_ftok_t *data)
+process_jpg_image (rspamd_mempool_t *pool, rspamd_ftok_t *data)
 {
        const guint8 *p, *end;
        guint16 h, w;
        struct rspamd_image *img;
 
-       img = rspamd_mempool_alloc0 (task->task_pool, sizeof (struct rspamd_image));
+       img = rspamd_mempool_alloc0 (pool, sizeof (struct rspamd_image));
        img->type = IMAGE_TYPE_JPG;
        img->data = data;
 
@@ -169,18 +169,18 @@ process_jpg_image (struct rspamd_task *task, rspamd_ftok_t *data)
 }
 
 static struct rspamd_image *
-process_gif_image (struct rspamd_task *task, rspamd_ftok_t *data)
+process_gif_image (rspamd_mempool_t *pool, rspamd_ftok_t *data)
 {
        struct rspamd_image *img;
        const guint8 *p;
        guint16 t;
 
        if (data->len < 10) {
-               msg_info_task ("bad gif detected (maybe striped)");
+               msg_info_pool ("bad gif detected (maybe striped)");
                return NULL;
        }
 
-       img = rspamd_mempool_alloc0 (task->task_pool, sizeof (struct rspamd_image));
+       img = rspamd_mempool_alloc0 (pool, sizeof (struct rspamd_image));
        img->type = IMAGE_TYPE_GIF;
        img->data = data;
 
@@ -194,18 +194,18 @@ process_gif_image (struct rspamd_task *task, rspamd_ftok_t *data)
 }
 
 static struct rspamd_image *
-process_bmp_image (struct rspamd_task *task, rspamd_ftok_t *data)
+process_bmp_image (rspamd_mempool_t *pool, rspamd_ftok_t *data)
 {
        struct rspamd_image *img;
        gint32 t;
        const guint8 *p;
 
        if (data->len < 28) {
-               msg_info_task ("bad bmp detected (maybe striped)");
+               msg_info_pool ("bad bmp detected (maybe striped)");
                return NULL;
        }
 
-       img = rspamd_mempool_alloc0 (task->task_pool, sizeof (struct rspamd_image));
+       img = rspamd_mempool_alloc0 (pool, sizeof (struct rspamd_image));
        img->type = IMAGE_TYPE_BMP;
        img->data = data;
        p = data->begin + 18;
@@ -558,31 +558,26 @@ rspamd_image_normalize (struct rspamd_task *task, struct rspamd_image *img)
 #endif
 }
 
-static void
-process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
+struct rspamd_image*
+rspamd_maybe_process_image (rspamd_mempool_t *pool,
+                                                       rspamd_ftok_t *data)
 {
        enum rspamd_image_type type;
        struct rspamd_image *img = NULL;
-       struct rspamd_mime_header *rh;
-       struct rspamd_mime_text_part *tp;
-       struct html_image *himg;
-       const gchar *cid, *html_cid;
-       guint cid_len, i, j;
-       GPtrArray *ar;
 
-       if ((type = detect_image_type (&part->parsed_data)) != IMAGE_TYPE_UNKNOWN) {
+       if ((type = detect_image_type (data)) != IMAGE_TYPE_UNKNOWN) {
                switch (type) {
                case IMAGE_TYPE_PNG:
-                       img = process_png_image (task, &part->parsed_data);
+                       img = process_png_image (pool, data);
                        break;
                case IMAGE_TYPE_JPG:
-                       img = process_jpg_image (task, &part->parsed_data);
+                       img = process_jpg_image (pool, data);
                        break;
                case IMAGE_TYPE_GIF:
-                       img = process_gif_image (task, &part->parsed_data);
+                       img = process_gif_image (pool, data);
                        break;
                case IMAGE_TYPE_BMP:
-                       img = process_bmp_image (task, &part->parsed_data);
+                       img = process_bmp_image (pool, data);
                        break;
                default:
                        img = NULL;
@@ -590,6 +585,23 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
                }
        }
 
+       return img;
+}
+
+static void
+process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
+{
+       struct rspamd_mime_header *rh;
+       struct rspamd_mime_text_part *tp;
+       struct html_image *himg;
+       const gchar *cid, *html_cid;
+       guint cid_len, i, j;
+       GPtrArray *ar;
+       struct rspamd_image *img;
+
+
+       img = rspamd_maybe_process_image (task->task_pool, &part->parsed_data);
+
        if (img != NULL) {
                debug_task ("detected %s image of size %ud x %ud in message <%s>",
                        rspamd_image_type_str (img->type),
@@ -643,6 +655,7 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
                                                                if (strlen (html_cid) == cid_len &&
                                                                                memcmp (html_cid, cid, cid_len) == 0) {
                                                                        img->html_image = himg;
+                                                                       himg->embedded_image = img;
 
                                                                        debug_task ("found linked image by cid: <%s>",
                                                                                        cid);
index 55aa6873f9b493f0accd116bfe9650a983840ffc..39a7dc8c51bdf8bdc471391c99c19da2300d80e3 100644 (file)
@@ -35,6 +35,15 @@ struct rspamd_image {
  */
 void rspamd_images_process (struct rspamd_task *task);
 
+/**
+ * Processes image in raw data
+ * @param task
+ * @param data
+ * @return
+ */
+struct rspamd_image* rspamd_maybe_process_image (rspamd_mempool_t *pool,
+               rspamd_ftok_t *data);
+
 /*
  * Get textual representation of an image's type
  */
index 8ebb3862e37fdfc6a6c5b4568c17137becc6dc91..9bf15e0a2c4d1d30c25e9a3c749a0e79d40d722e 100644 (file)
@@ -1512,6 +1512,13 @@ rspamd_html_process_img_tag (rspamd_mempool_t *pool, struct html_tag *tag,
                                /* We have an embedded image */
                                img->flags |= RSPAMD_HTML_FLAG_IMAGE_EMBEDDED;
                        }
+                       if (comp->len > sizeof ("data:") - 1 && memcmp (comp->start,
+                                       "data:", sizeof ("data:") - 1) == 0) {
+                               /* We have an embedded image in HTML tag */
+                               img->flags |=
+                                               (RSPAMD_HTML_FLAG_IMAGE_EMBEDDED|RSPAMD_HTML_FLAG_IMAGE_DATA);
+
+                       }
                        else {
                                img->flags |= RSPAMD_HTML_FLAG_IMAGE_EXTERNAL;
                                if (img->src) {
index c5a989f0e8019a1fa818d318667c0733416b14ab..0400672ac5fa8ed7080da3d4549429568d7f8f15 100644 (file)
@@ -24,6 +24,7 @@
  */
 #define RSPAMD_HTML_FLAG_IMAGE_EMBEDDED (1 << 0)
 #define RSPAMD_HTML_FLAG_IMAGE_EXTERNAL (1 << 1)
+#define RSPAMD_HTML_FLAG_IMAGE_DATA (1 << 2)
 
 enum html_component_type {
        RSPAMD_HTML_COMPONENT_NAME = 0,
@@ -43,12 +44,16 @@ struct html_tag_component {
        const guchar *start;
 };
 
+
+struct rspamd_image;
+
 struct html_image {
        guint height;
        guint width;
        guint flags;
        gchar *src;
        struct rspamd_url *url;
+       struct rspamd_image *embedded_image;
        struct html_tag *tag;
 };