-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmod_s2soutinjection.lua
48 lines (39 loc) · 1.79 KB
/
mod_s2soutinjection.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
local st = require"util.stanza";
local new_ip = require"util.ip".new_ip;
local new_outgoing = require"core.s2smanager".new_outgoing;
local bounce_sendq = module:depends"s2s".route_to_new_session.bounce_sendq;
local s2sout = module:depends"s2s".route_to_new_session.s2sout;
local injected = module:get_option("s2s_connect_overrides");
local function isip(addr)
return not not (addr and addr:match("^%d+%.%d+%.%d+%.%d+$") or addr:match("^[%x:]*:[%x:]-:[%x:]*$"));
end
module:hook("route/remote", function(event)
local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza;
local inject = injected and injected[to_host];
if not inject then return end
log("debug", "opening a new outgoing connection for this stanza");
local host_session = new_outgoing(from_host, to_host);
-- Store in buffer
host_session.bounce_sendq = bounce_sendq;
host_session.sendq = { {tostring(stanza), stanza.attr.type ~= "error" and stanza.attr.type ~= "result" and st.reply(stanza)} };
log("debug", "stanza [%s] queued until connection complete", tostring(stanza.name));
local ip_hosts, srv_hosts = {}, {};
host_session.srv_hosts = srv_hosts;
host_session.srv_choice = 0;
if type(inject) == "string" then inject = { inject } end
for _, item in ipairs(inject) do
local host, port = item[1] or item, tonumber(item[2]) or 5269;
if isip(host) then
ip_hosts[#ip_hosts+1] = { ip = new_ip(host, (host:find(":") and "IPv6") or "IPv4"), port = port }
else
srv_hosts[#srv_hosts+1] = { target = host, port = port }
end
end
if #ip_hosts > 0 then
host_session.ip_hosts = ip_hosts;
host_session.ip_choice = 0; -- Incremented by try_next_ip
s2sout.try_next_ip(host_session);
return true;
end
return s2sout.try_connect(host_session, host_session.srv_hosts[1].target, host_session.srv_hosts[1].port);
end, -2);