Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Sat, 10 Dec 2016 02:55:38 +0100
changeset 7783 dbd202e7c587
parent 7771 57d0f2d3d5c5 (current diff)
parent 7782 b1f80447a2b1 (diff)
child 7789 b62353e6a8e5
Merge 0.10->trunk
util/dependencies.lua
--- a/.hgignore	Mon Dec 05 23:03:09 2016 +0100
+++ b/.hgignore	Sat Dec 10 02:55:38 2016 +0100
@@ -1,5 +1,6 @@
 syntax: glob
 .hgignore
+.luacheckcache
 data
 local
 www_files
--- a/core/rostermanager.lua	Mon Dec 05 23:03:09 2016 +0100
+++ b/core/rostermanager.lua	Sat Dec 10 02:55:38 2016 +0100
@@ -234,6 +234,18 @@
 	local item = roster[jid];
 	return item and (item.subscription == "from" or item.subscription == "both"), err;
 end
+local function is_user_subscribed(username, host, jid)
+	do
+		local selfjid = username.."@"..host;
+		local user_subscription = _get_online_roster_subscription(selfjid, jid);
+		if user_subscription then return (user_subscription == "both" or user_subscription == "to"); end
+		local contact_subscription = _get_online_roster_subscription(jid, selfjid);
+		if contact_subscription then return (contact_subscription == "both" or contact_subscription == "from"); end
+	end
+	local roster, err = load_roster(username, host);
+	local item = roster[jid];
+	return item and (item.subscription == "to" or item.subscription == "both"), err;
+end
 
 function is_contact_pending_in(username, host, jid)
 	local roster = load_roster(username, host);
@@ -350,6 +362,7 @@
 	process_inbound_subscription_cancellation = process_inbound_subscription_cancellation;
 	process_inbound_unsubscribe = process_inbound_unsubscribe;
 	is_contact_subscribed = is_contact_subscribed;
+	is_user_subscribed = is_user_subscribed;
 	is_contact_pending_in = is_contact_pending_in;
 	set_contact_pending_in = set_contact_pending_in;
 	is_contact_pending_out = is_contact_pending_out;
--- a/plugins/mod_blocklist.lua	Mon Dec 05 23:03:09 2016 +0100
+++ b/plugins/mod_blocklist.lua	Sat Dec 10 02:55:38 2016 +0100
@@ -54,26 +54,21 @@
 
 -- Migrates from the old mod_privacy storage
 local function migrate_privacy_list(username)
-	local migrated_data = { [false] = "not empty" };
 	local legacy_data = module:open_store("privacy"):get(username);
-	if legacy_data and legacy_data.lists and legacy_data.default then
-		legacy_data = legacy_data.lists[legacy_data.default];
-		legacy_data = legacy_data and legacy_data.items;
-	else
-		return migrated_data;
-	end
-	if legacy_data then
-		module:log("info", "Migrating blocklist from mod_privacy storage for user '%s'", username);
-		local item, jid;
-		for i = 1, #legacy_data do
-			item = legacy_data[i];
-			if item.type == "jid" and item.action == "deny" then
-				jid = jid_prep(item.value);
-				if not jid then
-					module:log("warn", "Invalid JID in privacy store for user '%s' not migrated: %s", username, tostring(item.value));
-				else
-					migrated_data[jid] = true;
-				end
+	if not legacy_data or not legacy_data.lists or not legacy_data.default then return; end
+	local default_list = legacy_data.lists[legacy_data.default];
+	if not default_list or not default_list.items then return; end
+
+	local migrated_data = { [false] = { created = os.time(); migrated = "privacy" }};
+
+	module:log("info", "Migrating blocklist from mod_privacy storage for user '%s'", username);
+	for _, item in ipairs(default_list.items) do
+		if item.type == "jid" and item.action == "deny" then
+			local jid = jid_prep(item.value);
+			if not jid then
+				module:log("warn", "Invalid JID in privacy store for user '%s' not migrated: %s", username, tostring(item.value));
+			else
+				migrated_data[jid] = true;
 			end
 		end
 	end
@@ -82,10 +77,7 @@
 end
 
 local function get_blocklist(username)
-	local blocklist = cache[username];
-	if not blocklist then
-		blocklist = cache2:get(username);
-	end
+	local blocklist = cache2:get(username);
 	if not blocklist then
 		if not user_exists(username, module.host) then
 			return null_blocklist;
@@ -94,6 +86,9 @@
 		if not blocklist then
 			blocklist = migrate_privacy_list(username);
 		end
+		if not blocklist then
+			blocklist = { [false] = { created = os.time(); }; };
+		end
 		cache2:set(username, blocklist);
 	end
 	cache[username] = blocklist;
@@ -104,7 +99,7 @@
 	local origin, stanza = event.origin, event.stanza;
 	local username = origin.username;
 	local reply = st.reply(stanza):tag("blocklist", { xmlns = "urn:xmpp:blocking" });
-	local blocklist = get_blocklist(username);
+	local blocklist = cache[username] or get_blocklist(username);
 	for jid in pairs(blocklist) do
 		if jid then
 			reply:tag("item", { jid = jid }):up();
@@ -158,20 +153,25 @@
 		return true;
 	end
 
-	local blocklist = get_blocklist(username);
+	local blocklist = cache[username] or get_blocklist(username);
 
-	local new_blocklist = {};
+	local new_blocklist = {
+		-- We set the [false] key to someting as a signal not to migrate privacy lists
+		[false] = blocklist[false] or { created = os.time(); };
+	};
+	if type(blocklist[false]) == "table" then
+		new_blocklist[false].modified = os.time();
+	end
 
 	if is_blocking or next(new) then
 		for jid in pairs(blocklist) do
-			new_blocklist[jid] = true;
+			if jid then new_blocklist[jid] = true; end
 		end
 		for jid in pairs(new) do
 			new_blocklist[jid] = is_blocking;
 		end
 		-- else empty the blocklist
 	end
-	new_blocklist[false] = "not empty"; -- In order to avoid doing the migration thing twice
 
 	local ok, err = set_blocklist(username, new_blocklist);
 	if ok then
--- a/plugins/mod_carbons.lua	Mon Dec 05 23:03:09 2016 +0100
+++ b/plugins/mod_carbons.lua	Sat Dec 10 02:55:38 2016 +0100
@@ -24,21 +24,23 @@
 	local origin, stanza = event.origin, event.stanza;
 	local orig_type = stanza.attr.type or "normal";
 	local orig_from = stanza.attr.from;
+	local bare_from = jid_bare(orig_from);
 	local orig_to = stanza.attr.to;
-	
+	local bare_to = jid_bare(orig_to);
+
 	if not(orig_type == "chat" or (orig_type == "normal" and stanza:get_child("body"))) then
 		return -- Only chat type messages
 	end
 
 	-- Stanza sent by a local client
-	local bare_jid = jid_bare(orig_from);
+	local bare_jid = bare_from; -- JID of the local user
 	local target_session = origin;
 	local top_priority = false;
-	local user_sessions = bare_sessions[bare_jid];
+	local user_sessions = bare_sessions[bare_from];
 
 	-- Stanza about to be delivered to a local client
 	if not c2s then
-		bare_jid = jid_bare(orig_to);
+		bare_jid = bare_to;
 		target_session = full_sessions[orig_to];
 		user_sessions = bare_sessions[bare_jid];
 		if not target_session and user_sessions then
--- a/plugins/mod_presence.lua	Mon Dec 05 23:03:09 2016 +0100
+++ b/plugins/mod_presence.lua	Sat Dec 10 02:55:38 2016 +0100
@@ -178,7 +178,9 @@
 		end
 		core_post_stanza(origin, stanza);
 		send_presence_of_available_resources(node, host, to_bare, origin);
-		core_post_stanza(origin, st.presence({ type = "probe", from = from_bare, to = to_bare }));
+		if rostermanager.is_user_subscribed(node, host, to_bare) then
+			core_post_stanza(origin, st.presence({ type = "probe", from = from_bare, to = to_bare }));
+		end
 	elseif stanza.attr.type == "unsubscribed" then
 		-- 1. send unavailable
 		-- 2. route stanza