Annotate

plugins/muc/restrict_pm.lib.lua @ 13750:53c39fdb007f 13.0

mod_component: Don't return error reply for errors, fixes #1897
author Kim Alvefur <zash@zash.se>
date Sat, 22 Feb 2025 21:48:07 +0100
parent 13578:5fb7b9a9346f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13495
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Based on code from mod_muc_restrict_pm in prosody-modules@d82c0383106a
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- by Nicholas George <wirlaburla@worlio.com>
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
13578
5fb7b9a9346f MUC: Use fully qualified import
Kim Alvefur <zash@zash.se>
parents: 13495
diff changeset
4 local st = require "prosody.util.stanza";
13495
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local muc_util = module:require "muc/util";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local valid_roles = muc_util.valid_roles;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 -- COMPAT w/ prosody-modules allow_pm
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local compat_map = {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 everyone = "visitor";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 participants = "participant";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 moderators = "moderator";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 members = "affiliated";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local function get_allow_pm(room)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local val = room._data.allow_pm;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 return compat_map[val] or val or "visitor";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local function set_allow_pm(room, val)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 if get_allow_pm(room) == val then return false; end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 room._data.allow_pm = val;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 return true;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 local function get_allow_modpm(room)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 return room._data.allow_modpm or false;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local function set_allow_modpm(room, val)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 if get_allow_modpm(room) == val then return false; end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 room._data.allow_modpm = val;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 return true;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 module:hook("muc-config-form", function(event)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 local pmval = get_allow_pm(event.room);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 table.insert(event.form, {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 name = 'muc#roomconfig_allowpm';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 type = 'list-single';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 label = 'Allow private messages from';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 options = {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 { value = 'visitor', label = 'Everyone', default = pmval == 'visitor' };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 { value = 'participant', label = 'Participants', default = pmval == 'participant' };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 { value = 'moderator', label = 'Moderators', default = pmval == 'moderator' };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 { value = 'affiliated', label = "Members", default = pmval == "affiliated" };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 { value = 'none', label = 'No one', default = pmval == 'none' };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 }
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 });
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 table.insert(event.form, {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 name = '{xmpp:prosody.im}muc#allow_modpm';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 type = 'boolean';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 label = 'Always allow private messages to moderators';
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 value = get_allow_modpm(event.room)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 });
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 end);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 module:hook("muc-config-submitted/muc#roomconfig_allowpm", function(event)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 if set_allow_pm(event.room, event.value) then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 event.status_codes["104"] = true;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 module:hook("muc-config-submitted/{xmpp:prosody.im}muc#allow_modpm", function(event)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 if set_allow_modpm(event.room, event.value) then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 event.status_codes["104"] = true;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 local who_restricted = {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 none = "in this group";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 participant = "from guests";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 moderator = "from non-moderators";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 affiliated = "from non-members";
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 };
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 module:hook("muc-private-message", function(event)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 local stanza, room = event.stanza, event.room;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 local from_occupant = room:get_occupant_by_nick(stanza.attr.from);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 local to_occupant = room:get_occupant_by_nick(stanza.attr.to);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 -- To self is always okay
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 if to_occupant.bare_jid == from_occupant.bare_jid then return; end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 if get_allow_modpm(room) then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 if to_occupant and to_occupant.role == 'moderator'
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 or from_occupant and from_occupant.role == "moderator" then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 return; -- Allow to/from moderators
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 local pmval = get_allow_pm(room);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 if pmval ~= "none" then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 if pmval == "affiliated" and room:get_affiliation(from_occupant.bare_jid) then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 return; -- Allow from affiliated users
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 elseif valid_roles[from_occupant.role] >= valid_roles[pmval] then
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 module:log("debug", "Allowing PM: %s(%d) >= %s(%d)", from_occupant.role, valid_roles[from_occupant.role], pmval, valid_roles[pmval]);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 return; -- Allow from a permitted role
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 end
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 local msg = ("Private messages are restricted %s"):format(who_restricted[pmval]);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 module:log("debug", "Blocking PM from %s %s: %s", from_occupant.role, stanza.attr.from, msg);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 room:route_to_occupant(
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 from_occupant,
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 st.error_reply(stanza, "cancel", "policy-violation", msg, room.jid)
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 );
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 return false;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end, 1);
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 return {
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 get_allow_pm = get_allow_pm;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 set_allow_pm = set_allow_pm;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 get_allow_modpm = get_allow_modpm;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 set_allow_modpm = set_allow_modpm;
47e1df2d0a37 MUC: Add per-room PM restriction functionality (thanks Wirlaburla)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 };