1.1.4: * Print traceback on lua errors in lua config * Fix leaks in lua error paths * Improve 'R_EMPTY_IMAGE' rule * Fix metas memoization in SA plugin * Properly set `flag` in fuzzy replies * Fix arguments order * Fix issue with out-of-boundary reading * Fix issues found by coverity * Same result checking error found by coverity * Fix varargs processing (found by coverity) * Fix error in printing hex * Reduce weights for some hfilter patterns * Add aliases for task:get_from_ip: - task:get_addr - task:get_from_addr - task:get_ip * Rework once_received module - Fix priority for `good_hosts` - If a good host has been found do not add once_received symbols - Fix priorities for strict once_received - Add ability to whitelist IP addresses * Fix `MISSING_MIMEOLE` rule for modern OE * Treat meta tags as embedded tags (#501) 1.1.3: * Fix DSN rules when SMTP from is unavailable * Fix statconvert routine to avoid lua module usage * Set a sane quark for configtest to avoid NULL to be printed in logs * Support c11 if available * Fix parsing of ip:port strings * Add more diagnostic for lua subr errors * Fix task:set_from_ip lua method * Add basic routines for digital signatures * Add tool for digital signatures * Add plain open file API method for atomic open * Fix parsing nested braces inside logger vars * Pre filters now actually skip processing * Add pre-filter mode for multimap * Switch to apache 2 license 1.1.2: * Fix stat_cache closing * Add checkpoints to sqlite3 learn cache * Do not recompile lua generated headers all the time * Increase number of messages learned * Fix issues with dual stack and hfilter * Disable MID checks for hfilter by default * Fix cache definitions in multiple classifier and no type * Don't crash if learn cache failed to initialize * Fix googlegroups support in maillist plugin * Rework flags LUA API: - Allow to check for a specific flag - Add `learn_spam`, `learn_ham` and `broken_headers` flags - Unify internal functions * Add `BROKEN_HEADERS` rule * Add support for forged confirmation headers (by @AdUser) * Allow `any`, `mime` and `smtp` for get_from/get_recipients * Add mime types checking plugin * Add rule to detect spammers attempts to cheat mime parsing * Rework parsing of IP addresses in configuration (better IPv6 support) * Add `util.parse_mail_address` function to LUA API * Add lua sqlite3 module * Implement synchronous redis call * Ratelimit: avoid possible indexing of nil value (Fixes #498) (by @fatalbanana) * Add stat_convert command to convert stats tokens from sqlite3 to redis * Implement redis advanced lua api with pipelining * Fix memory leak on redis stat (#500) * Fix user/language learn count in sqlite statistics (#496) (by @fatalbanana) * Fix build with custom pcre * Fix fuzzy relearning (#498) * Improve planning of asynchronous tasks * Show slow rules in log * Add warning for slow regexps * Add base32 decode/encode routines to lua util * Allow converting of learn cache from sqlite to redis * Add methods to check if a messages has from/rcpts * Improve and fix multimap plugin: - Restore 'header' maps - Add filters for headers - Add 'email:addr', 'email:user', 'email:domain' and 'email:name' filters - Add generic regexp filters * Disable reload command in rc scripts * Improve runtime CPU dispatcher for libcryptobox * Add preliminary support of digital signatures via ed25519 * Add detection for RDRAND support * Print configuration of crypto on start * A in SPF presumes AAAA lookup as well 1.1.1: * Fix duplicated XBL symbol * Reduce log severity for ratelimit missing servers * Fix XBL composite to avoid duplicate symbols * Reduce weight of URL_ONLY rule due to FP rate * Disable fuzzy hashes from the metadata for now * Fix processing of empty messages (#486) * Always treat DNS timeouts as temporary fail for SPF * Fix issue with SPF double IP stack (#483) * Use X-Forwarded-For when checking secure_ip (#488) * Fix hash calculation for sqlite stats * Fix memory corruption on punycode * Fix strings allocation in punycode * Fix error message (#491) 1.1.0: * Incompatible change: sqlite3 and per_user behaviour: Now both redis and sqlite3 follows the common principles for per-user statistics: 1) If per-user statistics is enabled check per-user tokens ONLY 2) If per-user statistics is not enabled then check common tokens ONLY If you need old behaviour, then you'd need to use separate classifier for per-user statistics. * Implement redis statistics backend and cache * Implement autolearning for statistics * Reworked statistics architecture from scratch * Add hyperscan (https://github.com/01org/hyperscan) engine for regular expressions: - add lazy loader for hyperscan databases - rework regexp cache to have joint pcre/hyperscan scanning - implement hyperscan pre-filter support - add compilation guards for bad expressions - implement `rspamadm control recompile` command - implement hyperscan cache monitoring - slides: * Implement flexible task logging * Rework fuzzy worker: - it is now possible to run multiple fuzzy workers; - implement lazy writing as sqlite3 is bad at concurrent writing; - add retries for simple sql commands in fuzzy backend; - use fine-grained transactions for fuzzy; - implement new multi-pubkeys mode; - allow encrypted only storages; - rework statistics for fuzzy; - add `rspamadm control fuzzystat` command for extended statistics; - implement human readable output for the previous command; - add condition script for learning fuzzy storage; * Various fixes to SPF: - fix `redirect` records; - fix domains when parsing mx/ptr/a records in includes/redirects; - fix issues with multiple addresses in SPF records; - ignore SPF results in case of DNS failure; - adjust TTL of records when resolving subelements of SPF records; - always select `v=spf1` line if it is available - do not cache records with DNS failure in subrequests; - ignore records with temporary fails during subrequests resolving; - fix `RDNS_RC_NOREC` support; * Add clang plugin for static analysis: - implement static checks for `rspamd_printf` format strings; * Add 'allow_raw_input' option for non-mime messages * Recognize types using libmagic * Fix parsing of IPv6 received headers * Add new interface of communication between workers in rspamd * Add support for named socketpairs * Don't write URLs by default as it is too verbose * Set status for HTTP replies * Try load `rspamd.conf.override` * Implement words decaying for text parts to limit many checks * Improve support of SA rules and plugins: - add check_for_shifted_date and check_for_missing_to_header eval rules; - add 'check_relays_unparseable' support; - add `check_for_mime('mime_attachement')` function; - use new re_cache interface for all SA rules; - add support for `Mail::SpamAssassin::Plugin::MIMEHeader`; - add support of 'special' SA headers to `exists` function; - fix issue when SA metas contain other metas; - fix freemail rules; * Many fixes to the URL parser * Match any newline character in regexps * Fix resolving of upstreams and detection of poor IPv6 configurations * Parse upstreams selection algorithm from the configuration line * Add `reresolve` command to the control interface * Generate fuzzy hashes from task metadata (URLs and headers) * Add method to check if IP is local and `local_addrs` option * Implement forced timeout for delayed filters * Disable fast path of pcre-jit as it seems to be broken * Bayes fixes: - new normalizer function; - really use weights of tokens from the OSB algorithm; - restore multiple classifiers support; * Rules changes: - add `R_SUSPICIOUS_URL` rule that detects obfuscated URL's; - improve empty image rule; - rework `FORGED_RECIPIENTS` rule; - reduce weight of `SUSPICIOUS_RECIPS`; - fix `*_NORESOLVE_MX` symbols in hfilter; - add `SUBJ_ALL_CAPS` rule with support of UTF8 - add spamhaus SBL to uribl - fix `SUSPICIOUS_RECIPS` and `SORTED_RECIPS` rules - remove `R_TO_SEEMS_AUTO` as it generates a lot of FP; - add new Message-ID regexp for Thunderbird (by @moisseev); * Plugins changes: - allow ratelimit plugin to set symbol instead of pre-result - support IP DNS black lists for URIBL (e.g spamhaus SBL); - drop deprecated SURBL bits (by @fatalbanana) - rename `JP_SURBL_MULTI` to `ABUSE_SURBL` (by @fatalbanana) - add `SURBL_BLOCKED` (by @fatalbanana) - add `CR_SURBL` - SURBL: allow fallthrough to default symbol (by @fatalbanana) - Settings: fix IP match (by @fatalbanana) - SURBL: add missing symbols to metric (by @fatalbanana) - allow processing images urls for SURBL - unconditionally disable SPF for authenticated users and local networks * Rework ratelimit plugin - switch to `rates` instead of old and stupid strings to setup; - check if a bucket is zero and disable the corresponding limits' - turn off all buckets by default; - check either `rcpt` or `user` buckets, not all together' - document new `rates` and `symbol` options; - inform user about what buckets are used in the configuration; * Add neural network **experimental** plugin * Add a sample script to learn neural network from rspamd logs * Add documentation strings support to rspamd: - add strings for the main configuration options; - document workers options; - add internal plugin options; - create `rspamadm confighelp` routine; - implement human readable output for the previous command; - add subtree search support; - add keyword search support; * Documentation improvements, tutorials section, statistics description * Many other minor and major bugfixes not noted here 1.0.11: * Fix spf redirects * Fix domains when parsing mx/ptr/a records in includes/redirects * Fix unfolded base64 encoding * Fix GError use-after-free * Do not rewrite the original url when using redirector * Fix parsing of fragment in urls * Fix processing of HTML tags * Improve empty image rule * Avoid long double type * Fix tokens weights in OSB algorithm * Improve debugging for bayes 1.0.10: * Fix settings application (#416) * Fix another issue with fixed strings * Fix hash function invocation * Use the proper string for make_dns_request in lua_http * Fix scan time output * Update webui: - fix labels for greylisting - fix dimension of scan time 1.0.9: * Emergency fix in keyed blake2 to fix fuzzy hashes and encrypted password * Support passwords longer than 64 symbols 1.0.8: * Add function to traverse AST atoms * Allow dependencies on rspamd symbols for SA metas * Fix memory corruption when timeout is removed in fuzzy check * Fix encrypted fuzzy add processing * Avoid use-after-free in controller session destructor * Use session pool instead of task pool in fuzzy check * Fix assembly in i386 mode (#413, #412) 1.0.7: * Plugged memory leaks in internet address object & html parser * Fixed static build * Fixed multiple sigchld processing * Fixed deletion of signal events after event processing loop * Fixed build on ARM (#404 - reported by @Gottox) * Fixed setting the default mask for SPF. * Fixed sanitisation of HTTP query values * Fixed parsing of the last header in encrypted HTTP messages * Additions and fixes for test suite & benchmarks * Added openssl aes-256-gcm support to libcryptobox & HTTP server * Implemented support for starting multiple HTTP servers * Implemented batch accept in HTTP server * Added module to get data from HTTP headers (#285 - reported by @msimerson) * Added `rspamadm control` command * Added ability to sort counters output. * Added ability to specify custom headers for rspamc client * Fix architecture detection * Converted history storage to the UCL format * Allow flexible number of rows in history * Fix action badges in WebUI * Add universal cryptobox hash API * Migrated to the optimized blake2b implementation adopted from Andrew Moon * Allow explicit loading of specific modules * Always load settings module * Allow to add symbols from settings * Fix double free in the controller fuzzy learn command * Avoid endless loop when cannot open sqlite db * Updated libucl 1.0.6: * Fix build on i386 * Update CentOS7 service file patch (by @fatalbanana) * Fix path to rspamadm in Debian init script (by @fatalbanana) * Fix broken '_SC_GETPW_R_SIZE_MAX' on FreeBSD * Fix portability issues * Use cryptobox chacha for libottery * Better support of 32 bit builds * Fix header name tokens setup * Fix levenstein distance method for words * Add workaround for old libevent (#400) * Fix microseconds in termination timer * Fix some more issues with fixed strings * Explicitly test CPU instructions even after CPUID call * Do not check out of boundary memory * Do not output broken emails * Fix unknown symbols registration * Handle SIGILL using longjmp * Block signals when exiting event loop * Fix incorrect allocation size * Slightly optimize alignment * Restore rspamd -t for compatibility * Add more sanity checks for emails 1.0.5: * Add rspamd control interface: - support `stat` command to get runtime stats of rspamd workers - support `reload` command to reload runtime elements (e.g. sqlite3 databases) * Rework curve25519 library for modular design: - add Sandy2x implementation by Tung Chou - fix CPU detection for variables loading assembly - add testing for curve25519 ECDH * New fixed strings library * Add `R_SUSPICIOUS_IMAGES` rule * Enable mmap in sqlite3 * Use new strings in the HTTP code * Improve google perftools invocation * Improve performance profiling in http test * Reorganize includes to reduce namespace pollution * Allow specific sections printing in configdump command * Rework workers signals handlers to be chained if needed * Update socketpair utility function * Add control_path option for rspamd control protocol * Fix ownership when listening on UNIX sockets * Rework signals processing in main * Remove extra tools from rspamd (they live in rspamadm now) * Remove global rspamd_main * Add global timeout for the overall task processing (8 seconds by default) * Sanitize NULL values for fuzzy backend * Store NM between encrypt/decrypt * Add textpart:get_words_count method * Fix generic DNS request in lua * Tune hfilter weights * Add support of IPv6 in hfilter * Fix parsing of HTTP headers with IP addresses * Sync with the recent libucl * Various minor bugfixes 1.0.4: * Add configdump routine to rspamadm * Implement retransmits for fuzzy_check plugin * Fix events processing for learning anf checking fuzzy hashes * Avoid dependency on unneeded and uncompatible glib include * Add `historyreset` command to the controller * Fix loading of tokenizer config from dump (#389) * Add sorting hints for the history * Allow custom lua scripts for users/languages extraction (#388) * Do not add FORGED_RECIPIENTS when 'To' is missing (#387) * Do not add R_UNDISC_RCPT when 'To' is missing (#387) * Add encryption to fuzzy check plugin * Add encryption for fuzzy storage * Add new epoch for encrypted fuzzy request * Add encryption for `rspamd.com` storage * Remove gmime processing for LDA mode as it is deadly broken * Add routine to find end of headers position in mime messages * Fix LDA headers folding * Init libraries in rspamc client as well to avoid locale issues * Avoid collision with locally installed includes * Allocate and free memory with the same allocator in rspamadm (#385) * Preserve expired fuzzy hashes counter * Improvements in webui: - Add favicon.ico - Rework history table - Fix sorting for the history - Migrate to bootstrap 3 and jquery 2 - Fix css bugs - Add glyphicons - Add reset history - Improve history buttons - Redraw graph to avoid display issues - Webui is now MIT licensed to match licensing policy of rspamd 1.0.3: * Fix piechart clean slice (#380) * Fix controller crashes when GString is reallocated (#381) * Correctly set locale before start * Set C locale for numeric values * Add rspamadm routine: - add `pw` command to manage passwords - add `help` command for displaying help - add `configtest` command to check configuration files - add `keypair` command for generating encryption keys - add `fuzzy_merge` routine to merge fuzzy sqlite databases - add a simple manual page for rspamadm * Allow metric registration for composite expressions * Add strict mode for configtest * Add logger counters * Save and show learned messages count (#383) * Add `no_stat` flag * Add `task:set_flag` and `task:get_flags` (#382) * Enable foreign keys in sqlite3 * Remove orphaned shingles from fuzzy storage * Optimize synchronization steps for fuzzy storage * Allow delayed conditions registration * Add lua API for conditions registering 1.0.2: * Fix critical bug in webui that prevents password from being sent * Rework webui view: - Switch to d3.js for graphs - Improve piechart look - Rework colors for piechart - Fix layout for symbols - Fix refresh button * Add descriptions for whitelist maps * Fix build on arm (#379) * Fix issue with the last element in the radix trie * Add more tests for radix trie algorithm * Allow to extract URLs from query strings of other URLs (#361) * Initialize rrd fields before writing to file * Fix double free if no password has been specified 1.0.1: * Add writing to rrd from the controller * Fixed lots of bugs in rrd code * Adopt new DNS API in hfilter plugin (by @AlexeySa) * Allow only one controller process to manage rrd file * Set event base for fuzzy calls * Improve fuzzy IO errors logging * Add rra extraction function to rrd library * Add graph handler to the controller * Cache correct passwords to avoid too high CPU usage when working with webui * Controller sockets are owned by router do not export them to task * Optimize logging by skipping hash table search if it's empty * Fix loading issue whith broken statfiles * Print assertions from glib to rspamd logger * Load legacy `lua/rspamd.local.lua` * Update webui with some fixes to learning and scanning 1.0.0: * Rework symbols processing: - Improve sorting logic for symbols - Organize processing into multiple stages - Added asynchronous watchers for symbols - Added ability to organize dependencies between symbols * Fixed URL redirector: - Use optimized POE loop - Organize dependencies - Fix startup * New sqlite3 backend: - Allow to have per-languages and per-user statistics - Allow sqlite3 to be used as statistics backend * Store tokenizer configuration within statfiles * Improve bayes statistics: - Use headers and images metainformation in bayes - Suggest using of pre-processed tokens for statistics - Fix tokens normalization for OSB algorithm * Rewrite url parsing: - Fix numerous issues with url extraction and normalization - Fix mailto urls * Fix settings plugin to allow custom actions scores * Improve rbl plugin * Allow capturing patterns in rspamd lua regexp library * Add GTUBE support * Fix spamc legacy support * Add DKIM support to RBL module * Fix issues with multiple DKIM signatures * Fix issue if rspamd cannot create statfiles (#331) * Rework parts and task structure: - Now text_parts, parts and received are arrays - Pre-allocate arrays with some reasonable defaults - Use arrays instead of lists in plugins and checks - Remove unused fields from task structure - Rework mime_foreach callback function - Remove deprecated scan_milliseconds field * Add ip_score plugin support (not enabled by default): - Can check for asn/country and network using DNS lookups - Can store and load reputation from redis server * Improve PARTS_DIFFER rule to count merely different words * New HTML parser: - Parses HTML parts using a set of state machines - Extracts useful data and exports it to lua functions: + Styles + Images + URLs + Colors + Structure elements - Added HTML rules for some checks * New version of LUA DNS API * Table versions of many functions in LUA API * Improve rspamc client: - Print execution time - Allow executing of external commands and passing output to them - Allow mime output mode when rspamc alters message according to rspamd checks and send it to an external command or stdout * Allow scanning of local files using HTTP requests * Rework configuration system: - Rules are now moved from the $CONFDIR to $RULESDIR to avoid ambiguity - All modules configurations are now split in $CONFDIR/modules.d/* to simplify upgrades - Move hfilter to plugins - Allow plugins and rules to define default scores to simplify metrics setup - Include overrides for all modules to honor local/automatic parameters - Tune scores for many modules * Rework and enable DMARC plugin * Add whitelist plugin for SPF/DKIM/DMARC based whitelisting * Add some common domains to whitelists shipped with rspamd * Rework logging: - Now each log entry supports module name and a `tag`. Tag is used to identify unique objects (such as tasks) when checking log files - It is possible to turn on debugging for the specific modules - Systemd logging is fixed * Improve spamassassin plugin. - Now headers are matched more like SA - Improve support of Message-ID - Add support of ToCc header type - Fix :addr and :name in headers regexps * Resurrect rrd support code * Save controller stats between restarts * Fixed tonns of bugs * Added tonns of minor improvements and features * Added more unit tests * Create functional tests framework * Added documentation for missing modules * Added rpm/deb repositories and scripts * Updated WebUI and libucl externals 0.9.10: * Do not dereference null pointer on learning. * Fix some extreme cases in BAYES. * Add a workaround to avoid bad HTML messages breaking. * Build with -O2 flags by default. * Add constraints to limit DNS requests count per task. * Add workaround for SURBL DNS flood. * Set error if rspamd cannot learn anything. 0.9.9: * Don't use RWL_SPAMHAUS_WL (unknown result) for whitelisting (by @fatalbanana) * Import updated public suffix list (by @fatalbanana) * Remove debug message * Fix settings (by @fatalbanana) * Remove duplicated symbol registration * Use WAL for fuzzy storage * RBL fixes (by @fatalbanana): - silence errors; - yield unknown results from RBLs; - fix scoring for DNSWL; - fix use of RBL name as symbol; - ignore RBL names that would not be yielded; * Support captures in regular expressions * Add captures support to lua_regexp * Support dist on FreeBSD and Darwin * Add RCVD_IN_DNSWL_NONE as whitelisting exclusion (by @fatalbanana) * Multiple fixes to URL detection: - support port definition; - fix query and path recognition; - fix parsing of multiple slashes in URL; - fix parsing query just after port; - fix path field in `url:to_table` method; - improve support of IP based URLs. * Set ignore_whitelists = true for RECEIVED_SPAMHAUS_XBL (by @fatalbanana) * Add GTUBE support * Ignore User header in SA mode 0.9.8: * Fix critical bug in bayes classifier (#305) * Fix critical bug in RBL module (by @fatalbanana) * Fix and rework settings plugin. * Fix get_all_opts for a case of non-iterable options. * Use tld for redirector's matching. 0.9.7: * Add whitelist_exception setting to RBL module (by @fatalbanana) * Don't use RWL_MAILSPIKE_POSSIBLE or DNSWL_BLOCKED for whitelisting (by @fatalbanana) * Fix extreme cases in bayes classifier. * Fix parsing of urls with '?' at the end of hostname. * Update interface. * Fix number of issues with webui interaction. * Fix saving maps. * Allow user@ and @domain matches in multimap. * Fix issues with bounces From processing. * Fix abs/fabs misuse. * Fix builds on suse and arch linux distributions. 0.9.6: * Fix memory leak if mime cannot be parsed. * Fix dkim cache expiration. * Fix issues with redirector HTTP response. * Fix abnormal connection closing with certains messages with a high score (issue #296) * Fix redirector installation. * Use specific POE loop for some systems. * Fix number of issues in URL redirector. * Fix selecting URLs for sending to redirector. 0.9.5: * Avoid double free when extending HTTP message. * Fix double free if multiple classifiers are defined. * Fix misprint in spamassassin plugin. * Fix cpuid invocation on i386. * Fix ownership issues for zero-copy decode. * Allow __len metamethod on rspamd{text}. * Add base64 decoding lua utility. * Fix build on FreeBSD * Skip spaces at the beginning of mime messages. * DBL_ABUSE_REDIR should not have significant weight. * Allow to split by lua_regexp rspamd{text} objects. * Allow to specify custom stop pattern for lua_tcp. 0.9.4: * Fix critical bugs in tokenization algorithm * Write unit tests for tokenization * Add documentation for lua_tcp * Switch off legacy tokenization by default. * Fix critical bugs in words normalization * Add lua bindings to tokenizer. * Implement storing of HTTP headers inside task * Add lua API to accerss HTTP headers data * Implemented base64 encoding suitable for MIME * Use caseless hash and equal functions for HTTP request headers. * Improve debian architectures support (by @dottedmag) 0.9.3: * Revert incorrect regexp change that broke the default rules * Fix lua_tcp module 0.9.2: * Fix error on spawning unique workers. * Add preliminary version of generic LUA TCP requests API. * Use lua 5.1 if luajit is not available (Arm64, PowerPC, s390x etc) * Fix fuzzy mime strings with only type. * Improve thunderbird sanity checks. * Fix critical bug on matching regular expressions. * Make hiredis optional dependency. * Fix multiple bugs in daemon reloading 0.9.1: * Restore utf8 validation for regular expressions to avoid crashes * Fix symbols displaying in the interface * Add symbol groups to the interface * Fix maps ID parsing in the controller * Add multimap and regexp modules documentation * Backport fixes from libucl * Fix debian package (by @dottedmag) * Rework XXH32 invocations 0.9.0: * Add support of the fast and secure protocol level encryption: - curve25519 is used for key exchange; - chacha20/poly1305 cryptobox construction for bulk encryption; - zero latency overhead; - encrypting and balancing HTTP proxy worker * Rework expressions and create new expressions library: - aggressive optimizations based on the abstract syntax tree; - abstract expressions support (regular expressions, functions, lua modules composites and so on) - New comparision and '+' operators support - New greedy algorithm to minimize execution time of expressions and all symbols - Dynamic expressions benchmark and reoptimizations * Many improvements to the LUA API: - reworked logger module allowing to do pretty print of the most of lua types (including tables and userdata classes) - reworked lua redis and lua HTTP to support more features - added opaque type for passing large text chunks without copying - new regexp module with many auxiliary functions (e.g. `re:split`) * LuaJIT is now the default requirement for rspamd allowing to speed up lua execution by a large margin (however, plain lua is still supported) * New plugins: - spamassassin rules plugin that allows to load and re-use the most of SA rules natively - DMARC plugin that evaluates SPF and DKIM policies to the domain policies - many old plugins has been reworked to implement new features and improve stability * New aho-corasic trie implementation from @mischasan that allows to load and use hundreds of thousands of patterns with no influence on load * Support of PCRE JIT and PCRE JIT fast path modes that significantly improves the performance of regular expressions if supported by PCRE * New URLs parser and extractor: - removed legacy code that was useless for url finding - reworked algorithms of URL parsing for more precise and accurate results - added top-level-domains tree from http://publicsuffix.org - improved emails parsing - removed many phishing false positives due to TLD tree check * New statistics infrastructure: - created a separate layer of statistic library - improved OSB-Bayes by re-weighting tokens according to the original academic paper and `crm114` implementation, which reduced false positives rate significantly - created learn cache to avoid double learning of statistics and providing an efficient way to re-learn class for a message - created abstract layers for different statistics backends - implemented new tokenization algorithms with fast or secure (siphash) hashes to generate statistics features * Reworked utf8 tokenization that previously corrupted all UTF8 words (minor incompatibility with old fuzzy hashes with utf-8 symbols) * SPF module has been completely rewritten to support complex cases of `include` and `redirect` within SPF records * DKIM module now supports multiple signatures * Controller passwords can now be stored encrypted by `PBKDF2-HMAC` in the configuration file * Many hand-written HTTP clients has been replaced with the common rspamd http module * New test framework: - import lua `telescope` test framework - add unit tests for many rspamd modules and routines - create a unit test for each possible bug found - use luajit ffi for testing C code - added preliminary support of functional testing by creating tasks from lua * Randomize hash seed to avoid certain hash tables vulnerabilities * Documentation improvements: - added documentation for the vast majority of rspamd modules - added documentation for rspamd protocol - added documentation for the most of rspamd LUA extensions * Fixed tonns of bugs and memory leaks * Added tonns of minor features 0.8.3: * Various critical fixes in distribution (by @dottedmag and @fatalbanana) * Fixed bugs in url detector to parse certain patterns * Add default host and helo for a client * Some sanity checks for tokenizer and classifier * Reiterate on systemd support * Fix missing symbol registration * Add support of spamc compatible output * Filter double-dots in rbl.lua validate_dns (by @fatalbanana) * Update ucl submodule due to critical bugfix 0.8.2: * Create fuzzy db if it does not exist * Fix: Centos init script: configtest() (by @AlexeySa) * Enable one_shot for RECEIVED_SPAMHAUS_XBL - Fixes #102 (by @fatalbanana) * Update Exim patch (by @fatalbanana) * Fix processing of unix sockets. * Allow applying settings to authenticated users (by @fatalbanana) * Make settings priorities work as documented (by @fatalbanana) * Fix race condition in symbols planner * Add DNSWL_BLOCKED symbol (by @fatalbanana) * Make Exim pass usernames to rspamd (by @fatalbanana) * Update RBL module (by @fatalbanana): - fix indentation; - collapse loops; - avoid calling for un-needed information; - allow disabling RBLs for authenticated users * once_received.lua: Fix indentation & add exclusion for authenticated users (by @fatalbanana) * hfilter.lua: Add exclusion for authenticated users (by @AlexeySa) * Updates to hfilter rules (by @AlexeySa) * Set empty <> user or addr for msgs without FROM (by @eneq123) * Fix: attempt to index field '?' (a nil value) (by @eneq123) * Fix: if not exist Date-header (by @AlexeySa) * Add task:get_content() method. * rbl.lua: Ignore private IP space (by @fatalbanana) * Allow to check radix maps from lua by rspamd{ip} * Make local exclusions configurable per-RBL (by @fatalbanana) * Add rspamd_config:radix_from_config() (by @fatalbanana) * Support emails dnsbl in rbl (by @fatalbanana) * Complete rework of url extraction logic * Allow customizations for unix sockets. (fixes #182) * Set lua path according to rspamd settings. * Import lua-functional for plugins stuff. * Completely rewrite multimap plugin in functional style. * Fix FORGED_MUA_THUNDERBIRD_MSGID (fixes #186) * Check IPv6 addresses at dnswl.org and Spamhaus whitelist (by @fatalbanana) * Add lowercase utility for utf8 strings. * Various fixes to build system * Updated debian configuration infrastructure (by @dottedmag) 0.8.1: * Add sqlite and perl as dependencies for RPM/Debian packages (by @fatalbanana) * Remove whitelist.lua from RPM file list (by @fatalbanana) * Make Exim pass hostnames to rspamd (by @fatalbanana) * Fix building on Fedora (by @fatalbanana) * Add toggle for disabling installation of systemd units on Linux (by @fatalbanana) * Fix double format rounding that caused output corruption (reported by @fatalbanana) * Revert broken change for destructors ordering that led to memory corruption * Do not reset symbols case of settings if parsed from lua (reported by @andrejzverev) * Fix build on SunOS (by @wiedi) * Fix multiple crashes on broken DKIM DNS records * Fix critical issue with composites weights removing * Fix memory corruption in composites processing code * Ignore non-SPF TXT records when parsing SPF includes 0.8.0: * New fuzzy check logic: - use shingles algorithm for fuzzy matching - use blake2 instead of md5 for larger output space - combine fuzzy and strict matching - allow to organize private storages by means of keys - preserve compatibility with previous versions * New fuzzy storage: - use sqlite instead of own memory based hash tables - rework commands interface - add conversion from the old format - add fuzzy match by shignles - support old rspamd versions * Add lemmatizing for words used in fuzzy hashes that allows to improve match quality by using of the first forms of all words * Rework language detection * Fix several critical bugs, memory leaks and deadlocks: - memory leak in HTML nodes parsing - deadlock in logger code - deadlock in signals processing - crashes in fuzzy_storage - crashes in tokenizers if the input was empty * Import new libucl with several bugfixes and improvements * Support listening on ipv6 addresses only * Fix macro expansion in SPF module * Several bugfixes in DKIM module * Add load headers support for mime parts to the lua API * Add documentation for: - workers in general - fuzzy_storage worker - fuzzy_check plugin - mimepart and textpart lua API modules 0.7.6: * Apply boundary fix for dkim simple canonization * Fix ping command * Return nil if header was not found in lua_task * Fix hang in upstreams revive logic * Decode entitles when normalizing HTML parts * Fix logic of finding URLs in HTML parts * Do not include \0 into length of text when performing conversion to utf8 * Fix raw vs parsed reperesentations Raw parts are now: - decoded b64/qp, but *NOT* converted to utf-8 Processed parts are now: - converted to UTF-8 - normalized if needed (e.g. HTML tags are stripped) * Rework DKIM canonization to line based * Fix fuzzy hashes addding * Use more specific hash function for fuzzy * Fix leaking of iconv descriptors * Fix PTR resolving in lua resolver * Rework spf module. - Copy data to memory pool as cached record might be destroyed causing freed memory being passed to the protocol output (use after free) - Allow SPF_NEUTRAL policy to be handled separately - Add R_SPF_NEUTRAL to the default config * Rework `register_symbols` function * Allow to disable components of hfilter 0.7.5: * Fix owner when creating folder /run/rspamd (by @sfirmery) * Fix IP validity checks * Decode URLs obtained from HTML tags * Fix crash with unweighted upstreams * Stop processing headers in parts * Set sockaddr.sa_family properly when connectig to upstreams * Fix reload issues in surbl and fuzzy_check (reported by @citrin) * Fix timeouts in redirector * Improve lua errors reporting * Fix lua closures processing in libucl * Rework calling of lua functions from regexp module * Choose raw regexp for raw headers * Rework conversion to utf since glib one is broken * Ignore SGML style tags in html * Fix old bug with non-capturing https urls * Fix memory corruption on fuzzy reload (reported by @citrin) * Fix percents display in rspamc * Fix buffer update for DKIM * Do not validate utf for raw headers 0.7.4: * Fix build under *BSD * Detect HAN unicode script * Implement language detection heuristic for text parts * Fix time output in history * Improve piechart coloring * Fix \r\n conversion in DKIM module (reported by @citrin) * Try to detect systems with no IPv6 support * Fix multiple/single values in use settings (reported by @citrin) * Rework IP addresses in upstreams: - Select ipv4/unix addresses if they exist and use ipv6 for ipv6 only upstreams (since the support of ipv6 is poor in many OSes and environments) - Free IP list on upstream destruction - Add test cases for addresses selection - Allow adding of free form IP addresses to upstreams * Fix endiannes in lua_radix search (reported by @citrin) * Soft shutdown should also set wanna_die flag (reported by @citrin) * Stop use-after-free in event loop termination * Fix processing of very short messages in DKIM (reported by @citrin) * Detect systems without shared mutexes * Fix issues with PTR and MX elements in SPF parser (reported by @citrin) 0.7.3: * New upstreams code: - simplify upstreams API; - unify strings parsing in upstreams definition; - add configuration options for the upstreams; - for failed upstreams re-resolve their addresses; - use all resolved addresses for an upstream (round-robin); - implement stable hashing and use it by default for upstreams; - add unit test for upstreams module. * Rework signals processing in all rspamd workers: - signals are now processed in the event loop; - implement the most common signal handlers for all workers; - add callbacks for workers specific signal handlers * Fix critical issue with fuzzy storage: Fuzzy stroage could not save any hashes on termination due to bugged signals handling * Fix roll history IP storage * Rework ipv4/ipv6 handling in parsing addresses: - turn off support of IPV6_V6ONLY socket option; - create ipv6 socket prior to ipv4 one to handle systems with v6/v4 sockets enabled (Linux) * Remove CBL as it's wholly included in Spamhaus XBL (by @fatalbanana) * Remove nszones.com fake RBL (by @citrin) * Fix upstreams interaction for fuzzy_check * Verify spf PTR records (reported by @citrin) * Fix spf MX records parsing * Add compatibility for old libevent (by @yellowman) * Sync bugfixes from libucl 0.7.2: * Convert all maps to the compressed radix trie * Allow IPv6 addresses in IP maps * Remove dynamic items support from symbols cache * Allow hex encoded output of strings * Fix bug with control connections count * Process fuzzy weight correctly (reported by @fatalbanana) * Remove extra reference retain of http connection on error * Remove deprecated options from the default config * Add `one_shot` attr to metric's symbols * Doc: add documentation for metrics * Add Upstart job to debian packaging (by @CameronNemo) * Config: improve SURBL symbols descriptions (by @citrin) * Config: reflect SURBL changes (by @citrin): - Outblaze removed, malware moved to separate list: http://www.surbl.org/news/internal/MW-malware-sublist-added-to-multi * Fix C modules initialization on restart * Treat single IP as a single IP in radix lists (reported by @citrin) * Do not touch file and core limits if not asked explicitly (reported by @citrin) * Improve logging for fuzzy errors * Block SIGPIPE for HTTP writing * Doc: update manual pages * Fix HTTP connection termination * Reduce default number of parallel requests to 8 * Sync with libucl include features 0.7.1: * Fix typo in stat output. * Fix issues with includes crossing with the system includes * Restore testing framework * Add radix trie test suite * Implement new path-compressed radix trie. - The performance benefit over the old algorithm is about 1.5 times. - Memory usage is significantly lower as well. - Now radix trie can accept any IPv4/IPv6 values * Various improvements to the memory pools code * Fix writing reply to a client when no filters are defined * Write base32 encoded fuzzy * Fix 'soft reject' action * Fix rspamd reload and modules reconfiguration * Fix subject rewriting for the default subject * Fix states for processing task and pre-filters * Fix issues with connection closing * Fix crashes in rdns * Fix ratelimit pre-filter * Update exim patch. - Update to the recent exim version - Strip extra leading src/ from the patch - Remove sendfile since it was broken - Fix rspamd spam report for exim * Improve documentation 0.7.0: * Use HTTP protocol for all operatiosn * Webui worker is now removed and controller works as webui * Allow to serve static files via controller by option `static_dir` * Rspamd interface is now a part of rspamd * Rspamc client has been rewritten to use HTTP and non-blocking mode allowing to start multiple operations simultaneously (see `-n` option) * Lua API was completely reworked to satisfy modern standards of LUA: * Module `lua-message` was removed * Reduced number of superglobals registered by rspamd * Many functions has been redesigned * Symbols registration is now more convenient * Users settings has been rewritten as lua plugin * Reworked headers system as gmime's based one misses many headers and is very slow to get headers values * Reorganized code and removed embedded jannsson by using UCL for all json parsing * Migrated to `librdns` for DNS resolving that improves concurrency for DNS requests significantly * Fixed tonns of bugs in MIME processing * Improved metrcis and default symbol's weights * Added new RBL's * Fixed a number of issues in the modules * Removed several memory leaks found * Fix unicode processing * Fix fuzzy checking for unicode parts * Significantly improve documentation and especially LUA API docs * See migration notes at https://rspamd.com/doc/migration.html 0.6.8: * Controller now listen for localhost and not for 127.0.0.1 by default * Allow FCrDNS-style RBL lookups (by @fatalbanana) * Reduce threshold for parts_differ function. * Fix hostname lookup for rdns rbl (by @AlexeySa) * Fix HFILTER_URL_ONELINE to reduce false positive rate. * Fix whitelist module. * Allow override system predefined settings without touching system ones by .try_include macro (by @andrejzverev) * Check for [ip.address]-style HELO and suppress lookups. (by @fatalbanana) * Optimize hfilter (by @AlexeySa) * Fix issue with random numbers generator in dns. * Use more clever time values to setup entropy. * Synced with the recent libucl. 0.6.7: * Use ChaCha20 for DNS generator (more secure DNS id) * Unknown symbols now has zero weight and not 1.0 * Fix fuzzy hashes expire time * Fix critical issue in statfiles on FreeBSD 9 (and some other platforms) * Add .include_map macro to ucl parser * Update libucl * Fix headers end detection for DKIM module * Fix a bug in received headers parser * Validate IP addresses before pushing them to lua * Start new documentation project * Fixed tonns of other minor bugs * Start to prepare for 0.7 with HTTP protocol and new settings 0.6.6: * Removed issue with BUFSIZ limitation in the controller output * Simplify logging symbols escaping * Adjusted weights for several rules * Improve spamhaus rbl support * Removed PBL for received headers checks * Added hfilter module that performs various HELO and IP checks. * Rspamd can now be reloaded by HUP signal * Fuzzy storage should expire hashes properly * Build system has been reworked for better supportof pkg-config * Various minor bugfixes 0.6.5: * Fixed critical bug in DNS resolver, introduced in 0.6.4 * Improved multimap and rbl plugins to skip * Add dns_sockets option for tuning sockets per server in DNS resolver * Improved packages for rspamd 0.6.4: * Added io channels for DNS request to balance load and reduce id collisions chance * Fixed a bug in SPF filter that may cause core dump in specific circumstances * FIxed default config for rbl module * It is possible to get a list of rspamc commands with their descriptions * Added SORBS bl to the default config * 2tld file for surbl module has been significantly extended * Perl modules has been removed from the code. * Fixed an issue in libucl when parsing macros 0.6.3: * Fixed issues with DNS: - labels decompression algorithm was fixed; - added resolve_mx to lua API; - fixed modules that use DNS. * Lua modules once_received and emails reworked for new resolver API and UCL. * Debian package was polished. * Fixed a bug in fuzzy_check module that prevents correct processing messages without valid parts. 0.6.2: * Fuzzy check module has been reworked: - now fuzzy_check operates with a group of rules, that define which servers sre to be checked; - it is possible to specify read_only groups to avoid learning errors; - turn fuzzy_check to one_shot mode permanently; - fuzzy_check module configuration is now incompatible with the previous versions. * Imported bugfixes from libucl. * Fixed whitelist plugin. * Fixed statfiles resizing. * Improved logging initialization order. * Fixed race condition in the controller worker. 0.6.1: * Critical bugfixes: - fixed build system; - fixed in_class setting in bayes learning; 0.6.0: * Use UCL instead xml for configuration (https://github.com/vstakhov/libucl) * Fix statistics module normalization * Rework the many modules for the new configuration: - surbl has incompatible configuration; - fuzzy_check has incompatible configuration; - multimap has now new configuration; - received_rbl is removed and replaced by rbl module. * Removed deprecated options: - statfile_pool_size; - action and required/reject score for a metric. * Simplify build system and unify configuration for all platforms. * Improved URL detector (reduced false positive rate). * Lua 5.2 is now the default and fully supported version. * Tons of bugfixes and minor improvements. 0.5.6: * Fix bug with counters incrementing in rolling history * Detect expl and exp2l as some systems do not have it * Support input streams without Content-Length * Implement counters output via rspamc and controller interface * Fix bug with udp sockets in fuzzy storage 0.5.5: * New bayes normalizator based on inverse chi-square function * Various fixes to fuzzy storage * Allow update fuzzy storage only from specific IP addresses * Better support of IPv6 and address selection algorithms * Add CentOS spec file 0.5.4: * Fixed issues with diff algorithm * Added support of RRD statistics * Add webui worker for interface interaction * Fix a lot of issues with dynamic conf * Fix critical memory leak in settings code * Improve stability of the system 0.5.3: * Added dynamic options * Added advanced metaclassfication * Added RESTfull API for controller * Improved hashing algorithms * Various fixes for rspamc client: - allow interacting with unix sockets - librspamdclient major cleanup - bayes is now default classifier 0.5.2: * Added lua bindings for: - basic mime parts, that allows checkign attachements for example; - DNS resolver; * Existing lua bindings now works without task object allowing to use them in custom code. * Threads system was reworked to avoid global lua interpreter lock. * DKIM module now converts all line endings to CRLF how opendkim does. * URL detector is now more accurate for text parts. * Several critical bugs and memory leaks were fixed. 0.5.1: * Added lua worker type to handle network connections in lua. * Added lua bindings for async_session, IO dispatcher, memory_pool, and worker. * Composites can now uses other composites in expressions. * Fixes for debian package and for FreeBSD >= 9.1 * Add support of gmime-2.6 if gmime-2.4 is not found. * Improve url detection and phishing detection. * Add lua mime_part library to get an access to all message part attributes (like filename, length, type). 0.5.0: * Added SMTP lightweight balancing proxy with XCLIENT support. * Added lua bindings for upstreams objects and API. * New pre-filters are implemented to support initial checking for messages. * Added ratelimit plugin that uses redis protocol to store data. * Added ipv6 support to spf and some other modules. * Unbreak spf plugin. * Allow options with the same name be threated as list. * DKIM plugin an parsing code was added. * Separate build system to put logic in several shared libraries. * Many bugfixes. 0.3.2: * Add error handling for regexps * Fix quit command in controller interface * Write symbols weights to rspamc output * Improve logic of selecting rspamc version * Do not try to parse broken DNS replies * Add 'raw' flag to FROM_EXCESS_BASE64 rule (requested by citrin) * Output message id in rspamc reply * Fix inserting composite symbol * Fix output of log line * Document composites * Add logging for fuzzy checks * Add logging for learning * Improve logic of learning messages - do not learn more than specific threshold * Fix inserting results for symbols that were incorrectly (for example more than 1 time) defined in config file * Do not output control characters if output is not terminal * Fix some logic errors in learning * Consider lua plugins errors as fatal configuration errors * Fix wirting message id during fuzzy_add command * Display weight of symbols correctly * Fixes to winnow learning * One more try to improve accuracy of winnow algorithm * Add bayesian classifier (initial version) * Remove normalizer as it is winnow specific thing, so all statistic algorithms now returns value from 0 to 1 * Some fixes to fuzzy hashes expiration: * Fix assertion while look up value in NULL hash (found by cirtin) * Fix normalization for systems that have not tanhl function * Ignore rfc822 group addresses * Move images library to core rspamd * Add lua api to access images properties * Add post filters to lua API - filters that would be called after all message's processing * Add ability to check for specified symbol in task results from lua * Add ability to check for metric's results from lua * Add ability to learn specified statfile form lua * Add ability to extract filename and size of images from lua * Fix assertion while extracting internet address * Fix races in fuzzy storage * Make spf parser case insensitive * Add ability to check hashes of selected mime types * Add ability to set minimum size in bytes for mime types * Add ability to set minimum dimensions for images * Assume all text/* content types as text/plain * Fix getting data wrapper for gmime24 * Many fixes to statfile syncronization system * Fixed statfile pool initialization and synchronization with disk * Prepare 0.3.2 * Fix Mail::Rspamd::Config for new rspamd features * Use Mail::Rspamd::Config in rspamc client * Write user's name to rspamd log * Prepare rspamd build infrastructure for creating rpm and deb packages * Fix depends * Add start script for linux systems * Fix shared usage of statfiles * Add invalidation of statfiles in case of learning, so now statfiles * This should fix shared usage of statfile pool by several processes * Fix misprint (reported by az) * Fix stupid error when all checks can be done in a single pass * New trie based url scanner (based on libcamel) * Small fixes to rspamd perl client * Write fuzzy hashes info to log * Add trie interface to lua api * Explain sample config and cleanup it 0.3.1: * Add modules documentation * Continue implementing smtp proxy * Implement new learning system, now rspamd should be much more intelligent while learning messages * Convert statistic sums to use long double for counters * Use hyperbolic tangent for internal normalizer * In classify normalize result after comparing, not before * New symbols sorter * Fix strict aliasing while compiling with optimization * Fix tanhl detection for platforms that have not implementation of it * Remove several compile warnings * Add experimental support of dynamic rules to regexp module * Document views configuration * Several fixes to documentation * Add more logic for dynamic rules * Add documentation for dynamic rules * Add ability to make negations in networks in dynamic rules * Clean up cache items correctly * Implement basic SMTP dialog: * Implement interaction with smtp upstream (with support of XCLIENT) * Check messages received via smtp proxy * Add support for sendfile in io dispatcher * Fix issues with compatibility of worker_task and smtp proxy * Proxy DATA command * Fix SMTP * Change metric logic * Completely remove lex/yacc readers for config * Make common sense of metric/action and symbols * Sync changes with all plugins * Incorrectly removed in previous commit * Fix misprint (by Andrej Zverev) * announce the "password" keyword in usage list * Implement initial version of greylisting triplets storage * Fix issues with smtp worker * Fix QUIT command in SMTP worker * Some fixes about new metrics system (may be incomplete) * Get weights of symbol from default metric for symbols cache * Fix setting task->from/task->rctp in smtp client * Copy from and rcpt correctly * Some performance improvements to IO dispatcher (do not drain the whole buffer after a single line readed) * Fix smtp data input * Fix misprint * Add limit of maximum allowed smtp session errors * New logic of SURBL module: * Use system mkstemp(3) on systems where it is available as glib implementation * Try to fix memmove issues in io dispatcher * Remove debug from SURBL module * Rewrite buffered input for line policy (again) * Fix issue with links that are ip addresses in numeric form in surbl * On Darwin use BSD style sendfile definition * Reorganize platform specific knobs in CMakeLists * Use gettimeofday on systems that have not clock_getres * Use ftime for dns trans id generation on systems without clock_getres * Darwin sendfile(2) support * TIMEDB->TIMEB * More to previous commit * Pass env from main() arguments instead of platform specific global environ * Fix compatibility issues * Fix -lintl detection * Init some variables to avoid problems * Remove garbadge (gnome terminal sucks) * Add more information about why we drop smtp connection * Fix mkstemp call * Send to upstream QUIT command at the end of session * Check return value of each rspamd_dispatcher_write as in case of write errors sessions can be destroyed early * Fix states in smtp dialog * Use rspamd_snprintf instead of libc one * Fix URLS command * Fix reconfigure process of surbl module * Fix destroying smtp session (unmap memory and do not delete pool early) * Delete pool after using its variables * Delay timer must be registered in async session to correctly handle connection termination * Register dns requests in session too * Make session before registering events * Remove events in handlers * Add ability to set filters for smtp worker for each smtp stage * Add very initial version of DNS resolver (many things to be done) * Announce weights and sync * Fix few typo * Understand short names of facility in logging config * Add ability to make whitelist for spf checks * Misprint != -> == * Handle lua tag in way that it is not required to write additional text: * Strip all starting whitespace symbols from xml texts * Fix stupid bug in calculating buffer length while reading file maps * Add resolv.conf parsing into dns.c * Fix microseconds<->milliseconds conversions * Take callback argument in Mail::Rspamd::Client for processing files and directories * Print results if rspamc is called for a directory * Fix stupid error with surbl module reconfig (another one, blame me) * Do not show duplicate urls in url header * Fix detection of numeric urls (reported by citrin) * Write real time of message's scan to log (not only virtual) * Fix chartable module in utf mode * Fix parsing of some broken urls * Add ability to test regexp with 'T' flag * Write more code for DNS resolver: * Make DNS resolver working * Many improvements to rspamd test suite: now it CAN be used for testing rspamd functionality * Write DNS resolver tests * Fix issues with memory_pool mutexes and with creating of statfiles * Forgotten in previous commit * Add support for parsing SPF and SRV records * Fix PTR parsing * Add tests * Make SURBL module to use rspamd dns module * Several fixes to DNS logic * Remove evdns and use only rspamd resolver * Very hard to detect problem with race among error in socket and destroying task while we are writing to socket and go through a hash table * Fix resolving in smtp module * Init events before configuring resolver in smtp worker * Set resolver inside task * Fix reload signal (reported by citrin) * Some improvements to redirector * Call has_forked method to inform POE about fork * Fix lua DNS code * Decompress labels in DNS packets more strictly * Fix some problems with TXT records * Try to fix removing of DNS events * Do not insert unparsed RR's into reply * Calling callbacks may cause destroying session from which we are calling callback so we MUST call callback as the latest action * Fix check_smtp_data function * Add ability to make views by recipient * Add ability to set metric's action from config file * Fix bug with writing garbadge if message has no urls or no messages * Fix bug with incorrect behaviour of compare_parts_distance function * Add ability to assign several actions to one metric * Report action in rspamc protocol * Mail::Rspamd::Client and rspamc can now understand Action header too * Write action to log as well * Make valgrind happy about comparing symbols * Add more debug to comparing parts distance function * Write action even if message has no symbols * Make improvements to HTML entites decoder: now it replaces entities with common characters and * Add -d option to force debug output * Assume 7bit as default transfer encoding * Do not overwrite lua plugins and configs if they already exists in target directory * Improve logging * Write queue id to log * Remove test messages from cmake * Reopen log file by USR1 signal * Add reopenlog method to FreeBSD rc script * Adopt foreach for cmake 2.6 * Fix to rc script * Do not try to resolve names with several dots in a row * Fix surbl request formatting for ip addresses * Handle cases of broken requests * Fix problems with parsing compressed names * Fix TXT records parsing * Fix expanding spf macros that may fail in rare cases * Fix another error with early task destroying * Handle empty from header * Improve reopenlog command in rc script * Strip trailing whitespace characters in Mail::Rspamd::Client * Use ungreedy match to strip trailing whitespaces * Stupid error in calculation compressed label length * Some optimizations to client library * Do not compare empty parts * Empty and non-empty parts are allways different * Save in regexp cache the whole regexp with header name (if exists) and with flags * Add rspamd_log variable to lua plugins to access logging functions * Each part in rspamd task now can have parent part * Check for parts distance only for multipart/alternative subparts * Do not check attachements even if they are text (but attached as file) * Do not die if write (2) returned ENOSPACE while doing logging, turn on throttling mode instead (1 write try in a second) * Add ability to turn on debug for specific symbols * Add ability to configure dns timeouts and dns retransmits in config file * More debug * Fix extracting arguments in lua logger interface * Turn off debug_ip during reload if it was disabled by new config * Improve lua logging * Pre-init symbols cache when rereading config * Fix lua representing of invalid ip (nil, not 255.255.255.255) * Fix R_TO_SEEMS_AUTO rule (by citrin) * Add multimap lua plugin * Fix some multimap issues * Try to save images hashes to fuzzy storage to stop some annoying spammers * Allocate some more bytes for read buffer to avoid incorrect behavoiur * Add ability to check dns black lists by multimap module * Add multimap documentation * Fix labels parsing * Another try to save regexps in cache correctly * Improve test logs for regexps * Fix parsing txt records to avoid reading of uninitialized data * Fix error with writing symbols cache file * Fix error while working in utf mode when raw regexps was not created properly * Do not add extra byte while converting text to utf * Add error handling for regexps