# HG changeset patch # User Matthew Wild # Date 1275560426 -3600 # Node ID 0b238b2b0801ce67d2e1dbda83f91d005dd9fbb5 # Parent 9fe6d314fd07a7b71f98f1fd06b3f4975372f746 mod_blocking: Support for the "unblock all JIDs" case, and fix saving of rules after removing a JID diff -r 9fe6d314fd07 -r 0b238b2b0801 mod_blocking/mod_blocking.lua --- 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