Software /
code /
prosody
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; |