diff 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
line wrap: on
line diff
--- a/mod_compat_muc_admin/mod_compat_muc_admin.lua	Tue Mar 27 16:07:52 2012 +0000
+++ b/mod_compat_muc_admin/mod_compat_muc_admin.lua	Tue Mar 27 16:51:59 2012 +0000
@@ -9,7 +9,34 @@
 	module:log("error", "this module can only be used on muc hosts."); return false;
 end
 
+-- Constants and imported functions from muc.lib.lua
 local xmlns_ma, xmlns_mo = "http://jabber.org/protocol/muc#admin", "http://jabber.org/protocol/muc#owner";
+local kickable_error_conditions = {
+	["gone"] = true;
+	["internal-server-error"] = true;
+	["item-not-found"] = true;
+	["jid-malformed"] = true;
+	["recipient-unavailable"] = true;
+	["redirect"] = true;
+	["remote-server-not-found"] = true;
+	["remote-server-timeout"] = true;
+	["service-unavailable"] = true;
+	["malformed error"] = true;
+};
+local function is_kickable_error(stanza)
+	local cond = get_error_condition(stanza);
+	return kickable_error_conditions[cond] and cond;
+end
+local function build_unavailable_presence_from_error(stanza)
+	local type, condition, text = stanza:get_error();
+	local error_message = "Kicked: "..(condition and condition:gsub("%-", " ") or "presence error");
+	if text then
+		error_message = error_message..": "..text;
+	end
+	return st.presence({type='unavailable', from=stanza.attr.from, to=stanza.attr.to})
+		:tag('status'):text(error_message);
+end
+local function getText(stanza, path) return getUsingPath(stanza, path, true); end
 
 -- COMPAT: iq condensed function
 hosts[muc_host].modules.muc.stanza_handler.muc_new_room.room_mt["compat_iq"] = function (self, origin, stanza, xmlns)
@@ -97,26 +124,20 @@
 			origin.send(self:get_disco_info(stanza));
 		elseif xmlns == "http://jabber.org/protocol/disco#items" and type == "get" then
 			origin.send(self:get_disco_items(stanza));
-		elseif (xmlns == xmlns_ma or xmlns == xmlns_mo) then
+		elseif xmlns == xmlns_ma or xmlns == xmlns_mo then
 			if xmlns == xmlns_ma then
 				self:compat_iq(origin, stanza, xmlns);
-			elseif xmlns == xmlns_mo and stanza.tags[1].name == "query" and #stanza.tags[1].tags == 0 and
-			       stanza.attr.type == "get" then -- form request
-				if self:get_affiliation(stanza.attr.from) ~= "owner" then
-					origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms"));
-				else
-					self:send_form(origin, stanza);
-				end
-			elseif xmlns == xmlns_mo and stanza.tags[1].name == "query" and stanza.tags[1]:get_child("x", "jabber:x:data") and
-			       stanza.attr.type == "set" then
-				if self:get_affiliation(stanza.attr.from) ~= "owner" then
-					origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms"));
-				else
-					self:process_form(origin, stanza);
-				end
-			elseif xmlns == xmlns_mo and stanza.tags[1].tags[1] then
-				local child = stanza.tags[1].tags[1];
-				if child.name == "destroy" then
+			elseif xmlns == xmlns_mo and (type == "set" or type == "get") and stanza.tags[1].name == "query" then
+				local owner_err = st.error_reply(stanza, "auth", "forbidden", "Only owners can configure rooms");
+				if #stanza.tags[1].tags == 0 and stanza.attr.type == "get" then
+					if self:get_affiliation(stanza.attr.from) ~= "owner" then
+						origin.send(owner_err);
+					else self:send_form(origin, stanza); end
+				elseif stanza.attr.type == "set" and stanza.tags[1]:get_child("x", "jabber:x:data") then
+					if self:get_affiliation(stanza.attr.from) ~= "owner" then
+						origin.send(owner_err);
+					else self:process_form(origin, stanza); end
+				elseif stanza.tags[1].tags[1].name == "destroy" then
 					if self:get_affiliation(stanza.attr.from) == "owner" then
 						local newjid = child.attr.jid;
 						local reason, password;
@@ -129,7 +150,7 @@
 						end
 						self:destroy(newjid, reason, password);
 						origin.send(st.reply(stanza));
-					else origin.send(st.error_reply(stanza, "auth", "forbidden", "Only owners can destroy rooms")); end
+					else origin.send(owner_err); end
 				else
 					self:compat_iq(origin, stanza, xmlns);
 				end
@@ -219,5 +240,3 @@
 		origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
 	end
 end
-
-