Browse Source

[Minor] Core: Rework images processing API

tags/1.9.0
Vsevolod Stakhov 5 years ago
parent
commit
5cb0023612
4 changed files with 59 additions and 25 deletions
  1. 38
    25
      src/libmime/images.c
  2. 9
    0
      src/libmime/images.h
  3. 7
    0
      src/libserver/html.c
  4. 5
    0
      src/libserver/html.h

+ 38
- 25
src/libmime/images.c View 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);

+ 9
- 0
src/libmime/images.h View 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
*/

+ 7
- 0
src/libserver/html.c View 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) {

+ 5
- 0
src/libserver/html.h View 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;
};


Loading…
Cancel
Save