]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix white on white rule and add is_leaf flag
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 23 Jan 2020 18:58:46 +0000 (18:58 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 23 Jan 2020 18:58:46 +0000 (18:58 +0000)
rules/html.lua
src/libserver/html.c
src/lua/lua_html.c

index 9e582a7317ba1b6235e626a4e822ba29c60c6ce0..1891cfefa0d9de8ce4a8474e6e12a868d158beaf 100644 (file)
@@ -194,18 +194,18 @@ local vis_check_id = rspamd_config:register_symbol{
       if p:is_html() and p:get_html() then -- if the current part is html part
         local hc = p:get_html() -- we get HTML context
 
-        hc:foreach_tag({'font', 'span', 'div', 'p', 'td'}, function(tag)
+        hc:foreach_tag({'font', 'span', 'div', 'p', 'td'}, function(tag, clen, is_leaf)
           local bl = tag:get_extra()
           if bl then
-            if not bl['visible'] then
+            if not bl['visible'] and is_leaf then
               invisible_blocks = invisible_blocks + 1
             end
 
-            if bl['font_size'] and bl['font_size'] == 0 then
+            if bl['font_size'] and bl['font_size'] == 0 and is_leaf then
               zero_size_blocks = zero_size_blocks + 1
             end
 
-            if bl['bgcolor'] and bl['color'] and bl['visible'] then
+            if bl['bgcolor'] and bl['color'] and bl['visible'] and is_leaf then
 
               local color = bl['color']
               local bgcolor = bl['bgcolor']
@@ -225,10 +225,9 @@ local vis_check_id = rspamd_config:register_symbol{
 
               if diff < 0.1 then
                 ret = true
-                local content_len = #(tag:get_content() or {})
                 invisible_blocks = invisible_blocks + 1 -- This block is invisible
-                transp_len = transp_len + content_len * (0.1 - diff) * 10.0
-                normal_len = normal_len - content_len
+                transp_len = transp_len + clen * (0.1 - diff) * 10.0
+                normal_len = normal_len - clen
                 local tr = transp_len / (normal_len + transp_len)
                 if tr > transp_rate then
                   transp_rate = tr
index a6b03786158ac3cdbb197fccb05809e71f6c57ba..395987ccecca84bedca5f5c52b025adab135ebce 100644 (file)
@@ -2324,14 +2324,16 @@ rspamd_html_process_block_tag (rspamd_mempool_t *pool, struct html_tag *tag,
                                fstr.len = comp->len;
                                rspamd_html_process_color (comp->start, comp->len,
                                                &bl->font_color);
-                               msg_debug_html ("got color: %xd", bl->font_color.d.val);
+                               msg_debug_html ("tag %*s; got color: %xd",
+                                               tag->name.len, tag->name.start, bl->font_color.d.val);
                                break;
                        case RSPAMD_HTML_COMPONENT_BGCOLOR:
                                fstr.begin = (gchar *) comp->start;
                                fstr.len = comp->len;
                                rspamd_html_process_color (comp->start, comp->len,
                                                &bl->background_color);
-                               msg_debug_html ("got color: %xd", bl->font_color.d.val);
+                               msg_debug_html ("tag %*s; got color: %xd",
+                                               tag->name.len, tag->name.start, bl->font_color.d.val);
 
                                if (tag->id == Tag_BODY) {
                                        /* Set global background color */
@@ -2342,21 +2344,25 @@ rspamd_html_process_block_tag (rspamd_mempool_t *pool, struct html_tag *tag,
                        case RSPAMD_HTML_COMPONENT_STYLE:
                                bl->style.len = comp->len;
                                bl->style.start = comp->start;
-                               msg_debug_html ("got style: %*s", (gint) bl->style.len,
-                                               bl->style.start);
+                               msg_debug_html ("tag: %*s; got style: %*s",
+                                               tag->name.len, tag->name.start,
+                                               (gint) bl->style.len, bl->style.start);
                                rspamd_html_process_style (pool, bl, hc, comp->start, comp->len);
                                break;
                        case RSPAMD_HTML_COMPONENT_CLASS:
                                fstr.begin = (gchar *) comp->start;
                                fstr.len = comp->len;
                                bl->html_class = rspamd_mempool_ftokdup (pool, &fstr);
-                               msg_debug_html ("got class: %s", bl->html_class);
+                               msg_debug_html ("tag: %*s; got class: %s",
+                                               tag->name.len, tag->name.start, bl->html_class);
                                break;
                        case RSPAMD_HTML_COMPONENT_SIZE:
                                /* Not supported by html5 */
                                /* FIXME maybe support it */
                                bl->font_size = 16;
-                               msg_debug_html ("got size: %*s", (gint)comp->len, comp->start);
+                               msg_debug_html ("tag %*s; got size: %*s",
+                                               tag->name.len, tag->name.start,
+                                               (gint)comp->len, comp->start);
                                break;
                        default:
                                /* NYI */
index c0e07de36d7445c4a93428ad1ee8d97dfb108957..7d7e9b7a36cbb4867dd35e8801eb03aeed5047c3 100644 (file)
@@ -470,7 +470,15 @@ lua_html_node_foreach_cb (GNode *n, gpointer d)
                rspamd_lua_setclass (ud->L, "rspamd{html_tag}", -1);
                lua_pushinteger (ud->L, tag->content_length);
 
-               if (lua_pcall (ud->L, 2, 1, 0) != 0) {
+               /* Leaf flag */
+               if (g_node_first_child (n)) {
+                       lua_pushboolean (ud->L, false);
+               }
+               else {
+                       lua_pushboolean (ud->L, true);
+               }
+
+               if (lua_pcall (ud->L, 3, 1, 0) != 0) {
                        msg_err ("error in foreach_tag callback: %s", lua_tostring (ud->L, -1));
                        lua_pop (ud->L, 1);
                        return TRUE;