author | Nicholas George <wirlaburla@worlio.com> |
Sat, 08 Jun 2024 03:28:25 -0500 | |
changeset 5926 | f408b8e603af |
parent 5306 | ba94a5301985 |
permissions | -rw-r--r-- |
4340
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 |
5306
ba94a5301985
mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents:
4340
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:
4340
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:
4340
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:
4340
diff
changeset
|
34 |
else |
ba94a5301985
mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents:
4340
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:
4340
diff
changeset
|
36 |
end |
4340
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 |
5306
ba94a5301985
mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents:
4340
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:
4340
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:
4340
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:
4340
diff
changeset
|
48 |
else |
ba94a5301985
mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents:
4340
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:
4340
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:
4340
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:
4340
diff
changeset
|
52 |
}; |
ba94a5301985
mod_cloud_notify_filters: Fix traceback when invalid JIDs are submitted
Matthew Wild <mwild1@gmail.com>
parents:
4340
diff
changeset
|
53 |
end |
4340
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 |