Changeset

3396:23cf369ed1c3

net.server_event: Fix to not call onconnect a second time after the SSL handshake for starttls connections (thanks Flo)
author Matthew Wild <mwild1@gmail.com>
date Thu, 22 Jul 2010 11:43:42 +0100
parents 3395:e736f68c1047
children 3397:f376f0bd1d1f
files net/server_event.lua
diffstat 1 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/net/server_event.lua	Wed Jul 21 21:01:36 2010 +0100
+++ b/net/server_event.lua	Thu Jul 22 11:43:42 2010 +0100
@@ -143,9 +143,9 @@
 					debug( "new connection failed. id:", self.id, "error:", self.fatalerror )
 				else
 					if plainssl and ssl then  -- start ssl session
-						self:starttls()
+						self:starttls(nil, true)
 					else  -- normal connection
-						self:_start_session( self.listener.onconnect )
+						self:_start_session(true)
 					end
 					debug( "new connection established. id:", self.id )
 				end
@@ -155,13 +155,18 @@
 			self.eventconnect = addevent( base, self.conn, EV_WRITE, callback, cfg.CONNECT_TIMEOUT )
 			return true
 	end
-	function interface_mt:_start_session(onconnect) -- new session, for example after startssl
+	function interface_mt:_start_session(call_onconnect) -- new session, for example after startssl
 		if self.type == "client" then
 			local callback = function( )
 				self:_lock( false,  false, false )
 				--vdebug( "start listening on client socket with id:", self.id )
 				self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT );  -- register callback
-				self:onconnect()
+				if call_onconnect then
+					debug("CALLING ONCONNECT")
+					self:onconnect()
+				else
+					debug("NOT CALLING ONCONNECT");
+				end
 				self.eventsession = nil
 				return -1
 			end
@@ -173,7 +178,7 @@
 		end
 		return true
 	end
-	function interface_mt:_start_ssl(arg) -- old socket will be destroyed, therefore we have to close read/write events first
+	function interface_mt:_start_ssl(call_onconnect) -- old socket will be destroyed, therefore we have to close read/write events first
 			--vdebug( "starting ssl session with client id:", self.id )
 			local _
 			_ = self.eventread and self.eventread:close( )  -- close events; this must be called outside of the event callbacks!
@@ -184,7 +189,7 @@
 			if err then
 				self.fatalerror = err
 				self.conn = nil  -- cannot be used anymore
-				if "onconnect" == arg then
+				if call_onconnect then
 					self.ondisconnect = nil  -- dont call this when client isnt really connected
 				end
 				self:_close()
@@ -211,14 +216,11 @@
 								self.send = self.conn.send  -- caching table lookups with new client object
 								self.receive = self.conn.receive
 								local onsomething
-								if "onconnect" == arg then  -- trigger listener
-									onsomething = self.onconnect
-								else
-									onsomething = self.onsslconnection
+								if not call_onconnect then  -- trigger listener
+									self:onstatus("ssl-handshake-complete");
 								end
-								self:_start_session( onsomething )
+								self:_start_session( call_onconnect )
 								debug( "ssl handshake done" )
-								self:onstatus("ssl-handshake-complete");
 								self.eventhandshake = nil
 								return -1
 							end
@@ -232,7 +234,7 @@
 							end
 						end
 						if self.fatalerror then
-							if "onconnect" == arg then
+							if call_onconnect then
 								self.ondisconnect = nil  -- dont call this when client isnt really connected
 							end
 							self:_close()
@@ -414,7 +416,7 @@
 		-- No-op, we always use the underlying connection's send
 	end
 	
-	function interface_mt:starttls(sslctx)
+	function interface_mt:starttls(sslctx, call_onconnect)
 		debug( "try to start ssl at client id:", self.id )
 		local err
 		self._sslctx = sslctx;
@@ -428,7 +430,7 @@
 		self._usingssl = true
 		self.startsslcallback = function( )  -- we have to start the handshake outside of a read/write event
 			self.startsslcallback = nil
-			self:_start_ssl();
+			self:_start_ssl(call_onconnect);
 			self.eventstarthandshake = nil
 			return -1
 		end
@@ -699,9 +701,9 @@
 				local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, nil, sslctx )
 				--vdebug( "client id:", clientinterface, "startssl:", startssl )
 				if ssl and sslctx then
-					clientinterface:starttls(sslctx)
+					clientinterface:starttls(sslctx, true)
 				else
-					clientinterface:_start_session( clientinterface.onconnect )
+					clientinterface:_start_session( true )
 				end
 				debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>");