annotate mod_cloud_notify_filters/mod_cloud_notify_filters.lua @ 4537:53ee391ca689

mod_smacks: Fix traceback due to session being destroyed in send() Sending something can cause the OS to notice that the connection is dead and then the connection can be dead at this point. More likely if opportunistic_writes is enabled.
author Kim Alvefur <zash@zash.se>
date Thu, 01 Apr 2021 11:35:26 +0200
parents 6872e55cfb92
children ba94a5301985
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
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 muted_jids[jid.prep(item.attr.jid)] = true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 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
34 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 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
37 if filter_groupchat then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 local groupchat_rules = {};
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 for item in filter_groupchat:childtags("room") do
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 groupchat_rules[jid.prep(item.attr.jid)] = {
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 when = item.attr.allow;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 nick = item.attr.nick;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 };
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 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
46 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 function handle_push(event)
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 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
51 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
52 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
53 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
54
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 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
56 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
57 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
58 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 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
63 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
64 event.reason = "Filtering: muted";
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 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
70 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
71 if rule then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 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
73 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
74 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 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
76 local mentioned = false;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 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
78 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
79 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
80 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
81 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
82 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
83 mentioned = true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 break;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 if not mentioned then
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 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
90 return true;
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 end
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 end
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
6872e55cfb92 mod_cloud_notify_filters: New module to support push notification filters
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 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
98 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
99