svn commit: r1935791 - in spamassassin/trunk: . lib/Mail/SpamAssassin lib/Mail/SpamAssassin/Handler lib/Mail/SpamAssassin/Message lib/Mail/SpamAssassin/PDF lib/Mail/SpamAssassin/PDF/Context lib/Mail/SpamAssassin/PDF/Filter rules t t/data t/data/nice t/...

[email protected] Thu, 02 Jul 2026 04:24:26 -0000
Newsgroups gmane.mail.spam.spamassassin.cvs
Message-ID <178296626615.3540335.17682533729530999306@svn03-he-fi>
Author: fkento
Date: Thu Jul  2 04:24:25 2026
New Revision: 1935791

Log:
Add the first six MIME-part handlers to the handler framework

The handler framework itself shipped in an earlier release; this adds the
first set of handlers that make it useful.  The point of the paradigm is
to process nested content by chaining handlers together: each handler can
return synthetic child parts that the framework re-dispatches by type, so
JavaScript embedded in an HTML file inside a rar archive, or text in an
image embedded in a PDF, is unwrapped one layer at a time and reaches the
handler that can inspect it -- all bounded by handler_max_depth,
handler_max_parts, handler_max_bytes, and handler_time_limit.

Handlers (lib/Mail/SpamAssassin/Handler/):

  HTML (text/html) - render HTML parts and surface content with no MIME
    part of its own (inline data: images, embedded JavaScript) as child
    parts for the image and JavaScript handlers.

  JavaScript (text/javascript) - collect script text for the new
    "script" rule type and add navigation/redirect URLs to the URI
    detail list (type "script").

  SVG (image/svg+xml) - expose SVG text to the new "svgtext" rule type,
    add links to the URI detail list (type "svg"), and surface embedded
    script for the JavaScript handler.

  Image (image/*) - OCR image parts with tesseract and inject the text
    into the body.  New "imagetext" rule type.

  PDF (application/pdf) - parse PDFs with the new pure-Perl
    Mail::SpamAssassin::PDF parser, expose metadata via pdf2_* eval rules
    and _PDF2*_ tags, add URLs to the URI detail list (type "pdf"), and
    extract embedded images for the image handler.

  Archive (application/zip, application/vnd.rar) - unpack zip and rar
    attachments and return the files inside as child parts for
    re-dispatch.

HTML, JavaScript, and SVG are loaded by default from v403.pre; Image,
PDF, and Archive ship commented-out because they depend on external tools
(tesseract, unrar) or non-core Perl modules (Crypt::RC4, Crypt::Mode::CBC).

Also adds the pure-Perl PDF parser (lib/Mail/SpamAssassin/PDF/), handler
and PDF unit tests plus fixtures under t/, and updates HTML.pm and
Message/Node.pm to support the handlers.  UPGRADE, MANIFEST, and
rules/v403.pre updated accordingly.

Added:
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/Archive.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/HTML.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/Image.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/JavaScript.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/PDF.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Handler/SVG.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Context/
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Context.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Context/Info.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Core.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/ASCII85Decode.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/Decrypt.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/FlateDecode.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/LZWDecode.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Parser.pm
   spamassassin/trunk/t/data/mockimagehandler.pm
   spamassassin/trunk/t/data/nice/handler_archive_octet
   spamassassin/trunk/t/data/nice/handler_archive_rar
   spamassassin/trunk/t/data/nice/handler_archive_zip
   spamassassin/trunk/t/data/nice/handler_html
   spamassassin/trunk/t/data/nice/handler_image
   spamassassin/trunk/t/data/nice/handler_image_heic
   spamassassin/trunk/t/data/nice/handler_image_octet
   spamassassin/trunk/t/data/nice/handler_javascript
   spamassassin/trunk/t/data/nice/handler_javascript_attach
   spamassassin/trunk/t/data/nice/handler_javascript_html_attach
   spamassassin/trunk/t/data/nice/handler_pdf
   spamassassin/trunk/t/data/nice/handler_pdf_encrypted
   spamassassin/trunk/t/data/nice/handler_pdf_ocrimage
   spamassassin/trunk/t/data/nice/handler_pdf_octet
   spamassassin/trunk/t/data/nice/handler_svg
   spamassassin/trunk/t/data/pdf/
   spamassassin/trunk/t/data/pdf/aesv2.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/aesv2_cleartext_meta.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/aesv3.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/ascii85.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/indirect_mediabox.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/inline_image.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/lzw.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/mailto.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/multipage.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/ocr_image.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/openaction_js.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/protected.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/rc4_128.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/rc4_40.pdf   (contents, props changed)
   spamassassin/trunk/t/data/pdf/sample.pdf   (contents, props changed)
   spamassassin/trunk/t/handler_archive.t
   spamassassin/trunk/t/handler_html.t
   spamassassin/trunk/t/handler_image.t
   spamassassin/trunk/t/handler_image_heic.t
   spamassassin/trunk/t/handler_image_size.t
   spamassassin/trunk/t/handler_image_text.t
   spamassassin/trunk/t/handler_javascript.t
   spamassassin/trunk/t/handler_pdf.t
   spamassassin/trunk/t/handler_svg.t
   spamassassin/trunk/t/pdf_assert_token.t
   spamassassin/trunk/t/pdf_extract_images.t
   spamassassin/trunk/t/pdf_get_array.t
   spamassassin/trunk/t/pdf_get_dict.t
   spamassassin/trunk/t/pdf_get_name.t
   spamassassin/trunk/t/pdf_get_number.t
   spamassassin/trunk/t/pdf_get_reference.t
   spamassassin/trunk/t/pdf_get_string.t
   spamassassin/trunk/t/pdf_get_token.t
   spamassassin/trunk/t/pdf_info.t
Modified:
   spamassassin/trunk/MANIFEST
   spamassassin/trunk/UPGRADE
   spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm
   spamassassin/trunk/rules/v403.pre

NOTE: this message was too long when including "diff" contents.
      The contents have been replaced with URLs to display the
      diff contents on a web page.


Modified: spamassassin/trunk/MANIFEST

Modified: spamassassin/trunk/UPGRADE

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/Archive.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/HTML.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/Image.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/JavaScript.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/PDF.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/Handler/SVG.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Message/Node.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Context.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Context/Info.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Core.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/ASCII85Decode.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/Decrypt.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/FlateDecode.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Filter/LZWDecode.pm

Added: spamassassin/trunk/lib/Mail/SpamAssassin/PDF/Parser.pm

Modified: spamassassin/trunk/rules/v403.pre

Added: spamassassin/trunk/t/data/mockimagehandler.pm

Added: spamassassin/trunk/t/data/nice/handler_archive_octet

Added: spamassassin/trunk/t/data/nice/handler_archive_rar

Added: spamassassin/trunk/t/data/nice/handler_archive_zip

Added: spamassassin/trunk/t/data/nice/handler_html

Added: spamassassin/trunk/t/data/nice/handler_image

Added: spamassassin/trunk/t/data/nice/handler_image_heic

Added: spamassassin/trunk/t/data/nice/handler_image_octet

Added: spamassassin/trunk/t/data/nice/handler_javascript

Added: spamassassin/trunk/t/data/nice/handler_javascript_attach

Added: spamassassin/trunk/t/data/nice/handler_javascript_html_attach

Added: spamassassin/trunk/t/data/nice/handler_pdf

Added: spamassassin/trunk/t/data/nice/handler_pdf_encrypted

Added: spamassassin/trunk/t/data/nice/handler_pdf_ocrimage

Added: spamassassin/trunk/t/data/nice/handler_pdf_octet

Added: spamassassin/trunk/t/data/nice/handler_svg

Added: spamassassin/trunk/t/data/pdf/aesv2.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/aesv2_cleartext_meta.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/aesv3.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/ascii85.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/indirect_mediabox.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/inline_image.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/lzw.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/mailto.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/multipage.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/ocr_image.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/openaction_js.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/protected.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/rc4_128.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/rc4_40.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/data/pdf/sample.pdf
==============================================================================
Binary file. No diff available.

Added: spamassassin/trunk/t/handler_archive.t

Added: spamassassin/trunk/t/handler_html.t

Added: spamassassin/trunk/t/handler_image.t

Added: spamassassin/trunk/t/handler_image_heic.t

Added: spamassassin/trunk/t/handler_image_size.t

Added: spamassassin/trunk/t/handler_image_text.t

Added: spamassassin/trunk/t/handler_javascript.t

Added: spamassassin/trunk/t/handler_pdf.t

Added: spamassassin/trunk/t/handler_svg.t

Added: spamassassin/trunk/t/pdf_assert_token.t

Added: spamassassin/trunk/t/pdf_extract_images.t

Added: spamassassin/trunk/t/pdf_get_array.t

Added: spamassassin/trunk/t/pdf_get_dict.t

Added: spamassassin/trunk/t/pdf_get_name.t

Added: spamassassin/trunk/t/pdf_get_number.t

Added: spamassassin/trunk/t/pdf_get_reference.t

Added: spamassassin/trunk/t/pdf_get_string.t

Added: spamassassin/trunk/t/pdf_get_token.t

Added: spamassassin/trunk/t/pdf_info.t