Mercurial > prosody-modules
annotate mod_muc_moderation/mod_muc_moderation.lua @ 6092:bd3ff802d883
mod_anti_spam: Fix another traceback for origin sessions without an IP
This is likely to be the case for stanzas originating from local hosts, for
example (so not true s2s). It should be safe to bypass the IP check for those.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 28 Dec 2024 21:02:08 +0000 |
| parents | 4b677e445b8a |
| children | bcad6baa4fc3 |
| 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 | 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 |
|
5942
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
86 local actor_occupant = room:get_occupant_by_real_jid(actor) or room:new_occupant(jid.bare(actor), actor_nick); |
|
3897
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 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
|
89 :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
|
90 :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
|
91 |
|
5942
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
92 if room.get_occupant_id then |
|
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
93 -- This isn't a regular broadcast message going through the events occupant_id.lib hooks so we do this here |
|
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
94 announcement:add_child(st.stanza("occupant-id", { xmlns = xmlns_occupant_id; id = room:get_occupant_id(actor_occupant) })); |
|
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
95 end |
|
5ccc03c33158
mod_muc_moderation: Fix a regression. Actor occupant-id was not added under the moderated tag, but at the top level.
John Livingston <git@john-livingston.fr>
parents:
5612
diff
changeset
|
96 |
|
4814
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
97 if retract then |
|
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
98 announcement:tag("retract", { xmlns = xmlns_retract }):up(); |
|
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
99 end |
|
3897
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 if reason then |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 announcement:text_tag("reason", reason); |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 end |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 |
|
5611
06fad22672e1
mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents:
5170
diff
changeset
|
105 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
|
106 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
|
107 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
|
108 end |
|
06fad22672e1
mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents:
5170
diff
changeset
|
109 |
|
5943
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
110 announcement:reset(); |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
111 |
|
5944
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
112 local tombstone = nil; |
|
4814
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
113 if muc_log_archive.set and retract then |
|
5944
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
114 tombstone = st.message({ from = original.attr.from, type = "groupchat", id = original.attr.id }) |
|
4814
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
115 :tag("moderated", { xmlns = xmlns_moderate, by = actor_nick }) |
|
5943
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
116 :tag("retracted", { xmlns = xmlns_retract, stamp = dt.datetime() }):up(); |
|
5611
06fad22672e1
mod_muc_moderation: Copy XEP-0421 occupant-id from retracted message
Kim Alvefur <zash@zash.se>
parents:
5170
diff
changeset
|
117 |
|
4814
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
118 if reason then |
|
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
119 tombstone:text_tag("reason", reason); |
|
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
120 end |
|
5943
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
121 |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
122 if room.get_occupant_id then |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
123 if actor_occupant then |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
124 tombstone:add_child(st.stanza("occupant-id", { xmlns = xmlns_occupant_id; id = room:get_occupant_id(actor_occupant) })); |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
125 end |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
126 |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
127 if moderated_occupant_id then |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
128 -- Copy occupant id from moderated message |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
129 tombstone:add_direct_child(moderated_occupant_id); |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
130 end |
|
5076b78c95ef
mod_muc_moderation: Fix occupant-id placement in moderated tombstone.
John Livingston <git@john-livingston.fr>
parents:
5942
diff
changeset
|
131 end |
|
5169
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
132 tombstone:reset(); |
|
5944
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
133 end |
|
4814
5f12c75fd210
mod_muc_moderation: Handle non-retraction moderation
Kim Alvefur <zash@zash.se>
parents:
4806
diff
changeset
|
134 |
|
5944
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
135 -- fire an event, that can be used to cancel the moderation, or modify stanzas. |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
136 local event = { |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
137 room = room; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
138 announcement = announcement; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
139 tombstone = tombstone; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
140 stanza_id = stanza_id; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
141 retract = retract; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
142 reason = reason; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
143 actor = actor; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
144 actor_nick = actor_nick; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
145 }; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
146 if module:fire_event("muc-moderate-message", event) then |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
147 -- TODO: allow to change the error message? |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
148 return false, "wait", "internal-server-error"; |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
149 end |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
150 |
|
4b677e445b8a
mod_muc_moderation: adding a new hook that can be used to cancel the moderation, or modify resulting stanzas.
John Livingston <git@john-livingston.fr>
parents:
5943
diff
changeset
|
151 if tombstone then |
|
3897
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 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
|
153 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
|
154 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
|
155 end |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 end |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 -- Done, tell people about it |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 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
|
160 room:broadcast_message(announcement); |
|
3897
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 |
|
5169
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 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
165 -- Main handling |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
166 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
|
167 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
|
168 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
169 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
|
170 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
|
171 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
172 -- 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
|
173 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
|
174 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
|
175 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
|
176 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
177 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
|
178 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
|
179 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
180 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
|
181 |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 return true; |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
186 end |
|
1071a420ff6f
mod_muc_moderation: Refactor to prepare for new version of XEP-0425
Kim Alvefur <zash@zash.se>
parents:
4814
diff
changeset
|
187 |
|
3897
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 origin.send(st.reply(stanza)); |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 return true; |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 end); |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 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
|
193 -- Ensure moderation messages are stored |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 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
|
195 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
|
196 end |
|
3a96070f4a14
mod_muc_moderation: Initial commit of XEP-0425: Message Moderation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 end, 1); |
