mod_muc_restrict_pm/mod_muc_restrict_pm.lua
author Nicholas George <wirlaburla@worlio.com>
Fri, 24 May 2024 18:30:47 -0500
changeset 5918 d3610fb965d6
parent 5917 d82c0383106a
permissions -rw-r--r--
mod_muc_restrict_pm: Backport changes from upstream timber patch.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
     1
local st = require "util.stanza";
5918
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     2
local muc_util = module:require "muc/util";
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     3
local valid_roles = muc_util.valid_roles;
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     4
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     5
-- Backported backwards compatibility map (Thanks MattJ)
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     6
local compat_map = {
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     7
	everyone = "visitor";
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     8
	participants = "participant";
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
     9
	moderators = "moderator";
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    10
	members = "affiliated";
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    11
};
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    12
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    13
local function get_allow_pm(room)
5918
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    14
	local val = room._data.allow_pm;
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    15
	return compat_map[val] or val or 'visitor';
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    16
end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    17
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    18
local function set_allow_pm(room, val)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    19
	if get_allow_pm(room) == val then return false; end
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    20
	room._data.allow_pm = val;
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    21
	return true;
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    22
end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    23
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    24
local function get_allow_modpm(room)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    25
	return room._data.allow_modpm or false;
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    26
end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    27
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    28
local function set_allow_modpm(room, val)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    29
	if get_allow_modpm(room) == val then return false; end
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    30
	room._data.allow_modpm = val;
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    31
	return true;
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    32
end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    33
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    34
module:hook("muc-config-form", function(event)
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    35
	local pmval = get_allow_pm(event.room);
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    36
	table.insert(event.form, {
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    37
		name = 'muc#allow_pm';
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    38
		type = 'list-single';
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    39
		label = 'Allow PMs from';
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    40
		options = {
5918
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    41
			{ value = 'visitor', label = 'Everyone', default = pmval == 'visitor' },
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    42
			{ value = 'participant', label = 'Participants', default = pmval == 'participant' },
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    43
			{ value = 'affiliated', label = 'Members', default = pmval == 'affiliated' },
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    44
			{ value = 'moderator', label = 'Moderators', default = pmval == 'moderator' },
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    45
			{ value = 'none', label = 'No one', default = pmval == 'none' }
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    46
		}
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    47
	});
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    48
	table.insert(event.form, {
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    49
		name = 'muc#allow_modpm';
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    50
		type = 'boolean';
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    51
		label = 'Allow PMs to moderators';
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    52
		value = get_allow_modpm(event.room)
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    53
	});
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    54
end);
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    55
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    56
module:hook("muc-config-submitted/muc#allow_pm", function(event)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    57
	if set_allow_pm(event.room, event.value) then
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    58
		event.status_codes["104"] = true;
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    59
	end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    60
end);
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    61
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    62
module:hook("muc-config-submitted/muc#allow_modpm", function(event)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    63
	if set_allow_modpm(event.room, event.value) then
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    64
		event.status_codes["104"] = true;
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    65
	end
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    66
end);
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    67
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    68
module:hook("muc-private-message", function(event)
5916
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    69
	local stanza, room = event.stanza, event.room;
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    70
	local from_occupant = room:get_occupant_by_nick(stanza.attr.from);
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    71
	local to_occupant = room:get_occupant_by_nick(stanza.attr.to);
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    72
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    73
	-- To self is always okay
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    74
	if to_occupant.bare_jid == from_occupant.bare_jid then return; end
5916
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    75
5918
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    76
	if get_allow_modpm(room) then
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    77
		if to_occupant and to_occupant.role == 'moderator'
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    78
		or from_occupant and from_occupant.role == "moderator" then
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    79
			return; -- Allow to/from moderators
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    80
		end
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    81
	end
5916
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    82
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    83
	local pmval = get_allow_pm(room);
5918
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    84
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    85
	-- Backported improved handling (Thanks MattJ)
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    86
	if pmval ~= "none" then
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    87
		if pmval == "affiliated" and room:get_affiliation(from_occupant.bare_jid) then
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    88
			return; -- Allow from affiliated users
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    89
		elseif valid_roles[from_occupant.role] >= valid_roles[pmval] then
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    90
			return; -- Allow from a permitted role
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    91
		end
d3610fb965d6 mod_muc_restrict_pm: Backport changes from upstream timber patch.
Nicholas George <wirlaburla@worlio.com>
parents: 5917
diff changeset
    92
	end
5916
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    93
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    94
	room:route_to_occupant(
9d0270680d1f mod_muc_restrict_pm: fix lua warnings
Nicholas George <wirlaburla@worlio.com>
parents: 5914
diff changeset
    95
		from_occupant,
5917
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    96
		st.error_reply(stanza, "cancel", "policy-violation", "Private messages are restricted", room.jid)
d82c0383106a mod_muc_restrict_pm: small rewrite. improves room config options
Nicholas George <wirlaburla@worlio.com>
parents: 5916
diff changeset
    97
		);
5914
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    98
	return false;
7358d1b64b1d mod_muc_restrict_pm: Limit who may send and recieve MUC PMs
Nicholas George <wirlaburla@worlio.com>
parents:
diff changeset
    99
end, 1);