Mercurial > prosody-modules
annotate mod_cloud_notify_filters/mod_cloud_notify_filters.lua @ 5359:230fc6a0c086
mod_http_oauth2: Use new Lua pattern schema properties
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 22 Apr 2023 16:29:56 +0200 |
parents | ba94a5301985 |
children |
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 |