plugins/mod_debug_stanzas/watcher.lib.lua
author Kim Alvefur <zash@zash.se>
Thu, 28 Mar 2024 15:26:57 +0100
changeset 13472 98806cac64c3
parent 12981 74b9e05af71e
permissions -rw-r--r--
MUC: Switch to official XEP-0317 namespace for Hats (including compat) (thanks nicoco)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12467
diff changeset
     1
local filters = require "prosody.util.filters";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12467
diff changeset
     2
local jid = require "prosody.util.jid";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12467
diff changeset
     3
local set = require "prosody.util.set";
12467
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
};