annotate mod_cloud_notify_filters/mod_cloud_notify_filters.lua @ 5818:d3b69859553a

mod_password_policy: Change error type from 'cancel' to 'modify' This makes more sense, as the problem relates to the data that has been entered, and therefore the request could be retried with different data.
author Matthew Wild <mwild1@gmail.com>
date Mon, 08 Jan 2024 17:28:39 +0000
parents ba94a5301985
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