Mercurial > prosody-modules
annotate mod_compat_muc_admin/mod_compat_muc_admin.lua @ 5173:460f78654864
mod_muc_rtbl: also filter messages
This was a bit tricky because we don't want to run the JIDs
through SHA256 on each message. Took a while to come up with this
simple plan of just caching the SHA256 of the JIDs on the
occupants.
This will leave some dirt in the occupants after unloading the
module, but that should be ok; once they cycle the room, the
hashes will be gone.
This is direly needed, otherwise, there is a tight race between
the moderation activities and the actors joining the room.
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Tue, 21 Feb 2023 21:37:27 +0100 |
parents | 15a8b717597b |
children |
rev | line source |
---|---|
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
1 local st = require "util.stanza"; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
2 local jid_split = require "util.jid".split; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
3 local jid_bare = require "util.jid".bare; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
4 local jid_prep = require "util.jid".prep; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
5 local log = require "util.logger".init("mod_muc"); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
6 local muc_host = module:get_host(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
7 |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
8 if not hosts[muc_host].modules.muc then -- Not a MUC host |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
9 module:log("error", "this module can only be used on muc hosts."); return false; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
10 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
11 |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
12 -- Constants and imported functions from muc.lib.lua |
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
13 local xmlns_ma, xmlns_mo = "http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#owner"; |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
14 local kickable_error_conditions = { |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
15 ["gone"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
16 ["internal-server-error"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
17 ["item-not-found"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
18 ["jid-malformed"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
19 ["recipient-unavailable"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
20 ["redirect"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
21 ["remote-server-not-found"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
22 ["remote-server-timeout"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
23 ["service-unavailable"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
24 ["malformed error"] = true; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
25 }; |
731
15a8b717597b
mod_compat_muc_admin: added missing import (thanke MattJ)
Marco Cirillo <maranda@lightwitch.org>
parents:
631
diff
changeset
|
26 local function get_error_condition(stanza) |
15a8b717597b
mod_compat_muc_admin: added missing import (thanke MattJ)
Marco Cirillo <maranda@lightwitch.org>
parents:
631
diff
changeset
|
27 local _, condition = stanza:get_error(); |
15a8b717597b
mod_compat_muc_admin: added missing import (thanke MattJ)
Marco Cirillo <maranda@lightwitch.org>
parents:
631
diff
changeset
|
28 return condition or "malformed error"; |
15a8b717597b
mod_compat_muc_admin: added missing import (thanke MattJ)
Marco Cirillo <maranda@lightwitch.org>
parents:
631
diff
changeset
|
29 end |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
30 local function is_kickable_error(stanza) |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
31 local cond = get_error_condition(stanza); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
32 return kickable_error_conditions[cond] and cond; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
33 end |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
34 local function build_unavailable_presence_from_error(stanza) |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
35 local type, condition, text = stanza:get_error(); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
36 local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error"); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
37 if text then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
38 error_message = error_message..": "..text; |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
39 end |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
40 return st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to}) |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
41 :tag('status'):text(error_message); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
42 end |
630
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
43 local function getUsingPath(stanza, path, getText) |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
44 local tag = stanza; |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
45 for _, name in ipairs(path) do |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
46 if type(tag) ~= 'table' then return; end |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
47 tag = tag:child_with_name(name); |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
48 end |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
49 if tag and getText then tag = table.concat(tag); end |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
50 return tag; |
ab2a1564da9b
mod_compat_muc_admin: adding last missing local (getUsingPath).
Marco Cirillo <maranda@lightwitch.org>
parents:
629
diff
changeset
|
51 end |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
52 local function getText(stanza, path) return getUsingPath(stanza, path, true); end |
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
53 |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
54 -- COMPAT: iq condensed function |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
55 hosts[muc_host].modules.muc.stanza_handler.muc_new_room.room_mt["compat_iq"] = function (self, origin, stanza, xmlns) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
56 local actor = stanza.attr.from; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
57 local affiliation = self:get_affiliation(actor); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
58 local current_nick = self._jid_nick[actor]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
59 local role = current_nick and self._occupants[current_nick].role or self:get_default_role(affiliation); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
60 local item = stanza.tags[1].tags[1]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
61 if item and item.name == "item" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
62 if stanza.attr.type == "set" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
63 local callback = function() origin.send(st.reply(stanza)); end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
64 if item.attr.jid then -- Validate provided JID |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
65 item.attr.jid = jid_prep(item.attr.jid); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
66 if not item.attr.jid then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
67 origin.send(st.error_reply(stanza, "modify", "jid-malformed")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
68 return; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
69 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
70 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
71 if not item.attr.jid and item.attr.nick then -- COMPAT Workaround for Miranda sending 'nick' instead of 'jid' when changing affiliation |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
72 local occupant = self._occupants[self.jid.."/"..item.attr.nick]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
73 if occupant then item.attr.jid = occupant.jid; end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
74 elseif not item.attr.nick and item.attr.jid then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
75 local nick = self._jid_nick[item.attr.jid]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
76 if nick then item.attr.nick = select(3, jid_split(nick)); end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
77 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
78 local reason = item.tags[1] and item.tags[1].name == "reason" and #item.tags[1] == 1 and item.tags[1][1]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
79 if item.attr.affiliation and item.attr.jid and not item.attr.role then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
80 local success, errtype, err = self:set_affiliation(actor, item.attr.jid, item.attr.affiliation, callback, reason); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
81 if not success then origin.send(st.error_reply(stanza, errtype, err)); end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
82 elseif item.attr.role and item.attr.nick and not item.attr.affiliation then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
83 local success, errtype, err = self:set_role(actor, self.jid.."/"..item.attr.nick, item.attr.role, callback, reason); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
84 if not success then origin.send(st.error_reply(stanza, errtype, err)); end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
85 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
86 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
87 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
88 elseif stanza.attr.type == "get" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
89 local _aff = item.attr.affiliation; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
90 local _rol = item.attr.role; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
91 if _aff and not _rol then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
92 if affiliation == "owner" or (affiliation == "admin" and _aff ~= "owner" and _aff ~= "admin") then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
93 local reply = st.reply(stanza):query(xmlns); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
94 for jid, affiliation in pairs(self._affiliations) do |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
95 if affiliation == _aff then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
96 reply:tag("item", {affiliation = _aff, jid = jid}):up(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
97 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
98 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
99 origin.send(reply); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
100 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
101 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
102 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
103 elseif _rol and not _aff then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
104 if role == "moderator" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
105 -- TODO allow admins and owners not in room? Provide read-only access to everyone who can see the participants anyway? |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
106 if _rol == "none" then _rol = nil; end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
107 local reply = st.reply(stanza):query(xmlns); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
108 for occupant_jid, occupant in pairs(self._occupants) do |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
109 if occupant.role == _rol then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
110 reply:tag("item", { |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
111 nick = select(3, jid_split(occupant_jid)), |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
112 role = _rol or "none", |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
113 affiliation = occupant.affiliation or "none", |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
114 jid = occupant.jid |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
115 }):up(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
116 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
117 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
118 origin.send(reply); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
119 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
120 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
121 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
122 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
123 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
124 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
125 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
126 elseif stanza.attr.type == "set" or stanza.attr.type == "get" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
127 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
128 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
129 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
130 |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
131 -- COMPAT: reworked handle_to_room function |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
132 hosts[muc_host].modules.muc.stanza_handler.muc_new_room.room_mt["handle_to_room"] = function (self, origin, stanza) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
133 local type = stanza.attr.type; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
134 local xmlns = stanza.tags[1] and stanza.tags[1].attr.xmlns; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
135 if stanza.name == "iq" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
136 if xmlns == "http://jabber.org/protocol/disco#info" and type == "get" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
137 origin.send(self:get_disco_info(stanza)); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
138 elseif xmlns == "http://jabber.org/protocol/disco#items" and type == "get" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
139 origin.send(self:get_disco_items(stanza)); |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
140 elseif xmlns == xmlns_ma or xmlns == xmlns_mo then |
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
141 if xmlns == xmlns_ma then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
142 self:compat_iq(origin, stanza, xmlns); |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
143 elseif xmlns == xmlns_mo and (type == "set" or type == "get") and stanza.tags[1].name == "query" then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
144 local owner_err = st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms"); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
145 if #stanza.tags[1].tags == 0 and stanza.attr.type == "get" then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
146 if self:get_affiliation(stanza.attr.from) ~= "owner" then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
147 origin.send(owner_err); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
148 else self:send_form(origin, stanza); end |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
149 elseif stanza.attr.type == "set" and stanza.tags[1]:get_child("x", "jabber:x:data") then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
150 if self:get_affiliation(stanza.attr.from) ~= "owner" then |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
151 origin.send(owner_err); |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
152 else self:process_form(origin, stanza); end |
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
153 elseif stanza.tags[1].tags[1].name == "destroy" then |
628
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
154 if self:get_affiliation(stanza.attr.from) == "owner" then |
631
c9084b4c14f0
mod_compat_muc_admin: corrected variable leftovers.
Marco Cirillo <maranda@lightwitch.org>
parents:
630
diff
changeset
|
155 local newjid = stanza.tags[1].tags[1].attr.jid; |
628
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
156 local reason, password; |
631
c9084b4c14f0
mod_compat_muc_admin: corrected variable leftovers.
Marco Cirillo <maranda@lightwitch.org>
parents:
630
diff
changeset
|
157 for _,tag in ipairs(stanza.tags[1].tags[1].tags) do |
628
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
158 if tag.name == "reason" then |
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
159 reason = #tag.tags == 0 and tag[1]; |
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
160 elseif tag.name == "password" then |
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
161 password = #tag.tags == 0 and tag[1]; |
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
162 end |
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
163 end |
628
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
164 self:destroy(newjid, reason, password); |
c72be31941fa
mod_compat_muc_admin: we shall make sure that only owners can destroy rooms and not everyone, isn't it?
Marco Cirillo <maranda@lightwitch.org>
parents:
627
diff
changeset
|
165 origin.send(st.reply(stanza)); |
629
7d4cde86b12e
mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
Marco Cirillo <maranda@lightwitch.org>
parents:
628
diff
changeset
|
166 else origin.send(owner_err); end |
627
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
167 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
168 self:compat_iq(origin, stanza, xmlns); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
169 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
170 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
171 origin.send(st.error_reply(stanza, "modify", "bad-request")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
172 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
173 elseif type == "set" or type == "get" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
174 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
175 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
176 elseif stanza.name == "message" and type == "groupchat" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
177 local from, to = stanza.attr.from, stanza.attr.to; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
178 local room = jid_bare(to); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
179 local current_nick = self._jid_nick[from]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
180 local occupant = self._occupants[current_nick]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
181 if not occupant then -- not in room |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
182 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
183 elseif occupant.role == "visitor" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
184 origin.send(st.error_reply(stanza, "cancel", "forbidden")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
185 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
186 local from = stanza.attr.from; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
187 stanza.attr.from = current_nick; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
188 local subject = getText(stanza, {"subject"}); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
189 if subject then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
190 if occupant.role == "moderator" or |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
191 ( self._data.changesubject and occupant.role == "participant" ) then -- and participant |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
192 self:set_subject(current_nick, subject); -- TODO use broadcast_message_stanza |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
193 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
194 stanza.attr.from = from; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
195 origin.send(st.error_reply(stanza, "cancel", "forbidden")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
196 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
197 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
198 self:broadcast_message(stanza, true); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
199 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
200 stanza.attr.from = from; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
201 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
202 elseif stanza.name == "message" and type == "error" and is_kickable_error(stanza) then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
203 local current_nick = self._jid_nick[stanza.attr.from]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
204 log("debug", "%s kicked from %s for sending an error message", current_nick, self.jid); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
205 self:handle_to_occupant(origin, build_unavailable_presence_from_error(stanza)); -- send unavailable |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
206 elseif stanza.name == "presence" then -- hack - some buggy clients send presence updates to the room rather than their nick |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
207 local to = stanza.attr.to; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
208 local current_nick = self._jid_nick[stanza.attr.from]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
209 if current_nick then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
210 stanza.attr.to = current_nick; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
211 self:handle_to_occupant(origin, stanza); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
212 stanza.attr.to = to; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
213 elseif type ~= "error" and type ~= "result" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
214 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
215 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
216 elseif stanza.name == "message" and not stanza.attr.type and #stanza.tags == 1 and self._jid_nick[stanza.attr.from] |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
217 and stanza.tags[1].name == "x" and stanza.tags[1].attr.xmlns == "http://jabber.org/protocol/muc#user" then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
218 local x = stanza.tags[1]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
219 local payload = (#x.tags == 1 and x.tags[1]); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
220 if payload and payload.name == "invite" and payload.attr.to then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
221 local _from, _to = stanza.attr.from, stanza.attr.to; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
222 local _invitee = jid_prep(payload.attr.to); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
223 if _invitee then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
224 local _reason = payload.tags[1] and payload.tags[1].name == 'reason' and #payload.tags[1].tags == 0 and payload.tags[1][1]; |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
225 local invite = st.message({from = _to, to = _invitee, id = stanza.attr.id}) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
226 :tag('x', {xmlns='http://jabber.org/protocol/muc#user'}) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
227 :tag('invite', {from=_from}) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
228 :tag('reason'):text(_reason or ""):up() |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
229 :up(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
230 if self:get_password() then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
231 invite:tag("password"):text(self:get_password()):up(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
232 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
233 invite:up() |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
234 :tag('x', {xmlns="jabber:x:conference", jid=_to}) -- COMPAT: Some older clients expect this |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
235 :text(_reason or "") |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
236 :up() |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
237 :tag('body') -- Add a plain message for clients which don't support invites |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
238 :text(_from..' invited you to the room '.._to..(_reason and (' ('.._reason..')') or "")) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
239 :up(); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
240 if self:is_members_only() and not self:get_affiliation(_invitee) then |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
241 log("debug", "%s invited %s into members only room %s, granting membership", _from, _invitee, _to); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
242 self:set_affiliation(_from, _invitee, "member", nil, "Invited by " .. self._jid_nick[_from]) |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
243 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
244 self:_route_stanza(invite); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
245 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
246 origin.send(st.error_reply(stanza, "cancel", "jid-malformed")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
247 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
248 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
249 origin.send(st.error_reply(stanza, "cancel", "bad-request")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
250 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
251 else |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
252 if type == "error" or type == "result" then return; end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
253 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
254 end |
a8ff69c9b498
mod_compat_muc_admin: first commit.
Marco Cirillo <maranda@lightwitch.org>
parents:
diff
changeset
|
255 end |