Changeset

6690:b2e89583d6e6

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Wed, 13 May 2015 22:33:40 +0200
parents 6679:96e034508978 (current diff) 6689:53bfca69c48b (diff)
children 6693:365f0f885aa5
files plugins/mod_s2s/mod_s2s.lua
diffstat 4 files changed, 37 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/core/portmanager.lua	Wed May 13 17:00:27 2015 +0100
+++ b/core/portmanager.lua	Wed May 13 22:33:40 2015 +0200
@@ -152,7 +152,7 @@
 end
 
 function deactivate(service_name, service_info)
-	for name, interface, port, n, active_service
+	for name, interface, port, n, active_service --luacheck: ignore 213/name 213/n
 		in active_services:iter(service_name or service_info and service_info.name, nil, nil, nil) do
 		if service_info == nil or active_service.service == service_info then
 			close(interface, port);
@@ -192,11 +192,11 @@
 end
 
 function close(interface, port)
-	local service, server = get_service_at(interface, port);
+	local service, service_server = get_service_at(interface, port);
 	if not service then
 		return false, "port-not-open";
 	end
-	server:close();
+	service_server:close();
 	active_services:remove(service.name, interface, port);
 	log("debug", "Removed listening service %s from [%s]:%d", service.name, interface, port);
 	return true;
@@ -211,7 +211,7 @@
 	return (services[service_name] or {})[1];
 end
 
-function get_active_services(...)
+function get_active_services()
 	return active_services;
 end
 
--- a/plugins/mod_s2s/mod_s2s.lua	Wed May 13 17:00:27 2015 +0100
+++ b/plugins/mod_s2s/mod_s2s.lua	Wed May 13 22:33:40 2015 +0200
@@ -169,7 +169,7 @@
 
 -- Stream is authorised, and ready for normal stanzas
 function mark_connected(session)
-	local sendq, send = session.sendq, session.sends2s;
+	local sendq = session.sendq;
 
 	local from, to = session.from_host, session.to_host;
 
@@ -192,6 +192,7 @@
 	if session.direction == "outgoing" then
 		if sendq then
 			session.log("debug", "sending %d queued stanzas across new outgoing connection to %s", #sendq, session.to_host);
+			local send = session.sends2s;
 			for i, data in ipairs(sendq) do
 				send(data[1]);
 				sendq[i] = nil;
@@ -261,8 +262,6 @@
 local xmlns_xmpp_streams = "urn:ietf:params:xml:ns:xmpp-streams";
 
 function stream_callbacks.streamopened(session, attr)
-	local send = session.sends2s;
-
 	session.version = tonumber(attr.version) or 0;
 
 	-- TODO: Rename session.secure to session.encrypted
@@ -345,6 +344,7 @@
 		end
 
 		session:open_stream(session.to_host, session.from_host)
+		session.notopen = nil;
 		if session.version >= 1.0 then
 			local features = st.stanza("stream:features");
 
@@ -355,9 +355,8 @@
 			end
 
 			log("debug", "Sending stream features: %s", tostring(features));
-			send(features);
+			session.sends2s(features);
 		end
-		session.notopen = nil;
 	elseif session.direction == "outgoing" then
 		session.notopen = nil;
 		if not attr.id then
--- a/plugins/mod_s2s/s2sout.lib.lua	Wed May 13 17:00:27 2015 +0100
+++ b/plugins/mod_s2s/s2sout.lib.lua	Wed May 13 22:33:40 2015 +0200
@@ -18,18 +18,35 @@
 local adns = require "net.adns";
 local dns = require "net.dns";
 local t_insert, t_sort, ipairs = table.insert, table.sort, ipairs;
-local local_addresses = require "util.net".local_addresses;
 
 local s2s_destroy_session = require "core.s2smanager".destroy_session;
 
 local log = module._log;
 
-local sources = {};
+local anysource = { IPv4 = "0.0.0.0", IPv6 = "::" };
+local function get_sources(addrs)
+	local sources = {};
+	for _, IP in ipairs(addrs) do
+		local sock;
+		if IP.proto == "IPv4" then
+			sock = socket.udp();
+		elseif IP.proto == "IPv6" then
+			sock = socket.udp6();
+		end
+		sock:setpeername(IP.addr, 9);
+		local localaddr = sock:getsockname() or anysource[IP.proto];
+		sock:close();
+		if not sources[localaddr] then
+			sources[localaddr] = true;
+			t_insert(sources, new_ip(localaddr, IP.proto));
+		end
+	end
+	return sources;
+end
 local has_ipv4, has_ipv6;
 
 local dns_timeout = module:get_option_number("dns_timeout", 15);
 dns.settimeout(dns_timeout);
-local max_dns_depth = module:get_option_number("dns_max_depth", 3);
 
 local s2sout = {};
 
@@ -178,7 +195,7 @@
 
 				if have_other_result then
 					if #IPs > 0 then
-						rfc6724_dest(host_session.ip_hosts, sources);
+						rfc6724_dest(host_session.ip_hosts, get_sources(host_session.ip_hosts));
 						for i = 1, #IPs do
 							IPs[i] = {ip = IPs[i], port = connect_port};
 						end
@@ -214,7 +231,7 @@
 
 				if have_other_result then
 					if #IPs > 0 then
-						rfc6724_dest(host_session.ip_hosts, sources);
+						rfc6724_dest(host_session.ip_hosts, get_sources(host_session.ip_hosts));
 						for i = 1, #IPs do
 							IPs[i] = {ip = IPs[i], port = connect_port};
 						end
@@ -302,28 +319,12 @@
 		return;
 	end
 	for source, _ in pairs(s2s_sources) do
-		if source == "*" or source == "0.0.0.0" then
-			for _, addr in ipairs(local_addresses("ipv4", true)) do
-				sources[#sources + 1] = new_ip(addr, "IPv4");
-			end
-		elseif source == "::" then
-			for _, addr in ipairs(local_addresses("ipv6", true)) do
-				sources[#sources + 1] = new_ip(addr, "IPv6");
-			end
+		if source:find(":") then
+			has_ipv6 = true;
 		else
-			sources[#sources + 1] = new_ip(source, (source:find(":") and "IPv6") or "IPv4");
-		end
-	end
-	for i = 1,#sources do
-		if sources[i].proto == "IPv6" then
-			has_ipv6 = true;
-		elseif sources[i].proto == "IPv4" then
 			has_ipv4 = true;
 		end
 	end
-	if not (has_ipv4 or has_ipv6)  then
-		module:log("warn", "No local IPv4 or IPv6 addresses detected, outgoing connections may fail");
-	end
 end);
 
 return s2sout;
--- a/util/datamanager.lua	Wed May 13 17:00:27 2015 +0100
+++ b/util/datamanager.lua	Wed May 13 22:33:40 2015 +0200
@@ -348,8 +348,12 @@
 
 function purge(username, host)
 	local host_dir = format("%s/%s/", data_path, encode(host));
+	local ok, iter, state, var = pcall(lfs.dir, host_dir);
+	if not ok then
+		return ok, iter;
+	end
 	local errs = {};
-	for file in lfs.dir(host_dir) do
+	for file in iter, state, var do
 		if lfs.attributes(host_dir..file, "mode") == "directory" then
 			local store = decode(file);
 			local ok, err = do_remove(getpath(username, host, store));