aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2021-05-31 20:54:41 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2021-06-02 20:55:09 +0100
commitf5b403091ac5e6e48f13d5a6d31743f2b097b709 (patch)
tree4ce3ded3bdd2c35e3c372db6ac5044483edd5f12
parent6f6f6758fb8414fdb93f18fb667f4919ab588f7c (diff)
downloadrspamd-f5b403091ac5e6e48f13d5a6d31743f2b097b709.tar.gz
rspamd-f5b403091ac5e6e48f13d5a6d31743f2b097b709.zip
[Rework] Further work to make html content private
-rw-r--r--src/libserver/html/html.cxx102
-rw-r--r--src/libserver/html/html.h3
2 files changed, 41 insertions, 64 deletions
diff --git a/src/libserver/html/html.cxx b/src/libserver/html/html.cxx
index 973649791..45a9afa18 100644
--- a/src/libserver/html/html.cxx
+++ b/src/libserver/html/html.cxx
@@ -955,30 +955,19 @@ html_process_img_tag(rspamd_mempool_t *pool,
auto found_alt_it = tag->parameters.find(html_component_type::RSPAMD_HTML_COMPONENT_ALT);
- if (found_alt_it != tag->parameters.end() && dest != NULL) {
- if (dest->len > 0 && !g_ascii_isspace (dest->data[dest->len - 1])) {
+ if (found_alt_it != tag->parameters.end()) {
+ if (!hc->parsed.empty() && !g_ascii_isspace (hc->parsed.back())) {
/* Add a space */
- g_byte_array_append(dest, reinterpret_cast<const guint8 *>(" "), 1);
+ hc->parsed += ' ';
}
+ hc->parsed.append(found_alt_it->second);
- g_byte_array_append(dest,
- reinterpret_cast<const guint8 *>(found_alt_it->second.data()),
- found_alt_it->second.size());
-
- if (!g_ascii_isspace (dest->data[dest->len - 1])) {
+ if (!g_ascii_isspace (hc->parsed.back())) {
/* Add a space */
- g_byte_array_append(dest, reinterpret_cast<const guint8 *>(" "), 1);
+ hc->parsed += ' ';
}
}
-
- if (hc->images == nullptr) {
- hc->images = g_ptr_array_sized_new(4);
- rspamd_mempool_notify_alloc(pool, 4 * sizeof(gpointer) + sizeof(GPtrArray));
- rspamd_mempool_add_destructor(pool, rspamd_ptr_array_free_hard,
- hc->images);
- }
-
if (img->embedded_image) {
if (img->height == 0) {
img->height = img->embedded_image->height;
@@ -988,7 +977,7 @@ html_process_img_tag(rspamd_mempool_t *pool,
}
}
- g_ptr_array_add(hc->images, img);
+ hc->images.push_back(img);
tag->extra = img;
}
@@ -1002,7 +991,7 @@ html_process_link_tag(rspamd_mempool_t *pool, struct html_tag *tag,
if (found_rel_it != tag->parameters.end()) {
if (found_rel_it->second == "icon") {
- html_process_img_tag(pool, tag, hc, url_set, part_urls, nullptr);
+ html_process_img_tag(pool, tag, hc, url_set, part_urls);
}
}
}
@@ -1489,10 +1478,7 @@ static auto
html_process_block_tag(rspamd_mempool_t *pool, struct html_tag *tag,
struct html_content *hc) -> void
{
- struct html_block *bl;
- rspamd_ftok_t fstr;
-
- bl = rspamd_mempool_alloc0_type (pool, struct html_block);
+ auto *bl = rspamd_mempool_alloc0_type (pool, struct html_block);
bl->tag = tag;
bl->visible = TRUE;
bl->font_size = (guint) -1;
@@ -1531,6 +1517,7 @@ html_process_block_tag(rspamd_mempool_t *pool, struct html_tag *tag,
auto found_class_it = tag->parameters.find(html_component_type::RSPAMD_HTML_COMPONENT_CLASS);
if (found_class_it != tag->parameters.end()) {
+ rspamd_ftok_t fstr;
fstr.begin = found_class_it->second.data();
fstr.len = found_class_it->second.size();
bl->html_class = rspamd_mempool_ftokdup (pool, &fstr);
@@ -1538,14 +1525,7 @@ html_process_block_tag(rspamd_mempool_t *pool, struct html_tag *tag,
(int)tag->name.size(), tag->name.data(), bl->html_class);
}
- if (hc->blocks == NULL) {
- hc->blocks = g_ptr_array_sized_new(64);
- rspamd_mempool_notify_alloc (pool, 64 * sizeof(gpointer) + sizeof(GPtrArray));
- rspamd_mempool_add_destructor (pool, rspamd_ptr_array_free_hard,
- hc->blocks);
- }
-
- g_ptr_array_add(hc->blocks, bl);
+ hc->blocks.push_back(bl);
tag->block = bl;
}
@@ -1575,7 +1555,6 @@ html_propagate_style(struct html_content *hc,
struct html_block *bl,
std::vector<struct html_block *> &blocks) -> void
{
- struct html_block *bl_parent;
gboolean push_block = FALSE;
if (blocks.empty()) {
@@ -1583,41 +1562,39 @@ html_propagate_style(struct html_content *hc,
return;
}
/* Propagate from the parent if needed */
- bl_parent = blocks.back();
+ auto *bl_parent = blocks.back();
- if (bl_parent) {
- if (!bl->background_color.valid) {
- /* Try to propagate background color from parent nodes */
- if (bl_parent->background_color.valid) {
- memcpy(&bl->background_color, &bl_parent->background_color,
- sizeof(bl->background_color));
- }
- }
- else {
- push_block = TRUE;
+ if (!bl->background_color.valid) {
+ /* Try to propagate background color from parent nodes */
+ if (bl_parent->background_color.valid) {
+ memcpy(&bl->background_color, &bl_parent->background_color,
+ sizeof(bl->background_color));
}
+ }
+ else {
+ push_block = TRUE;
+ }
- if (!bl->font_color.valid) {
- /* Try to propagate background color from parent nodes */
- if (bl_parent->font_color.valid) {
- memcpy(&bl->font_color, &bl_parent->font_color,
- sizeof(bl->font_color));
- }
- }
- else {
- push_block = TRUE;
+ if (!bl->font_color.valid) {
+ /* Try to propagate background color from parent nodes */
+ if (bl_parent->font_color.valid) {
+ memcpy(&bl->font_color, &bl_parent->font_color,
+ sizeof(bl->font_color));
}
+ }
+ else {
+ push_block = TRUE;
+ }
- /* Propagate font size */
- if (bl->font_size == (guint) -1) {
- if (bl_parent->font_size != (guint) -1) {
- bl->font_size = bl_parent->font_size;
- }
- }
- else {
- push_block = TRUE;
+ /* Propagate font size */
+ if (bl->font_size == (guint) -1) {
+ if (bl_parent->font_size != (guint) -1) {
+ bl->font_size = bl_parent->font_size;
}
}
+ else {
+ push_block = TRUE;
+ }
/* Set bgcolor to the html bgcolor and font color to black as a last resort */
if (!bl->font_color.valid) {
@@ -2340,16 +2317,17 @@ rspamd_html_tag_by_name(const gchar *name)
}
gboolean
-rspamd_html_tag_seen(struct html_content *hc, const gchar *tagname)
+rspamd_html_tag_seen(void *ptr, const gchar *tagname)
{
gint id;
+ auto *hc = rspamd::html::html_content::from_ptr(ptr);
g_assert (hc != NULL);
id = rspamd_html_tag_by_name(tagname);
if (id != -1) {
- return isset(hc->tags_seen, id);
+ return hc->tags_seen[id];
}
return FALSE;
diff --git a/src/libserver/html/html.h b/src/libserver/html/html.h
index 23faa47d3..94063b9be 100644
--- a/src/libserver/html/html.h
+++ b/src/libserver/html/html.h
@@ -102,7 +102,6 @@ struct html_block {
/* Forwarded declaration */
struct rspamd_task;
-struct html_content;
/*
* Decode HTML entitles in text. Text is modified in place.
@@ -121,7 +120,7 @@ void *rspamd_html_process_part_full(rspamd_mempool_t *pool,
/*
* Returns true if a specified tag has been seen in a part
*/
-gboolean rspamd_html_tag_seen(struct html_content *hc, const gchar *tagname);
+gboolean rspamd_html_tag_seen(void *ptr, const gchar *tagname);
/**
* Returns name for the specified tag id