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