comparison mod_compat_muc_admin/mod_compat_muc_admin.lua @ 629:7d4cde86b12e

mod_compat_muc_admin: general cleanup, adding missing locals from muc.lib.lua (since things aren't inflated enough already)
author Marco Cirillo <maranda@lightwitch.org>
date Tue, 27 Mar 2012 16:51:59 +0000
parents c72be31941fa
children ab2a1564da9b
comparison
equal deleted inserted replaced
628:c72be31941fa 629:7d4cde86b12e
7 7
8 if not hosts[muc_host].modules.muc then -- Not a MUC host 8 if not hosts[muc_host].modules.muc then -- Not a MUC host
9 module:log("error", "this module can only be used on muc hosts."); return false; 9 module:log("error", "this module can only be used on muc hosts."); return false;
10 end 10 end
11 11
12 -- Constants and imported functions from muc.lib.lua
12 local xmlns_ma, xmlns_mo = "http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#owner"; 13 local xmlns_ma, xmlns_mo = "http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#owner";
14 local kickable_error_conditions = {
15 ["gone"] = true;
16 ["internal-server-error"] = true;
17 ["item-not-found"] = true;
18 ["jid-malformed"] = true;
19 ["recipient-unavailable"] = true;
20 ["redirect"] = true;
21 ["remote-server-not-found"] = true;
22 ["remote-server-timeout"] = true;
23 ["service-unavailable"] = true;
24 ["malformed error"] = true;
25 };
26 local function is_kickable_error(stanza)
27 local cond = get_error_condition(stanza);
28 return kickable_error_conditions[cond] and cond;
29 end
30 local function build_unavailable_presence_from_error(stanza)
31 local type, condition, text = stanza:get_error();
32 local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error");
33 if text then
34 error_message = error_message..": "..text;
35 end
36 return st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to})
37 :tag('status'):text(error_message);
38 end
39 local function getText(stanza, path) return getUsingPath(stanza, path, true); end
13 40
14 -- COMPAT: iq condensed function 41 -- COMPAT: iq condensed function
15 hosts[muc_host].modules.muc.stanza_handler.muc_new_room.room_mt["compat_iq"] = function (self, origin, stanza, xmlns) 42 hosts[muc_host].modules.muc.stanza_handler.muc_new_room.room_mt["compat_iq"] = function (self, origin, stanza, xmlns)
16 local actor = stanza.attr.from; 43 local actor = stanza.attr.from;
17 local affiliation = self:get_affiliation(actor); 44 local affiliation = self:get_affiliation(actor);
95 if stanza.name == "iq" then 122 if stanza.name == "iq" then
96 if xmlns == "http://jabber.org/protocol/disco#info" and type == "get" then 123 if xmlns == "http://jabber.org/protocol/disco#info" and type == "get" then
97 origin.send(self:get_disco_info(stanza)); 124 origin.send(self:get_disco_info(stanza));
98 elseif xmlns == "http://jabber.org/protocol/disco#items" and type == "get" then 125 elseif xmlns == "http://jabber.org/protocol/disco#items" and type == "get" then
99 origin.send(self:get_disco_items(stanza)); 126 origin.send(self:get_disco_items(stanza));
100 elseif (xmlns == xmlns_ma or xmlns == xmlns_mo) then 127 elseif xmlns == xmlns_ma or xmlns == xmlns_mo then
101 if xmlns == xmlns_ma then 128 if xmlns == xmlns_ma then
102 self:compat_iq(origin, stanza, xmlns); 129 self:compat_iq(origin, stanza, xmlns);
103 elseif xmlns == xmlns_mo and stanza.tags[1].name == "query" and #stanza.tags[1].tags == 0 and 130 elseif xmlns == xmlns_mo and (type == "set" or type == "get") and stanza.tags[1].name == "query" then
104 stanza.attr.type == "get" then -- form request 131 local owner_err = st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms");
105 if self:get_affiliation(stanza.attr.from) ~= "owner" then 132 if #stanza.tags[1].tags == 0 and stanza.attr.type == "get" then
106 origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms")); 133 if self:get_affiliation(stanza.attr.from) ~= "owner" then
107 else 134 origin.send(owner_err);
108 self:send_form(origin, stanza); 135 else self:send_form(origin, stanza); end
109 end 136 elseif stanza.attr.type == "set" and stanza.tags[1]:get_child("x", "jabber:x:data") then
110 elseif xmlns == xmlns_mo and stanza.tags[1].name == "query" and stanza.tags[1]:get_child("x", "jabber:x:data") and 137 if self:get_affiliation(stanza.attr.from) ~= "owner" then
111 stanza.attr.type == "set" then 138 origin.send(owner_err);
112 if self:get_affiliation(stanza.attr.from) ~= "owner" then 139 else self:process_form(origin, stanza); end
113 origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms")); 140 elseif stanza.tags[1].tags[1].name == "destroy" then
114 else
115 self:process_form(origin, stanza);
116 end
117 elseif xmlns == xmlns_mo and stanza.tags[1].tags[1] then
118 local child = stanza.tags[1].tags[1];
119 if child.name == "destroy" then
120 if self:get_affiliation(stanza.attr.from) == "owner" then 141 if self:get_affiliation(stanza.attr.from) == "owner" then
121 local newjid = child.attr.jid; 142 local newjid = child.attr.jid;
122 local reason, password; 143 local reason, password;
123 for _,tag in ipairs(child.tags) do 144 for _,tag in ipairs(child.tags) do
124 if tag.name == "reason" then 145 if tag.name == "reason" then
127 password = #tag.tags == 0 and tag[1]; 148 password = #tag.tags == 0 and tag[1];
128 end 149 end
129 end 150 end
130 self:destroy(newjid, reason, password); 151 self:destroy(newjid, reason, password);
131 origin.send(st.reply(stanza)); 152 origin.send(st.reply(stanza));
132 else origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can destroy rooms")); end 153 else origin.send(owner_err); end
133 else 154 else
134 self:compat_iq(origin, stanza, xmlns); 155 self:compat_iq(origin, stanza, xmlns);
135 end 156 end
136 else 157 else
137 origin.send(st.error_reply(stanza, "modify", "bad-request")); 158 origin.send(st.error_reply(stanza, "modify", "bad-request"));
217 else 238 else
218 if type == "error" or type == "result" then return; end 239 if type == "error" or type == "result" then return; end
219 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); 240 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
220 end 241 end
221 end 242 end
222
223