Software /
code /
prosody-modules
Annotate
mod_smacks/mod_smacks.lua @ 2608:362ca94192ee
mod_smacks: Add resumed session to event "smacks-hibernation-end"
Older versions of this event only have the "intermediate" session
in event.session (the one used to resume the existing session),
but not the resumed one.
This adds event.resumed which contains the resumed one alongside
to event.session.
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Sat, 11 Mar 2017 01:37:28 +0100 |
parent | 2596:ffb6646b4253 |
child | 2623:a65260300708 |
rev | line source |
---|---|
1670 | 1 -- XEP-0198: Stream Management for Prosody IM |
2 -- | |
3 -- Copyright (C) 2010-2015 Matthew Wild | |
4 -- Copyright (C) 2010 Waqas Hussain | |
5 -- Copyright (C) 2012-2015 Kim Alvefur | |
6 -- Copyright (C) 2012 Thijs Alkemade | |
7 -- Copyright (C) 2014 Florian Zeitz | |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
8 -- Copyright (C) 2016-2017 Thilo Molitor |
1670 | 9 -- |
10 -- This project is MIT/X11 licensed. Please see the | |
11 -- COPYING file in the source package for more information. | |
12 -- | |
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"; |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
15 local dep = require "util.dependencies"; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
16 local cache = dep.softreq("util.cache"); -- only available in prosody 0.10+ |
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
|
17 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
|
18 |
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
|
19 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
|
20 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
|
21 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
|
22 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
|
23 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
|
24 local timer = require "util.timer"; |
593
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:
592
diff
changeset
|
25 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
|
26 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
27 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
|
28 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
|
29 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas"; |
593
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:
592
diff
changeset
|
30 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
|
31 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
32 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
|
33 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
|
34 |
641
06a78cba6499
mod_smacks: get_option+_number
Matthew Wild <mwild1@gmail.com>
parents:
640
diff
changeset
|
35 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
|
36 local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", false); |
1881
3683eb95bc1a
mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents:
1733
diff
changeset
|
37 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
|
38 local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0); |
2394
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:
2251
diff
changeset
|
39 local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 60); |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
40 local max_hibernated_sessions = module:get_option_number("smacks_max_hibernated_sessions", 10); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
41 local max_old_sessions = module:get_option_number("smacks_max_old_sessions", 10); |
754
713c6791fbcc
mod_smacks: Import prosody.core_process_stanza()
Kim Alvefur <zash@zash.se>
parents:
642
diff
changeset
|
42 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
|
43 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
|
44 |
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
|
45 local c2s_sessions = module:shared("/*/c2s/sessions"); |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
46 |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
47 local function init_session_cache(max_entries, evict_callback) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
48 -- old prosody version < 0.10 (no limiting at all!) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
49 if not cache then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
50 local store = {}; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
51 return { |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
52 get = function(user, key) return store[user.."@"..key]; end; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
53 set = function(user, key, value) store[user.."@"..key] = value; end; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
54 }; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
55 end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
56 |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
57 -- use per user limited cache for prosody >= 0.10 |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
58 local stores = {}; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
59 return { |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
60 get = function(user, key) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
61 if not stores[user] then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
62 stores[user] = cache.new(max_entries, evict_callback); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
63 end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
64 return stores[user]:get(key); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
65 end; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
66 set = function(user, key, value) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
67 if not stores[user] then stores[user] = cache.new(max_entries, evict_callback); end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
68 stores[user]:set(key, value); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
69 -- remove empty caches completely |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
70 if not stores[user]:count() then stores[user] = nil; end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
71 end; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
72 }; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
73 end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
74 local old_session_registry = init_session_cache(max_old_sessions, nil); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
75 local session_registry = init_session_cache(max_hibernated_sessions, function(resumption_token, session) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
76 if session.destroyed then return; end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
77 session.log("warn", "User has too much hibernated sessions, removing oldest session (token: %s)", resumption_token); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
78 -- store old session's h values on force delete |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
79 -- save only actual h value and username/host (for security) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
80 old_session_registry.set(session.username, resumption_token, { |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
81 h = session.handled_stanza_count, |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
82 username = session.username, |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
83 host = session.host |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
84 }); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
85 return true; -- allow session to be removed from full cache to make room for new one |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
86 end); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
87 |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
88 local function stoppable_timer(delay, callback) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
89 local stopped = false; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
90 return { |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
91 stop = function () stopped = true end; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
92 module:add_timer(delay, function (t) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
93 if stopped then return; end |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
94 return callback(t); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
95 end); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
96 }; |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
97 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
|
98 |
2394
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:
2251
diff
changeset
|
99 local function delayed_ack_function(session) |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
100 -- fire event only if configured to do so and our session is not hibernated or destroyed |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
101 if delayed_ack_timeout > 0 and session.awaiting_ack |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
102 and not session.hibernating and not session.destroyed then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
103 session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d", |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
104 session.outgoing_stanza_queue and #session.outgoing_stanza_queue or 0); |
2394
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:
2251
diff
changeset
|
105 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:
2251
diff
changeset
|
106 end |
2494
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
107 session.delayed_ack_timer = nil; |
2394
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:
2251
diff
changeset
|
108 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:
2251
diff
changeset
|
109 |
591
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:
590
diff
changeset
|
110 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:
590
diff
changeset
|
111 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
|
112 |
591
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:
590
diff
changeset
|
113 local session_type = session.type; |
2417
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:
2394
diff
changeset
|
114 if session.username then |
591
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:
590
diff
changeset
|
115 if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm |
592
f9c73c1249cd
Update smacks to urn:xmpp:sm:3. Fix typo in can_do_smacks.
Thijs Alkemade <thijsalkemade@gmail.com>
parents:
591
diff
changeset
|
116 return false, "unexpected-request", "Client must bind a resource before enabling stream management"; |
591
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:
590
diff
changeset
|
117 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:
590
diff
changeset
|
118 return true; |
595
7693724881b3
Fix a typo in mod_smacks (type -> session_type).
Thijs Alkemade <thijsalkemade@gmail.com>
parents:
594
diff
changeset
|
119 elseif s2s_smacks and (session_type == "s2sin" or session_type == "s2sout") then |
591
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:
590
diff
changeset
|
120 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:
590
diff
changeset
|
121 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:
590
diff
changeset
|
122 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:
590
diff
changeset
|
123 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:
590
diff
changeset
|
124 |
263
41f1cac40560
mod_smacks: Fixed to use the correct events API.
Waqas Hussain <waqas20@gmail.com>
parents:
258
diff
changeset
|
125 module:hook("stream-features", |
41f1cac40560
mod_smacks: Fixed to use the correct events API.
Waqas Hussain <waqas20@gmail.com>
parents:
258
diff
changeset
|
126 function (event) |
591
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:
590
diff
changeset
|
127 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
|
128 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
|
129 event.features:tag("sm", sm3_attr):tag("optional"):up():up(); |
589
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:
588
diff
changeset
|
130 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
|
131 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
|
132 |
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
|
133 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
|
134 function (event) |
591
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:
590
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
141 local function request_ack_if_needed(session) |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
142 local queue = session.outgoing_stanza_queue; |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
143 if #queue > max_unacked_stanzas and session.awaiting_ack == nil then |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
144 session.log("debug", "Queuing <r> (in a moment)"); |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
145 session.awaiting_ack = false; |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
146 session.awaiting_ack_timer = stoppable_timer(1e-06, function () |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
147 if not session.awaiting_ack then |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
148 session.log("debug", "Sending <r> (inside timer, before send)"); |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
149 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })) |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
150 session.log("debug", "Sending <r> (inside timer, after send)"); |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
151 session.awaiting_ack = true; |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
152 if not session.delayed_ack_timer then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
153 session.delayed_ack_timer = stoppable_timer(delayed_ack_timeout, function() |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
154 delayed_ack_function(session); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
155 end); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
156 end |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
157 end |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
158 end); |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
159 end |
2494
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
160 -- Trigger "smacks-ack-delayed"-event if we added new (ackable) stanzas to the outgoing queue |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
161 -- and there isn't already a timer for this event running. |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
162 -- If we wouldn't do this, stanzas added to the queue after the first "smacks-ack-delayed"-event |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
163 -- would not trigger this event (again). |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
164 if #queue > max_unacked_stanzas and session.awaiting_ack and session.delayed_ack_timer == nil then |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
165 session.log("debug", "Calling delayed_ack_function directly (still waiting for ack)"); |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
166 delayed_ack_function(session); |
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
167 end |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
168 end |
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
169 |
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 local function outgoing_stanza_filter(stanza, session) |
1597
dc0cf2ba0e1a
mod_smacks: Stanzas don't have a ':' in their name
Kim Alvefur <zash@zash.se>
parents:
1539
diff
changeset
|
171 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
|
172 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
|
173 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
|
174 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
|
175 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
|
176 |
1599
8e006226e4c5
mod_smacks: Don't attach timestamps to 'iq' stanzas
Kim Alvefur <zash@zash.se>
parents:
1598
diff
changeset
|
177 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
|
178 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
|
179 end |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
180 |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
181 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
|
182 session.log("debug", "#queue = %d", #queue); |
1522
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
|
183 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
|
184 session.log("debug", "hibernating, stanza queued"); |
2087
e48dbb640408
mod_smacks: Drop stanzas instead of turning them into the empty string
Kim Alvefur <zash@zash.se>
parents:
1881
diff
changeset
|
185 return nil; |
1522
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
|
186 end |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
187 request_ack_if_needed(session); |
1520
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
188 end |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
189 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
|
190 end |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
191 |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
192 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
|
193 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
|
194 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
|
195 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
|
196 end |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
197 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
|
198 end |
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
199 |
1529
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
200 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
|
201 if not resume then |
1528
5ccb3ee2cf72
mod_smacks: Remove variable not used after 2881d532f385
Kim Alvefur <zash@zash.se>
parents:
1527
diff
changeset
|
202 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
|
203 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
|
204 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
205 |
2122
3f788f18cc10
mod_smacks: Adjust filter priorities to avoid conflict with mod_websocket
Kim Alvefur <zash@zash.se>
parents:
2091
diff
changeset
|
206 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
|
207 |
c15cea87036f
mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents:
987
diff
changeset
|
208 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
|
209 function session.close(...) |
c15cea87036f
mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents:
987
diff
changeset
|
210 if session.resumption_token then |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
211 session_registry.set(session.username, session.resumption_token, nil); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
212 old_session_registry.set(session.username, session.resumption_token, nil); |
988
c15cea87036f
mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents:
987
diff
changeset
|
213 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
|
214 end |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
215 -- send out last ack as per revision 1.5.2 of XEP-0198 |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
216 if session.smacks then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
217 (session.sends2s or session.send)(st.stanza("a", { xmlns = session.smacks, h = tostring(session.handled_stanza_count) })); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
218 end |
988
c15cea87036f
mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents:
987
diff
changeset
|
219 return session_close(...); |
c15cea87036f
mod_smacks: Wrap session:close() and make the session not resumable
Kim Alvefur <zash@zash.se>
parents:
987
diff
changeset
|
220 end |
1529
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
221 return session; |
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
222 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
223 |
1529
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
224 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
|
225 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
|
226 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
|
227 end |
2122
3f788f18cc10
mod_smacks: Adjust filter priorities to avoid conflict with mod_websocket
Kim Alvefur <zash@zash.se>
parents:
2091
diff
changeset
|
228 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
|
229 |
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
|
230 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
|
231 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
|
232 |
1529
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
233 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
|
234 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
|
235 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
|
236 return session; |
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
237 end |
16893646a458
mod_smacks: Move wrap_session() contents into separate direction-specific routines
Kim Alvefur <zash@zash.se>
parents:
1528
diff
changeset
|
238 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
239 function handle_enable(session, stanza, xmlns_sm) |
591
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:
590
diff
changeset
|
240 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:
590
diff
changeset
|
241 if not ok then |
590
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:
589
diff
changeset
|
242 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
|
243 (session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors})); |
590
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:
589
diff
changeset
|
244 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:
589
diff
changeset
|
245 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:
589
diff
changeset
|
246 |
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
|
247 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
|
248 session.smacks = xmlns_sm; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
249 |
1520
2881d532f385
mod_smacks: Use filters for queuing outgoing stanzas instead of wrapping session.send()
Kim Alvefur <zash@zash.se>
parents:
1518
diff
changeset
|
250 wrap_session(session, false); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
251 |
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
|
252 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
|
253 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
|
254 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
|
255 resume_token = uuid_generate(); |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
256 session_registry.set(session.username, resume_token, 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
|
257 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
|
258 end |
576
44b69c3d5351
mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents:
478
diff
changeset
|
259 (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
|
260 return true; |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
261 end |
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
262 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
|
263 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
|
264 |
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
|
265 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
|
266 function (session, stanza) |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
267 stoppable_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
|
268 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
|
269 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
|
270 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
|
271 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
|
272 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
|
273 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
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
283 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
|
284 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
|
285 session.smacks = xmlns_sm; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
286 |
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
|
287 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
|
288 |
44b69c3d5351
mod_smacks: Fix smacks on s2s connections, but disable it by default.
Kim Alvefur <zash@zash.se>
parents:
478
diff
changeset
|
289 -- FIXME Resume? |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
290 |
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
|
291 return true; |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
292 end |
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
293 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
|
294 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
|
295 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 -- Reply with <a> |
255
9b9b089407b1
mod_smacks: Fix to reply to stream for s2s sessions
Matthew Wild <mwild1@gmail.com>
parents:
220
diff
changeset
|
303 (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
|
304 return true; |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
305 end |
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
306 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
|
307 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
|
308 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
309 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
|
310 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
|
311 origin.awaiting_ack = nil; |
2090
1796a022dd29
mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents:
2089
diff
changeset
|
312 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:
2089
diff
changeset
|
313 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:
2089
diff
changeset
|
314 end |
2394
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:
2251
diff
changeset
|
315 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:
2251
diff
changeset
|
316 origin.delayed_ack_timer:stop(); |
2494
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
317 origin.delayed_ack_timer = nil; |
2394
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:
2251
diff
changeset
|
318 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
|
319 -- Remove handled stanzas from outgoing_stanza_queue |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
320 -- origin.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
|
321 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
|
322 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
|
323 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
|
324 end |
b631c8a8b9e7
mod_smacks: Assert that the 'h' attribute is present and a number
Kim Alvefur <zash@zash.se>
parents:
1406
diff
changeset
|
325 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
|
326 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
|
327 if handled_stanza_count > #queue then |
1416
7ddb522d9b28
mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
1408
diff
changeset
|
328 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
|
329 handled_stanza_count, #queue); |
1416
7ddb522d9b28
mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
1408
diff
changeset
|
330 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
|
331 for i=1,#queue do |
1416
7ddb522d9b28
mod_smacks: Fix logging (Thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents:
1408
diff
changeset
|
332 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
|
333 end |
263858d40ceb
mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents:
202
diff
changeset
|
334 end |
263858d40ceb
mod_smacks: Fix the logic for handling outgoing stanzas and ack requests
Matthew Wild <mwild1@gmail.com>
parents:
202
diff
changeset
|
335 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
|
336 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
|
337 end |
1406
7d76dd2310ef
mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
1405
diff
changeset
|
338 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
|
339 origin.last_acknowledged_stanza = origin.last_acknowledged_stanza + handled_stanza_count; |
2491
5fbca7de2088
mod_smacks: Send out more ack requests where needed
tmolitor <thilo@eightysoft.de>
parents:
2417
diff
changeset
|
340 request_ack_if_needed(origin) |
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
|
341 return true; |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
342 end |
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
343 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
|
344 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
|
345 |
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
|
346 --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
|
347 -- 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
|
348 -- 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
|
349 -- 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
|
350 |
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
|
351 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
|
352 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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 :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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 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
|
367 |
622
ce39df945de1
mod_smacks: Use pre-resource-unbind (0.9 feature) to fix reloadability and multiple host support
Matthew Wild <mwild1@gmail.com>
parents:
595
diff
changeset
|
368 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:
595
diff
changeset
|
369 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
|
370 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
|
371 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
|
372 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
|
373 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
|
374 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
|
375 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
|
376 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
|
377 else |
586
f733e7599ed6
mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
576
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 local resumption_token = session.resumption_token; |
2140
3a94b3cd31e2
mod_smacks: added new events for hibernation start/end
tmolitor <thilo@eightysoft.de>
parents:
2136
diff
changeset
|
382 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
|
383 timer.add_task(resume_timeout, function () |
586
f733e7599ed6
mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
576
diff
changeset
|
384 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
|
385 -- 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
|
386 -- 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
|
387 -- (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
|
388 -- 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
|
389 local curr_session = full_sessions[session.full_jid]; |
1598
043d08448d87
mod_smacks: Remove negation of condition, most likely a leftover from debugging
Kim Alvefur <zash@zash.se>
parents:
1597
diff
changeset
|
390 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
|
391 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
|
392 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
|
393 -- 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
|
394 -- 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
|
395 and session.hibernating == hibernate_time then |
586
f733e7599ed6
mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
576
diff
changeset
|
396 session.log("debug", "Destroying session for hibernating too long"); |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
397 session_registry.set(session.username, session.resumption_token, nil); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
398 -- save only actual h value and username/host (for security) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
399 old_session_registry.set(session.username, session.resumption_token, { |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
400 h = session.handled_stanza_count, |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
401 username = session.username, |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
402 host = session.host |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
403 }); |
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
|
404 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
|
405 sessionmanager.destroy_session(session); |
586
f733e7599ed6
mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
576
diff
changeset
|
406 else |
f733e7599ed6
mod_smacks: Add logging to hibernation and session destruction (thanks darkrain)
Matthew Wild <mwild1@gmail.com>
parents:
576
diff
changeset
|
407 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
|
408 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
|
409 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:
595
diff
changeset
|
410 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
|
411 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
412 |
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
|
413 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:
595
diff
changeset
|
414 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
|
415 |
1732
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
416 local function handle_s2s_destroyed(event) |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
417 local session = event.session; |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
418 local queue = session.outgoing_stanza_queue; |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
419 if queue and #queue > 0 then |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
420 session.log("warn", "Destroying session with %d unacked stanzas", #queue); |
1881
3683eb95bc1a
mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents:
1733
diff
changeset
|
421 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:
1733
diff
changeset
|
422 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:
1733
diff
changeset
|
423 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:
1733
diff
changeset
|
424 end |
3683eb95bc1a
mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents:
1733
diff
changeset
|
425 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:
1733
diff
changeset
|
426 else |
3683eb95bc1a
mod_smacks: Add experimental resending of unacked messages in s2s queues (disabled by default)
Kim Alvefur <zash@zash.se>
parents:
1733
diff
changeset
|
427 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:
1733
diff
changeset
|
428 end |
1732
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
429 end |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
430 end |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
431 |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
432 module:hook("s2sout-destroyed", handle_s2s_destroyed); |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
433 module:hook("s2sin-destroyed", handle_s2s_destroyed); |
2f9ee9ed6267
mod_smacks: Handle unacked messages in s2s queues
Kim Alvefur <zash@zash.se>
parents:
1706
diff
changeset
|
434 |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
435 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
|
436 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
|
437 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
|
438 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
|
439 :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
|
440 ); |
720b8268778e
mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents:
908
diff
changeset
|
441 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
|
442 end |
720b8268778e
mod_smacks: Don't allow steam resumption onto a stream after resource binding
Kim Alvefur <zash@zash.se>
parents:
908
diff
changeset
|
443 |
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
|
444 local id = stanza.attr.previd; |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
445 local original_session = session_registry.get(session.username, id); |
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
|
446 if not original_session then |
588
8042558336b6
mod_smacks: Log message when client tries to resume unknown session
Matthew Wild <mwild1@gmail.com>
parents:
587
diff
changeset
|
447 session.log("debug", "Tried to resume non-existent session with id %s", id); |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
448 local old_session = old_session_registry.get(session.username, id); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
449 if old_session and session.username == old_session.username |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
450 and session.host == old_session.host |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
451 and old_session.h then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
452 session.send(st.stanza("failed", { xmlns = xmlns_sm, h = tostring(old_session.h) }) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
453 :tag("item-not-found", { xmlns = xmlns_errors }) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
454 ); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
455 else |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
456 session.send(st.stanza("failed", { xmlns = xmlns_sm }) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
457 :tag("item-not-found", { xmlns = xmlns_errors }) |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
458 ); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
459 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
|
460 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
|
461 and session.host == original_session.host then |
587
322a14acd974
mod_smacks: Add log message on resume
Matthew Wild <mwild1@gmail.com>
parents:
586
diff
changeset
|
462 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
|
463 -- 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
|
464 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
|
465 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
|
466 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
|
467 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 original_session.send = session.send; |
1637
ad6694f7b13c
mod_smacks: Don't restore filters from original session after resumption, use new filters
Matthew Wild <mwild1@gmail.com>
parents:
1599
diff
changeset
|
473 original_session.filter = session.filter; |
1706
e4867211cddb
mod_smacks: Set session upvalue of filter() to correct session
Kim Alvefur <zash@zash.se>
parents:
1705
diff
changeset
|
474 original_session.filter.session = original_session; |
1705
6fa220a9f36d
mod_smacks: Move set of filters from new session to session being resumed
Kim Alvefur <zash@zash.se>
parents:
1704
diff
changeset
|
475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 -- 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
|
481 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
|
482 -- 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
|
483 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
|
484 |
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
|
485 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
|
486 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
|
487 |
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
|
488 -- 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
|
489 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
|
490 h = stanza.attr.h })); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1325
diff
changeset
|
491 |
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
|
492 -- 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
|
493 -- ...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
|
494 local queue = original_session.outgoing_stanza_queue; |
2608
362ca94192ee
mod_smacks: Add resumed session to event "smacks-hibernation-end"
tmolitor <thilo@eightysoft.de>
parents:
2596
diff
changeset
|
495 module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue}); |
1406
7d76dd2310ef
mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
1405
diff
changeset
|
496 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
|
497 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
|
498 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
|
499 end |
1406
7d76dd2310ef
mod_smacks: Add more debug logging
Kim Alvefur <zash@zash.se>
parents:
1405
diff
changeset
|
500 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
|
501 else |
755 | 502 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
|
503 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
|
504 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
|
505 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
|
506 :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
|
507 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
|
508 return true; |
1298
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
509 end |
659da45a2b4b
mod_smacks: Handle both version 2 and version 3 namespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
1293
diff
changeset
|
510 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
|
511 module:hook_stanza(xmlns_sm3, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm3); end); |
1733
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:
1732
diff
changeset
|
512 |
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:
1732
diff
changeset
|
513 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:
1732
diff
changeset
|
514 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:
1732
diff
changeset
|
515 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:
1732
diff
changeset
|
516 if session.awaiting_ack then |
2090
1796a022dd29
mod_smacks: Keep timer object around and stop it when needed (trunk only)
Kim Alvefur <zash@zash.se>
parents:
2089
diff
changeset
|
517 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:
2089
diff
changeset
|
518 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:
2089
diff
changeset
|
519 end |
2394
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:
2251
diff
changeset
|
520 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:
2251
diff
changeset
|
521 session.delayed_ack_timer:stop(); |
2494
d300ae5dba87
mod_smacks: Fix some bugs with smacks-ack-delayed event triggering.
tmolitor <thilo@eightysoft.de>
parents:
2491
diff
changeset
|
522 session.delayed_ack_timer = nil; |
2394
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:
2251
diff
changeset
|
523 end |
1733
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:
1732
diff
changeset
|
524 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:
1732
diff
changeset
|
525 end |
2091
ea95637cf041
mod_smacks: Log when sending <r> from read timeout event (0.10+)
Kim Alvefur <zash@zash.se>
parents:
2090
diff
changeset
|
526 session.log("debug", "Sending <r> (read timeout)"); |
2251
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:
2148
diff
changeset
|
527 session.awaiting_ack = false; |
1733
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:
1732
diff
changeset
|
528 (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:
1732
diff
changeset
|
529 session.awaiting_ack = true; |
2596
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
530 if not session.delayed_ack_timer then |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
531 session.delayed_ack_timer = stoppable_timer(delayed_ack_timeout, function() |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
532 delayed_ack_function(session); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
533 end); |
ffb6646b4253
Implement XEP-0198 revision 1.5.2 and limit number of hibernated sessions per user
tmolitor <thilo@eightysoft.de>
parents:
2494
diff
changeset
|
534 end |
1733
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:
1732
diff
changeset
|
535 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:
1732
diff
changeset
|
536 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:
1732
diff
changeset
|
537 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:
1732
diff
changeset
|
538 |
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:
1732
diff
changeset
|
539 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:
1732
diff
changeset
|
540 module:hook("c2s-read-timeout", handle_read_timeout); |