author | Matthew Wild <mwild1@gmail.com> |
Wed, 23 Mar 2022 13:42:44 +0000 | |
changeset 12467 | 788048158982 |
child 12981 | 74b9e05af71e |
permissions | -rw-r--r-- |
12467
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 |
local filters = require "util.filters"; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
local jid = require "util.jid"; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 |
local set = require "util.set"; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
local client_watchers = {}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
-- active_filters[session] = { |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 |
-- filter_func = filter_func; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
-- downstream = { cb1, cb2, ... }; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 |
-- } |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 |
local active_filters = {}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
local function subscribe_session_stanzas(session, handler, reason) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 |
if active_filters[session] then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
table.insert(active_filters[session].downstream, handler); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
if reason then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 |
handler(reason, nil, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 |
return; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 |
local downstream = { handler }; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
active_filters[session] = { |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 |
filter_in = function (stanza) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 |
module:log("debug", "NOTIFY WATCHER %d", #downstream); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 |
for i = 1, #downstream do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 |
downstream[i]("received", stanza, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 |
return stanza; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 |
end; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 |
filter_out = function (stanza) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
module:log("debug", "NOTIFY WATCHER %d", #downstream); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 |
for i = 1, #downstream do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 |
downstream[i]("sent", stanza, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
return stanza; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 |
end; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
downstream = downstream; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 |
}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 |
filters.add_filter(session, "stanzas/in", active_filters[session].filter_in); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
filters.add_filter(session, "stanzas/out", active_filters[session].filter_out); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 |
if reason then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 |
handler(reason, nil, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 |
local function unsubscribe_session_stanzas(session, handler, reason) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 |
local active_filter = active_filters[session]; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 |
if not active_filter then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 |
return; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 |
for i = #active_filter.downstream, 1, -1 do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
if active_filter.downstream[i] == handler then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 |
table.remove(active_filter.downstream, i); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 |
if reason then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 |
handler(reason, nil, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 |
if #active_filter.downstream == 0 then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 |
filters.remove_filter(session, "stanzas/in", active_filter.filter_in); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 |
filters.remove_filter(session, "stanzas/out", active_filter.filter_out); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
active_filters[session] = nil; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
local function unsubscribe_all_from_session(session, reason) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 |
local active_filter = active_filters[session]; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 |
if not active_filter then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 |
return; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 |
for i = #active_filter.downstream, 1, -1 do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 |
local handler = table.remove(active_filter.downstream, i); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 |
if reason then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 |
handler(reason, nil, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 |
filters.remove_filter(session, "stanzas/in", active_filter.filter_in); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 |
filters.remove_filter(session, "stanzas/out", active_filter.filter_out); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 |
active_filters[session] = nil; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 |
local function unsubscribe_handler_from_all(handler, reason) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 |
for session in pairs(active_filters) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 |
unsubscribe_session_stanzas(session, handler, reason); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 |
local s2s_watchers = {}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 |
module:hook("s2sin-established", function (event) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 |
for _, watcher in ipairs(s2s_watchers) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 |
if watcher.target_spec == event.session.from_host then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
subscribe_session_stanzas(event.session, watcher.handler, "opened"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 |
end); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 |
module:hook("s2sout-established", function (event) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 |
for _, watcher in ipairs(s2s_watchers) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 |
if watcher.target_spec == event.session.to_host then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 |
subscribe_session_stanzas(event.session, watcher.handler, "opened"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 |
end); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 |
module:hook("s2s-closed", function (event) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 |
unsubscribe_all_from_session(event.session, "closed"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 |
end); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 |
local watched_hosts = set.new(); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 |
local handler_map = setmetatable({}, { __mode = "kv" }); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 |
local function add_stanza_watcher(spec, orig_handler) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 |
local function filtering_handler(event_type, stanza, session) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 |
if stanza and spec.filter_spec then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 |
if spec.filter_spec.with_jid then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 |
if event_type == "sent" and (not stanza.attr.from or not jid.compare(stanza.attr.from, spec.filter_spec.with_jid)) then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 |
return; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
elseif event_type == "received" and (not stanza.attr.to or not jid.compare(stanza.attr.to, spec.filter_spec.with_jid)) then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 |
return; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 |
return orig_handler(event_type, stanza, session); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 |
handler_map[orig_handler] = filtering_handler; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 |
if spec.target_spec.jid then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 |
local target_is_remote_host = not jid.node(spec.target_spec.jid) and not prosody.hosts[spec.target_spec.jid]; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 |
if target_is_remote_host then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 |
-- Watch s2s sessions |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 |
table.insert(s2s_watchers, { |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 |
target_spec = spec.target_spec.jid; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 |
handler = filtering_handler; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 |
orig_handler = orig_handler; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 |
}); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 |
-- Scan existing s2sin for matches |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 |
for session in pairs(prosody.incoming_s2s) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 |
if spec.target_spec.jid == session.from_host then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 |
subscribe_session_stanzas(session, filtering_handler, "attached"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 |
-- Scan existing s2sout for matches |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 |
for local_host, local_session in pairs(prosody.hosts) do --luacheck: ignore 213/local_host |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 |
for remote_host, remote_session in pairs(local_session.s2sout) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 |
if spec.target_spec.jid == remote_host then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 |
subscribe_session_stanzas(remote_session, filtering_handler, "attached"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 |
else |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 |
table.insert(client_watchers, { |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 |
target_spec = spec.target_spec.jid; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 |
handler = filtering_handler; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 |
orig_handler = orig_handler; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 |
}); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 |
local host = jid.host(spec.target_spec.jid); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 |
if not watched_hosts:contains(host) and prosody.hosts[host] then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 |
module:context(host):hook("resource-bind", function (event) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 |
for _, watcher in ipairs(client_watchers) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 |
module:log("debug", "NEW CLIENT: %s vs %s", event.session.full_jid, watcher.target_spec); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 |
if jid.compare(event.session.full_jid, watcher.target_spec) then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 |
module:log("debug", "MATCH"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 |
subscribe_session_stanzas(event.session, watcher.handler, "opened"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 |
else |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 |
module:log("debug", "NO MATCH"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 |
end); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 |
module:context(host):hook("resource-unbind", function (event) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 |
unsubscribe_all_from_session(event.session, "closed"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 |
end); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
watched_hosts:add(host); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 |
for full_jid, session in pairs(prosody.full_sessions) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 |
if jid.compare(full_jid, spec.target_spec.jid) then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 |
subscribe_session_stanzas(session, filtering_handler, "attached"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 |
else |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 |
error("No recognized target selector"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
187 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 |
local function remove_stanza_watcher(orig_handler) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 |
local handler = handler_map[orig_handler]; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 |
unsubscribe_handler_from_all(handler, "detached"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 |
handler_map[orig_handler] = nil; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 |
for i = #client_watchers, 1, -1 do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 |
if client_watchers[i].orig_handler == orig_handler then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 |
table.remove(client_watchers, i); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
201 |
for i = #s2s_watchers, 1, -1 do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 |
if s2s_watchers[i].orig_handler == orig_handler then |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 |
table.remove(s2s_watchers, i); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 |
local function cleanup(reason) |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 |
client_watchers = {}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 |
s2s_watchers = {}; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 |
for session in pairs(active_filters) do |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 |
unsubscribe_all_from_session(session, reason or "cancelled"); |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 |
end |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 |
|
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 |
return { |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 |
add = add_stanza_watcher; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 |
remove = remove_stanza_watcher; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 |
cleanup = cleanup; |
788048158982
mod_debug_stanzas/watcher: New module library to dynamically 'watch' for stanzas
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 |
}; |