# HG changeset patch
# User Kim Alvefur <zash@zash.se>
# Date 1701544805 -3600
# Node ID f70311588c778c5a1ebc697aaf0b95b6c3bd79f9
# Parent  b7dc45d704fa45e89efd8a69bc7717793c3d5db7
mod_s2s: Close connection on smacks timeout

This merges the mod_s2s_smacks_timeout behavior from prosody-modules

This event is fired by mod_smacks when the connection has not responded
to an ack-request for a period of time defaulting to 30 seconds,
indicating that the connection has become stuck or non-responsive.
Closing it prevents routing further messages via this connection and
frees resources. A stuck connection may otherwise remain until for a
time determined by the OS TCP subsystem, which can be quite long.

diff -r b7dc45d704fa -r f70311588c77 CHANGES
--- a/CHANGES	Fri Dec 01 23:43:18 2023 +0100
+++ b/CHANGES	Sat Dec 02 20:20:05 2023 +0100
@@ -55,6 +55,7 @@
 - Forwarded header from RFC 7239 supported, disabled by default
 - mod_http_file_share now uses roles framework, affecting access from e.g. components
 - Intervals of mod_cron managed periodic jobs made configurable
+- When mod_smacks is enabled, s2s connections not responding to ack requests are closed.
 
 ## Removed
 
diff -r b7dc45d704fa -r f70311588c77 plugins/mod_s2s.lua
--- a/plugins/mod_s2s.lua	Fri Dec 01 23:43:18 2023 +0100
+++ b/plugins/mod_s2s.lua	Sat Dec 02 20:20:05 2023 +0100
@@ -272,6 +272,12 @@
 	end, 100);
 	module:hook("s2s-authenticated", make_authenticated, -1);
 	module:hook("s2s-read-timeout", keepalive, -1);
+	module:hook("smacks-ack-delayed", function (event)
+		if event.origin.type == "s2sin" or event.origin.type == "s2sout" then
+			event.origin:close("connection-timeout");
+			return true;
+		end
+	end, -1);
 	module:hook_stanza("http://etherx.jabber.org/streams", "features", function (session, stanza) -- luacheck: ignore 212/stanza
 		local limits = stanza:get_child("limits", "urn:xmpp:stream-limits:0");
 		if limits then