Mercurial > prosody-modules
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 |
| 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); |
