# HG changeset patch # User Kim Alvefur # Date 1449365421 -3600 # Node ID bdb216e0688a5cbdeee522a633adb43c185ab6bc # Parent f350f840a6f74ddd94e4f76a99799bdac989f614 mod_blocklist: When blocking someone who sent a subscription request, forget that request since the user would be unable to deny it while blocked (Fixes #574) diff -r f350f840a6f7 -r bdb216e0688a plugins/mod_blocklist.lua --- a/plugins/mod_blocklist.lua Sun Dec 06 02:22:49 2015 +0100 +++ b/plugins/mod_blocklist.lua Sun Dec 06 02:30:21 2015 +0100 @@ -10,7 +10,11 @@ -- local user_exists = require"core.usermanager".user_exists; -local is_contact_subscribed = require"core.rostermanager".is_contact_subscribed; +local rostermanager = require"core.rostermanager"; +local is_contact_subscribed = rostermanager.is_contact_subscribed; +local is_contact_pending_in = rostermanager.is_contact_pending_in; +local load_roster = rostermanager.load_roster; +local save_roster = rostermanager.save_roster; local st = require"util.stanza"; local st_error_reply = st.error_reply; local jid_prep = require"util.jid".prep; @@ -126,6 +130,10 @@ -- So contacts we need to do that for are added to the set below. local send_unavailable = {}; + -- Because blocking someone currently also blocks the ability to reject + -- subscription requests, we'll preemptively reject such + local remove_pending = {}; + for item in action:childtags("item") do local jid = jid_prep(item.attr.jid); if not jid then @@ -136,6 +144,8 @@ new[jid] = true; if is_contact_subscribed(username, module.host, jid) then send_unavailable[jid] = true; + elseif is_contact_pending_in(username, module.host, jid) then + remove_pending[jid] = true; end end @@ -180,6 +190,15 @@ end end end + + if next(remove_pending) then + local roster = load_roster(username, module.host); + for jid in pairs(remove_pending) do + roster[false].pending[jid] = nil; + end + save_roster(username, module.host, roster); + -- Not much we can do about save failing here + end end local blocklist_push = st.iq({ type = "set", id = "blocklist-push" })