Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Fri, 03 Apr 2015 06:39:28 +0200
changeset 6617 c78f8f8f4434
parent 6612 d2faaaca695d (current diff)
parent 6616 2aae36312eb9 (diff)
child 6624 352fa2cae1c9
Merge 0.10->trunk
--- a/core/rostermanager.lua	Fri Mar 27 22:24:57 2015 +0000
+++ b/core/rostermanager.lua	Fri Apr 03 06:39:28 2015 +0200
@@ -54,7 +54,7 @@
 end
 
 function roster_push(username, host, jid)
-	local roster = jid and jid ~= "pending" and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster;
+	local roster = jid and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster;
 	if roster then
 		local item = hosts[host].sessions[username].roster[jid];
 		local stanza = st.iq({type="set"});
@@ -79,6 +79,22 @@
 	end
 end
 
+local function roster_metadata(roster, err)
+	local metadata = roster[false];
+	if not metadata then
+		metadata = { broken = err or nil };
+		roster[false] = metadata;
+	end
+	if not metadata.pending then
+		if roster.pending and not type(roster.pending.subscription) == "string" then
+			metadata.pending, roster.pending = roster.pending, nil;
+		else
+			metadata.pending = {};
+		end
+	end
+	return metadata;
+end
+
 function load_roster(username, host)
 	local jid = username.."@"..host;
 	log("debug", "load_roster: asked for: %s", jid);
@@ -94,7 +110,7 @@
 	local data, err = datamanager.load(username, host, "roster");
 	roster = data or {};
 	if user then user.roster = roster; end
-	if not roster[false] then roster[false] = { broken = err or nil }; end
+	roster_metadata(roster, err);
 	if roster[jid] then
 		roster[jid] = nil;
 		log("warn", "roster for %s has a self-contact", jid);
@@ -120,15 +136,11 @@
 		--end
 	end
 	if roster then
-		local metadata = roster[false];
-		if not metadata then
-			metadata = {};
-			roster[false] = metadata;
-		end
+		local metadata = roster_metadata(roster);
 		if metadata.version ~= true then
 			metadata.version = (metadata.version or 0) + 1;
 		end
-		if roster[false].broken then return nil, "Not saving broken roster" end
+		if metadata.broken then return nil, "Not saving broken roster" end
 		return datamanager.store(username, host, "roster", roster);
 	end
 	log("warn", "save_roster: user had no roster to save");
@@ -176,7 +188,7 @@
 	local item = roster[jid];
 	local changed = nil;
 	if is_contact_pending_in(username, host, jid) then
-		roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty?
+		roster[false].pending[jid] = nil;
 		changed = true;
 	end
 	if item then
@@ -213,7 +225,7 @@
 
 function is_contact_pending_in(username, host, jid)
 	local roster = load_roster(username, host);
-	return roster.pending and roster.pending[jid];
+	return roster[false].pending[jid];
 end
 function set_contact_pending_in(username, host, jid, pending)
 	local roster = load_roster(username, host);
@@ -221,8 +233,7 @@
 	if item and (item.subscription == "from" or item.subscription == "both") then
 		return; -- false
 	end
-	if not roster.pending then roster.pending = {}; end
-	roster.pending[jid] = true;
+	roster[false].pending[jid] = true;
 	return save_roster(username, host, roster);
 end
 function is_contact_pending_out(username, host, jid)
@@ -272,8 +283,7 @@
 		else -- subscription == to
 			item.subscription = "both";
 		end
-		roster.pending[jid] = nil;
-		-- TODO maybe remove roster.pending if empty
+		roster[false].pending[jid] = nil;
 		return save_roster(username, host, roster);
 	end -- TODO else implement optional feature pre-approval (ask = subscribed)
 end
@@ -282,7 +292,7 @@
 	local item = roster[jid];
 	local pending = is_contact_pending_in(username, host, jid);
 	if pending then
-		roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty?
+		roster[false].pending[jid] = nil;
 	end
 	local subscribed;
 	if item then
--- a/plugins/mod_presence.lua	Fri Mar 27 22:24:57 2015 +0000
+++ b/plugins/mod_presence.lua	Fri Apr 03 06:39:28 2015 +0200
@@ -106,10 +106,8 @@
 				res.presence.attr.to = nil;
 			end
 		end
-		if roster.pending then -- resend incoming subscription requests
-			for jid in pairs(roster.pending) do
-				origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original?
-			end
+		for jid in pairs(roster[false].pending) do -- resend incoming subscription requests
+			origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original?
 		end
 		local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host});
 		for jid, item in pairs(roster) do -- resend outgoing subscription requests
--- a/plugins/mod_roster.lua	Fri Mar 27 22:24:57 2015 +0000
+++ b/plugins/mod_roster.lua	Fri Apr 03 06:39:28 2015 +0200
@@ -44,7 +44,7 @@
 			roster:query("jabber:iq:roster");
 			-- Client does not support versioning, or has stale roster
 			for jid, item in pairs(session.roster) do
-				if jid ~= "pending" and jid then
+				if jid then
 					roster:tag("item", {
 						jid = jid,
 						subscription = item.subscription,
@@ -64,9 +64,7 @@
 	else -- stanza.attr.type == "set"
 		local query = stanza.tags[1];
 		if #query.tags == 1 and query.tags[1].name == "item"
-				and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid
-				-- Protection against overwriting roster.pending, until we move it
-				and query.tags[1].attr.jid ~= "pending" then
+				and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid then
 			local item = query.tags[1];
 			local from_node, from_host = jid_split(stanza.attr.from);
 			local jid = jid_prep(item.attr.jid);
@@ -78,7 +76,7 @@
 						local r_item = roster[jid];
 						if r_item then
 							local to_bare = node and (node.."@"..host) or host; -- bare JID
-							if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then
+							if r_item.subscription == "both" or r_item.subscription == "from" or roster[false].pending[jid] then
 								core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare}));
 							end
 							if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then
@@ -144,8 +142,8 @@
 	local bare = username .. "@" .. host;
 	local roster = rm_load_roster(username, host);
 	for jid, item in pairs(roster) do
-		if jid and jid ~= "pending" then
-			if item.subscription == "both" or item.subscription == "from" or (roster.pending and roster.pending[jid]) then
+		if jid then
+			if item.subscription == "both" or item.subscription == "from" or roster[false].pending[jid] then
 				module:send(st.presence({type="unsubscribed", from=bare, to=jid}));
 			end
 			if item.subscription == "both" or item.subscription == "to" or item.ask then
--- a/prosodyctl	Fri Mar 27 22:24:57 2015 +0000
+++ b/prosodyctl	Fri Apr 03 06:39:28 2015 +0200
@@ -552,6 +552,7 @@
 			if not hgid and hgrepo then
 				return path.." - "..hgrepo .."!\n  ";
 			end
+			-- 010452cfaf53 is the first commit in the prosody-modules repository
 			hgrepo = hgrepo == "010452cfaf53" and "prosody-modules";
 			return path..(hgid and " - "..(hgrepo or "HG").." rev: "..hgid or "")
 				.."\n  ";
@@ -1093,7 +1094,7 @@
 		local x509_verify_identity = require"util.x509".verify_identity;
 		local ssl = dependencies.softreq"ssl";
 		-- local datetime_parse = require"util.datetime".parse_x509;
-		local load_cert = ssl and ssl.x509 and ssl.x509.load;
+		local load_cert = ssl and ssl.loadcertificate;
 		-- or ssl.cert_from_pem
 		if not ssl then
 			print("LuaSec not available, can't perform certificate checks")
--- a/util-src/Makefile	Fri Mar 27 22:24:57 2015 +0000
+++ b/util-src/Makefile	Fri Apr 03 06:39:28 2015 +0200
@@ -14,9 +14,9 @@
 .PHONY: all install clean
 .SUFFIXES: .c .o .so
 
-all: encodings.so hashes.so net.so pposix.so signal.so
+all: encodings.so hashes.so net.so pposix.so signal.so table.so
 
-install: encodings.so hashes.so net.so pposix.so signal.so
+install: encodings.so hashes.so net.so pposix.so signal.so table.so
 	install *.so ../util/
 
 clean:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util-src/table.c	Fri Apr 03 06:39:28 2015 +0200
@@ -0,0 +1,14 @@
+#include <lua.h>
+#include <lauxlib.h>
+
+static int Lcreate_table(lua_State* L) {
+	lua_createtable(L, luaL_checkinteger(L, 1), luaL_checkinteger(L, 2));
+	return 1;
+}
+
+int luaopen_util_table(lua_State *L) {
+	lua_newtable(L);
+	lua_pushcfunction(L, Lcreate_table);
+	lua_setfield(L, -2, "create");
+	return 1;
+}