]> git.ipfire.org Git - thirdparty/rspamd.git/log
thirdparty/rspamd.git
3 weeks ago[Test] Add system dependencies installation to integration test workflow
Vsevolod Stakhov [Fri, 17 Oct 2025 11:51:59 +0000 (12:51 +0100)] 
[Test] Add system dependencies installation to integration test workflow

- Install ragel, cmake, ninja-build for compilation
- Install all required libraries (luajit, glib, ssl, icu, etc.)
- Fix CI build failure

3 weeks ago[Test] Update integration tests to use rspamd-test-corpus
Vsevolod Stakhov [Fri, 17 Oct 2025 11:40:49 +0000 (12:40 +0100)] 
[Test] Update integration tests to use rspamd-test-corpus

- Fix integration-test.py -> integration-test.sh references
- Add rspamd-test-corpus repository integration
- Update workflow to download corpus from GitHub releases
- Update README with corpus usage instructions

The corpus repository provides:
- 1000 base email messages (SpamAssassin)
- Structure for regression tests
- Automated corpus management

Corpus: https://github.com/rspamd/rspamd-test-corpus

3 weeks ago[Test] Add Docker-based integration test suite
Vsevolod Stakhov [Thu, 16 Oct 2025 15:26:46 +0000 (16:26 +0100)] 
[Test] Add Docker-based integration test suite

Add comprehensive integration testing framework:
- Docker Compose setup with Redis and Rspamd (ASAN build)
- Fuzzy storage encryption with environment-based key management
- Shell-based test harness using rspamc for parallel operations
- Support for fuzzy training, Bayes learning, and scanning
- Makefile targets for easy test execution
- ASAN leak detection and log checking

3 weeks agoMerge pull request #5687 from rspamd/vstakhov-mime-anonymize-improvements
Vsevolod Stakhov [Fri, 17 Oct 2025 09:45:07 +0000 (10:45 +0100)] 
Merge pull request #5687 from rspamd/vstakhov-mime-anonymize-improvements

Improve MIME anonymization with LLM support and enhanced privacy

3 weeks ago[Fix] Remove Authentication-Results and anonymize envelope-from in Received headers 5687/head
Vsevolod Stakhov [Fri, 17 Oct 2025 07:53:57 +0000 (08:53 +0100)] 
[Fix] Remove Authentication-Results and anonymize envelope-from in Received headers

- Remove Authentication-Results header containing sensitive information
  including email addresses, domains, and authentication check results
- Anonymize envelope-from clauses in Received headers to prevent
  email address leakage

3 weeks ago[Feature] Improve MIME anonymization with LLM support and enhanced privacy
Vsevolod Stakhov [Thu, 16 Oct 2025 16:56:27 +0000 (17:56 +0100)] 
[Feature] Improve MIME anonymization with LLM support and enhanced privacy

- Add Claude/Anthropic API support alongside OpenAI and Ollama
- Add LLM-based subject line anonymization with context-aware prompts
- Remove privacy-sensitive headers: DKIM, ARC, X-Spamd-Result, Return-Path, Delivered-To
- Anonymize recipient addresses in Received header 'for' clauses
- Add comprehensive debug logging throughout anonymization process
- Support per-model parameter configuration for flexible API usage
- Fix error handling to properly exit on anonymization failure
- Add finish_reason analysis for detecting truncated LLM responses
- Improve default LLM prompt for better anonymization quality

3 weeks agoMerge pull request #5686 from PHPGangsta/patch-4
Vsevolod Stakhov [Thu, 16 Oct 2025 17:12:07 +0000 (18:12 +0100)] 
Merge pull request #5686 from PHPGangsta/patch-4

Set headers in DMARC reports to prevent out-of-office replies

3 weeks agoSet headers in DMARC reports to prevent out-of-office replies 5686/head
Michael Kliewe [Thu, 16 Oct 2025 16:13:09 +0000 (18:13 +0200)] 
Set headers in DMARC reports to prevent out-of-office replies

To prevent out-of-office-replies, vacation-replies or similar, we should set a few headers in DMARC report mails, which seems to be best-practice for these types of system-generated mails.

3 weeks ago[Fix] Fix use-after-free in fuzzy TCP connection cleanup
Vsevolod Stakhov [Thu, 16 Oct 2025 07:43:22 +0000 (08:43 +0100)] 
[Fix] Fix use-after-free in fuzzy TCP connection cleanup

Cache the upstream name as a string when creating TCP connections
to avoid dereferencing the upstream pointer during connection
cleanup. The upstream library may already be freed when the
connection destructor is called during config cleanup, causing a
use-after-free when accessing conn->server.

3 weeks ago[Fix] Fix compiler warnings in lua_logger and dkim modules
Vsevolod Stakhov [Thu, 16 Oct 2025 07:38:19 +0000 (08:38 +0100)] 
[Fix] Fix compiler warnings in lua_logger and dkim modules

Fixed incompatible pointer type warnings in lua_logger.c when converting
strings to integers by using gulong/glong types matching rspamd_strtoul/
rspamd_strtol function signatures.

Fixed enum type mismatch in dkim.c by adding RSPAMD_DKIM_KEY_INVALID to
rspamd_dkim_key_type enum and handling it in the verification switch.

3 weeks agoMerge pull request #5685 from moisseev/webui
Vsevolod Stakhov [Thu, 16 Oct 2025 07:27:45 +0000 (08:27 +0100)] 
Merge pull request #5685 from moisseev/webui

[Minor] Update CodeJar to version 4.3.0

3 weeks agoMerge pull request #5684 from rspamd/vstakhov-arc-sign-fix
Vsevolod Stakhov [Thu, 16 Oct 2025 07:27:32 +0000 (08:27 +0100)] 
Merge pull request #5684 from rspamd/vstakhov-arc-sign-fix

[Fix] ARC module now supports ed25519 keys

3 weeks ago[Test] Add ARC chain verification tests with multiple signatures 5684/head
Vsevolod Stakhov [Thu, 16 Oct 2025 06:20:51 +0000 (07:20 +0100)] 
[Test] Add ARC chain verification tests with multiple signatures

Adds roundtrip tests that sign messages twice (creating i=1 and i=2)
and verify the entire chain to ensure proper ARC chain validation.

3 weeks ago[Fix] Restore strict ARC header ordering to comply with RFC 8617
Vsevolod Stakhov [Wed, 15 Oct 2025 17:44:55 +0000 (18:44 +0100)] 
[Fix] Restore strict ARC header ordering to comply with RFC 8617

The split of ARC header insertion into two separate lua_mime.modify_headers
calls removed the explicit ordering enforcement. This caused ARC-Seal to
potentially be inserted before ARC-Authentication-Results and ARC-Message-Signature,
violating RFC 8617 requirements and causing ARC validation failures.

Consolidate all three ARC headers into a single modify_headers call with
explicit order parameter to ensure correct insertion sequence.

3 weeks ago[Feature] Add DKIM signing key API for flexible ARC signing
Vsevolod Stakhov [Wed, 15 Oct 2025 15:30:53 +0000 (16:30 +0100)] 
[Feature] Add DKIM signing key API for flexible ARC signing

Implements new C API for DKIM signing operations:
- rspamd_plugins.dkim.load_sign_key() - loads signing key
- rspamd_plugins.dkim.sign_key_get_alg() - detects key algorithm
- rspamd_plugins.dkim.sign_digest() - signs digest with loaded key

Updates ARC module to use new API for proper ed25519 and RSA support.
Adds comprehensive tests and improved signing eligibility diagnostics.

3 weeks ago[Feature] Add milter.add_headers object format support to rspamc --mime
Vsevolod Stakhov [Wed, 15 Oct 2025 14:32:22 +0000 (15:32 +0100)] 
[Feature] Add milter.add_headers object format support to rspamc --mime

Support milter.add_headers entries in {order: N, value: "..."} object
format in addition to plain strings and arrays. This format is used by
lua_mime.modify_headers() to control header insertion order.

3 weeks ago[Feature] Add milter header support to rspamc --mime output
Vsevolod Stakhov [Wed, 15 Oct 2025 13:17:07 +0000 (14:17 +0100)] 
[Feature] Add milter header support to rspamc --mime output

- Process milter.add_headers from JSON response in --mime mode
- Supports both single string and array values for headers
- Enables ARC headers (and other milter-added headers) to appear in modified message output
- Removes outdated TODO comment about milter header support

3 weeks ago[Minor] Update CodeJar to version 4.3.0 5685/head
Alexander Moisseev [Wed, 15 Oct 2025 13:15:10 +0000 (16:15 +0300)] 
[Minor] Update CodeJar to version 4.3.0

3 weeks ago[Fix] ARC module now supports ed25519 keys
Vsevolod Stakhov [Wed, 15 Oct 2025 11:39:54 +0000 (12:39 +0100)] 
[Fix] ARC module now supports ed25519 keys

- Remove hardcoded RSA-only restriction in do_sign()
- Replace manual RSA-specific key loading and signing in arc_sign_seal()
- Use native C dkim_sign() function with sign_type='arc-seal'
- Leverages existing C infrastructure that supports both RSA and ed25519
- Fixes 'DECODER routines::unsupported' error when loading ed25519 keys
- Algorithm detection (rsa-sha256 vs ed25519-sha256) now automatic
- Reduces arc_sign_seal() from ~100 lines to ~50 lines
- No FFI dependency, works with plain Lua installations

Resolves RSP-76

3 weeks agoMerge pull request #5681 from rspamd/vstakhov-composites-split
Vsevolod Stakhov [Tue, 14 Oct 2025 15:12:42 +0000 (16:12 +0100)] 
Merge pull request #5681 from rspamd/vstakhov-composites-split

[Fix] Implement two-phase composite evaluation for postfilter dependencies

3 weeks ago[Fix] Use null-terminated string for symbol lookup in composite dependency analysis 5681/head
Vsevolod Stakhov [Tue, 14 Oct 2025 14:38:39 +0000 (15:38 +0100)] 
[Fix] Use null-terminated string for symbol lookup in composite dependency analysis

In composite_dep_callback, atom->begin from rspamd_ftok_t is not null-terminated,
but was being passed directly to symbol_needs_second_pass() which calls
rspamd_symcache_get_symbol_flags() expecting a null-terminated C string.

This could cause incorrect symbol lookups or undefined behavior. Fix by creating
a std::string to ensure null-termination before passing to the C API.

3 weeks ago[Fix] Implement two-phase composite evaluation for postfilter dependencies
Vsevolod Stakhov [Tue, 14 Oct 2025 13:59:01 +0000 (14:59 +0100)] 
[Fix] Implement two-phase composite evaluation for postfilter dependencies

Fixes #5674 where composite rules combining postfilter/statistics symbols
with regular filter symbols failed to trigger. Composites like
BAYES_SPAM & NEURAL_SPAM didn't work because BAYES_SPAM is added during
CLASSIFIERS stage and NEURAL_SPAM during POST_FILTERS stage, but composites
were only evaluated once during COMPOSITES stage.

Solution:
- Analyze composite dependencies at configuration time
- Split composites into first-pass (depend only on filters) and second-pass
  (depend on postfilters/stats or other second-pass composites)
- Evaluate first-pass composites during COMPOSITES stage via symcache
- Evaluate second-pass composites during COMPOSITES_POST stage by directly
  iterating the second_pass_composites vector
- Skip symcache checks for second-pass composites during second pass to
  force re-evaluation despite being marked as checked in first pass
- Add functional test demonstrating the fix

The dependency analysis uses transitive closure: if composite A depends on
composite B, and B needs second pass, then A also needs second pass.

3 weeks agoMerge pull request #5680 from fatalbanana/multimap_multisymbol_numerals
Vsevolod Stakhov [Tue, 14 Oct 2025 13:57:15 +0000 (14:57 +0100)] 
Merge pull request #5680 from fatalbanana/multimap_multisymbol_numerals

Multimap: deal with symbols with leading numerals

3 weeks agoRevert "[Fix] Move nresults_postfilters recording to after POST_FILTERS stage"
Vsevolod Stakhov [Tue, 14 Oct 2025 12:36:15 +0000 (13:36 +0100)] 
Revert "[Fix] Move nresults_postfilters recording to after POST_FILTERS stage"

This reverts commit b4649ad851f67e64d2186100b9b53eb187f1f062.

3 weeks ago[Fix] Move nresults_postfilters recording to after POST_FILTERS stage
Vsevolod Stakhov [Tue, 14 Oct 2025 10:58:32 +0000 (11:58 +0100)] 
[Fix] Move nresults_postfilters recording to after POST_FILTERS stage

This fixes an issue where composite rules depending on statistics symbols
(like BAYES_SPAM) would fail to trigger. The nresults_postfilters counter
was being set too early (after COMPOSITES stage), preventing detection of
symbols added during autolearn or other post-filter processing.

Fixes #5674

3 weeks ago[Fix] Multimap: deal with symbols with leading numerals 5680/head
Andrew Lewis [Tue, 14 Oct 2025 10:54:31 +0000 (12:54 +0200)] 
[Fix] Multimap: deal with symbols with leading numerals

3 weeks ago[Test] Multimap symbol with leading numerals
Andrew Lewis [Tue, 14 Oct 2025 10:41:09 +0000 (12:41 +0200)] 
[Test] Multimap symbol with leading numerals

3 weeks agoMerge pull request #5676 from rspamd/vstakhov-url-patching
Vsevolod Stakhov [Tue, 14 Oct 2025 10:31:43 +0000 (11:31 +0100)] 
Merge pull request #5676 from rspamd/vstakhov-url-patching

[Feature] Add HTML URL rewriting infrastructure

3 weeks ago[Fix] Correct HTML attribute value offset calculation 5676/head
Vsevolod Stakhov [Tue, 14 Oct 2025 10:07:35 +0000 (11:07 +0100)] 
[Fix] Correct HTML attribute value offset calculation

Fix two issues in HTML parser attribute value span calculation:
1. Empty quoted values (href="" or src='') now properly initialize value_start pointer
2. Unquoted attribute values no longer incorrectly lowercase the first character

3 weeks ago[Fix] Add HTML entity encoding for URL rewriting
Vsevolod Stakhov [Tue, 14 Oct 2025 09:42:19 +0000 (10:42 +0100)] 
[Fix] Add HTML entity encoding for URL rewriting

Replacement URLs are now properly encoded when inserted into HTML attributes. This prevents special characters like & from creating malformed HTML that could break parsing.

3 weeks ago[Refactor] Direct C++ Lua binding for get_html_urls()
Vsevolod Stakhov [Tue, 14 Oct 2025 08:02:46 +0000 (09:02 +0100)] 
[Refactor] Direct C++ Lua binding for get_html_urls()

Replace the C wrapper layer (rspamd_html_enumerate_urls) with a direct
C++ Lua binding to eliminate unnecessary data copying. Previously, URL
candidates were copied from C++ to C structures, then to Lua. Now they
are pushed directly from C++ to Lua using lua_pushlstring.

Changes:
- Add lua_html_url_rewrite.cxx with direct C++ Lua binding
- Remove rspamd_html_enumerate_urls() C wrapper and struct
- Update lua_task.c to use extern declaration for C++ function
- Add lua_html_url_rewrite.cxx to CMakeLists.txt
- Use lua_createtable() to preallocate tables with known sizes

This improves performance by avoiding intermediate allocations, string
copies, and table reallocations while maintaining the same Lua API.

3 weeks ago[Minor] Remove irrelevant file
Vsevolod Stakhov [Mon, 13 Oct 2025 15:54:06 +0000 (16:54 +0100)] 
[Minor] Remove irrelevant file

3 weeks ago[Feature] Add task:get_html_urls() for async URL rewriting
Vsevolod Stakhov [Mon, 13 Oct 2025 10:46:09 +0000 (11:46 +0100)] 
[Feature] Add task:get_html_urls() for async URL rewriting

Introduce a two-phase API for HTML URL rewriting that separates URL
extraction from the rewriting step. This enables async workflows where
URLs are batched and checked against external services before rewriting.

Changes:
- Add rspamd_html_enumerate_urls() C wrapper to extract URL candidates
- Add task:get_html_urls() Lua method returning URL info per HTML part
- Include comprehensive unit tests covering edge cases
- Provide async usage examples (HTTP, Redis, simple patterns)

The new API complements the existing task:rewrite_html_urls() method,
allowing users to extract URLs, perform async operations, then apply
rewrites using a lookup table callback.

3 weeks ago[Fix] Use UTF-8 buffer for HTML URL rewriting
Vsevolod Stakhov [Mon, 13 Oct 2025 09:22:52 +0000 (10:22 +0100)] 
[Fix] Use UTF-8 buffer for HTML URL rewriting

The HTML parser calculates attribute value offsets from the UTF-8
buffer (utf_raw_content), but URL rewriting was incorrectly applying
patches to the MIME-decoded buffer (parsed). When charset conversion
occurs (e.g., from ISO-8859-1 to UTF-8), the same character can have
different byte lengths, causing incorrect patch positions.

This commit ensures all URL rewriting operations use the UTF-8 buffer
consistently, preventing corruption with non-ASCII characters.

3 weeks agoMerge pull request #5678 from moisseev/search
Vsevolod Stakhov [Sun, 12 Oct 2025 20:01:46 +0000 (21:01 +0100)] 
Merge pull request #5678 from moisseev/search

[Minor] Add search syntax hint to history table filter input

3 weeks ago[Minor] Add search syntax hint to history table filter input 5678/head
Copilot [Sun, 12 Oct 2025 17:10:43 +0000 (20:10 +0300)] 
[Minor] Add search syntax hint to history table filter input

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: moisseev <2275981+moisseev@users.noreply.github.com>
3 weeks agoMerge pull request #5675 from moisseev/visibility
Vsevolod Stakhov [Sat, 11 Oct 2025 17:04:27 +0000 (18:04 +0100)] 
Merge pull request #5675 from moisseev/visibility

[Rework] Refactor element visibility control to use Bootstrap classes

3 weeks ago[Test] Add comprehensive Lua unit tests for HTML URL rewriting
Vsevolod Stakhov [Sat, 11 Oct 2025 14:40:20 +0000 (15:40 +0100)] 
[Test] Add comprehensive Lua unit tests for HTML URL rewriting

Add 12 Lua-based unit tests covering:
- Basic URL rewriting with callback function
- Multiple URLs in same HTML part
- Selective rewriting (nil returns)
- Non-HTML parts skipped
- Quoted-printable encoded HTML
- Empty HTML handling
- Error handling (invalid callback)
- Multipart messages
- URLs with special characters
- Data and CID URI schemes skipped

3 weeks ago[Feature] Use luaL_ref for URL rewriter callback instead of global function name
Vsevolod Stakhov [Sat, 11 Oct 2025 14:18:02 +0000 (15:18 +0100)] 
[Feature] Use luaL_ref for URL rewriter callback instead of global function name

3 weeks ago[Feature] Add Lua binding for HTML URL rewriting (task:rewrite_html_urls)
Vsevolod Stakhov [Sat, 11 Oct 2025 14:08:13 +0000 (15:08 +0100)] 
[Feature] Add Lua binding for HTML URL rewriting (task:rewrite_html_urls)

3 weeks ago[Test] Add unit tests for HTML URL rewriting patch engine
Vsevolod Stakhov [Sat, 11 Oct 2025 13:42:15 +0000 (14:42 +0100)] 
[Test] Add unit tests for HTML URL rewriting patch engine

3 weeks ago[Fix] Add missing <optional> include to html_url_rewrite.hxx
Vsevolod Stakhov [Sat, 11 Oct 2025 10:05:43 +0000 (11:05 +0100)] 
[Fix] Add missing <optional> include to html_url_rewrite.hxx

3 weeks ago[Feature] Add HTML URL rewriting infrastructure
Vsevolod Stakhov [Sat, 11 Oct 2025 09:03:37 +0000 (10:03 +0100)] 
[Feature] Add HTML URL rewriting infrastructure

Implements infrastructure for rewriting clickable URLs in HTML content:

- Add span tracking to HTML parser to capture byte offsets of href/src attribute values
- Implement patch-based URL rewriting engine with overlap validation
- Add C→Lua glue for URL rewriting callback functions
- Support MIME re-encoding (quoted-printable, base64, 8bit) for modified content
- Add configuration options: enable_url_rewrite, url_rewrite_lua_func, url_rewrite_fold_limit

The feature allows Lua callbacks to transform URLs while preserving HTML structure
and MIME encoding. Integration with milter REPLBODY support enables message body
replacement.

4 weeks ago[Rework] Refactor element visibility control to use Bootstrap classes 5675/head
Copilot [Fri, 10 Oct 2025 17:17:41 +0000 (20:17 +0300)] 
[Rework] Refactor element visibility control to use Bootstrap classes

Replace inline styles and mixed jQuery methods with consistent helper functions and `d-none` class for better maintainability and performance.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: moisseev <2275981+moisseev@users.noreply.github.com>
4 weeks ago[Feature] Improve body rewriting support in rspamc and proxy
Vsevolod Stakhov [Fri, 10 Oct 2025 12:37:32 +0000 (13:37 +0100)] 
[Feature] Improve body rewriting support in rspamc and proxy

- Add --output-body option to rspamc for saving rewritten message body to file
  instead of printing to stdout
- Enable body_block protocol flag in proxy for non-milter mode to ensure
  message body is always available for rewriting operations
- This ensures consistent body rewriting capability across all protocol modes
  (rspamc, milter, and proxy)

4 weeks agoMerge pull request #5673 from rspamd/cursor/RSP-26-fix-milter-remove-headers-array...
Vsevolod Stakhov [Thu, 9 Oct 2025 18:48:58 +0000 (19:48 +0100)] 
Merge pull request #5673 from rspamd/cursor/RSP-26-fix-milter-remove-headers-array-handling-1740

Fix milter remove_headers array handling

4 weeks agofeat: Support array of positions for remove_headers 5673/head
Cursor Agent [Thu, 9 Oct 2025 15:45:51 +0000 (15:45 +0000)] 
feat: Support array of positions for remove_headers

Co-authored-by: v <v@rspamd.com>
4 weeks agoMerge pull request #5669 from rspamd/vstakhov-fuzzy-tcp-rework
Vsevolod Stakhov [Thu, 9 Oct 2025 15:42:21 +0000 (16:42 +0100)] 
Merge pull request #5669 from rspamd/vstakhov-fuzzy-tcp-rework

Add TCP protocol support for fuzzy storage

4 weeks agoMerge pull request #5672 from moisseev/liners
Vsevolod Stakhov [Thu, 9 Oct 2025 15:33:08 +0000 (16:33 +0100)] 
Merge pull request #5672 from moisseev/liners

[Test] Update JS linters

4 weeks ago[Test] Update JS linters 5672/head
Alexander Moisseev [Thu, 9 Oct 2025 13:20:16 +0000 (16:20 +0300)] 
[Test] Update JS linters

4 weeks ago[Fix] Fix double-release of fuzzy_tcp_session on invalid commands 5669/head
Vsevolod Stakhov [Thu, 9 Oct 2025 10:36:02 +0000 (11:36 +0100)] 
[Fix] Fix double-release of fuzzy_tcp_session on invalid commands

When a TCP command fails to parse in rspamd_fuzzy_tcp_io, the
fuzzy_tcp_session was released prematurely while cmd_session still
held a reference to it. This caused a double-release when cmd_session
was destroyed, potentially leading to memory corruption.

4 weeks agoMerge pull request #5671 from rspamd/cursor/RSP-278-fix-proxy-client-ip-forwarding...
Vsevolod Stakhov [Thu, 9 Oct 2025 10:07:32 +0000 (11:07 +0100)] 
Merge pull request #5671 from rspamd/cursor/RSP-278-fix-proxy-client-ip-forwarding-c0ae

Fix proxy client ip forwarding

4 weeks ago[Fix] Preserve IP header from upstream proxy in chain 5671/head
Vsevolod Stakhov [Thu, 9 Oct 2025 09:43:35 +0000 (10:43 +0100)] 
[Fix] Preserve IP header from upstream proxy in chain

4 weeks ago[Fix] Fix refcount leak in fuzzy_session destructor for TCP sessions
Vsevolod Stakhov [Thu, 9 Oct 2025 09:06:22 +0000 (10:06 +0100)] 
[Fix] Fix refcount leak in fuzzy_session destructor for TCP sessions

The fuzzy_session created for TCP command processing holds a reference
to its parent fuzzy_tcp_session but failed to release it in the destructor,
causing a refcount leak and potential use-after-free issue.

4 weeks ago[Fix] Use rspamd event wrapper consistently for TCP session timer
Vsevolod Stakhov [Thu, 9 Oct 2025 08:55:34 +0000 (09:55 +0100)] 
[Fix] Use rspamd event wrapper consistently for TCP session timer

The TCP session timer was incorrectly mixing rspamd's rspamd_io_ev wrapper
with direct libev API calls (ev_timer_init/start/stop), creating inconsistent
state that could lead to resource management issues.

Fixed by using rspamd_ev_watcher_init/start/stop consistently throughout,
passing fd=-1 for pure timers without file descriptors. Also removed the
now-unused fuzzy_tcp_timer_libev_cb wrapper function.

4 weeks agofeat: Add client IP to proxy messages
Cursor Agent [Thu, 9 Oct 2025 08:10:58 +0000 (08:10 +0000)] 
feat: Add client IP to proxy messages

Co-authored-by: v <v@rspamd.com>
4 weeks agoMerge branch 'master' into vstakhov-fuzzy-tcp-rework
Vsevolod Stakhov [Thu, 9 Oct 2025 07:31:51 +0000 (08:31 +0100)] 
Merge branch 'master' into vstakhov-fuzzy-tcp-rework

Resolved conflict in src/plugins/fuzzy_check.c by including both:
- HTML shingles configuration parsing from master
- TCP connection initialization from feature branch

Fixed trailing whitespace in config files from master.

4 weeks agoMerge pull request #5661 from rspamd/vstakhov-html-fuzzy
Vsevolod Stakhov [Wed, 8 Oct 2025 21:38:57 +0000 (22:38 +0100)] 
Merge pull request #5661 from rspamd/vstakhov-html-fuzzy

[Feature] Add HTML fuzzy hashing for structural similarity matching

4 weeks ago[Fix] Fix frequency-based ordering in HTML domain hashing 5661/head
Vsevolod Stakhov [Wed, 8 Oct 2025 16:23:10 +0000 (17:23 +0100)] 
[Fix] Fix frequency-based ordering in HTML domain hashing

The hash_top_domains function was sorting domains by frequency (descending),
but hash_domain_list was immediately re-sorting them alphabetically, which
negated the frequency information. This resulted in incorrect hashes where
domain order mattered for fuzzy matching.

Added preserve_order parameter to hash_domain_list to optionally skip
alphabetical re-sorting when frequency-based ordering should be maintained.

4 weeks agoMerge branch 'master' into vstakhov-html-fuzzy
Vsevolod Stakhov [Wed, 8 Oct 2025 16:12:17 +0000 (17:12 +0100)] 
Merge branch 'master' into vstakhov-html-fuzzy

4 weeks ago[Fix] Fix HTML shingles hash generation bugs
Vsevolod Stakhov [Wed, 8 Oct 2025 15:12:02 +0000 (16:12 +0100)] 
[Fix] Fix HTML shingles hash generation bugs

- Skip empty domains in hash_domain_list and hash_top_domains
- Validate HTML features are initialized before hashing
- Return zero hash for invalid/empty input instead of garbage

4 weeks ago[Fix] Fix memory leaks in HTML shingles generation
Vsevolod Stakhov [Wed, 8 Oct 2025 14:58:58 +0000 (15:58 +0100)] 
[Fix] Fix memory leaks in HTML shingles generation

- Require mempool parameter (cannot be NULL) for consistent memory management
- Change helper function to fill shingle structure in-place instead of allocating
- Eliminate unnecessary allocation, memcpy, and potential memory leaks
- All allocations now use rspamd_mempool_alloc0 consistently

4 weeks agoMerge pull request #5655 from rspamd/vstakhov-aliases-rewamp
Vsevolod Stakhov [Wed, 8 Oct 2025 14:23:34 +0000 (15:23 +0100)] 
Merge pull request #5655 from rspamd/vstakhov-aliases-rewamp

[Feature] Email aliases resolution and message classification

4 weeks ago[Fix] Fix set_addr validation to prevent malformed addresses 5655/head
Vsevolod Stakhov [Wed, 8 Oct 2025 10:16:32 +0000 (11:16 +0100)] 
[Fix] Fix set_addr validation to prevent malformed addresses

The set_addr function now properly checks that both addr.user and addr.domain
are non-empty strings before constructing addr.addr and addr.raw. This prevents
creating malformed addresses like '@domain.com' when addr.user is empty, and
ensures consistent state when addr.domain is empty.

4 weeks ago[Fix] Fix alias loop detection for converging paths in expand_multiple mode
Vsevolod Stakhov [Wed, 8 Oct 2025 10:11:29 +0000 (11:11 +0100)] 
[Fix] Fix alias loop detection for converging paths in expand_multiple mode

4 weeks ago[Fix] Fix is_local_domain to support backend objects
Vsevolod Stakhov [Wed, 8 Oct 2025 10:09:26 +0000 (11:09 +0100)] 
[Fix] Fix is_local_domain to support backend objects

The is_local_domain function was directly accessing module_state.local_domains
as a table, which caused it to always return false when local_domains was
configured as a backend object (MapBackend, CDBBackend, etc).

Fixed by:
- Moving get_from_source helper function before is_local_domain
- Using get_from_source to handle both plain tables and backend objects
- Updating return logic to handle different truthy values from backends

4 weeks ago[Minor] Fuzzy TCP: enable TCP_NODELAY for reduced latency
Vsevolod Stakhov [Wed, 8 Oct 2025 09:54:56 +0000 (10:54 +0100)] 
[Minor] Fuzzy TCP: enable TCP_NODELAY for reduced latency

Disables Nagle's algorithm on fuzzy TCP connections to minimize latency
for request-response traffic patterns. This prevents small packets from
being buffered, which is optimal for the fuzzy check protocol.

4 weeks ago[Fix] Fuzzy TCP: refresh timeout during active data transfer
Vsevolod Stakhov [Wed, 8 Oct 2025 09:50:24 +0000 (10:50 +0100)] 
[Fix] Fuzzy TCP: refresh timeout during active data transfer

Prevents active TCP connections from timing out when data is being actively transferred.
The timeout is now refreshed after each successful read/write operation, ensuring that
connections only timeout during actual inactivity, not during normal traffic flow.

4 weeks ago[Fix] Fuzzy TCP: separate session timeouts from connection failures
Vsevolod Stakhov [Wed, 8 Oct 2025 09:45:04 +0000 (10:45 +0100)] 
[Fix] Fuzzy TCP: separate session timeouts from connection failures

This addresses several timeout handling issues:
- Session timeouts no longer mark entire TCP connection as failed, allowing other sessions to continue
- Made tcp_retry_delay configurable (default: 10.0s)
- Added diagnostic reason strings to all cleanup paths
- Fixed reference counting with proper free_func for connection pool
- Added periodic timeout checks to detect stalled requests
- Unconditional timer cleanup (ev_timer_stop is safe to call)
- Enhanced logging with connection state and elapsed time details

4 weeks ago[Minor] Fix UDP fallback path to use proper upstream rotation
Vsevolod Stakhov [Wed, 8 Oct 2025 08:13:15 +0000 (09:13 +0100)] 
[Minor] Fix UDP fallback path to use proper upstream rotation

4 weeks ago[Fix] Fix TCP framing protocol endianness mismatch
Vsevolod Stakhov [Wed, 8 Oct 2025 08:10:09 +0000 (09:10 +0100)] 
[Fix] Fix TCP framing protocol endianness mismatch

The TCP framing protocol had an endianness mismatch for the 2-byte frame size header. The client was sending and expecting frame lengths in little-endian, while the server was sending and expecting them in network byte order (big-endian). This inconsistency corrupted frame lengths, leading to protocol errors and communication failures.

Changes:
* Server now uses GUINT16_TO_LE() instead of htons() for frame length encoding
* Server now uses GUINT16_FROM_LE() instead of ntohs() for frame length reading
* Server frame length parsing now reconstructs little-endian format
* Updated comment to reflect little-endian byte order consistency

All TCP frame lengths are now consistently transferred as little-endian numbers.

4 weeks agoMerge pull request #5663 from rspamd/cursor/RSP-246-parse-esmtp-arguments-for-lua...
Vsevolod Stakhov [Tue, 7 Oct 2025 20:41:35 +0000 (21:41 +0100)] 
Merge pull request #5663 from rspamd/cursor/RSP-246-parse-esmtp-arguments-for-lua-api-2fa5

Parse esmtp arguments for lua api

4 weeks ago[Minor] Address review comments
Vsevolod Stakhov [Tue, 7 Oct 2025 20:24:16 +0000 (21:24 +0100)] 
[Minor] Address review comments

4 weeks ago[Test] Remove redundant document
Vsevolod Stakhov [Tue, 7 Oct 2025 19:23:51 +0000 (20:23 +0100)] 
[Test] Remove redundant document

4 weeks ago[Test] Fix write-only fuzzy test expectations
Vsevolod Stakhov [Tue, 7 Oct 2025 19:10:35 +0000 (20:10 +0100)] 
[Test] Fix write-only fuzzy test expectations

The write-only mode test was failing because after fixing the
variable name (RSPAMD_SETTINGS_FUZZY_CHECK), the mode was correctly
applied to the client. In write-only mode, clients do not send
CHECK requests, so symbols should not appear during scanning.

The test was incorrectly expecting symbols to be found after adding
hashes. Changed test to verify correct write-only behavior:
- Hashes can be added via controller
- Scanning does not find symbols (CHECK not sent in write-only)
- Random messages still don't match

This validates that write-only mode prevents fuzzy checks while
allowing hash updates.

4 weeks ago[Fix] Fuzzy TCP: fix server replies and client event handling
Vsevolod Stakhov [Tue, 7 Oct 2025 18:20:03 +0000 (19:20 +0100)] 
[Fix] Fuzzy TCP: fix server replies and client event handling

Server was accepting TCP connections but never sending replies back,
causing all TCP requests to timeout. The issue had multiple causes:

Server side:
- TCP replies were routed through UDP code path, which doesn't queue
  replies for TCP sessions
- Async backend operations used stack-allocated session, causing
  segfaults when callback executed after stack frame destroyed

Client side:
- Event handler used equality checks (==) instead of bitwise (&)
  for libev event flags, preventing read events from being processed
- Timer initialization used rspamd IO wrapper for pure timer,
  causing fd=-1 assertion failures in ev_io_start
- Pending requests not cleaned up on timeout, causing use-after-free
  when late replies arrived after task completion

Fix by implementing TCP reply queue on server, using heap allocation
for async operations with proper reference counting, fixing event
handling to use bitwise operators, and implementing pure libev timer
for TCP timeout handling.

4 weeks agoMerge branch 'master' into vstakhov-fuzzy-tcp-rework
Vsevolod Stakhov [Tue, 7 Oct 2025 13:58:40 +0000 (14:58 +0100)] 
Merge branch 'master' into vstakhov-fuzzy-tcp-rework

4 weeks ago[Fix] Fix memory management issues in html_cta.process_html_links
Vsevolod Stakhov [Tue, 7 Oct 2025 13:58:02 +0000 (14:58 +0100)] 
[Fix] Fix memory management issues in html_cta.process_html_links

4 weeks ago[Fix] Fuzzy TCP: fix printf formats, buffer overflow, and timeout handling
Vsevolod Stakhov [Tue, 7 Oct 2025 13:53:16 +0000 (14:53 +0100)] 
[Fix] Fuzzy TCP: fix printf formats, buffer overflow, and timeout handling

- Fix printf format strings: use %ud instead of %u (rspamd printf requirement)
- Fix TCP write handler buffer overflow when writing frame header
  (ASAN error: remaining was calculated incorrectly)
- Fix timeout handling: mark commands as replied and check session completion
  to prevent task hanging on connection/request timeouts
- Fix Robot Framework test variables: add RSPAMD_ prefix for proper export
- Remove debug config dump

4 weeks ago[Feature] Fuzzy check: add protocol logging and TCP tests
Vsevolod Stakhov [Tue, 7 Oct 2025 12:22:50 +0000 (13:22 +0100)] 
[Feature] Fuzzy check: add protocol logging and TCP tests

Add explicit protocol logging:
- Log TCP vs UDP decision with rate and threshold
- Log actual protocol used for each request
- Log TCP connection status and fallbacks
- Shows current request rate for TCP auto-switch

Add functional tests for TCP:
- tcp.robot - basic TCP with auto-switch
- tcp-explicit.robot - forced TCP mode
- tcp-encrypted.robot - TCP with encryption
- Test high rate scenario and protocol switching

Update test configuration:
- Support SETTINGS_FUZZY_WORKER and SETTINGS_FUZZY_CHECK
- Allow dynamic TCP configuration in tests

4 weeks ago[Feature] Fuzzy check: add reply processing and lifecycle management
Vsevolod Stakhov [Tue, 7 Oct 2025 12:00:58 +0000 (13:00 +0100)] 
[Feature] Fuzzy check: add reply processing and lifecycle management

Complete TCP reply handling:
- Process all error codes (403, 503, 415, 401) like UDP
- Handle FUZZY_STAT commands with proper storage
- Mark commands as replied and check session completion

Add memory safety and lifecycle management:
- Cleanup pending requests when task finishes before reply
- Timeout checking for pending requests (io_timeout)
- Proper session cleanup for TCP (no fd/ev_watcher)
- Initialize TCP session fields (fd=-1, event_loop)

Prevents use-after-free when:
- Task completes before TCP reply arrives
- Reply takes too long (timeout)
- Connection fails with pending requests

4 weeks ago[Feature] Fuzzy check: implement TCP error handling and command sending
Vsevolod Stakhov [Tue, 7 Oct 2025 11:20:10 +0000 (12:20 +0100)] 
[Feature] Fuzzy check: implement TCP error handling and command sending

Add comprehensive error handling for TCP connections:
- Cleanup pending requests when connections fail
- Handle timeout, write, read, and protocol errors
- Track connection per pending command for cleanup

Implement TCP command sending:
- Add TCP framing to encrypted commands
- Queue commands for asynchronous sending
- Register in pending pool for reply matching
- Integrate with main check flow with UDP fallback

4 weeks ago[Feature] Fuzzy check: implement TCP connection management
Vsevolod Stakhov [Tue, 7 Oct 2025 08:19:40 +0000 (09:19 +0100)] 
[Feature] Fuzzy check: implement TCP connection management

Add async TCP connection establishment and I/O framework. This
implements Phase 2 of the TCP support - connection management with
event-driven architecture.

Changes:
- Add fuzzy_tcp_connection structure for per-rule TCP state
- Add fuzzy_tcp_pending_command for request/reply matching
- Implement fuzzy_tcp_connect_async() with non-blocking connect
- Implement fuzzy_tcp_io_handler() for connection/read/write events
- Add connection lifecycle management with reference counting
- Handle connection establishment with getsockopt SO_ERROR check
- Add timeout handling and upstream failure reporting
- Add placeholder write and read handlers for next phase

TCP connection is established lazily when rate threshold is exceeded.
Event handler manages connection state machine: connecting -> connected.
Write/read handlers will be implemented in Phase 3.

4 weeks ago[Feature] Fuzzy check: add TCP support with auto-switch
Vsevolod Stakhov [Tue, 7 Oct 2025 07:57:04 +0000 (08:57 +0100)] 
[Feature] Fuzzy check: add TCP support with auto-switch

Add TCP protocol support to fuzzy check client with rate-based
automatic switching between UDP and TCP transports. This enables
efficient bulk checking while maintaining UDP fallback.

Changes:
- Add TCP configuration parameters (enabled, auto, threshold, window, timeout)
- Implement sliding window rate tracker for request frequency monitoring
- Add TCP connection state tracking (connected, connecting)
- Implement fuzzy_should_use_tcp() decision logic
- Add fuzzy_update_rate_tracker() for rate tracking
- Add fuzzy_tcp_connect_async() placeholder for lazy TCP connection
- Integrate TCP/UDP selection in register_fuzzy_client_call()

Configuration:
  tcp = true;  # Enable TCP explicitly
  tcp = {      # Auto-switch configuration
    auto = true;
    threshold = 1.0;  # req/sec threshold
    window = 1.0;     # time window in seconds
  };

TCP connections are established lazily when rate threshold is exceeded.
Falls back to UDP if TCP is not available.

4 weeks ago[Feature] Fuzzy storage: implement TCP protocol support
Vsevolod Stakhov [Tue, 7 Oct 2025 07:56:32 +0000 (08:56 +0100)] 
[Feature] Fuzzy storage: implement TCP protocol support

Implement TCP transport for fuzzy storage protocol to enable efficient
bulk request handling. This adds TCP accept handlers, frame-based I/O
processing, and proper session management.

Changes:
- Add TCP session structure with framing state machine
- Implement TCP accept handler with rate limiting and access control
- Add TCP I/O handler supporting frame-based protocol (size header + payload)
- Implement TCP write reply with queuing support
- Add TCP timeout configuration parameter (default: 5.0 seconds)
- Refactor rate limit checks to accept parameters instead of session objects
- Update worker socket type to support both UDP and TCP
- Add debug logging infrastructure for fuzzy storage

TCP framing protocol: [uint16_t size][encrypted_payload]
Frame processing uses state machine: 0x0000 (idle) -> 0x8000 (have size) -> 0xC000 (complete)

4 weeks agoMerge pull request #5668 from rspamd/vstakhov-lua-logger-imps
Vsevolod Stakhov [Mon, 6 Oct 2025 13:44:38 +0000 (14:44 +0100)] 
Merge pull request #5668 from rspamd/vstakhov-lua-logger-imps

[Feature] Add type specifiers support to lua_logger

4 weeks agoMerge pull request #5666 from moisseev/webui
Vsevolod Stakhov [Mon, 6 Oct 2025 13:30:56 +0000 (14:30 +0100)] 
Merge pull request #5666 from moisseev/webui

[Fix] WebUI: repopulate classifier dropdown

4 weeks ago[Feature] Add type specifiers support to lua_logger 5668/head
Vsevolod Stakhov [Mon, 6 Oct 2025 13:22:26 +0000 (14:22 +0100)] 
[Feature] Add type specifiers support to lua_logger

Add support for format type specifiers in lua_logger:
- %d - signed integer (int64)
- %ud - unsigned integer (uint64)
- %f - floating point with smart formatting (no trailing zeros)
- %.Nf - floating point with N decimal places precision
- %% - escape literal percent sign

Type specifiers can be combined with positional (%1d) and
sequential (%d) argument references. String to number conversion
is supported. Added comprehensive unit tests.

4 weeks ago[Minor] WebUI: keep classifiers list when request is skipped 5666/head
Alexander Moisseev [Mon, 6 Oct 2025 12:39:26 +0000 (15:39 +0300)] 
[Minor] WebUI: keep classifiers list when request is skipped

4 weeks ago[Rework] Use postconf utility for Postfix configuration in configwizard
Vsevolod Stakhov [Mon, 6 Oct 2025 12:27:28 +0000 (13:27 +0100)] 
[Rework] Use postconf utility for Postfix configuration in configwizard

Replace direct file reading with postconf calls for better portability:
- Use postconf to get config_directory, alias_maps, virtual_alias_maps
- Use postconf to get mydestination instead of parsing main.cf
- Use postconf to check milter configuration (smtpd_milters, non_smtpd_milters)
- Add proper parsing of postconf output (handle prefixes like "hash:")
- Improve cross-platform compatibility by relying on Postfix's own tools

This approach is more portable and handles Postfix variables ($myhostname, etc.) correctly.

4 weeks agoMerge branch 'master' into vstakhov-aliases-rewamp
Vsevolod Stakhov [Mon, 6 Oct 2025 11:56:30 +0000 (12:56 +0100)] 
Merge branch 'master' into vstakhov-aliases-rewamp

4 weeks agoMerge pull request #5667 from rspamd/vstakhov-agents-improvements
Vsevolod Stakhov [Mon, 6 Oct 2025 11:39:55 +0000 (12:39 +0100)] 
Merge pull request #5667 from rspamd/vstakhov-agents-improvements

[Minor] Add Claude Code and Cursor AI assistant configuration

4 weeks ago[Project] Add Claude Code and Cursor AI assistant configuration 5667/head
Vsevolod Stakhov [Mon, 6 Oct 2025 11:34:07 +0000 (12:34 +0100)] 
[Project] Add Claude Code and Cursor AI assistant configuration

Add comprehensive configuration for AI development assistants:

.claude/ - Claude Code configuration:
- project_context.md: Project rules, code style, commit format, build system
- commands/: Custom slash commands for development workflow
  - build, test, build-and-test: Build and testing commands
  - check-code, format-code, test-lua: Code quality commands
  - prepare-commit, review-pr, create-release: Git workflow commands
- README.md: Documentation for all commands and features

.cursor/rules/ - Cursor rules:
- build-and-test.mdc: Build system and testing workflow documentation

Features:
- Automated code quality checks (luacheck, clang-format)
- Build system integration (ninja in ~/rspamd.build)
- Unit test execution (C/C++ and Lua tests)
- Commit message validation and formatting
- PR review assistance
- Release process automation

This enables AI assistants to follow Rspamd development practices
and automate common development tasks.

4 weeks ago[Feature] Add Postfix integration wizard to configwizard
Vsevolod Stakhov [Mon, 6 Oct 2025 11:23:14 +0000 (12:23 +0100)] 
[Feature] Add Postfix integration wizard to configwizard

Add setup_postfix() function to rspamadm configwizard that provides
guided configuration for Postfix mail server integration:

- Auto-detect Postfix configuration files (main.cf, master.cf)
- Parse mydestination for local domains
- Configure aliases module (system_aliases, virtual_aliases, local_domains)
- Check and provide instructions for milter integration
- Optional rate limiting and ARC signing configuration

Usage: rspamadm configwizard postfix

4 weeks ago[Fix] aliases: correct to_local when no recipients present
Vsevolod Stakhov [Mon, 6 Oct 2025 10:27:43 +0000 (11:27 +0100)] 
[Fix] aliases: correct to_local when no recipients present

4 weeks ago[Fix] WebUI: repopulate classifier dropdown
Alexander Moisseev [Mon, 6 Oct 2025 06:45:23 +0000 (09:45 +0300)] 
[Fix] WebUI: repopulate classifier dropdown

after reconnect from read-only

Ensure classifiers are fetched when the dropdown is empty even if cache suggests skipping,
preventing an empty selector on Scan tab after RO → Disconnect → Enable.

4 weeks ago[Minor] Remove unused constant 5663/head
Vsevolod Stakhov [Mon, 6 Oct 2025 10:03:19 +0000 (11:03 +0100)] 
[Minor] Remove unused constant

4 weeks ago[Minor] Remove unused variables after Lua ESMTP args rework
Vsevolod Stakhov [Mon, 6 Oct 2025 09:59:54 +0000 (10:59 +0100)] 
[Minor] Remove unused variables after Lua ESMTP args rework

4 weeks ago[Test] Add e2e for classifier dropdown population
Alexander Moisseev [Sun, 5 Oct 2025 17:08:30 +0000 (20:08 +0300)] 
[Test] Add e2e for classifier dropdown population

after RO → Disconnect → Enable

4 weeks ago[Rework] Remove Lua-level HTTP header parsing in ESMTP args getters; rely solely...
Vsevolod Stakhov [Mon, 6 Oct 2025 09:50:04 +0000 (10:50 +0100)] 
[Rework] Remove Lua-level HTTP header parsing in ESMTP args getters; rely solely on protocol layer to populate task fields