mod_cloud_notify_filters/mod_cloud_notify_filters.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:26:26 +0100
changeset 5063 5f1120c284c5
parent 4340 6872e55cfb92
child 5306 ba94a5301985
permissions -rw-r--r--
mod_cloud_notify_extensions: Add note about dependency Noting here because people might not click through to see it on the mod_cloud_notify_encrypted page.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
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