diff mod_blocking/mod_blocking.lua @ 940:80ede103d7a3

mod_blocking: Fix handling of unblocking command. Send out un-/block pushes to all resources.
author Tobias Markmann <tm@ayena.de>
date Wed, 27 Mar 2013 13:29:38 +0100
parents 000f1d1c6ca5
children 1b55d8f86644
line wrap: on
line diff
--- a/mod_blocking/mod_blocking.lua	Mon Mar 25 06:40:05 2013 +0100
+++ b/mod_blocking/mod_blocking.lua	Wed Mar 27 13:29:38 2013 +0100
@@ -100,6 +100,21 @@
 	return jid_list;
 end
 
+local function send_push_iqs(username, host, command_type, jids)
+	local bare_jid = username.."@"..host;
+
+	local stanza_content = st.stanza(command_type, { xmlns = xmlns_blocking });
+	for _, jid in ipairs(jids) do
+		stanza_content:tag("item", { jid = jid }):up();
+	end
+
+	for resource, session in pairs(prosody.bare_sessions[bare_jid].sessions) do
+		local iq_push_stanza = st.iq({ type = "set", to = bare_jid.."/"..resource });
+		iq_push_stanza:add_child(stanza_content);
+		session.send(iq_push_stanza);
+	end
+end
+
 function handle_blocking_command(event)
 	local session, stanza = event.origin, event.stanza;
 
@@ -118,11 +133,24 @@
 					add_blocked_jid(username, host, jid);
 				end
 				session.send(st.reply(stanza));
+				send_push_iqs(username, host, "block", block_jid_list);
 			end
 			return true;
 		elseif stanza.tags[1].name == "unblock" then
-			remove_all_blocked_jids(username, host);
+			local unblock = stanza.tags[1];
+			local unblock_jid_list = {};
+			for item in unblock:childtags() do
+				unblock_jid_list[#unblock_jid_list+1] = item.attr.jid;
+			end
+			if #unblock_jid_list == 0 then
+				remove_all_blocked_jids(username, host);
+			else
+				for _, jid_to_unblock in ipairs(unblock_jid_list) do
+					remove_blocked_jid(username, host, jid_to_unblock);
+				end
+			end
 			session.send(st.reply(stanza));
+			send_push_iqs(username, host, "unblock", unblock_jid_list);
 			return true;
 		end
 	elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then