Software /
code /
prosody
Comparison
plugins/mod_blocklist.lua @ 6975:5bc229eb99d3
mod_blocklist: Skip creating some tables and some processing if unblocking
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 06 Dec 2015 02:32:16 +0100 |
parent | 6974:bdb216e0688a |
child | 6976:4688ff9d4f2b |
comparison
equal
deleted
inserted
replaced
6974:bdb216e0688a | 6975:5bc229eb99d3 |
---|---|
119 -- We want this to be atomic and not do a partial update | 119 -- We want this to be atomic and not do a partial update |
120 local function edit_blocklist(event) | 120 local function edit_blocklist(event) |
121 local origin, stanza = event.origin, event.stanza; | 121 local origin, stanza = event.origin, event.stanza; |
122 local username = origin.username; | 122 local username = origin.username; |
123 local action = stanza.tags[1]; -- "block" or "unblock" | 123 local action = stanza.tags[1]; -- "block" or "unblock" |
124 local is_blocking = action.name == "block" or nil; -- nil if unblocking | |
124 local new = {}; -- JIDs to block depending or unblock on action | 125 local new = {}; -- JIDs to block depending or unblock on action |
125 | 126 |
126 -- XEP-0191 sayeth: | 127 -- XEP-0191 sayeth: |
127 -- > When the user blocks communications with the contact, the user's | 128 -- > When the user blocks communications with the contact, the user's |
128 -- > server MUST send unavailable presence information to the contact (but | 129 -- > server MUST send unavailable presence information to the contact (but |
129 -- > only if the contact is allowed to receive presence notifications [...] | 130 -- > only if the contact is allowed to receive presence notifications [...] |
130 -- So contacts we need to do that for are added to the set below. | 131 -- So contacts we need to do that for are added to the set below. |
131 local send_unavailable = {}; | 132 local send_unavailable = is_blocking and {}; |
132 | 133 |
133 -- Because blocking someone currently also blocks the ability to reject | 134 -- Because blocking someone currently also blocks the ability to reject |
134 -- subscription requests, we'll preemptively reject such | 135 -- subscription requests, we'll preemptively reject such |
135 local remove_pending = {}; | 136 local remove_pending = is_blocking and {}; |
136 | 137 |
137 for item in action:childtags("item") do | 138 for item in action:childtags("item") do |
138 local jid = jid_prep(item.attr.jid); | 139 local jid = jid_prep(item.attr.jid); |
139 if not jid then | 140 if not jid then |
140 origin.send(st_error_reply(stanza, "modify", "jid-malformed")); | 141 origin.send(st_error_reply(stanza, "modify", "jid-malformed")); |
141 return true; | 142 return true; |
142 end | 143 end |
143 item.attr.jid = jid; -- echo back prepped | 144 item.attr.jid = jid; -- echo back prepped |
144 new[jid] = true; | 145 new[jid] = true; |
145 if is_contact_subscribed(username, module.host, jid) then | 146 if is_blocking then |
146 send_unavailable[jid] = true; | 147 if is_contact_subscribed(username, module.host, jid) then |
147 elseif is_contact_pending_in(username, module.host, jid) then | 148 send_unavailable[jid] = true; |
148 remove_pending[jid] = true; | 149 elseif is_contact_pending_in(username, module.host, jid) then |
149 end | 150 remove_pending[jid] = true; |
150 end | 151 end |
151 | 152 end |
152 local is_blocking = action.name == "block" or nil; -- nil if unblocking | 153 end |
153 | 154 |
154 if is_blocking and not next(new) then | 155 if is_blocking and not next(new) then |
155 -- <block/> element does not contain at least one <item/> child element | 156 -- <block/> element does not contain at least one <item/> child element |
156 origin.send(st_error_reply(stanza, "modify", "bad-request")); | 157 origin.send(st_error_reply(stanza, "modify", "bad-request")); |
157 return true; | 158 return true; |