]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Html: Fix parent propagation
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Jul 2021 15:36:46 +0000 (16:36 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 6 Jul 2021 15:36:46 +0000 (16:36 +0100)
src/libserver/css/css_property.cxx
src/libserver/html/html.cxx
src/libserver/html/html_block.hxx

index 1dd73026dc9a23c2c0a747b7674d8f2134b8c083..992d5a0b0105a56ad6a3b2d45551020d408c41c5 100644 (file)
@@ -27,6 +27,7 @@ constexpr const auto prop_names_map = frozen::make_unordered_map<frozen::string,
                {"font-size", css_property_type::PROPERTY_FONT_SIZE},
                {"color", css_property_type::PROPERTY_COLOR},
                {"bgcolor", css_property_type::PROPERTY_BGCOLOR},
+               {"background-color", css_property_type::PROPERTY_BGCOLOR},
                {"background", css_property_type::PROPERTY_BACKGROUND},
                {"height", css_property_type::PROPERTY_HEIGHT},
                {"width", css_property_type::PROPERTY_WIDTH},
@@ -36,7 +37,7 @@ constexpr const auto prop_names_map = frozen::make_unordered_map<frozen::string,
 });
 
 /* Ensure that we have all cases listed */
-static_assert(prop_names_map.size() == static_cast<int>(css_property_type::PROPERTY_NYI));
+static_assert(prop_names_map.size() >= static_cast<int>(css_property_type::PROPERTY_NYI));
 
 auto token_string_to_property(const std::string_view &inp)
        -> css_property_type
index 86265b74e265ba26e23860c9884094bcb0f5e9a4..a026326e86e25cfea1e46e08354587961a2a291f 100644 (file)
@@ -1030,7 +1030,7 @@ html_append_content(struct html_content *hc, std::string_view data, bool transpa
                /* Replace all visible characters with spaces */
                auto start = std::next(hc->parsed.begin(), cur_offset);
                std::replace_if(start, std::end(hc->parsed), [](const auto c) {
-                       return g_ascii_isprint(c);
+                       return !g_ascii_isspace(c);
                }, ' ');
        }
 
@@ -2073,6 +2073,11 @@ TEST_CASE("html text extraction")
                         "<p style=\"font-size: 11px; line-height: 1.2; color: #555555; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; mso-line-height-alt: 14px; margin: 0;\">\n"
                         "&nbsp;</p>",
                                        " Sincerely,\n Skype Web\n"},
+                       /* bgcolor propagation */
+                       {"<a style=\"display: inline-block; color: #ffffff; background-color: #00aff0;\">\n"
+                        "<span style=\"color: #00aff0;\">F</span>Rev<span style=\"opacity: 1;\"></span></span>ie<span style=\"opacity: 1;\"></span>\n"
+                        "</span>w<span style=\"color: #00aff0;\">F<span style=\"opacity: 1;\">ΜΉ</span></span>",
+                                       " Review"},
        };
 
        rspamd_url_init(NULL);
index 28ab3bae1236556e2f908a027318a8f971ba9070..122d35aa323025a76b7e47b04fd364e26ece9b63 100644 (file)
@@ -115,11 +115,16 @@ struct html_block {
                auto simple_prop = [&](auto mask_val, auto &our_val, auto other_val) constexpr -> void {
                        if (!(mask & mask_val) && (other.mask & mask_val)) {
                                our_val = other_val;
+                               mask |= mask_val;
                        }
                };
                simple_prop(fg_color_mask, fg_color, other.fg_color);
                simple_prop(bg_color_mask, bg_color, other.bg_color);
-               simple_prop(display_mask, display, other.display);
+
+               if (other.has_display() && !other.is_visible()) {
+                       simple_prop(display_mask, display, other.display);
+                       mask |= other.mask&(transparent_flag|invisible_flag);
+               }
 
                /* Sizes are very different
                 * We can have multiple cases: