annotate mod_auto_answer_disco_info/mod_auto_answer_disco_info.lua @ 3656:3e0f4d727825

mod_vcard_muc: Add an alternative method of signaling avatar change When the avatar has been changed, a signal is sent that the room configuration has changed. Clients then do a disco#info query to find the SHA-1 of the new avatar. They can then fetch it as before, or not if they have it cached already. This is meant to be less disruptive than signaling via presence, which caused problems for some clients. If clients transition to the new method, the old one can eventually be removed. The namespace is made up while waiting for standardization. Otherwise it is very close to what's described in https://xmpp.org/extensions/inbox/muc-avatars.html
author Kim Alvefur <zash@zash.se>
date Sun, 25 Aug 2019 20:46:43 +0200
parents 4cdd1ddae72c
children 05c74210c007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2900
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 module:depends("cache_c2s_caps");
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 local st = require "util.stanza";
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4
3268
4cdd1ddae72c mod_auto_answer_disco_info: Simplify iq handling by hooking on the full payload tag instead of iq/full.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3106
diff changeset
5 local function disco_handler(event)
3081
e0ef90e96931 mod_auto_answer_disco_info: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2912
diff changeset
6 local stanza, origin = event.stanza, event.origin;
3268
4cdd1ddae72c mod_auto_answer_disco_info: Simplify iq handling by hooking on the full payload tag instead of iq/full.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3106
diff changeset
7 local query = stanza.tags[1];
2900
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 local to = stanza.attr.to;
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 local node = query.attr.node;
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10
2903
01692f0052e8 mod_cache_c2s_caps: Use prosody.full_sessions instead of _G.full_sessions (thanks luacheck)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2902
diff changeset
11 local target_session = prosody.full_sessions[to];
2911
43adc18ff9f3 mod_auto_answer_disco_info: Don’t answer if the target session isn’t online
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2903
diff changeset
12 if target_session == nil then
43adc18ff9f3 mod_auto_answer_disco_info: Don’t answer if the target session isn’t online
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2903
diff changeset
13 return;
43adc18ff9f3 mod_auto_answer_disco_info: Don’t answer if the target session isn’t online
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2903
diff changeset
14 end
43adc18ff9f3 mod_auto_answer_disco_info: Don’t answer if the target session isn’t online
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2903
diff changeset
15
2900
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 local disco_info = target_session.caps_cache;
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 if disco_info ~= nil and (node == nil or node == disco_info.attr.node) then
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18 local iq = st.reply(stanza);
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 iq:add_child(st.clone(disco_info));
3106
1fe7da46e915 mod_auto_answer_disco_info: Don’t traceback on iqs coming from mod_muc.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3081
diff changeset
20 local log = origin.log or module._log;
1fe7da46e915 mod_auto_answer_disco_info: Don’t traceback on iqs coming from mod_muc.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3081
diff changeset
21 log("debug", "Answering disco#info on the behalf of %s", to);
2900
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 module:send(iq);
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 return true;
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 end
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 end
0286ccacec7c mod_auto_answer_disco_info: New module answering disco#info queries on the behalf of the recipient
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26
3268
4cdd1ddae72c mod_auto_answer_disco_info: Simplify iq handling by hooking on the full payload tag instead of iq/full.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3106
diff changeset
27 module:hook("iq-get/full/http://jabber.org/protocol/disco#info:query", disco_handler, 1);