fkoyer opened a new pull request, #39:
URL: https://github.com/apache/spamassassin/pull/39

   Rendering an HTML part is the HTML handler's job, but handle_html() only 
called $node->rendered() to warm a cache and then read the results back. The 
parse now happens in the handler; rendered() renders text/plain and otherwise 
returns whatever the part's handler published with set_rendered().
   
   Mail::SpamAssassin::HTML is untouched.
   
   Note this makes the HTML handler load-bearing: with it not loaded, no HTML 
is parsed at all -- no rendered body text, no html_results for the html_* eval 
rules, and no URIs from href/src/action.  Previously only the URI harvest was 
lost.  v403.pre loads it by default (under the feature_handlers guard), so an 
install whose lib/ and rules/ come from the same version is unaffected; a site 
running this code against an older v403.pre, or one that has commented the 
loadhandler out, is not.  The existing warn in Message::apply_handlers() for a 
text/html part with no registered handler covers this; it now says what is 
actually lost, and has moved inside the part-walking loop, which reuses the 
per-node handler lookup already done there instead of a separate find_parts() 
scan.  Two cases it used to miss now warn: a message whose only text/html part 
is a synthetic child produced by another handler (ICS, Archive), and a config 
with no handlers registered at all -- the latter returned early, b
 efore the check.
   
   Node.pm:
    - new decode_and_normalize(): decode() plus the charset decision, factored 
out of the two branches of rendered() that each had their own copy. Returns 
($text, $character_semantics) so a caller feeding a parser that must be told 
whether it is getting bytes or characters can do so.
    - set_rendered() takes optional $invisible and $visible arguments, for a 
renderer that can tell hidden text from shown text.  Both default to the old 
behaviour, so existing callers are unaffected.
    - rendered() no longer parses HTML; its type gate is text/plain only.
   
   Handler/SVG.pm now publishes the text it extracts with set_rendered(), under 
the part's own image/svg+xml type.  Previously an SVG part was rendered only as 
a side effect of rendered()'s HTML branch, which stamped it text/html -- so an 
SVG arriving as an attachment (the common case) was then dropped from the body 
by the text/* attachment skip in get_body_text_array_common().
   
   This is a behaviour change, not just code motion: SVG text now reaches body 
rules where it did not before, the same way OCR'd image and PDF text already 
do.  On t/data/nice/handler_svg the body gains "SVGSENTINEL Please view 
documents on docusign secure link".
   
   Bayes asks for the MIME-part handlers explicitly on the learn path 
(get_body_from_msg).  It already got them, but only incidentally: it calls 
Message::extract_message_metadata, which does not run handlers, and then 
_get_msgdata_from_permsgstatus -> get_uri_list -> get_uri_detail_list, which 
does.  The handler-extracted text Bayes learns therefore hung on a call made 
for its URIs.  apply_handlers() is idempotent, so this is a no-op at runtime; 
it just stops the token stream depending on that.
   
   One smaller behaviour change: text/plain parts now emit the 
"normalize_charset is off" debug line, which only the HTML branch used to log.  
Debug output only.
   
   Also:
    - Pyzor::Digest::Pieces read {rendered} directly, which only worked if 
something else had already rendered the part; call rendered().
    - Message::get_body_text_array_common no longer pushes an undef into 
{metadata}{html_all} when a handler publishes text/html without html_results.
    - t/scan_text_attach.t builds a PerMsgStatus and calls apply_handlers(), as 
a real scan does; it previously relied on rendered() lazily parsing HTML with 
no handler having run.
   
   Verified behaviour-neutral for HTML: rendered/visible/invisible text, utf8 
flags and the html_results stats are byte-identical across 70 rendered parts 
from 23 fixtures, with normalize_charset both on and off.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to