mod_muc_block_pm: Update to 0.12+ API, use roles instead of affiliations
The module was possibly broken with 0.12 before.
This changes the behavior to allow only messages to or from moderators.
--- a/mod_muc_block_pm/README.markdown Mon Jul 10 16:10:57 2023 +0200
+++ b/mod_muc_block_pm/README.markdown Wed Jul 12 15:47:20 2023 +0200
@@ -1,12 +1,11 @@
---
-summary: Prevent unaffiliated MUC participants from sending PMs
+summary: Prevent MUC participants from sending PMs
---
# Introduction
-This module prevents unaffiliated users from sending private messages in
-chat rooms, unless someone with an affiliation (member, admin etc)
-messages them first.
+This module prevents *participants* from sending private messages to
+anyone except *moderators*.
# Configuration
@@ -23,6 +22,5 @@
Branch State
-------- -----------------
- 0.9 Works
- 0.10 Should work
- 0.11 Should work
+ 0.11 Will **not** work
+ 0.12 Should work
--- a/mod_muc_block_pm/mod_muc_block_pm.lua Mon Jul 10 16:10:57 2023 +0200
+++ b/mod_muc_block_pm/mod_muc_block_pm.lua Wed Jul 12 15:47:20 2023 +0200
@@ -1,29 +1,18 @@
-local bare_jid = require"util.jid".bare;
-local st = require"util.stanza";
+local st = require "util.stanza";
--- Support both old and new MUC code
-local mod_muc = module:depends"muc";
-local rooms = rawget(mod_muc, "rooms");
-local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or
- function (jid)
- return rooms[jid];
+module:hook("muc-private-message", function(event)
+ local stanza, room = event.stanza, event.room;
+ local from_occupant = room:get_occupant_by_nick(stanza.attr.from);
+
+ if from_occupant and from_occupant.role == "moderator" then
+ return -- moderators may message anyone
end
-module:hook("message/full", function(event)
- local stanza, origin = event.stanza, event.origin;
- if stanza.attr.type == "error" then
- return
+ local to_occupant = room:get_occupant_by_nick(stanza.attr.to)
+ if to_occupant and to_occupant.role == "moderator" then
+ return -- messaging moderators is ok
end
- local to, from = stanza.attr.to, stanza.attr.from;
- local room = get_room_from_jid(bare_jid(to));
- local to_occupant = room and room._occupants[to];
- local from_occupant = room and room._occupants[room._jid_nick[from]]
- if not ( to_occupant and from_occupant ) then return end
- if from_occupant.affiliation then
- to_occupant._pm_block_override = true;
- elseif not from_occupant._pm_block_override then
- origin.send(st.error_reply(stanza, "cancel", "not-authorized", "Private messages are disabled"));
- return true;
- end
+ room:route_to_occupant(from_occupant, st.error_reply(stanza, "cancel", "policy-violation", "Private messages are disabled", room.jid))
+ return false;
end, 1);