annotate mod_cloud_notify_filters/mod_cloud_notify_filters.lua @ 5302:ba94a5301985

mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
author Matthew Wild <mwild1@gmail.com>
date Tue, 04 Apr 2023 18:09:48 +0100
parents 6872e55cfb92
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4336
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local jid = require "util.jid";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local xmlns_push = "urn:xmpp:push:0";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local xmlns_push_filter_unknown = "tigase:push:filter:ignore-unknown:0";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local xmlns_push_filter_muted = "tigase:push:filter:muted:0";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local xmlns_push_filter_groupchat = "tigase:push:filter:groupchat:0";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local xmlns_references = "urn:xmpp:reference:0";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 -- https://xeps.tigase.net//docs/push-notifications/encrypt/#41-discovering-support
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local function account_disco_info(event)
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 event.reply:tag("feature", {var=xmlns_push_filter_unknown}):up();
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 event.reply:tag("feature", {var=xmlns_push_filter_muted}):up();
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 event.reply:tag("feature", {var=xmlns_push_filter_groupchat}):up();
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 module:hook("account-disco-info", account_disco_info);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 function handle_register(event)
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 local enable = event.stanza:get_child("enable", xmlns_push);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local filter_unknown = enable:get_child("ignore-unknown", xmlns_push_filter_unknown);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 if filter_unknown then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 event.push_info.filter_unknown = true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local filter_muted = enable:get_child("muted", xmlns_push_filter_muted);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 if filter_muted then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 local muted_jids = {};
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 for item in filter_muted:childtags("item") do
5302
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
31 local room_jid = jid.prep(item.attr.jid);
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
32 if not room_jid then
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
33 module:log("warn", "Skipping invalid JID: <%s>", room_jid);
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
34 else
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
35 muted_jids[room_jid] = true;
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
36 end
4336
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 event.push_info.muted_jids = muted_jids;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local filter_groupchat = enable:get_child("groupchat", xmlns_push_filter_groupchat);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 if filter_groupchat then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 local groupchat_rules = {};
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 for item in filter_groupchat:childtags("room") do
5302
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
45 local room_jid = jid.prep(item.attr.jid);
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
46 if not room_jid then
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
47 module:log("warn", "Skipping invalid JID: <%s>", item.attr.jid);
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
48 else
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
49 groupchat_rules[room_jid] = {
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
50 when = item.attr.allow;
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
51 nick = item.attr.nick;
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
52 };
ba94a5301985 mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents: 4336
diff changeset
53 end
4336
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 event.push_info.groupchat_rules = groupchat_rules;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 function handle_push(event)
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local push_info = event.push_info;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 local stanza = event.original_stanza;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 local user_name, user_host = jid.split(stanza.attr.to);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 local sender_jid = jid.bare(stanza.attr.from);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 if push_info.filter_unknown then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 if user_host == module.host and not is_contact_subscribed(user_name, user_host, sender_jid) then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 event.reason = "Filtering: unknown sender";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 if push_info.muted_jids then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 if push_info.muted_jids[sender_jid] then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 event.reason = "Filtering: muted";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 if stanza.attr.type == "groupchat" and push_info.groupchat_rules then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local rule = push_info.groupchat_rules[sender_jid];
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 if rule then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 if rule.when == "never" then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 event.reason = "Filtering: muted group chat";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 elseif rule.when == "mentioned" then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local mentioned = false;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 local our_uri = "xmpp:"..jid.bare(stanza.attr.to);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 local our_muc_uri = rule.nick and "xmpp:"..sender_jid.."/"..rule.nick;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 for reference in stanza:childtags("reference", xmlns_references) do
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 if reference.attr.type == "mention" then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 local mention_uri = reference.attr.uri;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 if mention_uri == our_uri or mention_uri == our_muc_uri then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 mentioned = true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 break;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 if not mentioned then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 event.reason = "Filtering: not mentioned";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 module:hook("cloud_notify/registration", handle_register);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 module:hook("cloud_notify/push", handle_push);
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109