aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2015-05-13 22:33:40 +0200
committerKim Alvefur <zash@zash.se>2015-05-13 22:33:40 +0200
commit539f4b561436344e095cc945afe6301edf272250 (patch)
tree158e57da633fa8d8553805dcd190a93b767d7f9a
parent70e77200f7789e9fb606c7e99e30a54aca70c5c5 (diff)
parentd6a59152ea90202fa09ba8e6ba7386b68978b181 (diff)
downloadprosody-539f4b561436344e095cc945afe6301edf272250.tar.gz
prosody-539f4b561436344e095cc945afe6301edf272250.zip
Merge 0.10->trunk
-rw-r--r--core/portmanager.lua8
-rw-r--r--plugins/mod_s2s/mod_s2s.lua9
-rw-r--r--plugins/mod_s2s/s2sout.lib.lua47
-rw-r--r--util/datamanager.lua6
4 files changed, 37 insertions, 33 deletions
diff --git a/core/portmanager.lua b/core/portmanager.lua
index bbb7c215..e800cf36 100644
--- a/core/portmanager.lua
+++ b/core/portmanager.lua
@@ -152,7 +152,7 @@ function activate(service_name)
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 @@ function unregister_service(service_name, service_info)
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 @@ function get_service(service_name)
return (services[service_name] or {})[1];
end
-function get_active_services(...)
+function get_active_services()
return active_services;
end
diff --git a/plugins/mod_s2s/mod_s2s.lua b/plugins/mod_s2s/mod_s2s.lua
index a861b049..68042a5d 100644
--- a/plugins/mod_s2s/mod_s2s.lua
+++ b/plugins/mod_s2s/mod_s2s.lua
@@ -169,7 +169,7 @@ end
-- 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 @@ function mark_connected(session)
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 stream_callbacks = { default_ns = "jabber:server", handlestanza = core_pr
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 @@ function stream_callbacks.streamopened(session, attr)
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 @@ function stream_callbacks.streamopened(session, attr)
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
diff --git a/plugins/mod_s2s/s2sout.lib.lua b/plugins/mod_s2s/s2sout.lib.lua
index 5214f4cf..7c6033a3 100644
--- a/plugins/mod_s2s/s2sout.lib.lua
+++ b/plugins/mod_s2s/s2sout.lib.lua
@@ -18,18 +18,35 @@ local socket = require "socket";
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 @@ function s2sout.try_connect(host_session, connect_host, connect_port, err)
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 @@ function s2sout.try_connect(host_session, connect_host, connect_port, err)
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 @@ module:hook_global("service-added", function (event)
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
- 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
+ if source:find(":") then
has_ipv6 = true;
- elseif sources[i].proto == "IPv4" then
+ else
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;
diff --git a/util/datamanager.lua b/util/datamanager.lua
index b4138638..a107d95c 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -348,8 +348,12 @@ end
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));