ejabberdsql2prosody: Allow for multiple INSERTs to the same table
[prosody.git] / net / server.lua
index 77bc2f5cef31cec64a03df54f6ea869285839bf3..6fe72712ae26e5f7700ff1275ade476132886f4d 100644 (file)
@@ -1,11 +1,9 @@
---[[\r
-\r
-        server.lua by blastbeat\r
-\r
-        - this script contains the server loop of the program\r
-        - other scripts can reg a server here\r
-\r
-]]--\r
+-- \r
+-- server.lua by blastbeat of the luadch project\r
+-- Re-used here under the MIT/X Consortium License\r
+-- \r
+-- Modifications (C) 2008-2009 Matthew Wild, Waqas Hussain\r
+--\r
 \r
 -- // wrapping luadch stuff // --\r
 \r
@@ -77,6 +75,7 @@ local idfalse
 local addtimer\r
 local closeall\r
 local addserver\r
+local getserver\r
 local wrapserver\r
 local getsettings\r
 local closesocket\r
@@ -173,22 +172,30 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco
     local ssl = false\r
 \r
     if sslctx then\r
+        ssl = true\r
         if not ssl_newcontext then\r
-            return nil, "luasec not found"\r
+            out_error "luasec not found"\r
+            ssl = false\r
         end\r
         if type( sslctx ) ~= "table" then\r
             out_error "server.lua: wrong server sslctx"\r
-            return nil, "wrong server sslctx"\r
+            ssl = false\r
         end\r
         sslctx, err = ssl_newcontext( sslctx )\r
         if not sslctx then\r
             err = err or "wrong sslctx parameters"\r
             out_error( "server.lua: ", err )\r
-            return nil, err\r
+            ssl = false\r
         end\r
-        ssl = true\r
-    else\r
-       out_put("server.lua: ", "ssl not enabled on ", serverport);\r
+    end\r
+    if not ssl then\r
+      sslctx = false;\r
+      if startssl then\r
+         out_error( "server.lua: Cannot start ssl on port: ", serverport )\r
+         return nil, "Cannot start ssl,  see log for details"\r
+       else\r
+         out_put("server.lua: ", "ssl not enabled on ", serverport);\r
+       end\r
     end\r
 \r
     local accept = socket.accept\r
@@ -521,7 +528,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                     end\r
                 end\r
                 disconnect( handler, "ssl handshake failed" )\r
-                handler.close( true )    -- forced disconnect\r
+                _ = handler and handler.close( true )    -- forced disconnect\r
                 return false    -- handshake failed\r
             end\r
         )\r
@@ -537,8 +544,13 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
             socket:settimeout( 0 )\r
             handler.readbuffer = handshake\r
             handler.sendbuffer = handshake\r
-            handshake( socket )    -- do handshake\r
+            handshake( socket ) -- do handshake\r
+            if not socket then\r
+                return nil, nil, "ssl handshake failed";\r
+            end\r
         else\r
+            -- We're not automatically doing SSL, so we're not secure (yet)\r
+            ssl = false\r
             handler.starttls = function( now )\r
                 if not now then\r
                     --out_put "server.lua: we need to do tls, but delaying until later"\r
@@ -575,6 +587,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
 \r
                 handler.starttls = nil\r
                 needtls = nil\r
+                \r
+                -- Secure now\r
+                ssl = true\r
 \r
                 handler.readbuffer = handshake\r
                 handler.sendbuffer = handshake\r
@@ -647,13 +662,13 @@ addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, st
         err = "luasec not found"\r
     end\r
     if err then\r
-        out_error( "server.lua: ", err )\r
+        out_error( "server.lua, port ", port, ": ", err )\r
         return nil, err\r
     end\r
     addr = addr or "*"\r
     local server, err = socket_bind( addr, port )\r
     if err then\r
-        out_error( "server.lua: ", err )\r
+        out_error( "server.lua, port ", port, ": ", err )\r
         return nil, err\r
     end\r
     local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx, maxconnections, startssl )    -- wrap new server socket\r
@@ -670,12 +685,17 @@ addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, st
     return handler\r
 end\r
 \r
+getserver = function ( port )\r
+       return _server[ port ];\r
+end\r
+\r
 removeserver = function( port )\r
     local handler = _server[ port ]\r
     if not handler then\r
         return nil, "no server found on port '" .. tostring( port ) "'"\r
     end\r
     handler.close( )\r
+    _server[ port ] = nil\r
     return true\r
 end\r
 \r
@@ -728,7 +748,7 @@ stats = function( )
     return _readtraffic, _sendtraffic, _readlistlen, _sendlistlen, _timerlistlen\r
 end\r
 \r
-local dontstop = true;\r
+local dontstop = true; -- thinking about tomorrow, ...\r
 \r
 setquitting = function (quit)\r
        dontstop = not quit;\r
@@ -786,7 +806,7 @@ local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx,
 end\r
 \r
 local addclient = function( address, port, listeners, pattern, sslctx, startssl )\r
-    local client, err = socket.tcp( )\r
+    local client, err = luasocket.tcp( )\r
     if err then\r
         return nil, err\r
     end\r
@@ -795,7 +815,7 @@ local addclient = function( address, port, listeners, pattern, sslctx, startssl
     if err then    -- try again\r
         local handler = wrapclient( client, address, port, listeners )\r
     else\r
-        wrapconnection( server, listeners, socket, address, port, "clientport", pattern, sslctx, startssl )\r
+        wrapconnection( nil, listeners, client, address, port, "clientport", pattern, sslctx, startssl )\r
     end\r
 end\r
 \r
@@ -844,6 +864,7 @@ return {
     closeall = closeall,\r
     addtimer = addtimer,\r
     addserver = addserver,\r
+    getserver = getserver,\r
     getsettings = getsettings,\r
     setquitting = setquitting,\r
     removeserver = removeserver,\r