Mercurial > prosody-modules
comparison mod_privilege/mod_privilege.lua @ 3388:7454274ead2f
mod_privilege: fixed routing issue with message permission:
The presence of `xmlns="jabber:client"` was causing trouble during routing, notably mod_smacks was not counting the outgoing stanza.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 01 Dec 2018 17:50:36 +0100 |
parents | e9226e3bdeba |
children | 3ddab718f717 |
comparison
equal
deleted
inserted
replaced
3387:c5e8042b174c | 3388:7454274ead2f |
---|---|
330 end); | 330 end); |
331 | 331 |
332 | 332 |
333 --> message permission <-- | 333 --> message permission <-- |
334 | 334 |
335 local function clean_xmlns(node) | |
336 -- Recursively remove "jabber:client" attribute from node. | |
337 -- In Prosody internal routing, xmlns should not be set. | |
338 -- Keeping xmlns would lead to issues like mod_smacks ignoring the outgoing stanza, | |
339 -- so we remove all xmlns attributes with a value of "jabber:client" | |
340 if node.attr.xmlns == 'jabber:client' then | |
341 for childnode in node:childtags() do | |
342 clean_xmlns(childnode); | |
343 end | |
344 node.attr.xmlns = nil; | |
345 end | |
346 end | |
347 | |
335 module:hook("message/host", function(event) | 348 module:hook("message/host", function(event) |
336 local session, stanza = event.origin, event.stanza; | 349 local session, stanza = event.origin, event.stanza; |
337 local privilege_elt = stanza:get_child('privilege', _PRIV_ENT_NS) | 350 local privilege_elt = stanza:get_child('privilege', _PRIV_ENT_NS) |
338 if privilege_elt==nil then return; end | 351 if privilege_elt==nil then return; end |
339 local _, to_host = jid.split(stanza.attr.to) | 352 local _, to_host = jid.split(stanza.attr.to) |
344 and privilege_elt.tags[1].attr.xmlns==_FORWARDED_NS then | 357 and privilege_elt.tags[1].attr.xmlns==_FORWARDED_NS then |
345 local message_elt = privilege_elt.tags[1]:get_child('message', 'jabber:client') | 358 local message_elt = privilege_elt.tags[1]:get_child('message', 'jabber:client') |
346 if message_elt ~= nil then | 359 if message_elt ~= nil then |
347 local _, from_host, from_resource = jid.split(message_elt.attr.from) | 360 local _, from_host, from_resource = jid.split(message_elt.attr.from) |
348 if from_resource == nil and hosts[from_host] then -- we only accept bare jids from one of the server hosts | 361 if from_resource == nil and hosts[from_host] then -- we only accept bare jids from one of the server hosts |
362 clean_xmlns(message_elt); -- needed do to proper routing | |
349 -- at this point everything should be alright, we can send the message | 363 -- at this point everything should be alright, we can send the message |
350 prosody.core_route_stanza(nil, message_elt) | 364 prosody.core_route_stanza(nil, message_elt) |
351 else -- trying to send a message from a forbidden entity | 365 else -- trying to send a message from a forbidden entity |
352 module:log("warn", "Entity "..tostring(session.full_jid).." try to send a message from "..tostring(message_elt.attr.from)) | 366 module:log("warn", "Entity "..tostring(session.full_jid).." try to send a message from "..tostring(message_elt.attr.from)) |
353 session.send(st.error_reply(stanza, 'auth', 'forbidden')) | 367 session.send(st.error_reply(stanza, 'auth', 'forbidden')) |