mod_muc_moderation/mod_muc_moderation.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 5616 2e30af180da5
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3904
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     1
-- mod_muc_moderation
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     2
--
4758
4665df54719d mod_muc_moderation: Bump year
Kim Alvefur <zash@zash.se>
parents: 4754
diff changeset
     3
-- Copyright (C) 2015-2021 Kim Alvefur
3904
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     4
--
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     5
-- This file is MIT licensed.
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     6
--
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     7
-- Implements: XEP-0425: Message Moderation
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
     8
--
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
-- Imports
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local dt = require "util.datetime";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local id = require "util.id";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local jid = require "util.jid";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local st = require "util.stanza";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
-- Plugin dependencies
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local mod_muc = module:depends "muc";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
local muc_util = module:require "muc/util";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local valid_roles = muc_util.valid_roles;
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
local muc_log_archive = module:open_store("muc_log", "archive");
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
if not muc_log_archive.set then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	module:log("warn", "Selected archive storage module does not support message replacement, no tombstones will be saved");
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
-- Namespaces
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
local xmlns_fasten = "urn:xmpp:fasten:0";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
local xmlns_moderate = "urn:xmpp:message-moderate:0";
5615
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
    30
local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
local xmlns_retract = "urn:xmpp:message-retract:0";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
-- Discovering support
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
module:hook("muc-disco#info", function (event)
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
	event.reply:tag("feature", { var = xmlns_moderate }):up();
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
end);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    38
-- TODO error registry, requires Prosody 0.12+
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    40
-- moderate : function (string, string, string, boolean, string) : boolean, enum, enum, string
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    41
local function moderate(actor, room_jid, stanza_id, retract, reason)
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	local room_node = jid.split(room_jid);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	local room = mod_muc.get_room_from_jid(room_jid);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
5174
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    45
	-- Permissions is based on role, which is a property of a current occupant,
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    46
	-- so check if the actor is an occupant, otherwise if they have a reserved
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    47
	-- nickname that can be used to retrieve the role.
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	local actor_nick = room:get_occupant_jid(actor);
4754
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    49
	if not actor_nick then
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    50
		local reserved_nickname = room:get_affiliation_data(jid.bare(actor), "reserved_nickname");
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    51
		if reserved_nickname then
4810
80f871bedcdf mod_muc_moderation: Fix actor JID when moderated from outside (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 4758
diff changeset
    52
			actor_nick = room.jid .. "/" .. reserved_nickname;
4754
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    53
		end
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    54
	end
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4753
diff changeset
    55
5174
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    56
	-- Retrieve their current role, iff they are in the room, otherwise what they
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    57
	-- would have based on affiliation.
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    58
	local affiliation = room:get_affiliation(actor);
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    59
	local role = room:get_role(actor_nick) or room:get_default_role(affiliation);
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    60
	if valid_roles[role or "none"] < valid_roles.moderator then
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    61
		return false, "auth", "forbidden", "You need a role of at least 'moderator'";
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    62
	end
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5173
diff changeset
    63
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
	-- Original stanza to base tombstone on
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
	local original, err;
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	if muc_log_archive.get then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
		original, err = muc_log_archive:get(room_node, stanza_id);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
	else
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
		-- COMPAT missing :get API
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		err = "item-not-found";
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
		for i, item in muc_log_archive:find(room_node, { key = stanza_id, limit = 1 }) do
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
			if i == stanza_id then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
				original, err = item, nil;
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
			end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
		end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	end
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    77
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	if not original then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
		if err == "item-not-found" then
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    80
			return false, "modify", "item-not-found";
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
		else
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
    82
			return false, "wait", "internal-server-error";
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
		end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
	local announcement = st.message({ from = room_jid, type = "groupchat", id = id.medium(), })
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
		:tag("apply-to", { xmlns = xmlns_fasten, id = stanza_id })
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
			:tag("moderated", { xmlns = xmlns_moderate, by = actor_nick })
4818
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
    90
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
    91
	if retract then
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
    92
		announcement:tag("retract", { xmlns = xmlns_retract }):up();
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
    93
	end
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
	if reason then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
		announcement:text_tag("reason", reason);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
	end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
5615
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
    99
	local moderated_occupant_id = original:get_child("occupant-id", xmlns_occupant_id);
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   100
	if room.get_occupant_id and moderated_occupant_id then
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   101
		announcement:add_direct_child(moderated_occupant_id);
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   102
	end
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   103
5616
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   104
	local actor_occupant = room:get_occupant_by_real_jid(actor) or room:new_occupant(jid.bare(actor), actor_nick);
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   105
	if room.get_occupant_id then
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   106
		-- This isn't a regular broadcast message going through the events occupant_id.lib hooks so we do this here
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   107
		announcement:add_direct_child(st.stanza("occupant-id", { xmlns = xmlns_occupant_id; id = room:get_occupant_id(actor_occupant) }))
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   108
	end
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   109
4818
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   110
	if muc_log_archive.set and retract then
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   111
		local tombstone = st.message({ from = original.attr.from, type = "groupchat", id = original.attr.id })
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   112
			:tag("moderated", { xmlns = xmlns_moderate, by = actor_nick })
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   113
				:tag("retracted", { xmlns = xmlns_retract, stamp = dt.datetime() }):up();
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   114
5616
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   115
		if room.get_occupant_id then
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   116
			tombstone:add_direct_child(st.stanza("occupant-id", { xmlns = xmlns_occupant_id; id = room:get_occupant_id(actor_occupant) }))
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   117
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   118
			if moderated_occupant_id then
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   119
				-- Copy occupant id from moderated message
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   120
				tombstone:add_child(moderated_occupant_id);
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5615
diff changeset
   121
			end
5615
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   122
		end
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5174
diff changeset
   123
4818
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   124
		if reason then
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   125
			tombstone:text_tag("reason", reason);
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   126
		end
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   127
		tombstone:reset();
4818
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4810
diff changeset
   128
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
		local was_replaced = muc_log_archive:set(room_node, stanza_id, tombstone);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
		if not was_replaced then
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   131
			return false, "wait", "internal-server-error";
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
		end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
	-- Done, tell people about it
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
	module:log("info", "Message with id '%s' in room %s moderated by %s, reason: %s", stanza_id, room_jid, actor, reason);
3906
341850e8866f mod_muc_moderation: Broadcast retraction via method that saves it
Kim Alvefur <zash@zash.se>
parents: 3905
diff changeset
   137
	room:broadcast_message(announcement);
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
5173
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   139
	return true;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   140
end
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   141
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   142
-- Main handling
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   143
module:hook("iq-set/bare/" .. xmlns_fasten .. ":apply-to", function (event)
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   144
	local stanza, origin = event.stanza, event.origin;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   145
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   146
	local actor = stanza.attr.from;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   147
	local room_jid = stanza.attr.to;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   148
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   149
	-- Collect info we need
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   150
	local apply_to = stanza.tags[1];
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   151
	local moderate_tag = apply_to:get_child("moderate", xmlns_moderate);
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   152
	if not moderate_tag then return end -- some other kind of fastening?
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   153
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   154
	local reason = moderate_tag:get_child_text("reason");
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   155
	local retract = moderate_tag:get_child("retract", xmlns_retract);
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   156
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   157
	local stanza_id = apply_to.attr.id;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   158
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   159
	local ok, error_type, error_condition, error_text = moderate(actor, room_jid, stanza_id, retract, reason);
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   160
	if not ok then
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   161
		origin.send(st.error_reply(stanza, error_type, error_condition, error_text));
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   162
		return true;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   163
	end
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4818
diff changeset
   164
3901
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
	origin.send(st.reply(stanza));
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
	return true;
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   167
end);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   168
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   169
module:hook("muc-message-is-historic", function (event)
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   170
	-- Ensure moderation messages are stored
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   171
	if event.stanza.attr.from == event.room.jid then
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   172
		return event.stanza:get_child("apply-to", xmlns_fasten);
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
	end
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   174
end, 1);