Merge 0.9->trunk
authorMatthew Wild <mwild1@gmail.com>
Thu, 25 Apr 2013 20:37:51 +0100
changeset 5521 076534a0384a
parent 5515 865d82f21d12 (current diff)
parent 5520 75230be5be58 (diff)
child 5523 8741bb69a786
Merge 0.9->trunk
--- a/plugins/mod_admin_telnet.lua	Tue Apr 23 15:38:38 2013 +0100
+++ b/plugins/mod_admin_telnet.lua	Thu Apr 25 20:37:51 2013 +0100
@@ -903,13 +903,23 @@
 	end;
 };
 
-function def_env.muc:room(room_jid)
-	local room_name, host = jid_split(room_jid);
+local function check_muc(jid)
+	local room_name, host = jid_split(jid);
 	if not hosts[host] then
 		return nil, "No such host: "..host;
 	elseif not hosts[host].modules.muc then
 		return nil, "Host '"..host.."' is not a MUC service";
 	end
+	return room_name, host;
+end
+
+function def_env.muc:create(room_jid)
+	local room, host = check_muc(room_jid);
+	return hosts[host].modules.muc.create_room(room_jid);
+end
+
+function def_env.muc:room(room_jid)
+	local room_name, host = check_muc(room_jid);
 	local room_obj = hosts[host].modules.muc.rooms[room_jid];
 	if not room_obj then
 		return nil, "No such room: "..room_jid;
--- a/plugins/mod_c2s.lua	Tue Apr 23 15:38:38 2013 +0100
+++ b/plugins/mod_c2s.lua	Thu Apr 25 20:37:51 2013 +0100
@@ -133,25 +133,25 @@
 			session.send(st.stanza("stream:stream", default_stream_attr):top_tag());
 		end
 		if reason then -- nil == no err, initiated by us, false == initiated by client
+			local stream_error = st.stanza("stream:error");
 			if type(reason) == "string" then -- assume stream error
-				log("debug", "Disconnecting client, <stream:error> is: %s", reason);
-				session.send(st.stanza("stream:error"):tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' }));
+				stream_error:tag(reason, {xmlns = 'urn:ietf:params:xml:ns:xmpp-streams' });
 			elseif type(reason) == "table" then
 				if reason.condition then
-					local stanza = st.stanza("stream:error"):tag(reason.condition, stream_xmlns_attr):up();
+					stream_error:tag(reason.condition, stream_xmlns_attr):up();
 					if reason.text then
-						stanza:tag("text", stream_xmlns_attr):text(reason.text):up();
+						stream_error:tag("text", stream_xmlns_attr):text(reason.text):up();
 					end
 					if reason.extra then
-						stanza:add_child(reason.extra);
+						stream_error:add_child(reason.extra);
 					end
-					log("debug", "Disconnecting client, <stream:error> is: %s", tostring(stanza));
-					session.send(stanza);
 				elseif reason.name then -- a stanza
-					log("debug", "Disconnecting client, <stream:error> is: %s", tostring(reason));
-					session.send(reason);
+					stream_error = reason;
 				end
 			end
+			stream_error = tostring(stream_error);
+			log("debug", "Disconnecting client, <stream:error> is: %s", stream_error);
+			session.send(stream_error);
 		end
 		
 		session.send("</stream:stream>");
--- a/plugins/muc/muc.lib.lua	Tue Apr 23 15:38:38 2013 +0100
+++ b/plugins/muc/muc.lib.lua	Thu Apr 25 20:37:51 2013 +0100
@@ -88,6 +88,10 @@
 local room_mt = {};
 room_mt.__index = room_mt;
 
+function room_mt:__tostring()
+	return "MUC room ("..self.jid..")";
+end
+
 function room_mt:get_default_role(affiliation)
 	if affiliation == "owner" or affiliation == "admin" then
 		return "moderator";
--- a/util/json.lua	Tue Apr 23 15:38:38 2013 +0100
+++ b/util/json.lua	Thu Apr 25 20:37:51 2013 +0100
@@ -2,8 +2,6 @@
 -- Copyright (C) 2008-2010 Matthew Wild
 -- Copyright (C) 2008-2010 Waqas Hussain
 --
--- utf8char copyright (C) 2007 Rici Lake
---
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 --
@@ -18,6 +16,9 @@
 local newproxy, getmetatable = newproxy, getmetatable;
 local print = print;
 
+local has_array, array = pcall(require, "util.array");
+local array_mt = hasarray and getmetatable(array()) or {};
+
 --module("json")
 local json = {};
 
@@ -38,32 +39,19 @@
 	if not escapes[ch] then escapes[ch] = ("\\u%.4X"):format(i); end
 end
 
-local function utf8char(i)
-	if i >= 0 then
-		i = i - i%1
-		if i < 128 then
-			return s_char(i)
-		else
-			local c1 = i % 64
-			i = (i - c1) / 64
-			if i < 32 then
-				return s_char(0xC0+i, 0x80+c1)
-			else
-        			local c2 = i % 64
-        			i = (i - c2) / 64
-        			if i < 16 and (i ~= 13 or c2 < 32) then
-        				return s_char(0xE0+i, 0x80+c2, 0x80+c1)
-        			elseif i >= 16 and i < 0x110 then
-        				local c3 = i % 64
-        				i = (i - c3) / 64
-        				return s_char(0xF0+i, 0x80+c3, 0x80+c2, 0x80+c1)
-        			end
-			end
-		end
+local function codepoint_to_utf8(code)
+	if code < 0x80 then return s_char(code); end
+	local bits0_6 = code % 64;
+	if code < 0x800 then
+		local bits6_5 = (code - bits0_6) / 64;
+		return s_char(0x80 + 0x40 + bits6_5, 0x80 + bits0_6);
 	end
+	local bits0_12 = code % 4096;
+	local bits6_6 = (bits0_12 - bits0_6) / 64;
+	local bits12_4 = (code - bits0_12) / 4096;
+	return s_char(0x80 + 0x40 + 0x20 + bits12_4, 0x80 + bits6_6, 0x80 + bits0_6);
 end
 
-
 local valid_types = {
 	number  = true,
 	string  = true,
@@ -165,7 +153,12 @@
 	elseif t == "string" then
 		stringsave(o, buffer);
 	elseif t == "table" then
-		tablesave(o, buffer);
+		local mt = getmetatable(o);
+		if mt == array_mt then
+			arraysave(o, buffer);
+		else
+			tablesave(o, buffer);
+		end
 	elseif t == "boolean" then
 		t_insert(buffer, (o and "true" or "false"));
 	else
@@ -237,7 +230,7 @@
 	
 	local readvalue;
 	local function readarray()
-		local t = {};
+		local t = setmetatable({}, array_mt);
 		next(); -- skip '['
 		skipstuff();
 		if ch == "]" then next(); return t; end
@@ -284,7 +277,7 @@
 						if not ch:match("[0-9a-fA-F]") then error("invalid unicode escape sequence in string"); end
 						seq = seq..ch;
 					end
-					s = s..utf8char(tonumber(seq, 16));
+					s = s..codepoint_to_utf8(tonumber(seq, 16));
 					next();
 				else error("invalid escape sequence in string"); end
 			end