plugins/mod_smacks.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 07 Oct 2022 11:35:56 +0100
changeset 12749 2cbf0e9314ff
parent 12743 0dc80024fdd2
child 12804 06ba2f8cee47
permissions -rw-r--r--
mod_smacks: Change boolean attribute from '1' to 'true' for compatibility Conversations 2.10.10 and earlier expect this to be literally 'true' and don't recognise '1'. This leads to it not attempting resumption with Prosody at all since this change was introduced in 36ba170c4fd0. Thanks to Zash for noticing, debugging and diagnosing this issue. This issue is fixed in Conversations commit 052c58f3 (unreleased at the time of writing).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- XEP-0198: Stream Management for Prosody IM
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- Copyright (C) 2010-2015 Matthew Wild
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- Copyright (C) 2010 Waqas Hussain
12475
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
     5
-- Copyright (C) 2012-2022 Kim Alvefur
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- Copyright (C) 2012 Thijs Alkemade
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
-- Copyright (C) 2014 Florian Zeitz
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
-- Copyright (C) 2016-2020 Thilo Molitor
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
--
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
-- This project is MIT/X11 licensed. Please see the
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
-- COPYING file in the source package for more information.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
--
12475
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
    13
-- TODO unify sendq and smqueue
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    15
local tonumber = tonumber;
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    16
local tostring = tostring;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
local os_time = os.time;
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    18
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    19
-- These metrics together allow to calculate an instantaneous
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    20
-- "unacked stanzas" metric in the graphing frontend, without us having to
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    21
-- iterate over all the queues.
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    22
local tx_queued_stanzas = module:measure("tx_queued_stanzas", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    23
local tx_dropped_stanzas =  module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    24
	"histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    25
	"tx_dropped_stanzas", "", "number of stanzas in a queue which got dropped",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    26
	{},
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    27
	{buckets = {0, 1, 2, 4, 8, 16, 32}}
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    28
):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    29
local tx_acked_stanzas = module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    30
	"histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    31
	"tx_acked_stanzas", "", "number of items acked per ack received",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    32
	{},
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    33
	{buckets = {0, 1, 2, 4, 8, 16, 32}}
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    34
):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    35
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    36
-- number of session resumptions attempts where the session had expired
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    37
local resumption_expired = module:measure("session_resumption_expired", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    38
local resumption_age = module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    39
	"histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    40
	"resumption_age", "seconds", "time the session had been hibernating at the time of a resumption",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    41
	{},
12276
fe0f5c47fda3 mod_smacks: Tweak resumption age buckets towards multiples of 60
Kim Alvefur <zash@zash.se>
parents: 12141
diff changeset
    42
	{buckets = { 0, 1, 2, 5, 10, 30, 60, 120, 300, 600 }}
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    43
):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    44
local sessions_expired = module:measure("sessions_expired", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    45
local sessions_started = module:measure("sessions_started", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    46
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
    47
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    48
local datetime = require "util.datetime";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
local add_filter = require "util.filters".add_filter;
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    50
local jid = require "util.jid";
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    51
local smqueue = require "util.smqueue";
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    52
local st = require "util.stanza";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
local timer = require "util.timer";
12116
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12085
diff changeset
    54
local new_id = require "util.id".short;
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
    55
local watchdog = require "util.watchdog";
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
    56
local it = require"util.iterators";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    58
local sessionmanager = require "core.sessionmanager";
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    59
12743
0dc80024fdd2 Backed out changeset 1bc2220cd6ec
Jonas Schäfer <jonas@wielicki.name>
parents: 12724
diff changeset
    60
local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas";
11985
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11984
diff changeset
    61
local xmlns_delay = "urn:xmpp:delay";
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
local xmlns_mam2 = "urn:xmpp:mam:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
local xmlns_sm2 = "urn:xmpp:sm:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
local xmlns_sm3 = "urn:xmpp:sm:3";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
local sm2_attr = { xmlns = xmlns_sm2 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
local sm3_attr = { xmlns = xmlns_sm3 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
    69
local queue_size = module:get_option_number("smacks_max_queue_size", 500);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
local resume_timeout = module:get_option_number("smacks_hibernation_time", 600);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", true);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
local max_inactive_unacked_stanzas = module:get_option_number("smacks_max_inactive_unacked_stanzas", 256);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 30);
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
    76
local max_old_sessions = module:get_option_number("smacks_max_old_sessions", 10);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
local c2s_sessions = module:shared("/*/c2s/sessions");
12067
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12066
diff changeset
    79
local local_sessions = prosody.hosts[module.host].sessions;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
    81
local function format_h(h) if h then return string.format("%d", h) end end
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
    82
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
    83
local all_old_sessions = module:open_store("smacks_h");
12055
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
    84
local old_session_registry = module:open_store("smacks_h", "map");
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
    85
local session_registry = module:shared "/*/smacks/resumption-tokens"; -- > user@host/resumption-token --> resource
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
12522
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    87
local function track_session(session, id)
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    88
	session_registry[jid.join(session.username, session.host, id or session.resumption_token)] = session;
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    89
	session.resumption_token = id;
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    90
end
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    91
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    92
local function save_old_session(session)
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    93
	session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil;
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    94
	return old_session_registry:set(session.username, session.resumption_token,
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    95
		{ h = session.handled_stanza_count; t = os.time() })
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    96
end
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    97
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    98
local function clear_old_session(session, id)
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
    99
	session_registry[jid.join(session.username, session.host, id or session.resumption_token)] = nil;
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   100
	return old_session_registry:set(session.username, id or session.resumption_token, nil)
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   101
end
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   102
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   103
local ack_errors = require"util.error".init("mod_smacks", xmlns_sm3, {
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   104
	head = { condition = "undefined-condition"; text = "Client acknowledged more stanzas than sent by server" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   105
	tail = { condition = "undefined-condition"; text = "Client acknowledged less stanzas than already acknowledged" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   106
	pop = { condition = "internal-server-error"; text = "Something went wrong with Stream Management" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   107
	overflow = { condition = "resource-constraint", text = "Too many unacked stanzas remaining, session can't be resumed" }
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   108
});
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   109
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   110
local enable_errors = require "util.error".init("mod_smacks", xmlns_sm3, {
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   111
	already_enabled = { condition = "unexpected-request", text = "Stream management is already enabled" };
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   112
	bind_required = { condition = "unexpected-request", text = "Client must bind a resource before enabling stream management" };
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   113
	unavailable = { condition = "service-unavailable", text = "Stream management is not available for this stream" };
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   114
	-- Resumption
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   115
	expired = { condition = "item-not-found", text = "Session expired, and cannot be resumed" };
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   116
	already_bound = { condition = "unexpected-request", text = "Cannot resume another session after a resource is bound" };
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   117
	unknown_session = { condition = "item-not-found", text = "Unknown session" };
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   118
});
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   119
12080
ad1fe36eaae7 mod_smacks: Fix typo (thanks codespell)
Kim Alvefur <zash@zash.se>
parents: 12079
diff changeset
   120
-- COMPAT note the use of compatibility wrapper in events (queue:table())
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   121
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   122
local function ack_delayed(session, stanza)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
	-- fire event only if configured to do so and our session is not already hibernated or destroyed
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   124
	if delayed_ack_timeout > 0 and session.awaiting_ack
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
	and not session.hibernating and not session.destroyed then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
		session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d",
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   127
			session.outgoing_stanza_queue and session.outgoing_stanza_queue:count_unacked() or 0);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   128
		module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue:table(), stanza = stanza});
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
	session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   131
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
local function can_do_smacks(session, advertise_only)
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   134
	if session.smacks then return false, enable_errors.new("already_enabled"); end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
	local session_type = session.type;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
	if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
		if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   139
			return false, enable_errors.new("bind_required");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
	elseif s2s_smacks and (session_type == "s2sin" or session_type == "s2sout") then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
	end
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   145
	return false, enable_errors.new("unavailable");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   148
module:hook("stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
		function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
			if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   152
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   153
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   154
		end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   155
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   156
module:hook("s2s-stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   157
		function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   158
			if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   159
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   160
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   161
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   162
		end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   163
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   164
local function should_ack(session, force)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   165
	if not session then return end -- shouldn't be possible
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   166
	if session.destroyed then return end -- gone
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   167
	if not session.smacks then return end -- not using
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   168
	if session.hibernating then return end -- can't ack when asleep
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   169
	if session.awaiting_ack then return end -- already waiting
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   170
	if force then return force end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   171
	local queue = session.outgoing_stanza_queue;
12526
1671cb924002 mod_smacks: Fix to use current method of counting acked stanzas
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   172
	local expected_h = queue:count_acked() + queue:count_unacked();
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
	local max_unacked = max_unacked_stanzas;
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   174
	if session.state == "inactive" then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   175
		max_unacked = max_inactive_unacked_stanzas;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   176
	end
12082
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
   177
	-- this check of last_requested_h prevents ack-loops if misbehaving clients report wrong
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   178
	-- stanza counts. it is set when an <r> is really sent (e.g. inside timer), preventing any
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   179
	-- further requests until a higher h-value would be expected.
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   180
	return queue:count_unacked() > max_unacked and expected_h ~= session.last_requested_h;
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   181
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   182
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   183
local function request_ack(session, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   184
	local queue = session.outgoing_stanza_queue;
12528
dd5ab9a6b599 mod_smacks: Remove debug log references to timer (not used anymore)
Kim Alvefur <zash@zash.se>
parents: 12527
diff changeset
   185
	session.log("debug", "Sending <r> from %s - #queue=%d", reason, queue:count_unacked());
12553
3729a6bdb562 mod_smacks: Fix #1761 by setting a flag earlier
Kim Alvefur <zash@zash.se>
parents: 12530
diff changeset
   186
	session.awaiting_ack = true;
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   187
	(session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }))
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   188
	if session.destroyed then return end -- sending something can trigger destruction
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   189
	-- expected_h could be lower than this expression e.g. more stanzas added to the queue meanwhile)
12526
1671cb924002 mod_smacks: Fix to use current method of counting acked stanzas
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   190
	session.last_requested_h = queue:count_acked() + queue:count_unacked();
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   191
	if not session.delayed_ack_timer then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   192
		session.delayed_ack_timer = timer.add_task(delayed_ack_timeout, function()
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   193
			ack_delayed(session, nil); -- we don't know if this is the only new stanza in the queue
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   194
		end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   195
	end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   196
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   197
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   198
local function request_ack_now_if_needed(session, force, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   199
	if should_ack(session, force) then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   200
		request_ack(session, reason);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   201
	end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   202
end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   203
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   204
local function outgoing_stanza_filter(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   205
	-- XXX: Normally you wouldn't have to check the xmlns for a stanza as it's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   206
	-- supposed to be nil.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   207
	-- However, when using mod_smacks with mod_websocket, then mod_websocket's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   208
	-- stanzas/out filter can get called before this one and adds the xmlns.
12077
4cbe7979a92a mod_smacks: Fix traceback when bouncing unacked stanzas
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
   209
	if not session.smacks then return stanza end
11983
705c4c07a860 mod_smacks: Use stanza type checking function for correctness
Kim Alvefur <zash@zash.se>
parents: 11982
diff changeset
   210
	local is_stanza = st.is_stanza(stanza) and
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   211
		(not stanza.attr.xmlns or stanza.attr.xmlns == 'jabber:client')
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   212
		and not stanza.name:find":";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   213
12049
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12048
diff changeset
   214
	if is_stanza then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   215
		local queue = session.outgoing_stanza_queue;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   216
		local cached_stanza = st.clone(stanza);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   217
11987
27f2539b4f87 mod_smacks: Remove dead conditional
Kim Alvefur <zash@zash.se>
parents: 11986
diff changeset
   218
		if cached_stanza.name ~= "iq" and cached_stanza:get_child("delay", xmlns_delay) == nil then
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   219
			cached_stanza = cached_stanza:tag("delay", {
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   220
				xmlns = xmlns_delay,
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   221
				from = jid.bare(session.full_jid or session.host),
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   222
				stamp = datetime.datetime()
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   223
			});
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   224
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   225
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   226
		queue:push(cached_stanza);
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   227
		tx_queued_stanzas(1);
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   228
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   229
		if session.hibernating then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   230
			session.log("debug", "hibernating since %s, stanza queued", datetime.datetime(session.hibernating));
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   231
			-- FIXME queue implementation changed, anything depending on it being an array will break
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   232
			module:fire_event("smacks-hibernation-stanza-queued", {origin = session, queue = queue:table(), stanza = cached_stanza});
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   233
			return nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   234
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   235
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   236
	return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   237
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   238
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   239
local function count_incoming_stanzas(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   240
	if not stanza.attr.xmlns then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   241
		session.handled_stanza_count = session.handled_stanza_count + 1;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   242
		session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   243
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   244
	return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   245
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   246
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   247
local function wrap_session_out(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   248
	if not resume then
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   249
		session.outgoing_stanza_queue = smqueue.new(queue_size);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   250
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   251
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   252
	add_filter(session, "stanzas/out", outgoing_stanza_filter, -999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   253
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   254
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   255
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   256
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   257
module:hook("pre-session-close", function(event)
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   258
	local session = event.session;
12079
9f4d88f54a54 mod_smacks: Avoid log noise when a non-smacks session is closed
Kim Alvefur <zash@zash.se>
parents: 12078
diff changeset
   259
	if session.smacks == nil then return end
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   260
	if session.resumption_token then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   261
		session.log("debug", "Revoking resumption token");
12522
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   262
		clear_old_session(session);
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   263
		session.resumption_token = nil;
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   264
	else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   265
		session.log("debug", "Session not resumable");
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   266
	end
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   267
	if session.hibernating_watchdog then
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   268
		session.log("debug", "Removing sleeping watchdog");
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   269
		-- If the session is being replaced instead of resume, we don't want the
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   270
		-- old session around to time out and cause trouble for the new session
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   271
		session.hibernating_watchdog:cancel();
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   272
		session.hibernating_watchdog = nil;
12073
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   273
	else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
   274
		session.log("debug", "No watchdog set");
12066
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
   275
	end
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   276
	-- send out last ack as per revision 1.5.2 of XEP-0198
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   277
	if session.smacks and session.conn and session.handled_stanza_count then
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   278
		(session.sends2s or session.send)(st.stanza("a", {
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   279
			xmlns = session.smacks;
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   280
			h = format_h(session.handled_stanza_count);
11979
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   281
		}));
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   282
	end
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   283
end);
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11956
diff changeset
   284
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   285
local function wrap_session_in(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   286
	if not resume then
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   287
		sessions_started(1);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   288
		session.handled_stanza_count = 0;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   289
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   290
	add_filter(session, "stanzas/in", count_incoming_stanzas, 999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   291
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   292
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   293
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   294
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   295
local function wrap_session(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   296
	wrap_session_out(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   297
	wrap_session_in(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   298
	return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   300
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   301
function do_enable(session, stanza)
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   302
	local ok, err = can_do_smacks(session);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   303
	if not ok then
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   304
		session.log("warn", "Failed to enable smacks: %s", err.text); -- TODO: XEP doesn't say we can send error text, should it?
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   305
		return nil, err;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   306
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   307
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   308
	if session.username then
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   309
		local old_sessions, err = all_old_sessions:get(session.username);
12523
d935af51c644 mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
   310
		session.log("debug", "Old sessions: %q", old_sessions)
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   311
		if old_sessions then
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   312
			local keep, count = {}, 0;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   313
			for token, info in it.sorted_pairs(old_sessions, function(a, b)
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   314
				return (old_sessions[a].t or 0) > (old_sessions[b].t or 0);
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   315
			end) do
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   316
				count = count + 1;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   317
				if count > max_old_sessions then break end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   318
				keep[token] = info;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   319
			end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   320
			all_old_sessions:set(session.username, keep);
12141
4e61aaa4e9b2 mod_smacks: Log error to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12140
diff changeset
   321
		elseif err then
12523
d935af51c644 mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
   322
			session.log("error", "Unable to retrieve old resumption counters: %s", err);
12140
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   323
		end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   324
	end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12139
diff changeset
   325
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   326
	local resume_token;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   327
	local resume = stanza.attr.resume;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   328
	if resume == "true" or resume == "1" then
12116
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12085
diff changeset
   329
		resume_token = new_id();
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   330
	end
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   331
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   332
	return {
12723
268b1a9162a9 mod_smacks: Add type field to results so actions can be later distinguished
Matthew Wild <mwild1@gmail.com>
parents: 12695
diff changeset
   333
		type = "enabled";
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   334
		id = resume_token;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   335
		resume_max = resume_token and tostring(resume_timeout) or nil;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   336
		session = session;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   337
		finish = function ()
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   338
			session.log("debug", "Enabling stream management");
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   339
12724
0a137436490f mod_smacks: Set session flag during successful enable
Matthew Wild <mwild1@gmail.com>
parents: 12723
diff changeset
   340
			session.smacks = stanza.attr.xmlns;
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   341
			track_session(session, resume_token);
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   342
			wrap_session(session, false);
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   343
		end;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   344
	};
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   345
end
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   346
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   347
function handle_enable(session, stanza, xmlns_sm)
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   348
	local enabled, err = do_enable(session, stanza);
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   349
	if not enabled then
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   350
		(session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):add_error(err));
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   351
		return true;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   352
	end
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   353
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   354
	(session.sends2s or session.send)(st.stanza("enabled", {
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   355
		xmlns = xmlns_sm;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   356
		id = enabled.id;
12749
2cbf0e9314ff mod_smacks: Change boolean attribute from '1' to 'true' for compatibility
Matthew Wild <mwild1@gmail.com>
parents: 12743
diff changeset
   357
		resume = enabled.id and "true" or nil; -- COMPAT w/ Conversations 2.10.10 requires 'true' not '1'
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   358
		max = enabled.resume_max;
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   359
	}));
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   360
12695
90d90b540b6b mod_smacks: Set session.smacks after sending <enabled/> to fix traceback
Matthew Wild <mwild1@gmail.com>
parents: 12693
diff changeset
   361
	session.smacks = xmlns_sm;
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   362
	enabled.finish();
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   363
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   364
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   365
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   366
module:hook_tag(xmlns_sm2, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   367
module:hook_tag(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   368
12475
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   369
module:hook_tag("http://etherx.jabber.org/streams", "features", function(session, stanza)
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   370
	if can_do_smacks(session) then
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   371
		session.smacks_feature = stanza:get_child("sm", xmlns_sm3) or stanza:get_child("sm", xmlns_sm2);
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   372
	end
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   373
end);
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   374
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   375
module:hook("s2sout-established", function (event)
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   376
	local session = event.session;
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   377
	if not session.smacks_feature then return end
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   378
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   379
	session.smacks = session.smacks_feature.attr.xmlns;
12508
c589874fe348 mod_smacks: Initialize queue before sending <enable>
Kim Alvefur <zash@zash.se>
parents: 12475
diff changeset
   380
	wrap_session_out(session, false);
12475
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   381
	session.sends2s(st.stanza("enable", { xmlns = session.smacks }));
a3b12eeedd4b mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents: 12276
diff changeset
   382
end);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   383
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   384
function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
12523
d935af51c644 mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
   385
	session.log("debug", "Enabling stream management");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   386
	session.smacks = xmlns_sm;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   387
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   388
	wrap_session_in(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   389
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   390
	-- FIXME Resume?
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   391
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   392
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   393
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   394
module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   395
module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   396
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   397
function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   398
	if not origin.smacks then
12523
d935af51c644 mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
   399
		origin.log("debug", "Received ack request from non-smack-enabled session");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   400
		return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   401
	end
12523
d935af51c644 mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
   402
	origin.log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   403
	-- Reply with <a>
11981
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
   404
	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) }));
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   405
	-- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h)
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   406
	request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   407
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   408
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   409
module:hook_tag(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   410
module:hook_tag(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   411
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   412
function handle_a(origin, stanza)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   413
	if not origin.smacks then return; end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   414
	origin.awaiting_ack = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   415
	if origin.awaiting_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   416
		timer.stop(origin.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   417
		origin.awaiting_ack_timer = nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   418
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   419
	if origin.delayed_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   420
		timer.stop(origin.delayed_ack_timer)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   421
		origin.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   422
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   423
	-- Remove handled stanzas from outgoing_stanza_queue
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   424
	local h = tonumber(stanza.attr.h);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   425
	if not h then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   426
		origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   427
		return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   428
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   429
	local queue = origin.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   430
	local handled_stanza_count = h-queue:count_acked();
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   431
	local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   432
	if err then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   433
		origin.log("warn", "The client says it handled %d new stanzas, but we sent %d :)",
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   434
			handled_stanza_count, queue:count_unacked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   435
		origin.log("debug", "Client h: %d, our h: %d", tonumber(stanza.attr.h), queue:count_acked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   436
		for i, item in queue._queue:items() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   437
			origin.log("debug", "Q item %d: %s", i, item);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   438
		end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   439
		origin:close(err);
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   440
		return;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   441
	end
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   442
	tx_acked_stanzas:sample(handled_stanza_count);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   443
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   444
	origin.log("debug", "#queue = %d (acked: %d)", queue:count_unacked(), handled_stanza_count);
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   445
	request_ack_now_if_needed(origin, false, "handle_a", nil)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   446
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   447
end
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   448
module:hook_tag(xmlns_sm2, "a", handle_a);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   449
module:hook_tag(xmlns_sm3, "a", handle_a);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   450
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   451
local function handle_unacked_stanzas(session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   452
	local queue = session.outgoing_stanza_queue;
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   453
	local unacked = queue:count_unacked()
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   454
	if unacked > 0 then
12532
8e780079a424 mod_smacks: Indicate that bounces are generated by the server
Kim Alvefur <zash@zash.se>
parents: 12531
diff changeset
   455
		local error_from = jid.join(session.username, session.host or module.host);
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   456
		tx_dropped_stanzas:sample(unacked);
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   457
		session.smacks = false; -- Disable queueing
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   458
		session.outgoing_stanza_queue = nil;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   459
		for stanza in queue._queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   460
			if not module:fire_event("delivery/failure", { session = session, stanza = stanza }) then
12529
8087f5357f53 mod_smacks: Fix bounce of stanzas directed to full JID on unclean disconnect
Kim Alvefur <zash@zash.se>
parents: 12526
diff changeset
   461
				if stanza.attr.type ~= "error" and stanza.attr.from ~= session.full_jid then
12532
8e780079a424 mod_smacks: Indicate that bounces are generated by the server
Kim Alvefur <zash@zash.se>
parents: 12531
diff changeset
   462
					local reply = st.error_reply(stanza, "cancel", "recipient-unavailable", nil, error_from);
12530
252ed01896dd mod_smacks: Bounce unhandled stanzas from local origin (fix #1759)
Kim Alvefur <zash@zash.se>
parents: 12529
diff changeset
   463
					module:send(reply);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   464
				end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   465
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   466
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   467
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   468
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   469
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   470
-- don't send delivery errors for messages which will be delivered by mam later on
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   471
-- check if stanza was archived --> this will allow us to send back errors for stanzas not archived
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   472
-- because the user configured the server to do so ("no-archive"-setting for one special contact for example)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   473
module:hook("delivery/failure", function(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   474
	local session, stanza = event.session, event.stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   475
	-- Only deal with authenticated (c2s) sessions
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   476
	if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   477
		if stanza.name == "message" and stanza.attr.xmlns == nil and
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   478
				( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   479
			-- don't store messages in offline store if they are mam results
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   480
			local mam_result = stanza:get_child("result", xmlns_mam2);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   481
			if mam_result ~= nil then
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   482
				return true; -- stanza already "handled", don't send an error and don't add it to offline storage
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   483
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   484
			-- do nothing here for normal messages and don't send out "message delivery errors",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   485
			-- because messages are already in MAM at this point (no need to frighten users)
12118
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12116
diff changeset
   486
			local stanza_id = stanza:get_child_with_attr("stanza-id", "urn:xmpp:sid:0", "by", jid.bare(session.full_jid));
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12116
diff changeset
   487
			stanza_id = stanza_id and stanza_id.attr.id;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   488
			if session.mam_requested and stanza_id ~= nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   489
				session.log("debug", "mod_smacks delivery/failure returning true for mam-handled stanza: mam-archive-id=%s", tostring(stanza_id));
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   490
				return true; -- stanza handled, don't send an error
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   491
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   492
			-- store message in offline store, if this client does not use mam *and* was the last client online
12067
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12066
diff changeset
   493
			local sessions = local_sessions[session.username] and local_sessions[session.username].sessions or nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   494
			if sessions and next(sessions) == session.resource and next(sessions, session.resource) == nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   495
				local ok = module:fire_event("message/offline/handle", { origin = session, username = session.username, stanza = stanza });
12052
f087bfd021ad mod_smacks: Fix typo
Kim Alvefur <zash@zash.se>
parents: 12051
diff changeset
   496
				session.log("debug", "mod_smacks delivery/failure returning %s for offline-handled stanza", tostring(ok));
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   497
				return ok; -- if stanza was handled, don't send an error
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   498
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   499
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   500
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   501
end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   502
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   503
module:hook("pre-resource-unbind", function (event)
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   504
	local session = event.session;
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   505
	if not session.smacks then return end
12064
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   506
	if not session.resumption_token then
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   507
		local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   508
		if queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   509
			session.log("debug", "Destroying session with %d unacked stanzas", queue:count_unacked());
12064
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   510
			handle_unacked_stanzas(session);
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
   511
		end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   512
		return
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   513
	end
12076
ef0f174488af mod_smacks: Fix duplicate sleep behavior when replacing a session
Kim Alvefur <zash@zash.se>
parents: 12074
diff changeset
   514
	if session.hibernating then return end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   515
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   516
	session.hibernating = os_time();
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   517
	session.hibernating_watchdog = watchdog.new(resume_timeout, function()
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   518
		session.log("debug", "mod_smacks hibernation timeout reached...");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   519
		if session.destroyed then
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   520
			session.log("debug", "The session has already been destroyed");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   521
			return
12065
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   522
		elseif not session.resumption_token then
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   523
			-- This should normally not happen, the watchdog should be canceled from session:close()
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   524
			session.log("debug", "The session has already been resumed or replaced");
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
   525
			return
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   526
		end
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   527
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   528
		session.log("debug", "Destroying session for hibernating too long");
12522
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   529
		save_old_session(session);
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   530
		session.resumption_token = nil;
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   531
		sessionmanager.destroy_session(session, "Hibernating too long");
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   532
		sessions_expired(1);
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   533
	end);
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   534
	if session.conn then
12074
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   535
		local conn = session.conn;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   536
		c2s_sessions[conn] = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   537
		session.conn = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
   538
		conn:close();
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   539
	end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   540
	module:fire_event("smacks-hibernation-start", { origin = session; queue = session.outgoing_stanza_queue:table() });
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   541
	return true; -- Postpone destruction for now
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   542
end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   543
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   544
local function handle_s2s_destroyed(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   545
	local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   546
	local queue = session.outgoing_stanza_queue;
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   547
	if queue and queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   548
		session.log("warn", "Destroying session with %d unacked stanzas", queue:count_unacked());
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   549
		if s2s_resend then
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   550
			for stanza in queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   551
				module:send(stanza);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   552
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   553
			session.outgoing_stanza_queue = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   554
		else
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   555
			handle_unacked_stanzas(session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   556
		end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   557
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   558
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   559
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   560
module:hook("s2sout-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   561
module:hook("s2sin-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   562
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   563
function do_resume(session, stanza)
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   564
	if session.full_jid then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   565
		session.log("warn", "Tried to resume after resource binding");
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   566
		return nil, enable_errors.new("already_bound");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   567
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   568
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   569
	local id = stanza.attr.previd;
12057
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
   570
	local original_session = session_registry[jid.join(session.username, session.host, id)];
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   571
	if not original_session then
12055
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
   572
		local old_session = old_session_registry:get(session.username, id);
11982
628374809421 mod_smacks: Remove redundant fields
Kim Alvefur <zash@zash.se>
parents: 11981
diff changeset
   573
		if old_session then
12070
f07c8240a71d mod_smacks: Split log messages for when an old session exists in storage
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
   574
			session.log("debug", "Tried to resume old expired session with id %s", id);
12522
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   575
			clear_old_session(session, id);
12129
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12118
diff changeset
   576
			resumption_expired(1);
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   577
			return nil, enable_errors.new("expired", { h = old_session.h });
12058
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12057
diff changeset
   578
		end
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   579
		session.log("debug", "Tried to resume non-existent session with id %s", id);
12692
36ba170c4fd0 mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents: 12686
diff changeset
   580
		return nil, enable_errors.new("unknown_session");
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   581
	end
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12554
diff changeset
   582
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   583
	if original_session.hibernating_watchdog then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   584
		original_session.log("debug", "Letting the watchdog go");
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   585
		original_session.hibernating_watchdog:cancel();
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   586
		original_session.hibernating_watchdog = nil;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   587
	elseif session.hibernating then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   588
		original_session.log("error", "Hibernating session has no watchdog!")
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   589
	end
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   590
	-- zero age = was not hibernating yet
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   591
	local age = 0;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   592
	if original_session.hibernating then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   593
		local now = os_time();
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   594
		age = now - original_session.hibernating;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   595
	end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   596
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   597
	session.log("debug", "mod_smacks resuming existing session %s...", original_session.id);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   598
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   599
	local queue = original_session.outgoing_stanza_queue;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   600
	local h = tonumber(stanza.attr.h);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   601
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   602
	original_session.log("debug", "Pre-resumption #queue = %d", queue:count_unacked())
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   603
	local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   604
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   605
	if not err and not queue:resumable() then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   606
		err = ack_errors.new("overflow");
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   607
	end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   608
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   609
	if err then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   610
		session.log("debug", "Resumption failed: %s", err);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   611
		return nil, err;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   612
	end
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   613
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   614
	-- Update original_session with the parameters (connection, etc.) from the new session
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   615
	sessionmanager.update_session(original_session, session);
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   616
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   617
	return {
12723
268b1a9162a9 mod_smacks: Add type field to results so actions can be later distinguished
Matthew Wild <mwild1@gmail.com>
parents: 12695
diff changeset
   618
		type = "resumed";
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   619
		session = original_session;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   620
		id = id;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   621
		-- Return function to complete the resumption and resync unacked stanzas
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   622
		-- This is two steps so we can support SASL2/ISR
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   623
		finish = function ()
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   624
			-- Ok, we need to re-send any stanzas that the client didn't see
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   625
			-- ...they are what is now left in the outgoing stanza queue
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   626
			-- We have to use the send of "session" because we don't want to add our resent stanzas
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   627
			-- to the outgoing queue again
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   628
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   629
			original_session.log("debug", "resending all unacked stanzas that are still queued after resume, #queue = %d", queue:count_unacked());
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   630
			for _, queued_stanza in queue:resume() do
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   631
				original_session.send(queued_stanza);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   632
			end
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   633
			original_session.log("debug", "all stanzas resent, enabling stream management on resumed stream, #queue = %d", queue:count_unacked());
12682
5a61e1603f42 mod_smacks: Don't close resuming session when failed due to overflow
Matthew Wild <mwild1@gmail.com>
parents: 12681
diff changeset
   634
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   635
			-- Add our own handlers to the resumed session (filters have been reset in the update)
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   636
			wrap_session(original_session, true);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   637
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   638
			-- Let everyone know that we are no longer hibernating
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   639
			module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue:table()});
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   640
			original_session.awaiting_ack = nil; -- Don't wait for acks from before the resumption
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   641
			request_ack_now_if_needed(original_session, true, "handle_resume", nil);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   642
			resumption_age:sample(age);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   643
		end;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   644
	};
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   645
end
12060
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12058
diff changeset
   646
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   647
function handle_resume(session, stanza, xmlns_sm)
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   648
	local resumed, err = do_resume(session, stanza);
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   649
	if not resumed then
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   650
		session.send(st.stanza("failed", { xmlns = xmlns_sm, h = format_h(err.context.h) })
12743
0dc80024fdd2 Backed out changeset 1bc2220cd6ec
Jonas Schäfer <jonas@wielicki.name>
parents: 12724
diff changeset
   651
			:tag(err.condition, { xmlns = xmlns_errors }));
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   652
		return true;
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   653
	end
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12554
diff changeset
   654
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   655
	session = resumed.session;
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12554
diff changeset
   656
12686
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   657
	-- Inform client of successful resumption
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   658
	session.send(st.stanza("resumed", { xmlns = xmlns_sm,
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   659
		h = format_h(session.handled_stanza_count), previd = resumed.id }));
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   660
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   661
	-- Complete resume (sync stanzas, etc.)
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   662
	resumed.finish();
464a22f2751c mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents: 12682
diff changeset
   663
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   664
	return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   665
end
12681
3b9771d496ed mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents: 12554
diff changeset
   666
11939
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   667
module:hook_tag(xmlns_sm2, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11938
diff changeset
   668
module:hook_tag(xmlns_sm3, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm3); end);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   669
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   670
-- Events when it's sensible to request an ack
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   671
-- Could experiment with forcing (ignoring max_unacked) <r>, but when and why?
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   672
local request_ack_events = {
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   673
	["csi-client-active"] = true;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   674
	["csi-flushing"] = false;
11942
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11941
diff changeset
   675
	["c2s-pre-ondrain"] = false;
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11941
diff changeset
   676
	["s2s-pre-ondrain"] = false;
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   677
};
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   678
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   679
for event_name, force in pairs(request_ack_events) do
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   680
	module:hook(event_name, function(event)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   681
		local session = event.session or event.origin;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   682
		request_ack_now_if_needed(session, force, event_name);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   683
	end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   684
end
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   685
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   686
local function handle_read_timeout(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   687
	local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   688
	if session.smacks then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   689
		if session.awaiting_ack then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   690
			if session.awaiting_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   691
				timer.stop(session.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   692
				session.awaiting_ack_timer = nil;
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   693
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   694
			if session.delayed_ack_timer then
11940
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11939
diff changeset
   695
				timer.stop(session.delayed_ack_timer);
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   696
				session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   697
			end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   698
			return false; -- Kick the session
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   699
		end
11941
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11940
diff changeset
   700
		request_ack_now_if_needed(session, true, "read timeout");
11938
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   701
		return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   702
	end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   703
end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   704
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   705
module:hook("s2s-read-timeout", handle_read_timeout);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   706
module:hook("c2s-read-timeout", handle_read_timeout);
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   707
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   708
module:hook_global("server-stopping", function(event)
12081
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   709
	if not local_sessions then
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   710
		-- not a VirtualHost, no user sessions
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   711
		return
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
   712
	end
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   713
	local reason = event.reason;
12082
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
   714
	-- Close smacks-enabled sessions ourselves instead of letting mod_c2s close
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   715
	-- it, which invalidates the smacks session. This allows preserving the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   716
	-- counter value, so it can be communicated to the client when it tries to
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   717
	-- resume the lost session after a restart.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   718
	for _, user in pairs(local_sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   719
		for _, session in pairs(user.sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   720
			if session.resumption_token then
12522
73ee3855f970 mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents: 12508
diff changeset
   721
				if save_old_session(session) then
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   722
					session.resumption_token = nil;
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   723
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   724
					-- Deal with unacked stanzas
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   725
					if session.outgoing_stanza_queue then
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   726
						handle_unacked_stanzas(session);
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   727
					end
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   728
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   729
					if session.conn then
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   730
						session.conn:close()
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   731
						session.conn = nil;
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   732
						-- Now when mod_c2s gets here, it will immediately destroy the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   733
						-- session since it is unconnected.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   734
					end
12069
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   735
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   736
					-- And make sure nobody tries to send anything
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
   737
					session:close{ condition = "system-shutdown", text = reason };
12068
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   738
				end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   739
			end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   740
		end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   741
	end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
   742
end, -90);