aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2014-09-02 22:33:11 +0200
committerKim Alvefur <zash@zash.se>2014-09-02 22:33:11 +0200
commitab57f00b936342c599aadf901f85e5b29ee91baa (patch)
treeb4ffbcba45331b7fa86a9e1d1881e94b8fef9d42
parente41db733ad45978e4b3193af348c220623125a0e (diff)
parent3d6dafb89a05a6aad4d102266172e377d9491360 (diff)
downloadprosody-ab57f00b936342c599aadf901f85e5b29ee91baa.tar.gz
prosody-ab57f00b936342c599aadf901f85e5b29ee91baa.zip
Merge 0.9->0.10
-rw-r--r--net/http.lua4
-rw-r--r--net/http/server.lua4
-rw-r--r--net/server_event.lua11
-rw-r--r--net/server_select.lua5
-rw-r--r--plugins/mod_admin_telnet.lua4
-rw-r--r--plugins/mod_c2s.lua6
-rw-r--r--plugins/mod_component.lua4
-rw-r--r--plugins/mod_net_multiplex.lua3
-rw-r--r--plugins/mod_s2s/mod_s2s.lua11
9 files changed, 43 insertions, 9 deletions
diff --git a/net/http.lua b/net/http.lua
index ab9ec7b6..0c0ef967 100644
--- a/net/http.lua
+++ b/net/http.lua
@@ -72,6 +72,10 @@ function listener.ondisconnect(conn, err)
requests[conn] = nil;
end
+function listener.ondetach(conn)
+ requests[conn] = nil;
+end
+
local function request_reader(request, data, err)
if not request.parser then
local function error_cb(reason)
diff --git a/net/http/server.lua b/net/http/server.lua
index 09f8d2a4..be870c51 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -142,6 +142,10 @@ function listener.ondisconnect(conn)
sessions[conn] = nil;
end
+function listener.ondetach(conn)
+ sessions[conn] = nil;
+end
+
function listener.onincoming(conn, data)
sessions[conn]:feed(data);
end
diff --git a/net/server_event.lua b/net/server_event.lua
index e10606dd..756e9837 100644
--- a/net/server_event.lua
+++ b/net/server_event.lua
@@ -438,9 +438,11 @@ do
end
function interface_mt:setlistener(listener)
- self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, self.onreadtimeout, self.onstatus
- = listener.onconnect, listener.ondisconnect, listener.onincoming,
- listener.ontimeout, listener.onreadtimeout, listener.onstatus;
+ self:ondetach(); -- Notify listener that it is no longer responsible for this connection
+ self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout,
+ self.onreadtimeout, self.onstatus, self.ondetach
+ = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout,
+ listener.onreadtimeout, listener.onstatus, listener.ondetach;
end
-- Stub handlers
@@ -460,6 +462,8 @@ do
end
function interface_mt:ondrain()
end
+ function interface_mt:ondetach()
+ end
function interface_mt:onstatus()
end
end
@@ -487,6 +491,7 @@ do
ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
ondrain = listener.ondrain; -- called when writebuffer is empty
+ ondetach = listener.ondetach; -- called when disassociating this listener from this connection
onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
eventread = false, eventwrite = false, eventclose = false,
eventhandshake = false, eventstarthandshake = false; -- event handler
diff --git a/net/server_select.lua b/net/server_select.lua
index 6308e62f..d2192f0a 100644
--- a/net/server_select.lua
+++ b/net/server_select.lua
@@ -285,6 +285,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
local disconnect = listeners.ondisconnect
local drain = listeners.ondrain
local onreadtimeout = listeners.onreadtimeout;
+ local detach = listeners.ondetach
local bufferqueue = { } -- buffer array
local bufferqueuelen = 0 -- end of buffer array
@@ -316,11 +317,15 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
handler.onreadtimeout = onreadtimeout;
handler.setlistener = function( self, listeners )
+ if detach then
+ detach(self) -- Notify listener that it is no longer responsible for this connection
+ end
dispatch = listeners.onincoming
disconnect = listeners.ondisconnect
status = listeners.onstatus
drain = listeners.ondrain
handler.onreadtimeout = listeners.onreadtimeout
+ detach = listeners.ondetach
end
handler.getstats = function( )
return readtraffic, sendtraffic
diff --git a/plugins/mod_admin_telnet.lua b/plugins/mod_admin_telnet.lua
index 5388a0e6..a17b1c57 100644
--- a/plugins/mod_admin_telnet.lua
+++ b/plugins/mod_admin_telnet.lua
@@ -170,6 +170,10 @@ function console_listener.ondisconnect(conn, err)
end
end
+function console_listener.ondetach(conn)
+ sessions[conn] = nil;
+end
+
-- Console commands --
-- These are simple commands, not valid standalone in Lua
diff --git a/plugins/mod_c2s.lua b/plugins/mod_c2s.lua
index bb3858c0..4238b2e7 100644
--- a/plugins/mod_c2s.lua
+++ b/plugins/mod_c2s.lua
@@ -240,9 +240,9 @@ function listener.onconnect(conn)
function session.data(data)
-- Parse the data, which will store stanzas in session.pending_stanzas
if data then
- data = filter("bytes/in", data);
- if data then
- local ok, err = stream:feed(data);
+ data = filter("bytes/in", data);
+ if data then
+ local ok, err = stream:feed(data);
if not ok then
log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_"));
session:close("not-well-formed");
diff --git a/plugins/mod_component.lua b/plugins/mod_component.lua
index 297609d8..53ef4ed0 100644
--- a/plugins/mod_component.lua
+++ b/plugins/mod_component.lua
@@ -317,6 +317,10 @@ function listener.ondisconnect(conn, err)
end
end
+function listener.ondetach(conn)
+ sessions[conn] = nil;
+end
+
module:provides("net", {
name = "component";
private = true;
diff --git a/plugins/mod_net_multiplex.lua b/plugins/mod_net_multiplex.lua
index d666b907..0dd3dc67 100644
--- a/plugins/mod_net_multiplex.lua
+++ b/plugins/mod_net_multiplex.lua
@@ -34,7 +34,6 @@ end
function listener.onincoming(conn, data)
if not data then return; end
local buf = buffers[conn];
- buffers[conn] = nil;
buf = buf and buf..data or data;
for service, multiplex_pattern in pairs(available_services) do
if buf:match(multiplex_pattern) then
@@ -57,6 +56,8 @@ function listener.ondisconnect(conn, err)
buffers[conn] = nil; -- warn if no buffer?
end
+listener.ondetach = listener.ondisconnect;
+
module:provides("net", {
name = "multiplex";
config_prefix = "";
diff --git a/plugins/mod_s2s/mod_s2s.lua b/plugins/mod_s2s/mod_s2s.lua
index 8614b857..0a2b5bb7 100644
--- a/plugins/mod_s2s/mod_s2s.lua
+++ b/plugins/mod_s2s/mod_s2s.lua
@@ -350,8 +350,11 @@ function stream_callbacks.streamopened(session, attr)
session.notopen = nil;
elseif session.direction == "outgoing" then
session.notopen = nil;
- -- If we are just using the connection for verifying dialback keys, we won't try and auth it
- if not attr.id then error("stream response did not give us a streamid!!!"); end
+ if not attr.id then
+ log("error", "Stream response did not give us a stream id!");
+ session:close({ condition = "undefined-condition", text = "Missing stream ID" });
+ return;
+ end
session.streamid = attr.id;
if session.secure and not session.cert_chain_status then
@@ -617,6 +620,10 @@ function listener.register_outgoing(conn, session)
initialize_session(session);
end
+function listener.ondetach(conn)
+ sessions[conn] = nil;
+end
+
function check_auth_policy(event)
local host, session = event.host, event.session;
local must_secure = secure_auth;