Annotate

plugins/mod_debug_stanzas/watcher.lib.lua @ 12581:6ee9071c0a1f

Merge 0.12->trunk
author Kim Alvefur <zash@zash.se>
date Fri, 08 Jul 2022 19:36:07 +0200
parent 12463:788048158982
child 12977:74b9e05af71e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12463
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 };