Comparison

plugins/s2s/s2sout.lib.lua @ 4602:ba898af15de5

mod_s2s: Collect s2s sources from portmanager and get local address if necessary
author Florian Zeitz <florob@babelmonkeys.de>
date Sun, 11 Mar 2012 20:16:57 +0100
parent 4599:f9f5230d7a9c
child 4611:8572373fa26f
comparison
equal deleted inserted replaced
4601:4007b9f9aa5f 4602:ba898af15de5
6 -- COPYING file in the source package for more information. 6 -- COPYING file in the source package for more information.
7 -- 7 --
8 8
9 --- Module containing all the logic for connecting to a remote server 9 --- Module containing all the logic for connecting to a remote server
10 10
11 local portmanager = require "core.portmanager";
11 local wrapclient = require "net.server".wrapclient; 12 local wrapclient = require "net.server".wrapclient;
12 local initialize_filters = require "util.filters".initialize; 13 local initialize_filters = require "util.filters".initialize;
13 local idna_to_ascii = require "util.encodings".idna.to_ascii; 14 local idna_to_ascii = require "util.encodings".idna.to_ascii;
14 local add_task = require "util.timer".add_task; 15 local add_task = require "util.timer".add_task;
15 local new_ip = require "util.ip".new_ip; 16 local new_ip = require "util.ip".new_ip;
19 local st = require "util.stanza"; 20 local st = require "util.stanza";
20 21
21 local s2s_new_outgoing = require "core.s2smanager".new_outgoing; 22 local s2s_new_outgoing = require "core.s2smanager".new_outgoing;
22 local s2s_destroy_session = require "core.s2smanager".destroy_session; 23 local s2s_destroy_session = require "core.s2smanager".destroy_session;
23 24
24 local cfg_sources = config.get("*", "core", "s2s_interfaces") or socket.local_addresses and socket.local_addresses() or { "*" }; 25 local sources = {};
25 26
26 local max_dns_depth = module:get_option_number("dns_max_depth", 3); 27 local max_dns_depth = module:get_option_number("dns_max_depth", 3);
27 28
28 local s2sout = {}; 29 local s2sout = {};
29 30
156 end 157 end
157 end 158 end
158 end 159 end
159 160
160 function s2sout.try_connect(host_session, connect_host, connect_port, err) 161 function s2sout.try_connect(host_session, connect_host, connect_port, err)
161 local sources;
162 host_session.connecting = true; 162 host_session.connecting = true;
163 163
164 if not err then 164 if not err then
165 local IPs = {}; 165 local IPs = {};
166 host_session.ip_hosts = IPs; 166 host_session.ip_hosts = IPs;
167 local handle4, handle6; 167 local handle4, handle6;
168 local has_other = false; 168 local has_other = false;
169
170 if not sources then
171 sources = {};
172 for i, source in ipairs(cfg_sources) do
173 if source == "*" then
174 sources[i] = new_ip("0.0.0.0", "IPv4");
175 else
176 sources[i] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
177 end
178 end
179 end
180 169
181 handle4 = adns.lookup(function (reply, err) 170 handle4 = adns.lookup(function (reply, err)
182 handle4 = nil; 171 handle4 = nil;
183 172
184 -- COMPAT: This is a compromise for all you CNAME-(ab)users :) 173 -- COMPAT: This is a compromise for all you CNAME-(ab)users :)
321 310
322 log("debug", "Connection attempt in progress..."); 311 log("debug", "Connection attempt in progress...");
323 return true; 312 return true;
324 end 313 end
325 314
315 module:hook_global("service-added", function (event)
316 if event.name ~= "s2s" then return end
317
318 local s2s_sources = portmanager.get_active_services():get("s2s");
319
320 for source, _ in pairs(s2s_sources) do
321 if source == "*" or source == "0.0.0.0" then
322 if not socket.local_addresses then
323 sources[#sources + 1] = new_ip("0.0.0.0", "IPv4");
324 else
325 for _, addr in ipairs(socket.local_addresses("ipv4", true)) do
326 sources[#sources + 1] = new_ip(addr, "IPv4");
327 end
328 end
329 elseif source == "::" then
330 if not socket.local_addresses then
331 sources[#sources + 1] = new_ip("::", "IPv4");
332 else
333 for _, addr in ipairs(socket.local_addresses("ipv6", true)) do
334 sources[#sources + 1] = new_ip(addr, "IPv6");
335 end
336 end
337 else
338 sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
339 end
340 end
341 end);
342
326 return s2sout; 343 return s2sout;