annotate mod_muc_slow_mode/mod_muc_slow_mode.lua @ 6319:04c3273cb81f

mod_auth_cyrus: Add empty 'profile' table to SASL handler objects This is for compatibility with Prosody's built-in util.sasl objects. A SASL profile table usually includes methods supported by the backend, which can be used by SASL mechanism handlers to perform operations (such as testing the password). It also optionally contains a 'cb' field with channel binding method handlers. The Cyrus backend doesn't support channel binding, and doesn't have the same concept of auth backend methods (it handles all that internally, and Prosody has no insight or control over it). Thus, we create an empty profile which informs Prosody that the SASL handler does not support any of the auth or channel binding methods. Some features will not work, but they didn't work anyway. This just makes it explicit. This fixes a traceback in mod_sasl2_fast, which expected SASL handlers to always contain a 'profile' field.
author Matthew Wild <mwild1@gmail.com>
date Thu, 04 Sep 2025 10:14:46 +0100
parents d7c207964aa5
children 919f26901b51
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5939
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
1 -- mod_muc_slow_mode
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
2 --
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
3 -- SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
4 -- SPDX-License-Identifier: AGPL-3.0-only
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
5 --
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
6 -- Implements: XEP-????: MUC Slow Mode (XEP to come).
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
7 --
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
8 -- Imports
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
9 local st = require "util.stanza";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
10 local jid_bare = require "util.jid".bare;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
11 local gettime = require 'socket'.gettime;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
12
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
13 -- Plugin dependencies
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
14 local mod_muc = module:depends "muc";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
15
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
16 local muc_util = module:require "muc/util";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
17 local valid_roles = muc_util.valid_roles;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
18
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
19 -- Namespaces
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
20 local xmlns_muc = "http://jabber.org/protocol/muc";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
21
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
22 -- Options
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
23
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
24 -- form_position: the position in the room config form (this value will be passed as priority for the "muc-config-form" hook).
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
25 -- Depending on your application, it is possible that the slow mode is more important than other fields (for example for a video streaming service).
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
26 -- So there is an option to change this.
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
27 -- By default, field will be between muc#roomconfig_changesubject and muc#roomconfig_moderatedroom
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
28 local form_position = module:get_option_number("slow_mode_duration_form_position") or 80-2;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
29
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
30 -- Getter/Setter
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
31 local function get_slow_mode_duration(room)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
32 return room._data.slow_mode_duration or 0;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
33 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
34
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
35 local function set_slow_mode_duration(room, duration)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
36 if duration then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
37 duration = assert(tonumber(duration), "Slow mode duration is not a valid number");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
38 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
39 if duration and duration < 0 then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
40 duration = 0;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
41 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
42
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
43 if get_slow_mode_duration(room) == duration then return false; end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
44
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
45 room._data.slow_mode_duration = duration;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
46 return true;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
47 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
48
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
49 -- Discovering support
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
50 local function add_disco_form(event)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
51 table.insert(event.form, {
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
52 name = "muc#roominfo_slow_mode_duration";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
53 value = "";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
54 });
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
55 event.formdata["muc#roominfo_slow_mode_duration"] = get_slow_mode_duration(event.room);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
56 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
57
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
58 module:hook("muc-disco#info", add_disco_form);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
59
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
60 -- Config form declaration
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
61 local function add_form_option(event)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
62 table.insert(event.form, {
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
63 name = "muc#roomconfig_slow_mode_duration";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
64 type = "text-single";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
65 datatype = "xs:integer";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
66 range_min = 0;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
67 label = "Slow Mode (0=disabled, any positive integer= users can send a message every X seconds.)";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
68 -- desc = "";
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
69 value = get_slow_mode_duration(event.room);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
70 });
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
71 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
72
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
73 module:hook("muc-config-submitted/muc#roomconfig_slow_mode_duration", function(event)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
74 if set_slow_mode_duration(event.room, event.value) then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
75 -- status 104 = configuration change: Inform occupants that a non-privacy-related room configuration change has occurred
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
76 event.status_codes["104"] = true;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
77 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
78 end);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
79
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
80 module:hook("muc-config-form", add_form_option, form_position);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
81
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
82 -- handling groupchat messages
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
83 function handle_groupchat(event)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
84 local origin, stanza = event.origin, event.stanza;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
85 local room = event.room;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
86
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
87 -- only consider messages with body (ie: ignore chatstate and other non-text xmpp messages)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
88 local body = stanza:get_child_text("body")
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
89 if not body or #body < 1 then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
90 -- module:log("debug", "No body, message accepted");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
91 return;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
92 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
93
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
94 local duration = get_slow_mode_duration(room) or 0;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
95 if duration <= 0 then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
96 -- no slow mode for this room
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
97 -- module:log("debug", "No slow mode for this room");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
98 return;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
99 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
100
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
101 -- Checking user's permissions (moderators are not subject to slow mode)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
102 local actor = stanza.attr.from;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
103 local actor_nick = room:get_occupant_jid(actor);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
104 local actor_jid = jid_bare(actor);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
105 -- Only checking role, not affiliation (slow mode only applies on users currently connected to the room)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
106 local role = room:get_role(actor_nick);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
107 if valid_roles[role or "none"] >= valid_roles.moderator then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
108 -- user bypasses the slow mode.
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
109 -- module:log("debug", "User is moderator, bypassing slow mode");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
110 return;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
111 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
112
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
113 if not room.slow_mode_last_messages then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
114 -- We store last message time for each users in room.slow_mode_last_messages:
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
115 -- * key: bare jid (without the nickname)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
116 -- * value: last message timestamp
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
117 -- If room is cleared from memory, these data are lost. But should not be an issue.
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
118 -- For now, i don't clean slow_mode_last_messages, it should not use too much memory.
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
119 -- module:log("debug", "Initializing slow_mode_last_messages for the room.");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
120 room.slow_mode_last_messages = {};
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
121 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
122
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
123 local now = gettime();
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
124 local previous = room.slow_mode_last_messages[actor_jid];
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
125 -- module:log(
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
126 -- "debug",
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
127 -- "Last message for user %s was at %s, now is %s, duration is %s, now - previous is %s",
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
128 -- actor_jid,
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
129 -- previous or 0,
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
130 -- now,
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
131 -- duration,
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
132 -- (now - (previous or 0))
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
133 -- );
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
134 if ((not previous) or (now - previous > duration)) then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
135 -- module:log("debug", "Message accepted");
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
136 room.slow_mode_last_messages[actor_jid] = now;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
137 return;
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
138 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
139
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
140 module:log("debug", "Bouncing message for user %s", actor_nick);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
141 local reply = st.error_reply(
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
142 stanza,
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
143 -- error_type = 'wait' (see descriptions in RFC 6120 https://xmpp.org/rfcs/rfc6120.html#stanzas-error-syntax)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
144 "wait",
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
145 -- error_condition = 'policy-violation' (see RFC 6120 Defined Error Conditions https://xmpp.org/rfcs/rfc6120.html#stanzas-error-conditions)
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
146 "policy-violation",
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
147 "You have exceeded the limit imposed by the slow mode in this room. You have to wait " .. duration .. " seconds between messages. Please try again later"
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
148 );
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
149
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
150 -- Note: following commented lines were inspired by mod_muc_limits, but it seems it is not required.
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
151 -- if body then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
152 -- reply:up():tag("body"):text(body):up();
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
153 -- end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
154 -- local x = stanza:get_child("x", xmlns_muc);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
155 -- if x then
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
156 -- reply:add_child(st.clone(x));
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
157 -- end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
158
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
159 origin.send(reply);
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
160 return true; -- stoping propagation
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
161 end
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
162
d7c207964aa5 mod_muc_slow_mode: initial commit.
John Livingston <git@john-livingston.fr>
parents:
diff changeset
163 module:hook("muc-occupant-groupchat", handle_groupchat);