mod_cache_c2s_caps/mod_cache_c2s_caps.lua
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
Fri, 08 Jun 2018 21:59:42 +0200
changeset 3115 7a3ac037e57f
parent 3084 b003d72d9ce6
child 3458 c424bfb927b1
permissions -rw-r--r--
mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     1
local st_iq = require "util.stanza".iq;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     2
local uuid_gen = require "util.uuid".generate;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     3
local calculate_hash = require "util.caps".calculate_hash;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     4
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     5
-- Map of jid..node, to avoid querying the same client multiple times for the same value.
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     6
local in_flight_iqs = {}
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     7
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     8
-- Some clients (*ahem* poezio…) don’t include the @node in their result iq.
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
     9
local iq_node_map = {}
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    10
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    11
local function iq_result_handler(event)
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    12
	local origin, stanza = event.origin, event.stanza;
3115
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    13
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    14
	local query = stanza:get_child("query", "http://jabber.org/protocol/disco#info");
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    15
	if not query then
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    16
		origin.log("debug", "Wrong iq payload in disco#info result: %s", stanza);
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    17
		return;
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    18
	end
7a3ac037e57f mod_cache_c2s_caps: Fix traceback on invalid payload in disco#info result.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3084
diff changeset
    19
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    20
	local from = stanza.attr.from;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    21
	local id = stanza.attr.id;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    22
	local node_string = query.attr.node;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    23
	local node_query = iq_node_map[from..id];
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    24
	if node_string == nil then
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    25
		node_string = node_query;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    26
		query.attr.node = node_query;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    27
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    28
	iq_node_map[from..id] = nil;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    29
	in_flight_iqs[from..node_string] = nil;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    30
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    31
	if node_string ~= node_query then
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    32
		origin.log("debug", "Wrong node for our disco#info query, expected %s, received %s", node_string, node_query);
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    33
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    34
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    35
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    36
	local node, ver = node_query:match("([^#]+)#([^#]+)");
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    37
	local hash = calculate_hash(query)
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    38
	if ver ~= hash then
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    39
		origin.log("debug", "Wrong hash for disco#info: %s ~= %s", ver, hash);
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    40
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    41
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    42
	origin.caps_cache = query;
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    43
	origin.log("info", "Stored caps %s", ver);
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    44
	module:fire_event("c2s-capabilities-changed", { origin = origin });
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    45
	return true;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    46
end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    47
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    48
local function iq_error_handler(event)
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    49
	local origin = event.origin;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    50
	origin.caps_cache = nil;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    51
	module:fire_event("c2s-capabilities-changed", { origin = origin });
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    52
end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    53
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    54
local function presence_stanza_handler(event)
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    55
	local origin, stanza = event.origin, event.stanza;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    56
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    57
	local from = stanza.attr.from;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    58
	if stanza.attr.to ~= nil then
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    59
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    60
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    61
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    62
	local caps = stanza:get_child("c", "http://jabber.org/protocol/caps");
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    63
	if caps == nil then
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    64
		origin.log("debug", "Presence without caps received, skipping");
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    65
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    66
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    67
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    68
	local hash = caps.attr.hash;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    69
	local node = caps.attr.node;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    70
	local ver = caps.attr.ver;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    71
	if not hash or not node or not ver then
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    72
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    73
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    74
	if hash ~= "sha-1" then
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    75
		origin.log("warn", "Non-SHA-1 caps received: %s", hash);
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    76
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    77
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    78
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    79
	local node_query = node.."#"..ver;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    80
	if (origin.caps_cache and origin.caps_cache.attr.node == node_query) or in_flight_iqs[from..node_query] ~= nil then
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    81
		origin.log("debug", "Already requested these caps, skipping");
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    82
		return;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    83
	end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    84
3084
b003d72d9ce6 mod_cache_c2s_caps: Switch to origin.log to provide better debug to admins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2905
diff changeset
    85
	origin.log("debug", "Received presence with SHA-1 caps %s, querying disco#info", node_query);
2903
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    86
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    87
	local id = uuid_gen();
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    88
	iq_node_map[from..id] = node_query
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    89
	local iq = st_iq({ type = "get", from = module.host, to = from, id = id })
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    90
		:tag("query", { xmlns = "http://jabber.org/protocol/disco#info", node = node_query });
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    91
	module:hook("iq-result/host/"..id, iq_result_handler);
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    92
	module:hook("iq-error/host/"..id, iq_error_handler);
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    93
	module:send(iq);
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    94
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    95
	in_flight_iqs[from..node_query] = true;
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    96
end
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    97
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    98
-- Handle only non-directed presences for now.
0273d7583373 mod_cache_c2s_caps: New module caching capabilities from local clients
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
    99
module:hook("pre-presence/bare", presence_stanza_handler);