annotate mod_muc_moderation/mod_muc_moderation.lua @ 5668:ecfd7aece33b

mod_measure_modules: Report module statuses via OpenMetrics Someone in the chat asked about a health check endpoint, which reminded me of mod_http_status, which provides access to module statuses with full details. After that, this idea came about, which seems natural. As noted in the README, it could be used to monitor that critical modules are in fact loaded correctly. As more modules use the status API, the more useful this module and mod_http_status becomes.
author Kim Alvefur <zash@zash.se>
date Fri, 06 Oct 2023 18:34:39 +0200
parents 2e30af180da5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3900
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
1 -- mod_muc_moderation
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
2 --
4754
4665df54719d mod_muc_moderation: Bump year
Kim Alvefur <zash@zash.se>
parents: 4750
diff changeset
3 -- Copyright (C) 2015-2021 Kim Alvefur
3900
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
4 --
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
5 -- This file is MIT licensed.
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
6 --
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
7 -- Implements: XEP-0425: Message Moderation
06971a04216f mod_muc_moderation: Add a copyright header
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
8 --
3897
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";
5611
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5170
diff changeset
30 local xmlns_occupant_id = "urn:xmpp:occupant-id:0";
3897
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
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
38 -- TODO error registry, requires Prosody 0.12+
3897
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
diff changeset
41 local function moderate(actor, room_jid, stanza_id, retract, reason)
3897
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
5170
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5169
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: 5169
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: 5169
diff changeset
47 -- nickname that can be used to retrieve the role.
3897
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);
4750
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4749
diff changeset
49 if not actor_nick then
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4749
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: 4749
diff changeset
51 if reserved_nickname then
4806
80f871bedcdf mod_muc_moderation: Fix actor JID when moderated from outside (thanks lovetox)
Kim Alvefur <zash@zash.se>
parents: 4754
diff changeset
52 actor_nick = room.jid .. "/" .. reserved_nickname;
4750
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4749
diff changeset
53 end
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4749
diff changeset
54 end
98429b646bd4 mod_muc_moderation: Use reserved nickname as fallback
Kim Alvefur <zash@zash.se>
parents: 4749
diff changeset
55
5170
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5169
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: 5169
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: 5169
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: 5169
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: 5169
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: 5169
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: 5169
diff changeset
62 end
4d6af8950016 mod_muc_moderation: Derive role from reserved nickname if occupant
Kim Alvefur <zash@zash.se>
parents: 5169
diff changeset
63
3897
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
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
77
3897
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
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
80 return false, "modify", "item-not-found";
3897
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 else
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
82 return false, "wait", "internal-server-error";
3897
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 })
4814
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
90
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
91 if retract then
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
92 announcement:tag("retract", { xmlns = xmlns_retract }):up();
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
93 end
3897
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
5611
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5170
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: 5170
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: 5170
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: 5170
diff changeset
102 end
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5170
diff changeset
103
5612
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5611
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: 5611
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: 5611
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: 5611
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: 5611
diff changeset
108 end
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5611
diff changeset
109
4814
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
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: 4806
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: 4806
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: 4806
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: 4806
diff changeset
114
5612
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5611
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: 5611
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: 5611
diff changeset
117
2e30af180da5 mod_muc_moderation: Stamp XEP-0421 occupant-id for the acting moderator
Kim Alvefur <zash@zash.se>
parents: 5611
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: 5611
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: 5611
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: 5611
diff changeset
121 end
5611
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5170
diff changeset
122 end
06fad22672e1 mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents: 5170
diff changeset
123
4814
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
124 if reason then
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
125 tombstone:text_tag("reason", reason);
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
126 end
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
127 tombstone:reset();
4814
5f12c75fd210 mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents: 4806
diff changeset
128
3897
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
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
131 return false, "wait", "internal-server-error";
3897
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);
3902
341850e8866f mod_muc_moderation: Broadcast retraction via method that saves it
Kim Alvefur <zash@zash.se>
parents: 3901
diff changeset
137 room:broadcast_message(announcement);
3897
3a96070f4a14 mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138
5169
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
139 return true;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
140 end
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
141
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
142 -- Main handling
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
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: 4814
diff changeset
145
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
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: 4814
diff changeset
148
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
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: 4814
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: 4814
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: 4814
diff changeset
153
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
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: 4814
diff changeset
156
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
diff changeset
158
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
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: 4814
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: 4814
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: 4814
diff changeset
162 return true;
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
163 end
1071a420ff6f mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4814
diff changeset
164
3897
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);