Commit Graph

780 Commits

Author SHA1 Message Date
Mike Hillyer 080b38d9ad Add a warning to the webhooks helper about proper positioning of the log hooks and queue helper calls. 2024-04-16 14:57:09 -04:00
Wez Furlong e0326e4c39 queue: make bounce_all do spool removal async
I think we've gone back and forth on this a couple of times.
The motivation for this commit is that we've been troubleshooting
an issue that seems to be triggered by bouncing all the mail.
The symptom is that the system becomes unresponsive after
triggering the bounce.

Here in the context of `bounce_all`, the queue lock is held
so that we can capture the messages, but then we serially
remove them from the spool, so that we can report the total
number back to the originating HTTP request.

For a large queue size that presents a big point of contention
for other tasks or requests that may need to operate on the
queue.

This commit moves that spool removal into another task so that
that task can run asynchronously and independently from the
bounce HTTP request.

The consequence of this is that the numbers reported by the
bounce request will likely be lower than the final count.
The `bounce-list` kcli command can be used to check up on
those numbers.
2024-04-10 08:10:03 -07:00
Wez Furlong 0a831f60de mta-sts: reduce scope of cache lock
We've been troubleshooting a lockup on a system with a low core count.
What we found in a stack trace was that one of the threads was blocking
on the CACHE mutex in the sts logic.  That mutex is intended to be
short-duration in scope, managing the direct lookup or insertion
into the cache, and no more.

However, due to the the way that rust scopes the lifetime of the
MutexGuard that is acquired from the CACHE, we were holding it
across the async DNS operation that is used to validate that
a cached policy is still current.

This can result in a deadlock on a system with a sufficiently
low core count/high enough concurrent volume of traffic to sites
with MTA-STS enabled.

This commit resolves this by introducing a lookup function that
explicitly clones the cached policy without returning a MutexGuard.
2024-04-10 07:23:03 -07:00
Wez Furlong e81a5fb6ca fix: msg:set_scheduling didn't immediately recompute due time 2024-04-09 14:34:38 -07:00
Mike Hillyer d282ac61ac Documenting Add support for Routing_Domain in the Queues helper. #141 2024-04-08 13:17:17 -04:00
Mike Hillyer c3cf0d4666 Update shaping based on Comcast documents, add stack trace information to the documentation. 2024-04-03 10:08:43 -04:00
Wez Furlong 898ed52410 add msg:append_text_html and msg:append_text_html
These can be used to insert tracking pixels/links.

closes: https://github.com/KumoCorp/kumomta/issues/120
2024-03-31 14:04:46 -07:00
Wez Furlong 1fb712e2bf Add msg:set_data()
This method allows replacing the message payload arbitrarily.
This is a building block for more advanced and convenient
modification operations.

refs: https://github.com/KumoCorp/kumomta/issues/117
refs: https://github.com/KumoCorp/kumomta/issues/120
2024-03-31 06:57:59 -07:00
Wez Furlong edc56226f7 docs: always pull upstream mkdocs 2024-03-31 06:49:14 -07:00
Wez Furlong e94506fd96 Add new Rejection log event
We skip logging the 421 we generate while shutting down because
it feels a bit redundant; you'll see the server shutting down
in the journal anyway.

refs: https://github.com/KumoCorp/kumomta/issues/88
2024-03-29 16:37:37 -07:00
Wez Furlong 3207c45f3d expose inject_v1 API via lua
closes: https://github.com/KumoCorp/kumomta/issues/102
2024-03-29 09:06:54 -07:00
Wez Furlong 755eb848e2 add glob, read_dir
closes: https://github.com/KumoCorp/kumomta/issues/161
2024-03-29 08:25:51 -07:00
Wez Furlong 0c5794ba31 TSA: Add SuspendTenant, SuspendCampaign
refs: https://github.com/KumoCorp/kumomta/issues/113
2024-03-28 13:08:45 -07:00
Wez Furlong e41b4297ea tsa: hook up websocket suspension stream
This commit connects the new websocket based suspension feed
up to shaping.lua. This allows ready-q suspensions to be
enacted in realtime, as well as sets things up to support
scheduled queue suspensions in a later commit.

refs: https://github.com/KumoCorp/kumomta/issues/113
2024-03-28 07:14:36 -07:00
Wez Furlong 39de0e33a6 Expose suspension API to lua
This is very similar to the HTTP suspension API, with the
difference that the suspend method returns just the uuid rather
than the entire suspension object.

refs: https://github.com/KumoCorp/kumomta/issues/113
2024-03-28 07:14:35 -07:00
Wez Furlong be80391239 add kumo.http.connect_websocket
refs: https://github.com/KumoCorp/kumomta/issues/113
2024-03-28 07:14:35 -07:00
Wez Furlong 6003976a10 new: kumo.spawn_task function
This function will spawn a new thread that runs a tokio
localset, which in turn will trigger the specified event
and run it.

On it's own it doesn't do a lot, but it provides a way
to perform background tasks in lua.

```lua
kumo.on('init', function()
  kumo.spawn_task {
    event_name = 'my.task',
    args = { 'hello', 'there' },
  }
end)

kumo.on('my.task', function(args)
  -- Prints: `I am the task.  ["hello","there"]`
  print('I am the task.', kumo.json_encode(args))
end)
```
2024-03-28 07:14:35 -07:00
Wez Furlong 889cd8223a fix smtp client idle behavior
The intent of the idle behavior is to linger for up to the configured
idle_timeout value, waiting for new messages to arrive in the ready
queue.

The actual behavior was to initiate a wait, but when woken up,
if there were no messages in the ready queue, the connection
would close out, even if there was still time that could be
waited out before the idle period was up.

This commit adds in a loop that will keep the connection open
until the idle timeout is reached, which in turn will improve
throughput, especially if the traffic is a little bursty.
2024-03-27 16:33:18 -07:00
Wez Furlong abd030cc2c docs: changelog for #157
refs: #157
2024-03-25 14:56:41 -07:00
Wez Furlong f54922b9f0 strip enhanced status code from multi-line responses
Previously we would only remove it from the first line.  This commit
removes it from the second and subseqent lines as well.

The bulk of this commit was a little bit of refactoring to favilitate
testing this change.

refs: #157
2024-03-25 11:55:52 -07:00
Wez Furlong f6f8c55ea4 listener_domains: fix fallback issue
This commit refactors listener_domains.lua to facilitate unit testing
and adds a couple of basic test cases.

The functional change here is that we were missing an explicit
fallback step in the case where no listener or domain matches
the provided values directly; we need to explicitly add a check
against the `*` listener AND `*` domain for the final step.
Previously, we would only look at the `*` listener for the final
step.

closes: #128
2024-03-22 09:48:18 -07:00
Wez Furlong a209a470ff docs: clarify how to access headers in logging templates 2024-03-22 08:08:14 -07:00
Wez Furlong c44d7feee7 docs: changelog for #155 2024-03-20 08:27:46 -07:00
Wez Furlong cb94ad00b0 docs: fix link 2024-03-17 09:36:16 -07:00
Wez Furlong 5596d7cf99 http_listener: allow configuring max request size 2024-03-17 09:35:02 -07:00
Wez Furlong 5063a4671b docs: format generate-toc.py 2024-03-17 07:24:34 -07:00
Tom Mairs d961be87bf Update KumoProxy install instructions 2024-03-15 16:51:35 -06:00
Tom Mairs d285a7f71a Update timeout defaults 2024-03-15 15:18:06 -06:00
Mike Hillyer dbb27a6037 Fixing relative URLs. 2024-03-15 16:39:54 -04:00
Mike Hillyer 37efa0e500 Correct link paths and spelling. 2024-03-15 16:32:20 -04:00
Wez Furlong 5a1999a1b1 Add kumo.make_throttle and throttle_insert_ready_queue event
These allow performing arbitrary rate limiting operations
at both reception time and when messages are moved from the
scheduled queue and into the ready queue.

refs:  https://github.com/KumoCorp/kumomta/issues/149
2024-03-15 12:21:57 -07:00
Tom Mairs 18b0520ca8 typo correction 2024-03-15 13:15:46 -06:00
Tom Mairs 7a7919a9f5 fix URLS 2024-03-15 12:54:02 -06:00
Tom Mairs 5e15003493 spelling corrections 2024-03-15 12:50:56 -06:00
Tom Mairs c48f7f6183 Add sbin utilities 2024-03-15 12:42:59 -06:00
Wez Furlong a8b61ce59e proxy-server: fix missing bind(2) call
Somewhat embarrasing really
2024-03-14 17:51:58 -07:00
Mike Hillyer 5359ec11a9 Adding a link to the page on How to read logs on the troubleshooting page. 2024-03-14 09:49:51 -04:00
Mike Hillyer 35c368b72e Add references to the validate-shaping utility to the userguide. 2024-03-11 15:41:16 -04:00
Tom Mairs 28bd066c9c Add reference for /opt/kumomta/sbin/validate-shaping 2024-03-09 16:25:38 -07:00
Wez Furlong a16a886f0e add requeue_message event
In the end I decided to implicitly make the message due for immediate
delivery in the case where the queue was changed; I couldn't think
of a good reason not to do that, and it simplifies the implementation
both of the event internals for anyone implementing the event
themselves in their lua policy.

refs: https://github.com/KumoCorp/kumomta/issues/149
2024-03-08 13:35:06 -07:00
Wez Furlong 33c7557afb msg: add num_attempts, set_due and queue_name methods
refs: https://github.com/KumoCorp/kumomta/issues/149
2024-03-08 13:35:03 -07:00
Mike Hillyer 9bd6e3d37f Changelog entry for new max_message_rate option. 2024-03-07 17:07:49 -05:00
Wez Furlong 8c43dfe209 add scheduled queue max_message_rate throttle
Needs testing, but I think this will do the job at the raw configuration
level. TSA support for adjusting this setting is a bigger endeavor and
is not included in this commit.

refs: https://github.com/KumoCorp/kumomta/issues/143
2024-03-07 11:00:18 -07:00
Wez Furlong 0d61040815 fix: OOB didn't respect headers and meta config from logger 2024-03-04 13:07:05 -07:00
Wez Furlong aa46113dee mailparsing: improve handling of bad messages
We had a user report problems with an incoming OOB message.
The issue was that `msg:from_header()` would raise an error
because one of the MIME parts in the incoming message had
8-bit data and didn't apply transfer encoding on the offending
part.

It's actually a bit deeper than just missing transfer encoding;
the issue was really that Spam Assassin was employed on the
remote system and it generated an `X-Ham-Report` header that
embedded 8-bit data (looks mostly UTF-8, but had an invalid byte)
in that header without applying RFC2047 header encoding.

```
X-Ham-Report: Spam detection software, running on the system "example.com",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 root\@localhost for details.
 Content preview:  <unencoded binary data here>
```

In the resultant rfc3464 delivery status report, the original
message payload is included as a message/rfc822 part in the body.
So to our parser this looks like a badly encoded body (which it is),
but only because the header in that part was badly encoded.

So this is a double-fail; the Spam Assassin header content
preview logic is generating a non-conforming header, and Exim's
DSN generation at the offending site is generating a non-conforming
message payload.

What this commit does is:

* Adds an `IntoSharedString` trait to encapsulate the conversion
  from String, str or bytes into SharedString.  Previously we
  used a fallible conversion for this, but now this conversion is
  infallible but returns a MessageConformance value. Internally,
  if the data is not UTF-8, we fall back to the lossy conversion
  and flag the part as needing transfer encoding.
* That will allow the parser to return something, even if it is
  slightly mangled by the unicode replacement character. This
  mangling is not a bug: it's a case of "garbage-in, garbage-out".
* This change allows check_fix_conformance to report
  NEEDS_TRANSFER_ENCODING when run in check mode. When run in fix
  mode, the offending part, *including the replacement character*
  will have transfer encoding applied to it. We can't "do better"
  here because the input message is bogus and is missing proper
  transfer encoding.
* Fixes an issue where whitespace from this fixed part was stripped
  out. I'm not sure why whitespace was being stripped; no unit
  tests fail as a result of this change, so it must be good?
2024-02-28 09:56:27 -07:00
Wez Furlong 5bf3d4f3e0 docs: apply proper lua formatting to kafka docs 2024-02-28 09:41:20 -07:00
Wez Furlong f63d352816 update rocksdb and nix versions
closes: https://github.com/KumoCorp/kumomta/pull/145
2024-02-24 10:24:03 -07:00
Wez Furlong c637d200c8 fix: OOB and ARF reports were not logged correctly
As best as I can tell, this is a casualty of a last moment
code format/copy-pasta.  All of the logic works correctly,
but the Reception log record didn't include the relay
disposition so the log_oob or log_arf flag didn't make it
to the logging layer.
2024-02-24 09:20:36 -07:00
Wez Furlong 949f0a6625 code formatting 2024-02-24 09:18:23 -07:00
Mike Hillyer d58a888864 Typo fix for Usage of removed call in Docs #140 2024-02-23 18:01:01 -05:00