annotate mod_auto_answer_disco_info/mod_auto_answer_disco_info.lua @ 4651:8231774f5bfd

mod_cloud_notify_encrypted: Ensure body substring remains valid UTF-8 The `body:sub()` call risks splitting the string in the middle of a multi-byte UTF-8 sequence. This should have been caught by util.stanza validation, but that would have caused some havoc, at the very least causing the notification to not be sent. There have been no reports of this happening. Likely because this module isn't widely deployed among users with languages that use many longer UTF-8 sequences. The util.encodings.utf8.valid() function is O(n) where only the last sequence really needs to be checked, but it's in C and expected to be fast.
author Kim Alvefur <zash@zash.se>
date Sun, 22 Aug 2021 13:22:59 +0200
parents 05c74210c007
children
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
4585
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
27 module:hook("iq/full", function(event)
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
28 local stanza = event.stanza;
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
29 if stanza.attr.type == "get" then
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
30 if stanza:get_child("query", "http://jabber.org/protocol/disco#info") then
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
31 return disco_handler(event);
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
32 end
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
33 end
05c74210c007 mod_auto_answer_disco_info: Fix to use event that is fired
Kim Alvefur <zash@zash.se>
parents: 3268
diff changeset
34 end, 1);