changeset 1588:b5f9f1111a8b

mod_query_client_ver: Query and log client software
author Kim Alvefur <zash@zash.se>
date Sat, 20 Dec 2014 16:07:50 +0100
parents 3ac2b835c7b3
children 0da51b825263
files mod_query_client_ver/mod_query_client_ver.lua
diffstat 1 files changed, 51 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_query_client_ver/mod_query_client_ver.lua	Sat Dec 20 16:07:50 2014 +0100
@@ -0,0 +1,51 @@
+-- Query and log client software
+
+local st = require"util.stanza";
+local uuid = require"util.uuid".generate;
+
+local xmlns_iq_version = "jabber:iq:version";
+local version_id = uuid();
+local xmlns_disco_info = "http://jabber.org/protocol/disco#info";
+local disco_id = uuid();
+
+module:hook("presence/bare", function(event)
+	local origin, stanza = event.origin, event.stanza;
+	if origin.type == "c2s" and not origin.presence and not stanza.attr.to then
+		module:add_timer(1, function()
+			if origin.type ~= "c2s" then return end
+			origin.log("debug", "Sending version query");
+			origin.send(st.iq({ id = version_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_iq_version));
+		end);
+	end
+end, 1);
+
+module:hook("iq-result/host/"..version_id, function(event)
+	local origin, stanza = event.origin, event.stanza;
+	local query = stanza:get_child("query", xmlns_iq_version);
+	if query then
+		local client = query:get_child_text("name");
+		if client then
+			local version = query:get_child_text("version");
+			if version then
+				client = client .. " version " .. version;
+			end
+			origin.log("info", "Running %s", client);
+			return true;
+		end
+	end
+	origin.send(st.iq({ id = disco_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_disco_info));
+end);
+
+module:hook("iq-result/host/"..disco_id, function(event)
+	local origin, stanza = event.origin, event.stanza;
+	local query = stanza:get_child("query", xmlns_disco_info);
+	if query then
+		local ident = query:get_child("identity");
+		if ident and ident.attr.name then
+			origin.log("info", "Running %s", ident.attr.name);
+			return true;
+		end
+	end
+	-- Unknown software
+end);
+