diff options
-rw-r--r-- | src/libmime/images.c | 63 | ||||
-rw-r--r-- | src/libmime/images.h | 9 | ||||
-rw-r--r-- | src/libserver/html.c | 7 | ||||
-rw-r--r-- | src/libserver/html.h | 5 |
4 files changed, 59 insertions, 25 deletions
diff --git a/src/libmime/images.c b/src/libmime/images.c index c4d20b4ad..b9a54b1a0 100644 --- a/src/libmime/images.c +++ b/src/libmime/images.c @@ -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); diff --git a/src/libmime/images.h b/src/libmime/images.h index 55aa6873f..39a7dc8c5 100644 --- a/src/libmime/images.h +++ b/src/libmime/images.h @@ -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 */ diff --git a/src/libserver/html.c b/src/libserver/html.c index 8ebb3862e..9bf15e0a2 100644 --- a/src/libserver/html.c +++ b/src/libserver/html.c @@ -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) { diff --git a/src/libserver/html.h b/src/libserver/html.h index c5a989f0e..0400672ac 100644 --- a/src/libserver/html.h +++ b/src/libserver/html.h @@ -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; }; |