Browse Source

[Fix] Fix embedded images linking logic

tags/2.0
Vsevolod Stakhov 4 years ago
parent
commit
90fb3cc286
4 changed files with 58 additions and 33 deletions
  1. 0
    1
      rules/html.lua
  2. 52
    32
      src/libmime/images.c
  3. 5
    0
      src/libmime/images.h
  4. 1
    0
      src/libmime/message.c

+ 0
- 1
rules/html.lua View File

@@ -101,7 +101,6 @@ rspamd_config.R_EMPTY_IMAGE = {
if p:is_html() then -- if the current part is html part
local hc = p:get_html() -- we get HTML context
local len = p:get_length() -- and part's length

if hc and len < 50 then -- if we have a part that has less than 50 bytes of text
local images = hc:get_images() -- then we check for HTML images


+ 52
- 32
src/libmime/images.c View File

@@ -596,14 +596,8 @@ rspamd_maybe_process_image (rspamd_mempool_t *pool,
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;
struct rspamd_image *img;


img = rspamd_maybe_process_image (task->task_pool, &part->parsed_data);

if (img != NULL) {
@@ -619,7 +613,45 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)

part->flags |= RSPAMD_MIME_PART_IMAGE;
part->specific.img = img;
}
}

const gchar *
rspamd_image_type_str (enum rspamd_image_type type)
{
switch (type) {
case IMAGE_TYPE_PNG:
return "PNG";
break;
case IMAGE_TYPE_JPG:
return "JPEG";
break;
case IMAGE_TYPE_GIF:
return "GIF";
break;
case IMAGE_TYPE_BMP:
return "BMP";
break;
default:
break;
}

return "unknown";
}

static void
rspamd_image_process_part (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;
struct rspamd_image *img;

img = (struct rspamd_image *)part->specific.img;

if (img) {
/* Check Content-Id */
rh = rspamd_message_get_header_from_hash (part->raw_headers,
"Content-Id");
@@ -638,15 +670,14 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
cid_len --;
}


PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, text_parts), i, tp) {
if (IS_PART_HTML (tp) && tp->html != NULL &&
tp->html->images != NULL) {
tp->html->images != NULL) {
for (j = 0; j < tp->html->images->len; j ++) {
himg = g_ptr_array_index (tp->html->images, j);

if ((himg->flags & RSPAMD_HTML_FLAG_IMAGE_EMBEDDED) &&
himg->src) {
himg->src) {
html_cid = himg->src;

if (strncmp (html_cid, "cid:", 4) == 0) {
@@ -654,7 +685,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) {
memcmp (html_cid, cid, cid_len) == 0) {
img->html_image = himg;
himg->embedded_image = img;

@@ -664,6 +695,7 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
if (himg->height == 0) {
himg->height = img->height;
}

if (himg->width == 0) {
himg->width = img->width;
}
@@ -672,32 +704,20 @@ process_image (struct rspamd_task *task, struct rspamd_mime_part *part)
}
}
}

}

}
}
}

const gchar *
rspamd_image_type_str (enum rspamd_image_type type)
void
rspamd_images_link (struct rspamd_task *task)
{
switch (type) {
case IMAGE_TYPE_PNG:
return "PNG";
break;
case IMAGE_TYPE_JPG:
return "JPEG";
break;
case IMAGE_TYPE_GIF:
return "GIF";
break;
case IMAGE_TYPE_BMP:
return "BMP";
break;
default:
break;
}
struct rspamd_mime_part *part;
guint i;

return "unknown";
}
PTR_ARRAY_FOREACH (MESSAGE_FIELD (task, parts), i, part) {
if (part->flags & RSPAMD_MIME_PART_IMAGE) {
rspamd_image_process_part (task, part);
}
}
}

+ 5
- 0
src/libmime/images.h View File

@@ -39,6 +39,11 @@ struct rspamd_image {
*/
void rspamd_images_process (struct rspamd_task *task);

/*
* Link embedded images to the HTML parts
*/
void rspamd_images_link (struct rspamd_task *task);

/**
* Processes image in raw data
* @param task

+ 1
- 0
src/libmime/message.c View File

@@ -1570,6 +1570,7 @@ rspamd_message_process (struct rspamd_task *task)
}
}

rspamd_images_link (task);
rspamd_tokenize_meta_words (task);
}


Loading…
Cancel
Save