changeset 164:0b238b2b0801

mod_blocking: Support for the "unblock all JIDs" case, and fix saving of rules after removing a JID
author Matthew Wild <mwild1@gmail.com>
date Thu, 03 Jun 2010 11:20:26 +0100
parents 9fe6d314fd07
children fd8d76daad97
files mod_blocking/mod_blocking.lua
diffstat 1 files changed, 34 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mod_blocking/mod_blocking.lua	Thu Jun 03 11:19:50 2010 +0100
+++ b/mod_blocking/mod_blocking.lua	Thu Jun 03 11:20:26 2010 +0100
@@ -46,6 +46,24 @@
 			return true;
 		end
 	end
+	datamanager.store(username, host, "privacy", privacy_lists);
+end
+
+function remove_all_blocked_jids(username, host)
+	local privacy_lists = datamanager.load(username, host, "privacy") or {};
+	local default_list_name = privacy_lists.default;
+	if not default_list_name then return; end
+	local default_list = privacy_lists.list[default_list_name];
+	if not default_list then return; end
+	local items = default_list.items;
+	local item;
+	for i=#items,1 do -- order must be unique
+		item = items[i];
+		if item.type == "jid" and item.action == "deny" then
+			table.remove(items, i);
+		end
+	end
+	datamanager.store(username, host, "privacy", privacy_lists);
 end
 
 function get_blocked_jids(username, host)
@@ -69,18 +87,23 @@
 
 function handle_blocking_command(session, stanza)
 	local username, host = jid_split(stanza.attr.from);
-	if stanza.attr.type == "set" and stanza.tags[1].name == "block" then
-		local block = stanza.tags[1]:get_child("block");
-		local block_jid_list = {};
-		for item in block:childtags() do
-			block_jid_list[#block_jid_list+1] = item.attr.jid;
-		end
-		if #block_jid_list == 0 then
-			--FIXME: Reply bad-request
-		else
-			for _, jid in ipairs(block_jid_list) do
-				add_blocked_jid(username, host, jid);
+	if stanza.attr.type == "set" then
+		if stanza.tags[1].name == "block" then
+			local block = stanza.tags[1]:get_child("block");
+			local block_jid_list = {};
+			for item in block:childtags() do
+				block_jid_list[#block_jid_list+1] = item.attr.jid;
 			end
+			if #block_jid_list == 0 then
+				--FIXME: Reply bad-request
+			else
+				for _, jid in ipairs(block_jid_list) do
+					add_blocked_jid(username, host, jid);
+				end
+				session.send(st.reply(stanza));
+			end
+		elseif stanza.tags[1].name == "unblock" then
+			remove_all_blocked_jids(username, host);
 			session.send(st.reply(stanza));
 		end
 	elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then