mod_smacks/mod_smacks.lua
author Kim Alvefur <zash@zash.se>
Thu, 15 Dec 2016 02:57:03 +0100
changeset 2421 5e7badecf7fe
parent 2398 4c27ebcf4cbd
child 2495 5fbca7de2088
permissions -rw-r--r--
mod_smacks: Check if a session is an authenticated c2s session by looking for a username (fix for change in 0.10 9f70d35a1602)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1674
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     1
-- XEP-0198: Stream Management for Prosody IM
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     2
--
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     3
-- Copyright (C) 2010-2015 Matthew Wild
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     4
-- Copyright (C) 2010 Waqas Hussain
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     5
-- Copyright (C) 2012-2015 Kim Alvefur
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     6
-- Copyright (C) 2012 Thijs Alkemade
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     7
-- Copyright (C) 2014 Florian Zeitz
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
     8
-- Copyright (C) 2016 Thilo Molitor
1674
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
     9
--
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
    10
-- This project is MIT/X11 licensed. Please see the
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
    11
-- COPYING file in the source package for more information.
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
    12
--
5f5ff061b316 mod_smacks: Add license header
Kim Alvefur <zash@zash.se>
parents: 1640
diff changeset
    13
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
local st = require "util.stanza";
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
    15
local uuid_generate = require "util.uuid".generate;
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
local t_insert, t_remove = table.insert, table.remove;
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
    18
local math_min = math.min;
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
    19
local os_time = os.time;
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
local tonumber, tostring = tonumber, tostring;
201
bc24f58a0d39 mod_smacks: Use filters for catching incoming stanzas (more reliable and efficient), also add some logic to make compatible with the stream resumption module (coming soon)
Matthew Wild <mwild1@gmail.com>
parents: 200
diff changeset
    21
local add_filter = require "util.filters".add_filter;
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
    22
local timer = require "util.timer";
598
db2a40cbd6ef Add a <delay> to stanzas that are queued (and don't have one already), so clients can show them with the original timestamp.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 597
diff changeset
    23
local datetime = require "util.datetime";
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    25
local xmlns_sm2 = "urn:xmpp:sm:2";
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    26
local xmlns_sm3 = "urn:xmpp:sm:3";
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
    27
local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas";
598
db2a40cbd6ef Add a <delay> to stanzas that are queued (and don't have one already), so clients can show them with the original timestamp.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 597
diff changeset
    28
local xmlns_delay = "urn:xmpp:delay";
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    30
local sm2_attr = { xmlns = xmlns_sm2 };
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    31
local sm3_attr = { xmlns = xmlns_sm3 };
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
641
06a78cba6499 mod_smacks: get_option+_number
Matthew Wild <mwild1@gmail.com>
parents: 640
diff changeset
    33
local resume_timeout = module:get_option_number("smacks_hibernation_time", 300);
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
    34
local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", false);
1885
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
    35
local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false);
642
842a8a3b0d81 mod_smacks: Make smacks_max_unacked_stanzas configurable
Matthew Wild <mwild1@gmail.com>
parents: 641
diff changeset
    36
local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0);
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    37
local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 60);
754
713c6791fbcc mod_smacks: Import prosody.core_process_stanza()
Kim Alvefur <zash@zash.se>
parents: 642
diff changeset
    38
local core_process_stanza = prosody.core_process_stanza;
757
92c6f84ec446 mod_smacks: Use require to import (thanks a lot, autocomplete)
Kim Alvefur <zash@zash.se>
parents: 756
diff changeset
    39
local sessionmanager = require"core.sessionmanager";
200
64a573203c20 mod_smacks: Better logic for deciding what is a stanza and what is not, and deciding when to send ack requests
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
    40
640
d87131b29bbd mod_smacks: Remove dependency on connlisteners (use sessions table shared by mod_c2s directly)
Matthew Wild <mwild1@gmail.com>
parents: 625
diff changeset
    41
local c2s_sessions = module:shared("/*/c2s/sessions");
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
    42
local session_registry = {};
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
    43
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    44
local function delayed_ack_function(session)
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    45
	-- fire event only when configured to do so
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    46
	if delayed_ack_timeout > 0 and session.awaiting_ack and not session.outgoing_stanza_queue == nil then
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    47
		session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d", #session.outgoing_stanza_queue);
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    48
		module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue});
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    49
	end
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    50
end
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
    51
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    52
local function can_do_smacks(session, advertise_only)
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    53
	if session.smacks then return false, "unexpected-request", "Stream management is already enabled"; end
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
    54
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    55
	local session_type = session.type;
2421
5e7badecf7fe mod_smacks: Check if a session is an authenticated c2s session by looking for a username (fix for change in 0.10 9f70d35a1602)
Kim Alvefur <zash@zash.se>
parents: 2398
diff changeset
    56
	if session.username then
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    57
		if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm
597
f9c73c1249cd Update smacks to urn:xmpp:sm:3. Fix typo in can_do_smacks.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 596
diff changeset
    58
			return false, "unexpected-request", "Client must bind a resource before enabling stream management";
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    59
		end
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    60
		return true;
600
7693724881b3 Fix a typo in mod_smacks (type -> session_type).
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 599
diff changeset
    61
	elseif s2s_smacks and (session_type == "s2sin" or session_type == "s2sout") then
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    62
		return true;
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    63
	end
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    64
	return false, "service-unavailable", "Stream management is not available for this stream";
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    65
end
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    66
263
41f1cac40560 mod_smacks: Fixed to use the correct events API.
Waqas Hussain <waqas20@gmail.com>
parents: 258
diff changeset
    67
module:hook("stream-features",
41f1cac40560 mod_smacks: Fixed to use the correct events API.
Waqas Hussain <waqas20@gmail.com>
parents: 258
diff changeset
    68
		function (event)
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    69
			if can_do_smacks(event.origin, true) then
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    70
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    71
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
593
57ac609444c4 mod_smacks: Only advertise stream features when a stream is authenticated, and doesn't already have smacks enabled
Matthew Wild <mwild1@gmail.com>
parents: 591
diff changeset
    72
			end
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
		end);
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
module:hook("s2s-stream-features",
263
41f1cac40560 mod_smacks: Fixed to use the correct events API.
Waqas Hussain <waqas20@gmail.com>
parents: 258
diff changeset
    76
		function (event)
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
    77
			if can_do_smacks(event.origin, true) then
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    78
				event.features:tag("sm", sm2_attr):tag("optional"):up():up();
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
    79
				event.features:tag("sm", sm3_attr):tag("optional"):up():up();
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
    80
			end
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
		end);
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    83
local function outgoing_stanza_filter(stanza, session)
1601
dc0cf2ba0e1a mod_smacks: Stanzas don't have a ':' in their name
Kim Alvefur <zash@zash.se>
parents: 1539
diff changeset
    84
	local is_stanza = stanza.attr and not stanza.attr.xmlns and not stanza.name:find":";
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    85
	if is_stanza and not stanza._cached then -- Stanza in default stream namespace
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    86
		local queue = session.outgoing_stanza_queue;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    87
		local cached_stanza = st.clone(stanza);
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    88
		cached_stanza._cached = true;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    89
1603
8e006226e4c5 mod_smacks: Don't attach timestamps to 'iq' stanzas
Kim Alvefur <zash@zash.se>
parents: 1602
diff changeset
    90
		if cached_stanza and cached_stanza.name ~= "iq" and cached_stanza:get_child("delay", xmlns_delay) == nil then
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    91
			cached_stanza = cached_stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()});
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    92
		end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    93
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    94
		queue[#queue+1] = cached_stanza;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
    95
		session.log("debug", "#queue = %d", #queue);
1523
d4a4ed31567e mod_smacks: Trick session.send() into not returning nil or mod_message will act as if messages were not delivered
Kim Alvefur <zash@zash.se>
parents: 1520
diff changeset
    96
		if session.hibernating then
d4a4ed31567e mod_smacks: Trick session.send() into not returning nil or mod_message will act as if messages were not delivered
Kim Alvefur <zash@zash.se>
parents: 1520
diff changeset
    97
			session.log("debug", "hibernating, stanza queued");
2091
e48dbb640408 mod_smacks: Drop stanzas instead of turning them into the empty string
Kim Alvefur <zash@zash.se>
parents: 1885
diff changeset
    98
			return nil;
1523
d4a4ed31567e mod_smacks: Trick session.send() into not returning nil or mod_message will act as if messages were not delivered
Kim Alvefur <zash@zash.se>
parents: 1520
diff changeset
    99
		end
2152
c472a454be61 mod_smacks: Fix sending <r> after stanzas while not creating multiple timers (thanks Thilo)
Kim Alvefur <zash@zash.se>
parents: 2144
diff changeset
   100
		if #queue > max_unacked_stanzas and session.awaiting_ack == nil then
2092
7a29d8e3275b mod_smacks: Go back to sending ack requests from a timer a moment after a stanza was sent
Kim Alvefur <zash@zash.se>
parents: 2091
diff changeset
   101
			session.log("debug", "Queuing <r> (in a moment)");
2152
c472a454be61 mod_smacks: Fix sending <r> after stanzas while not creating multiple timers (thanks Thilo)
Kim Alvefur <zash@zash.se>
parents: 2144
diff changeset
   102
			session.awaiting_ack = false;
2094
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   103
			session.awaiting_ack_timer = module:add_timer(1e-06, function ()
2092
7a29d8e3275b mod_smacks: Go back to sending ack requests from a timer a moment after a stanza was sent
Kim Alvefur <zash@zash.se>
parents: 2091
diff changeset
   104
				if not session.awaiting_ack then
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   105
					session.log("debug", "Sending <r> (before send)");
2092
7a29d8e3275b mod_smacks: Go back to sending ack requests from a timer a moment after a stanza was sent
Kim Alvefur <zash@zash.se>
parents: 2091
diff changeset
   106
					(session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }))
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   107
					session.log("debug", "Sending <r> (after send)");
2152
c472a454be61 mod_smacks: Fix sending <r> after stanzas while not creating multiple timers (thanks Thilo)
Kim Alvefur <zash@zash.se>
parents: 2144
diff changeset
   108
					session.awaiting_ack = true;
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   109
					session.delayed_ack_timer = module:add_timer(delayed_ack_timeout, function()
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   110
						delayed_ack_function(session);
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   111
					end);
2092
7a29d8e3275b mod_smacks: Go back to sending ack requests from a timer a moment after a stanza was sent
Kim Alvefur <zash@zash.se>
parents: 2091
diff changeset
   112
				end
7a29d8e3275b mod_smacks: Go back to sending ack requests from a timer a moment after a stanza was sent
Kim Alvefur <zash@zash.se>
parents: 2091
diff changeset
   113
			end);
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   114
		end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   115
	end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   116
	return stanza;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   117
end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   118
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   119
local function count_incoming_stanzas(stanza, session)
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   120
	if not stanza.attr.xmlns then
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   121
		session.handled_stanza_count = session.handled_stanza_count + 1;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   122
		session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count);
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   123
	end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   124
	return stanza;
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   125
end
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   126
1529
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   127
local function wrap_session_out(session, resume)
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   128
	if not resume then
1528
5ccb3ee2cf72 mod_smacks: Remove variable not used after 2881d532f385
Kim Alvefur <zash@zash.se>
parents: 1527
diff changeset
   129
		session.outgoing_stanza_queue = {};
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   130
		session.last_acknowledged_stanza = 0;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   131
	end
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   132
2126
3f788f18cc10 mod_smacks: Adjust filter priorities to avoid conflict with mod_websocket
Kim Alvefur <zash@zash.se>
parents: 2095
diff changeset
   133
	add_filter(session, "stanzas/out", outgoing_stanza_filter, -999);
988
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   134
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   135
	local session_close = session.close;
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   136
	function session.close(...)
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   137
		if session.resumption_token then
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   138
			session_registry[session.resumption_token] = nil;
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   139
			session.resumption_token = nil;
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   140
		end
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   141
		return session_close(...);
c15cea87036f mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents: 987
diff changeset
   142
	end
1529
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   143
	return session;
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   144
end
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   145
1529
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   146
local function wrap_session_in(session, resume)
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   147
	if not resume then
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   148
		session.handled_stanza_count = 0;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   149
	end
2126
3f788f18cc10 mod_smacks: Adjust filter priorities to avoid conflict with mod_websocket
Kim Alvefur <zash@zash.se>
parents: 2095
diff changeset
   150
	add_filter(session, "stanzas/in", count_incoming_stanzas, 999);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   151
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   152
	return session;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   153
end
201
bc24f58a0d39 mod_smacks: Use filters for catching incoming stanzas (more reliable and efficient), also add some logic to make compatible with the stream resumption module (coming soon)
Matthew Wild <mwild1@gmail.com>
parents: 200
diff changeset
   154
1529
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   155
local function wrap_session(session, resume)
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   156
	wrap_session_out(session, resume);
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   157
	wrap_session_in(session, resume);
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   158
	return session;
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   159
end
16893646a458 mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents: 1528
diff changeset
   160
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   161
function handle_enable(session, stanza, xmlns_sm)
596
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
   162
	local ok, err, err_text = can_do_smacks(session);
36003cae2370 mod_smacks: Consolidate logic for deciding whether to advertise or allow smacks for a given session, and fix an issue with not allowing s2s connections to enable smacks because of not binding a resource... (thanks xnyphs)
Matthew Wild <mwild1@gmail.com>
parents: 595
diff changeset
   163
	if not ok then
595
40b707d7a809 mod_smacks: Handle a client trying to <enable> twice, or trying to <enable> before resource binding (thanks Thijs Alkemade)
Matthew Wild <mwild1@gmail.com>
parents: 593
diff changeset
   164
		session.log("warn", "Failed to enable smacks: %s", err_text); -- TODO: XEP doesn't say we can send error text, should it?
1527
06ecc5b3ca46 mod_smacks: Send failure correctly on s2s
Kim Alvefur <zash@zash.se>
parents: 1526
diff changeset
   165
		(session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors}));
595
40b707d7a809 mod_smacks: Handle a client trying to <enable> twice, or trying to <enable> before resource binding (thanks Thijs Alkemade)
Matthew Wild <mwild1@gmail.com>
parents: 593
diff changeset
   166
		return true;
40b707d7a809 mod_smacks: Handle a client trying to <enable> twice, or trying to <enable> before resource binding (thanks Thijs Alkemade)
Matthew Wild <mwild1@gmail.com>
parents: 593
diff changeset
   167
	end
40b707d7a809 mod_smacks: Handle a client trying to <enable> twice, or trying to <enable> before resource binding (thanks Thijs Alkemade)
Matthew Wild <mwild1@gmail.com>
parents: 593
diff changeset
   168
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   169
	module:log("debug", "Enabling stream management");
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   170
	session.smacks = xmlns_sm;
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   171
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   172
	wrap_session(session, false);
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   173
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   174
	local resume_token;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   175
	local resume = stanza.attr.resume;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   176
	if resume == "true" or resume == "1" then
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   177
		resume_token = uuid_generate();
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   178
		session_registry[resume_token] = session;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   179
		session.resumption_token = resume_token;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   180
	end
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   181
	(session.sends2s or session.send)(st.stanza("enabled", { xmlns = xmlns_sm, id = resume_token, resume = resume }));
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   182
	return true;
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   183
end
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   184
module:hook_stanza(xmlns_sm2, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm2); end, 100);
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   185
module:hook_stanza(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100);
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   186
1530
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   187
module:hook_stanza("http://etherx.jabber.org/streams", "features",
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   188
		function (session, stanza)
2093
964b3d649a36 mod_smacks: Increase delay for starting s2s smacks to a non-zero value
Kim Alvefur <zash@zash.se>
parents: 2092
diff changeset
   189
			module:add_timer(1e-6, function ()
1531
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   190
				if can_do_smacks(session) then
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   191
					if stanza:get_child("sm", xmlns_sm3) then
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   192
						session.sends2s(st.stanza("enable", sm3_attr));
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   193
						session.smacks = xmlns_sm3;
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   194
					elseif stanza:get_child("sm", xmlns_sm2) then
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   195
						session.sends2s(st.stanza("enable", sm2_attr));
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   196
						session.smacks = xmlns_sm2;
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   197
					else
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   198
						return;
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   199
					end
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   200
					wrap_session_out(session, false);
1530
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   201
				end
1531
7d86fc477993 mod_smacks: Delay initiation of outgoing smacks on s2s until after queued stanzas are sent
Kim Alvefur <zash@zash.se>
parents: 1530
diff changeset
   202
			end);
1530
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   203
		end);
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   204
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   205
function handle_enabled(session, stanza, xmlns_sm)
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   206
	module:log("debug", "Enabling stream management");
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   207
	session.smacks = xmlns_sm;
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   208
1530
fb7cd669f41b mod_smacks: Initiate outgoing smacks on s2s when sending request and incoming when the remote says enabled
Kim Alvefur <zash@zash.se>
parents: 1529
diff changeset
   209
	wrap_session_in(session, false);
576
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   210
44b69c3d5351 mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents: 478
diff changeset
   211
	-- FIXME Resume?
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   212
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   213
	return true;
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   214
end
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   215
module:hook_stanza(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   216
module:hook_stanza(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   217
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   218
function handle_r(origin, stanza, xmlns_sm)
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   219
	if not origin.smacks then
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   220
		module:log("debug", "Received ack request from non-smack-enabled session");
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   221
		return;
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   222
	end
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   223
	module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   224
	-- Reply with <a>
255
9b9b089407b1 mod_smacks: Fix to reply to stream for s2s sessions
Matthew Wild <mwild1@gmail.com>
parents: 220
diff changeset
   225
	(origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = tostring(origin.handled_stanza_count) }));
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   226
	return true;
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   227
end
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   228
module:hook_stanza(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end);
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   229
module:hook_stanza(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   230
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   231
function handle_a(origin, stanza)
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   232
	if not origin.smacks then return; end
200
64a573203c20 mod_smacks: Better logic for deciding what is a stanza and what is not, and deciding when to send ack requests
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
   233
	origin.awaiting_ack = nil;
2094
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   234
	if origin.awaiting_ack_timer then
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   235
		origin.awaiting_ack_timer:stop();
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   236
	end
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   237
	if origin.delayed_ack_timer then
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   238
		origin.delayed_ack_timer:stop();
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   239
	end
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   240
	-- Remove handled stanzas from outgoing_stanza_queue
258
36648205b10a mod_smacks: Add commented log statement for future debugging
Matthew Wild <mwild1@gmail.com>
parents: 257
diff changeset
   241
	--log("debug", "ACK: h=%s, last=%s", stanza.attr.h or "", origin.last_acknowledged_stanza or "");
1407
b631c8a8b9e7 mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents: 1406
diff changeset
   242
	local h = tonumber(stanza.attr.h);
b631c8a8b9e7 mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents: 1406
diff changeset
   243
	if not h then
b631c8a8b9e7 mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents: 1406
diff changeset
   244
		origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; };
b631c8a8b9e7 mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents: 1406
diff changeset
   245
	end
b631c8a8b9e7 mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents: 1406
diff changeset
   246
	local handled_stanza_count = h-origin.last_acknowledged_stanza;
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   247
	local queue = origin.outgoing_stanza_queue;
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   248
	if handled_stanza_count > #queue then
1416
7ddb522d9b28 mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 1408
diff changeset
   249
		origin.log("warn", "The client says it handled %d new stanzas, but we only sent %d :)",
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   250
			handled_stanza_count, #queue);
1416
7ddb522d9b28 mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 1408
diff changeset
   251
		origin.log("debug", "Client h: %d, our h: %d", tonumber(stanza.attr.h), origin.last_acknowledged_stanza);
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   252
		for i=1,#queue do
1416
7ddb522d9b28 mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 1408
diff changeset
   253
			origin.log("debug", "Q item %d: %s", i, tostring(queue[i]));
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   254
		end
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   255
	end
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   256
	for i=1,math_min(handled_stanza_count,#queue) do
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   257
		t_remove(origin.outgoing_stanza_queue, 1);
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   258
	end
1406
7d76dd2310ef mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents: 1405
diff changeset
   259
	origin.log("debug", "#queue = %d", #queue);
220
263858d40ceb mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents: 202
diff changeset
   260
	origin.last_acknowledged_stanza = origin.last_acknowledged_stanza + handled_stanza_count;
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   261
	return true;
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   262
end
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   263
module:hook_stanza(xmlns_sm2, "a", handle_a);
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   264
module:hook_stanza(xmlns_sm3, "a", handle_a);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   265
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   266
--TODO: Optimise... incoming stanzas should be handled by a per-session
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   267
-- function that has a counter as an upvalue (no table indexing for increments,
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   268
-- and won't slow non-198 sessions). We can also then remove the .handled flag
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   269
-- on stanzas
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   270
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   271
function handle_unacked_stanzas(session)
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   272
	local queue = session.outgoing_stanza_queue;
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   273
	local error_attr = { type = "cancel" };
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   274
	if #queue > 0 then
202
d11478ae374e mod_smacks: Clean outgoing stanza queue correctly on session close
Matthew Wild <mwild1@gmail.com>
parents: 201
diff changeset
   275
		session.outgoing_stanza_queue = {};
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   276
		for i=1,#queue do
256
57de4a7840ef mod_smacks: Fixes for storing the unacked stanzas so that they can be properly replayed to clients on stream resume
Matthew Wild <mwild1@gmail.com>
parents: 255
diff changeset
   277
			local reply = st.reply(queue[i]);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   278
			if reply.attr.to ~= session.full_jid then
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   279
				reply.attr.type = "error";
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   280
				reply:tag("error", error_attr)
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   281
					:tag("recipient-unavailable", {xmlns = "urn:ietf:params:xml:ns:xmpp-stanzas"});
256
57de4a7840ef mod_smacks: Fixes for storing the unacked stanzas so that they can be properly replayed to clients on stream resume
Matthew Wild <mwild1@gmail.com>
parents: 255
diff changeset
   282
				core_process_stanza(session, reply);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   283
			end
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   284
		end
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   285
	end
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   286
end
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   287
622
ce39df945de1 mod_smacks: Use pre-resource-unbind (0.9 feature) to fix reloadability and multiple host support
Matthew Wild <mwild1@gmail.com>
parents: 600
diff changeset
   288
module:hook("pre-resource-unbind", function (event)
ce39df945de1 mod_smacks: Use pre-resource-unbind (0.9 feature) to fix reloadability and multiple host support
Matthew Wild <mwild1@gmail.com>
parents: 600
diff changeset
   289
	local session, err = event.session, event.error;
1024
d7655e634c30 mod_smacks: Allow resumption if the TCP connection is closed from our end, c15cea87036f ensures distinction from cleanly closed streams (thanks Lance)
Kim Alvefur <zash@zash.se>
parents: 994
diff changeset
   290
	if session.smacks then
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   291
		if not session.resumption_token then
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   292
			local queue = session.outgoing_stanza_queue;
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   293
			if #queue > 0 then
1405
26a2092e289f mod_smacks: Log things attached to sessions instead of the module
Kim Alvefur <zash@zash.se>
parents: 1343
diff changeset
   294
				session.log("warn", "Destroying session with %d unacked stanzas", #queue);
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   295
				handle_unacked_stanzas(session);
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   296
			end
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   297
		else
587
f733e7599ed6 mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 576
diff changeset
   298
			session.log("debug", "mod_smacks hibernating session for up to %d seconds", resume_timeout);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   299
			local hibernate_time = os_time(); -- Track the time we went into hibernation
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   300
			session.hibernating = hibernate_time;
478
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   301
			local resumption_token = session.resumption_token;
2144
3a94b3cd31e2 mod_smacks: added new events for hibernation start/end
tmolitor <thilo@eightysoft.de>
parents: 2140
diff changeset
   302
			module:fire_event("smacks-hibernation-start", {origin = session, queue = session.outgoing_stanza_queue});
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   303
			timer.add_task(resume_timeout, function ()
587
f733e7599ed6 mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 576
diff changeset
   304
				session.log("debug", "mod_smacks hibernation timeout reached...");
478
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   305
				-- We need to check the current resumption token for this resource
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   306
				-- matches the smacks session this timer is for in case it changed
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   307
				-- (for example, the client may have bound a new resource and
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   308
				-- started a new smacks session, or not be using smacks)
810
464ed063a8f2 mod_smacks: Less table indexing!
Kim Alvefur <zash@zash.se>
parents: 757
diff changeset
   309
				local curr_session = full_sessions[session.full_jid];
1602
043d08448d87 mod_smacks: Remove negation of condition, most likely a leftover from debugging
Kim Alvefur <zash@zash.se>
parents: 1601
diff changeset
   310
				if session.destroyed then
987
fabff75bfc3f mod_smacks: If a hibernating session was destroyed before the timeout, don't destroy it again or say that it was resumed
Kim Alvefur <zash@zash.se>
parents: 925
diff changeset
   311
					session.log("debug", "The session has already been destroyed");
fabff75bfc3f mod_smacks: If a hibernating session was destroyed before the timeout, don't destroy it again or say that it was resumed
Kim Alvefur <zash@zash.se>
parents: 925
diff changeset
   312
				elseif curr_session and curr_session.resumption_token == resumption_token
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   313
				-- Check the hibernate time still matches what we think it is,
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   314
				-- otherwise the session resumed and re-hibernated.
478
db0f065c4e09 mod_smacks: Don't destroy a session that binds the same resource as a hibernating smacks session (thanks xnyhps for tracking down the problem, though I've used a different fix)
Matthew Wild <mwild1@gmail.com>
parents: 345
diff changeset
   315
				and session.hibernating == hibernate_time then
587
f733e7599ed6 mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 576
diff changeset
   316
					session.log("debug", "Destroying session for hibernating too long");
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   317
					session_registry[session.resumption_token] = nil;
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   318
					session.resumption_token = nil;
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   319
					sessionmanager.destroy_session(session);
587
f733e7599ed6 mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 576
diff changeset
   320
				else
f733e7599ed6 mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents: 576
diff changeset
   321
					session.log("debug", "Session resumed before hibernation timeout, all is well")
257
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   322
				end
08fa42e1ab06 mod_smacks: Fixes for monkey-patched sessionmanager.destroy to handle stream resumption, and to fall back to stock destroy() if the session is not smacks-enabled.
Matthew Wild <mwild1@gmail.com>
parents: 256
diff changeset
   323
			end);
622
ce39df945de1 mod_smacks: Use pre-resource-unbind (0.9 feature) to fix reloadability and multiple host support
Matthew Wild <mwild1@gmail.com>
parents: 600
diff changeset
   324
			return true; -- Postpone destruction for now
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   325
		end
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   326
160
9a7671720dec mod_smacks: XEP-0198 Stream Management acks. Initial commit - very rough, useful mainly for testing at the moment, most certainly contains bugs :)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   327
	end
622
ce39df945de1 mod_smacks: Use pre-resource-unbind (0.9 feature) to fix reloadability and multiple host support
Matthew Wild <mwild1@gmail.com>
parents: 600
diff changeset
   328
end);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   329
1736
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   330
local function handle_s2s_destroyed(event)
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   331
	local session = event.session;
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   332
	local queue = session.outgoing_stanza_queue;
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   333
	if queue and #queue > 0 then
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   334
		session.log("warn", "Destroying session with %d unacked stanzas", #queue);
1885
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   335
		if s2s_resend then
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   336
			for i = 1, #queue do
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   337
				module:send(queue[i]);
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   338
			end
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   339
			session.outgoing_stanza_queue = nil;
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   340
		else
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   341
			handle_unacked_stanzas(session);
3683eb95bc1a mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents: 1737
diff changeset
   342
		end
1736
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   343
	end
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   344
end
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   345
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   346
module:hook("s2sout-destroyed", handle_s2s_destroyed);
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   347
module:hook("s2sin-destroyed", handle_s2s_destroyed);
2f9ee9ed6267 mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents: 1710
diff changeset
   348
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   349
function handle_resume(session, stanza, xmlns_sm)
925
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   350
	if session.full_jid then
994
487cd02aada0 mod_smacks: Complain a little louder about clients trying to resume after resource binding
Kim Alvefur <zash@zash.se>
parents: 988
diff changeset
   351
		session.log("warn", "Tried to resume after resource binding");
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   352
		session.send(st.stanza("failed", { xmlns = xmlns_sm })
925
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   353
			:tag("unexpected-request", { xmlns = xmlns_errors })
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   354
		);
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   355
		return true;
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   356
	end
720b8268778e mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents: 908
diff changeset
   357
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   358
	local id = stanza.attr.previd;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   359
	local original_session = session_registry[id];
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   360
	if not original_session then
591
8042558336b6 mod_smacks: Log message when client tries to resume unknown session
Matthew Wild <mwild1@gmail.com>
parents: 589
diff changeset
   361
		session.log("debug", "Tried to resume non-existent session with id %s", id);
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   362
		session.send(st.stanza("failed", { xmlns = xmlns_sm })
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   363
			:tag("item-not-found", { xmlns = xmlns_errors })
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   364
		);
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   365
	elseif session.username == original_session.username
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   366
	and session.host == original_session.host then
589
322a14acd974 mod_smacks: Add log message on resume
Matthew Wild <mwild1@gmail.com>
parents: 587
diff changeset
   367
		session.log("debug", "mod_smacks resuming existing session...");
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   368
		-- TODO: All this should move to sessionmanager (e.g. session:replace(new_session))
623
c1f3958695ea mod_smacks: If a resumed session still has a connection open, close that connection before resuming
Matthew Wild <mwild1@gmail.com>
parents: 622
diff changeset
   369
		if original_session.conn then
c1f3958695ea mod_smacks: If a resumed session still has a connection open, close that connection before resuming
Matthew Wild <mwild1@gmail.com>
parents: 622
diff changeset
   370
			session.log("debug", "mod_smacks closing an old connection for this session");
c1f3958695ea mod_smacks: If a resumed session still has a connection open, close that connection before resuming
Matthew Wild <mwild1@gmail.com>
parents: 622
diff changeset
   371
			local conn = original_session.conn;
640
d87131b29bbd mod_smacks: Remove dependency on connlisteners (use sessions table shared by mod_c2s directly)
Matthew Wild <mwild1@gmail.com>
parents: 625
diff changeset
   372
			c2s_sessions[conn] = nil;
623
c1f3958695ea mod_smacks: If a resumed session still has a connection open, close that connection before resuming
Matthew Wild <mwild1@gmail.com>
parents: 622
diff changeset
   373
			conn:close();
c1f3958695ea mod_smacks: If a resumed session still has a connection open, close that connection before resuming
Matthew Wild <mwild1@gmail.com>
parents: 622
diff changeset
   374
		end
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   375
		original_session.ip = session.ip;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   376
		original_session.conn = session.conn;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   377
		original_session.send = session.send;
1640
ad6694f7b13c mod_smacks: Don't restore filters from original session after resumption, use new filters
Matthew Wild <mwild1@gmail.com>
parents: 1603
diff changeset
   378
		original_session.filter = session.filter;
1710
e4867211cddb mod_smacks: Set session upvalue of filter() to correct session
Kim Alvefur <zash@zash.se>
parents: 1709
diff changeset
   379
		original_session.filter.session = original_session;
1709
6fa220a9f36d mod_smacks: Move set of filters from new session to session being resumed
Kim Alvefur <zash@zash.se>
parents: 1708
diff changeset
   380
		original_session.filters = session.filters;
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   381
		original_session.stream = session.stream;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   382
		original_session.secure = session.secure;
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   383
		original_session.hibernating = nil;
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   384
		wrap_session(original_session, true);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   385
		-- Inform xmppstream of the new session (passed to its callbacks)
1520
2881d532f385 mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents: 1518
diff changeset
   386
		original_session.stream:set_session(original_session);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   387
		-- Similar for connlisteners
640
d87131b29bbd mod_smacks: Remove dependency on connlisteners (use sessions table shared by mod_c2s directly)
Matthew Wild <mwild1@gmail.com>
parents: 625
diff changeset
   388
		c2s_sessions[session.conn] = original_session;
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   389
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   390
		session.send(st.stanza("resumed", { xmlns = xmlns_sm,
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   391
			h = original_session.handled_stanza_count, previd = id }));
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   392
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   393
		-- Fake an <a> with the h of the <resume/> from the client
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   394
		original_session:dispatch_stanza(st.stanza("a", { xmlns = xmlns_sm,
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   395
			h = stanza.attr.h }));
1343
7dbde05b48a9 all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1325
diff changeset
   396
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   397
		-- Ok, we need to re-send any stanzas that the client didn't see
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   398
		-- ...they are what is now left in the outgoing stanza queue
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   399
		local queue = original_session.outgoing_stanza_queue;
2144
3a94b3cd31e2 mod_smacks: added new events for hibernation start/end
tmolitor <thilo@eightysoft.de>
parents: 2140
diff changeset
   400
		module:fire_event("smacks-hibernation-end", {origin = session, queue = queue});
1406
7d76dd2310ef mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents: 1405
diff changeset
   401
		session.log("debug", "#queue = %d", #queue);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   402
		for i=1,#queue do
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   403
			session.send(queue[i]);
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   404
		end
1406
7d76dd2310ef mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents: 1405
diff changeset
   405
		session.log("debug", "#queue = %d -- after send", #queue);
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   406
	else
755
bab7c4ace803 mod_smacks: Fix log statement
Kim Alvefur <zash@zash.se>
parents: 754
diff changeset
   407
		module:log("warn", "Client %s@%s[%s] tried to resume stream for %s@%s[%s]",
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   408
			session.username or "?", session.host or "?", session.type,
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   409
			original_session.username or "?", original_session.host or "?", original_session.type);
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   410
		session.send(st.stanza("failed", { xmlns = xmlns_sm })
345
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   411
			:tag("not-authorized", { xmlns = xmlns_errors }));
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   412
	end
445178d15b51 mod_smacks: Merge mod_fastreconnect (resumption support), fix a number of bugs, refactor the code and add some more comments to explain process
Matthew Wild <mwild1@gmail.com>
parents: 263
diff changeset
   413
	return true;
1298
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   414
end
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   415
module:hook_stanza(xmlns_sm2, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm2); end);
659da45a2b4b mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 1293
diff changeset
   416
module:hook_stanza(xmlns_sm3, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm3); end);
1737
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   417
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   418
local function handle_read_timeout(event)
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   419
	local session = event.session;
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   420
	if session.smacks then
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   421
		if session.awaiting_ack then
2094
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   422
			if session.awaiting_ack_timer then
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   423
				session.awaiting_ack_timer:stop();
1796a022dd29 mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents: 2093
diff changeset
   424
			end
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   425
			if session.delayed_ack_timer then
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   426
				session.delayed_ack_timer:stop();
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   427
			end
1737
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   428
			return false; -- Kick the session
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   429
		end
2095
ea95637cf041 mod_smacks: Log when sending <r> from read timeout event (0.10+)
Kim Alvefur <zash@zash.se>
parents: 2094
diff changeset
   430
		session.log("debug", "Sending <r> (read timeout)");
2255
48c3d64a3fc1 mod_smacks: Signal that we're about to send an ack request from read timeout event to prevent a duplicate request from outgoing stanza filter
Kim Alvefur <zash@zash.se>
parents: 2152
diff changeset
   431
		session.awaiting_ack = false;
1737
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   432
		(session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }));
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   433
		session.awaiting_ack = true;
2398
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   434
		session.delayed_ack_timer = module:add_timer(delayed_ack_timeout, function()
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   435
			delayed_ack_function(session);
4c27ebcf4cbd mod_smacks: added new event "smacks-ack-delayed" used by mod_cloud_notify and extended the readme file accordingly (also mention mod_smacks_offline and mod_smacks_noerror in readme file)
tmolitor <thilo@eightysoft.de>
parents: 2255
diff changeset
   436
		end);
1737
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   437
		return true;
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   438
	end
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   439
end
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   440
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   441
module:hook("s2s-read-timeout", handle_read_timeout);
9abd3dce619a mod_smacks: Handle the read timeout event (0.10+ only) and send an ack request, close the connection the second time if unanswerd
Kim Alvefur <zash@zash.se>
parents: 1736
diff changeset
   442
module:hook("c2s-read-timeout", handle_read_timeout);