Software / code / prosody
Comparison
core/s2smanager.lua @ 337:4a1dd1c2c219
We have SRV resolving \o/
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 18 Nov 2008 22:41:04 +0000 |
| parent | 333:8d15b073fdbe |
| child | 343:cae2178b5623 |
comparison
equal
deleted
inserted
replaced
| 336:d97d59cfd1e8 | 337:4a1dd1c2c219 |
|---|---|
| 1 | 1 |
| 2 local hosts = hosts; | 2 local hosts = hosts; |
| 3 local sessions = sessions; | 3 local sessions = sessions; |
| 4 local socket = require "socket"; | 4 local socket = require "socket"; |
| 5 local format = string.format; | 5 local format = string.format; |
| 6 local t_insert = table.insert; | 6 local t_insert, t_sort = table.insert, table.sort; |
| 7 local get_traceback = debug.traceback; | 7 local get_traceback = debug.traceback; |
| 8 local tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber | 8 local tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber |
| 9 = tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber; | 9 = tostring, pairs, ipairs, getmetatable, print, newproxy, error, tonumber; |
| 10 | 10 |
| 11 local connlisteners_get = require "net.connlisteners".get; | 11 local connlisteners_get = require "net.connlisteners".get; |
| 22 | 22 |
| 23 local md5_hash = require "util.hashes".md5; | 23 local md5_hash = require "util.hashes".md5; |
| 24 | 24 |
| 25 local dialback_secret = "This is very secret!!! Ha!"; | 25 local dialback_secret = "This is very secret!!! Ha!"; |
| 26 | 26 |
| 27 local srvmap = { ["gmail.com"] = "talk.google.com", ["identi.ca"] = "hampton.controlezvous.ca", ["cdr.se"] = "jabber.cdr.se" }; | 27 local dns = require "net.dns"; |
| 28 | 28 |
| 29 module "s2smanager" | 29 module "s2smanager" |
| 30 | |
| 31 local function compare_srv_priorities(a,b) return a.priority < b.priority or a.weight < b.weight; end | |
| 30 | 32 |
| 31 function send_to_host(from_host, to_host, data) | 33 function send_to_host(from_host, to_host, data) |
| 32 if data.name then data = tostring(data); end | 34 if data.name then data = tostring(data); end |
| 33 local host = hosts[from_host].s2sout[to_host]; | 35 local host = hosts[from_host].s2sout[to_host]; |
| 34 if host then | 36 if host then |
| 35 -- We have a connection to this host already | 37 -- We have a connection to this host already |
| 36 if host.type == "s2sout_unauthed" then | 38 if host.type == "s2sout_unauthed" then |
| 37 host.log("debug", "trying to send over unauthed s2sout to "..to_host..", authing it now..."); | 39 (host.log or log)("debug", "trying to send over unauthed s2sout to "..to_host..", authing it now..."); |
| 38 if not host.notopen and not host.dialback_key then | 40 if not host.notopen and not host.dialback_key then |
| 39 host.log("debug", "dialback had not been initiated"); | 41 host.log("debug", "dialback had not been initiated"); |
| 40 initiate_dialback(host); | 42 initiate_dialback(host); |
| 41 end | 43 end |
| 42 | 44 |
| 85 local cl = connlisteners_get("xmppserver"); | 87 local cl = connlisteners_get("xmppserver"); |
| 86 | 88 |
| 87 local conn, handler = socket.tcp() | 89 local conn, handler = socket.tcp() |
| 88 | 90 |
| 89 --FIXME: Below parameters (ports/ip) are incorrect (use SRV) | 91 --FIXME: Below parameters (ports/ip) are incorrect (use SRV) |
| 90 to_host = srvmap[to_host] or to_host; | 92 |
| 93 local connect_host, connect_port = to_host, 5269; | |
| 94 | |
| 95 local answer = dns.lookup("_xmpp-server._tcp."..to_host..".", "SRV"); | |
| 96 | |
| 97 if answer then | |
| 98 log("debug", to_host.." has SRV records, handling..."); | |
| 99 local srv_hosts = {}; | |
| 100 host_session.srv_hosts = srv_hosts; | |
| 101 for _, record in ipairs(answer) do | |
| 102 t_insert(srv_hosts, record.srv); | |
| 103 end | |
| 104 t_sort(srv_hosts, compare_srv_priorities); | |
| 105 | |
| 106 local srv_choice = srv_hosts[1]; | |
| 107 if srv_choice then | |
| 108 log("debug", "Best record found"); | |
| 109 connect_host, connect_port = srv_choice.target or to_host, srv_choice.port or connect_port; | |
| 110 log("debug", "Best record found, will connect to %s:%d", connect_host, connect_port); | |
| 111 end | |
| 112 end | |
| 91 | 113 |
| 92 conn:settimeout(0); | 114 conn:settimeout(0); |
| 93 local success, err = conn:connect(to_host, 5269); | 115 local success, err = conn:connect(connect_host, connect_port); |
| 94 if not success then | 116 if not success and err ~= "timeout" then |
| 95 log("warn", "s2s connect() failed: %s", err); | 117 log("warn", "s2s connect() failed: %s", err); |
| 96 end | 118 end |
| 97 | 119 |
| 98 conn = wraptlsclient(cl, conn, to_host, 5269, 0, 1, hosts[from_host].ssl_ctx ); | 120 conn = wraptlsclient(cl, conn, to_host, 5269, 0, 1, hosts[from_host].ssl_ctx ); |
| 99 host_session.conn = conn; | 121 host_session.conn = conn; |