# HG changeset patch # User Matthew Wild # Date 1266508931 0 # Node ID ba1cc6ad649d0370557ec33b1e57ad5a74ca294e Initial commit (dedicated to darkrain) diff -r 000000000000 -r ba1cc6ad649d servers/djabberd.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/djabberd.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,6 @@ +function testers.djabberd() + if not test(q_invalid_xml, ".") and not test(q_invalid_host, ".") then -- djabberd says nothing + server_name = "djabberd"; + server_comment "djabberd is not very talkative, so this is an assumption"; + end +end diff -r 000000000000 -r ba1cc6ad649d servers/ejabberd.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/ejabberd.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,38 @@ +function testers.ejabberd() + if (test(q_invalid_xml, [=[ id=["']none['"]]=]) or test(q_invalid_xml, " id='%d+'")) + and (not test(q_invalid_xml, literal " xml:lang=")) then + + server_name = "ejabberd"; + + -- Facebook curiosity + if test(q_invalid_xml, " id=(.)") == '"' then + server_comment "Appears to be Facebook's variant of ejabberd"; + end + + local hostname = test(q_invalid_xml, [=[from=["']([^"']+)]=]); + if not hostname then + server_comment "The server did not return a hostname, odd."; + else + local stream_open = [[]]; + + if not test(stream_open.."", ":features>$") then -- Oops, not ejabberd + debug("Oops, not ejabberd (please report):", test(stream_open.."", ".*")); + server_name = nil; + return; + end + + if test(q_invalid_xml, " id='%d+'") then + server_min_version = "2.1.x"; + elseif test(stream_open, literal "") then + server_name = "Isode M-Link"; + end +end + diff -r 000000000000 -r ba1cc6ad649d servers/jabber_xcp.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/jabber_xcp.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,5 @@ +function testers.jabber_xcp() + if test(q_empty_message_tag, literal "") then + server_name = "Jabber XCP"; + end +end diff -r 000000000000 -r ba1cc6ad649d servers/jabberd14.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/jabberd14.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,6 @@ +function testers.jabberd14() + if test(q_invalid_xml, literal "Invalid XML") then + server_name = "jabberd14"; + end +end + diff -r 000000000000 -r ba1cc6ad649d servers/jabberd2.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/jabberd2.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,5 @@ +function testers.jabberd2() + if test(q_invalid_xml, literal ">syntax error") then + server_name = "jabberd2"; + end +end diff -r 000000000000 -r ba1cc6ad649d servers/openfire.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/openfire.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,5 @@ +function testers.openfire() + if test(q_invalid_host, literal " encoding='UTF-8'?>") and test(q_invalid_host, literal "") then + server_name = "Openfire"; + end +end diff -r 000000000000 -r ba1cc6ad649d servers/prosody.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servers/prosody.lua Thu Feb 18 16:02:11 2010 +0000 @@ -0,0 +1,11 @@ +function testers.prosody() + if test(q_invalid_xml, literal " id=''") + and test(q_invalid_host, "This server does not serve") + and not test(q_invalid_xml, " from=") then + server_name = "Prosody"; + if not test(q_invalid_host, literal ">>", tostring(question)); + conn:settimeout(default_timeout); + local data, err, partial = conn:receive("*a"); + received = data or partial or ""; + conn:close(); + received_cache[question] = received; + debug("<<", #received ~= "" and tostring(received) or nil); + end + return received ~= "" and received:match(answer); +end + +function test(question, answer) + return _test(arg[1], tonumber(arg[2]) or default_port, question, answer); +end + +function server_comment(comment) + table.insert(getfenv(2).server_comments, comment); +end + +function literal(s) + return s:gsub("%p", "%%%1"); +end + +----- +q_invalid_xml = "abc\n"; +q_empty_message_tag = ""; +q_invalid_host = ""; +----- + +testers = {}; + +dofile "servers/ejabberd.lua" +dofile "servers/google_talk.lua" +dofile "servers/isode_mlink.lua" +dofile "servers/jabberd14.lua" +dofile "servers/jabberd2.lua" +dofile "servers/prosody.lua" +dofile "servers/tigase.lua" +dofile "servers/djabberd.lua" +dofile "servers/openfire.lua" +dofile "servers/jabber_xcp.lua" + +function test_fingerprint(server) + local tester = testers[server]; + local env = setmetatable({server_comments = {}}, { __index = _G }); + setfenv(tester, env); + local ok, err = pcall(tester); + if not ok then + print("Error while testing for "..server..": "..err); + end + return env; +end + +------------------------------------------------------------------ + +local results = {}; +for server in pairs(testers) do + local res = test_fingerprint(server); + if res.server_name then + table.insert(results, res); + end +end + +if #results > 1 then + print("Note... multiple matches, could be any:"); +end + +for _, result in ipairs(results) do + io.write(result.server_name); + if result.server_min_version then + io.write(", version "..result.server_min_version.." or later"); + end + io.write("\n"); + if #result.server_comments > 0 then + print(" Notes:\n", table.concat(result.server_comments, "\n ")); + end +end