mod_muc_block_pm: Prevent unaffiliated users from sending private messages in MUC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_muc_block_pm/README.markdown Tue Feb 28 17:04:30 2017 +0100
@@ -0,0 +1,28 @@
+---
+summary: Prevent unaffiliated 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.
+
+# Configuration
+
+The module doesn't have any options, just load it onto a MUC component.
+
+``` lua
+Component "muc"
+modules_enabled = {
+ "muc_block_pm";
+}
+```
+
+# Compatibility
+
+ Branch State
+ -------- -----------------
+ 0.9 Works
+ 0.10 Should work
+ trunk *Does not work*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_muc_block_pm/mod_muc_block_pm.lua Tue Feb 28 17:04:30 2017 +0100
@@ -0,0 +1,20 @@
+local bare_jid = require"util.jid".bare;
+local st = require"util.stanza";
+
+local muc_rooms = module:depends"muc".rooms;
+
+module:hook("message/full", function(event)
+ local stanza, origin = event.stanza, event.origin;
+ local to, from = stanza.attr.to, stanza.attr.from;
+ local room = muc_rooms[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
+end, 1);