Alex, > Do we have an idea of a timeline for the next release and/or > production release currently?
Not a fixed date yet, but we are getting there, the light at the end of a tunnel is getting bright. No problems with stability, it just would be nice to finish some remaining details, and The Great Scoring computation still needs to be done. > How about dependencies? > What modules will need to be updated? - minimum required version of ExtUtils::MakeMaker is 6.17 - now required modules: Time::HiRes, NetAddr::IP, Archive::Tar - minimal version of Mail::DKIM is 0.31 (preferred 0.36_5 or later) (did I miss anything?) > Will perl-5.8 work okay? - preferred versions of perl are 5.8.8, 5.8.9, and 5.10.0 or later (of these three the 5.8.9 appears to be the most buggy) - support for versions of perl 5.6.* is being gradually revoked (may still work, but no promises and no support) > How about for use with amavis? Will I need to upgrade that? Some of the new features are only available with recent versions of amavisd. Specifically: - TIMING-SA reports in the log (at log level 2) are available since amavisd-new-2.6.0; - passing of truncated large mail to SpamAssassin without breaking DKIM signature results is available since 2.6.3 - with version amavisd-new-2.6.2 and older the following change is necessary: - my($data_representation) = 'GLOB'; # pass data to SA as ARRAY or a GLOB + my($data_representation) = 'ARRAY'; > A list of the top five best new features would also be great! *salivates* Here is my personal choice (amavis and DKIM -centric, sorry): - improved error detection and reporting - support for ADSP (with manual overrides) in a DKIM plugin (deals with phishing on domains like eBay, PayPal, amazon.com, ...) - ability to check a truncated long message without breaking DKIM signatures - timing breakdown reports - much improved IPv6 support - avoid Perl 5.8.9 and 5.10.0 compiler crashing when compiling many rules on FreeBSD (smaller threads stack) (ok, that's six) > I'm trying to anticipate what I can do ahead of time to get it into > place as soon as possible. With amavisd-new 2.6.3 it should be fine. Here is my attempt at compiling release notes for SpamAssassin 3.3 from a SVN change log. I left out changes to infrastructure, trivial changes and details on rule changes. Please say so if something important was left out. SpamAssassin 3.3.0 RELEASE NOTES --- DRAFT / UNOFFICIAL COMPATIBILITY WITH 3.2.5 - rules are no longer distributed with the package, but installed by sa-update - either automatically fetched from the network (preferably), or from a tar archive, which is available for downloading separately - minimum required version of ExtUtils::MakeMaker is 6.17 - now required modules: Time::HiRes, NetAddr::IP, Archive::Tar - minimal version of Mail::DKIM is 0.31 (preferred 0.36_5 or later) - no longer used modules: Mail::DomainKeys, Mail::SPF::Query - support for versions of perl 5.6.* is being gradually revoked (may still work, but no promises and no support) - preferred versions of perl are 5.8.8, 5.8.9, and 5.10.0 or later (of these three the 5.8.9 appears to be the most buggy) BUILDING AND PACKAGING - rules are no longer distributed with the package, but installed by sa-update - simplify Makefile.PL and fix a bug in DESTDIR support by increasing the minimum ExtUtils::MakeMaker version required to 6.17 - include check_whitelist and check_spamd in distribution; now called 'sa-awl' and 'sa-check_spamd' WORKAROUNDS TO PERL BUGS AND LIMITATIONS - let the Check.pm plugin produce smaller chunks of source code from rules (60 kB) to avoid Perl compiler crashing on exceeding stack size - localize $1, $2, etc at several places, avoiding taint issue from propagating - avoid Perl I/O bug by replacing line-by-line reading with read() where suitable, or play down the EBADF status in other places and only report it as dbg instead of a die - while also providing a little speedup (10..25%) on reading a message - new sub Message::split_into_array_of_short_lines to nicely split a text into array of paragraph chunks of sizes between 1 kB and 2 kB, gives less opportunity to runaway regular expressions in rules; fixes bugs: 5717, 5644, 5795, 5486, 5801, 5041 ERROR HANDLING, ROBUSTNESS - improved error detection and reporting: test status of all system calls and I/O operations (or explicitly document where not), and report unexpected failures; - eval calls now check for eval result instead of testing the $@, which is not always reliable; - localized $@ and $! in DESTROY methods to prevent potential calls to eval and calls to system routines in code executed from a DESTROY method from clobbering global variables $@ and $!; - Util::helper_app_pipe_open_unix: contain a failing exec with an eval to prevent additional cases of process cloning. The exec could fail this way when given tainted arguments; - Util::helper_app_pipe_open_unix: flush stdout and stderr before forking, otherwise an error reported by exec (such as 'insecure dependency') was lost in a buffer; - eval-protect an open($fh,'-|') to capture implied fork failures due to lack of system resource; - explicit untainting: combine "use re 'taint'" with untaint_var(), avoiding implicit perl untainting and workarounds to prevent it; - add 'use strict' where missing; - avoid a bunch of warnings on "Use of uninitialized value" - clearly report reasons for helper application process failures MEMORY FOOTPRINT - as a side-effect of compiling rules in smaller chunks (to avoid compiler crashes) virtual memory footprint of SpamAssassin is reduced; - save some memory by not importing Pod::Usage unless it is needed; - save 350k+ of memory in sa-compile by replacing DynaLoader with XSLoader; - remove unneeded index from MySQL bayes_token table; IPv6 SUPPORT - IPv6 support for trusted_networks, internal_networks, whitelist_from_rcvd, msa_networks, and other stuff that uses NetSet and the Received header parser, using NetAddr::IP; - allow usage of a remote dccifd host through an INET or INET6 socket; - README.awl: increase suggested awl.ip field width to 45 to be able to hold IPv6 addresses (optionally); - IP_PRIVATE now includes the ipv6 variants of private address space, as well as the ipv6-mapped ipv4 addresses. - NetSet now understands that ::ffff:192.168.1.2 and 192.168.1.2 are the same address; - IPv6 addresses are now recognised in Received headers; - when reading Received header fields, the "IPv6:" prefix is stripped from IPv6 addresses, and "::ffff:" is removed from IPv6-mapped IPv4 addresses (so strings can match them as simply IPv4 addresses); - ::1 is always included in the trusted_networks/internal_networks set similar to 127.0.0.0/8; SPAMC - add -n / --connect-timeout switch to spamc, allowing separate connection timeout from communication timeout; - add --filter-retries and --filter-retry-sleep - spamc would not time out connections to a hung spamd - spamc client library leaks the zlib compression buffer if compression is used - spamc long option '--dest' was broken SPAMD - when spamd is started with the daemonize option do not exit the parent until the child signals that it has logged the pid, to allow a wrapper script to simply continue immediately after starting spamd; - additional tempfile cleanup in kill_handler; - add SPAMD_LOCALHOST option to make-test to allow specifying non-127.0.0.1 IP address for use in FreeBSD jail; API - adding one optional argument to Mail::SpamAssassin::parse allows caller to pass additional out-of-band information to SpamAssassin (such as DKIM verification results, information about a SMTP session, or dynamic rule hits); this information is made available to plugins and the rest of the code through a 'suppl_attrib' hash; - Plugin::Check - pick up 'rule_hits' from caller via the new mechanism and call got_hit() on them; - simplified adding dynamic score hits and dynamic rules by plugins (such as AWL, CRM114, FuzzyOcr, Check) by letting got_hit() accept options tflags and description, and letting it store a supplied dynamic score for proper reporting; - let the timing breakdown information be accessible to a caller through the existing get_tag mechanism (tag TIMING); - let the generated header fields ('add_header' configuration options) be accessible to a caller through the existing get_tag mechanism (tag ADDEDHEADER and friends); RULES - rules are no longer distributed with the package; - dropped redundant rules or rules causing too many false positives; - added or updated rules (incomplete list in no particular order: vbounce, money, image spam, fill_this_form, FreeMail, European Parliament, HTML attachments, uri_obfu*, urinsrhsbl, urinsrhssub, urifullnsrhsbl, URI_OBFU_X9_WS, rDNS=localhost, INVALID_DATE_TZ_ABSURD, KHOP_SC, RCVD_IN_PSBL, FRT_VALIUM*, BOUNCE_MESSAGE, VBOUNCE_MESSAGE, __BOUNCE_UNDELIVERABLE, HELO_STATIC_HOST, FILL_THIS_FORM_FRAUD_PHISH, CHALLENGE_RESPONSE, DKIM_VALID, DKIM_VALID_AU, DKIM_ADSP_*, NML_ADSP_CUSTOM_{LOW,MED,HIGH}, __VIA_ML, MIME_BASE64_TEXT, FORGED_MUA_THEBAT_BOUN, FORGED_MUA_THEBAT_CS, UNRESOLVED_TEMPLATE, __THEBAT_MUA, __ANY_OUTLOOK_MUA, RP_MATCHES_RCVD, one-word X-Mailer, ... - rule for plain text attachments with octet-stream MIME type; - avoid false positives on ISO-2022-JP messages in several rules; - updated various default whitelists, uridnsbl_skip_domain, adsp_override, ... PLUGINS - new plugins: FreeMail, PhishTag, Reuse - now enabled by default: DKIM - now disabled by default: AWL - retired plugin DomainKeys AWL PLUGIN - plugin AWL is now disabled by default; - README.awl: increase suggested awl.ip field width to 45 to support IPv6 addresses or DKIM signer domains; - AutoWhitelist.pm: allow storing an IPv6 address (previously causing SQL server errors: value too long) - let AWL keep separate records for DKIM-signed and unsigned mail (when auto_whitelist_distinguish_signed configuration option is true, and SQL field awl.ip field size is increased or made dynamic); - gracefully handle NaN from corrupted database or a broken emulator; DCC PLUGIN - added support for DCC reputations, added setting dcc_rep_percent, new test check_dcc_reputation_range(), new tag DCCREP (DCC servers supply reputation data only to licensed clients); - allow usage of a remote dccifd host through an INET or INET6 socket; DKIM PLUGIN - plugin is now enabled by default; - absolute minimal version of Mail::DKIM is 0.31; support for ADSP requires Mail::DKIM 0.34; a DNS test (and rule) for NXDOMAIN is operational since Mail::DKIM 0.36_5 - supports multiple signatures (useful for whitelisting); - distinguishes author domain signatures from third party signatures (useful for whitelisting); - provides a tag DKIMIDENTITY (in addition to DKIMDOMAIN); - DKIM now supports Author Domain Signing Practices - ADSP (RFC 5617); - use the Mail::DKIM::AuthorDomainPolicy instead of Mail::DKIM::DkimPolicy, when available (since Mail::DKIM 0.34); - implements an 'adsp_override' configuration directive and adds an eval:check_dkim_adsp check, which is used by new DKIM_ADSP_* rules; - rules contain an initial set of 'adsp_override' directives, listing some of the more popular target domains for phishing (applicable only to domains which sign all their direct mail with a DKIM or DK signature); - this plugin can now re-use Mail::DKIM verification results if made available by a caller, which saves resources and makes it possible for SpamAssassin to work on a truncated large mail without breaking DKIM signatures; BUG FIXES - fixed Rule2XSBody segfaults; - do not treat user data as perl booleans (a string "0" is a false); - avoid data from the wild be interpreted as perl regular expressions; - ArchiveIterator: prevent _scan_directory from passing directories to _scan_file (on NFS it would fail with EISDIR on read(2); - fixed vpopmail support; - the 'exists:' evaluator in HEADER rules now works as documented and tests for existence of a header field, instead of testing for a header field body being nonempty; internally, the pms->get can also now distinguish between empty and nonexistent header fields - fixes to header fields parsing in several places: header field names are case-insensitive, whitespace is not required after a colon, obsolete rfc822 syntax allowed whitespace before a colon; VBounce: match "Received:" only at the beginning of a line; - Exporter never really worked in SA, was not enclosed in BEGIN{} OTHER - more expensive code sections are now instrumented with timing measurements; timing report is logged as a debug message by the end of processing, and made available to a caller and to 'add_header' directives through a TIMING tag; - total rewrite of URI detection in plain text body; - pseudoheader "ALL:raw" returns a pristine header section, and pseudoheader "ALL" returns a cleaned header section - many updates to the list of top level domains; - add 'util_rb_3tld', allowing 3-level TLDs to be listed in URIBLs and allowing new 3TLDs to be added from rule updates; - avoid trusted_networks bog down due to O(n^2) loop with millions of entries; - preserve order of declared 'add_header' haeder fields; - allow debug areas to be excluded from debugging, e.g.: -D all,norules,noconfig,nodcc - fixes to Plugin/VBounce.pm, updated VBounce ruleset; - new module Mail::SpamAssassin::BayesStore::BDB, but is not yet ready for use - numerous additional and updated self-tests; - updated documentation, fixed numerous typos and mistakes in documentation text and in log messages; - extensive improvements to development process: automated testing through Hudson, improvements to mass-check and rules Mark