Mercurial > prosody-hg
comparison plugins/mod_blocklist.lua @ 6973:f350f840a6f7
mod_blocklist: Restructure how we keep track of where to send unavailable presence
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 06 Dec 2015 02:22:49 +0100 |
| parents | 9e926e48cbf9 |
| children | bdb216e0688a |
comparison
equal
deleted
inserted
replaced
| 6972:9e926e48cbf9 | 6973:f350f840a6f7 |
|---|---|
| 117 local origin, stanza = event.origin, event.stanza; | 117 local origin, stanza = event.origin, event.stanza; |
| 118 local username = origin.username; | 118 local username = origin.username; |
| 119 local action = stanza.tags[1]; -- "block" or "unblock" | 119 local action = stanza.tags[1]; -- "block" or "unblock" |
| 120 local new = {}; -- JIDs to block depending or unblock on action | 120 local new = {}; -- JIDs to block depending or unblock on action |
| 121 | 121 |
| 122 -- XEP-0191 sayeth: | |
| 123 -- > When the user blocks communications with the contact, the user's | |
| 124 -- > server MUST send unavailable presence information to the contact (but | |
| 125 -- > only if the contact is allowed to receive presence notifications [...] | |
| 126 -- So contacts we need to do that for are added to the set below. | |
| 127 local send_unavailable = {}; | |
| 128 | |
| 122 for item in action:childtags("item") do | 129 for item in action:childtags("item") do |
| 123 local jid = jid_prep(item.attr.jid); | 130 local jid = jid_prep(item.attr.jid); |
| 124 if not jid then | 131 if not jid then |
| 125 origin.send(st_error_reply(stanza, "modify", "jid-malformed")); | 132 origin.send(st_error_reply(stanza, "modify", "jid-malformed")); |
| 126 return true; | 133 return true; |
| 127 end | 134 end |
| 128 item.attr.jid = jid; -- echo back prepped | 135 item.attr.jid = jid; -- echo back prepped |
| 129 new[jid] = is_contact_subscribed(username, module.host, jid) or false; | 136 new[jid] = true; |
| 137 if is_contact_subscribed(username, module.host, jid) then | |
| 138 send_unavailable[jid] = true; | |
| 139 end | |
| 130 end | 140 end |
| 131 | 141 |
| 132 local is_blocking = action.name == "block" or nil; -- nil if unblocking | 142 local is_blocking = action.name == "block" or nil; -- nil if unblocking |
| 133 | 143 |
| 134 if is_blocking and not next(new) then | 144 if is_blocking and not next(new) then |
| 159 origin.send(st_error_reply(stanza, "wait", "internal-server-error", err)); | 169 origin.send(st_error_reply(stanza, "wait", "internal-server-error", err)); |
| 160 return true; | 170 return true; |
| 161 end | 171 end |
| 162 | 172 |
| 163 if is_blocking then | 173 if is_blocking then |
| 164 for jid, in_roster in pairs(new) do | 174 for jid in pairs(send_unavailable) do |
| 165 if not blocklist[jid] and in_roster then | 175 if not blocklist[jid] then |
| 166 for _, session in pairs(sessions[username].sessions) do | 176 for _, session in pairs(sessions[username].sessions) do |
| 167 if session.presence then | 177 if session.presence then |
| 168 module:send(st.presence({ type = "unavailable", to = jid, from = session.full_jid })); | 178 module:send(st.presence({ type = "unavailable", to = jid, from = session.full_jid })); |
| 169 end | 179 end |
| 170 end | 180 end |
