summaryrefslogtreecommitdiffstats
path: root/src/libmime/images.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-09-19 12:07:03 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-09-19 12:07:03 +0100
commit90fb3cc2868a3ee4d5995aefb71fb6d66b450edf (patch)
treee1741d8521658640273beb6a645fef702f9f52d1 /src/libmime/images.c
parentbf5f32f82d65cba399c65c42b3b322294c692f6f (diff)
downloadrspamd-90fb3cc2868a3ee4d5995aefb71fb6d66b450edf.tar.gz
rspamd-90fb3cc2868a3ee4d5995aefb71fb6d66b450edf.zip
[Fix] Fix embedded images linking logic
Diffstat (limited to 'src/libmime/images.c')
-rw-r--r--src/libmime/images.c84
1 files changed, 52 insertions, 32 deletions
diff --git a/src/libmime/images.c b/src/libmime/images.c
index cb59bc88e..073776359 100644
--- a/src/libmime/images.c
+++ b/src/libmime/images.c
@@ -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);
+ }
+ }
+} \ No newline at end of file