X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fserver.lua;h=069db50f5dc0b17e4dd34c6b08a3a790b91335c1;hb=b155bce5da7c12fe5c34366c1197978f49d34239;hp=3491b190e8fdb26d75c1748779cc254f89ce640d;hpb=1fb6494efc605f15f3a2d17cd0b73befcb1e2044;p=prosody.git diff --git a/net/server.lua b/net/server.lua index 3491b190..069db50f 100644 --- a/net/server.lua +++ b/net/server.lua @@ -1,11 +1,9 @@ ---[[ - - server.lua by blastbeat - - - this script contains the server loop of the program - - other scripts can reg a server here - -]]-- +-- +-- server.lua by blastbeat of the luadch project +-- Re-used here under the MIT/X Consortium License +-- +-- Modifications (C) 2008-2009 Matthew Wild, Waqas Hussain +-- -- // wrapping luadch stuff // -- @@ -174,22 +172,51 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco local ssl = false if sslctx then + ssl = true if not ssl_newcontext then - return nil, "luasec not found" + out_error "luasec not found" + ssl = false end if type( sslctx ) ~= "table" then out_error "server.lua: wrong server sslctx" - return nil, "wrong server sslctx" + ssl = false end - sslctx, err = ssl_newcontext( sslctx ) - if not sslctx then + local ctx; + ctx, err = ssl_newcontext( sslctx ) + if not ctx then err = err or "wrong sslctx parameters" - out_error( "server.lua: ", err ) - return nil, err + local file; + file = err:match("^error loading (.-) %("); + if file then + if file == "private key" then + file = sslctx.key or "your private key"; + elseif file == "certificate" then + file = sslctx.certificate or "your certificate file"; + end + local reason = err:match("%((.+)%)$") or "some reason"; + if reason == "Permission denied" then + reason = "Check that the permissions allow Prosody to read this file."; + elseif reason == "No such file or directory" then + reason = "Check that the path is correct, and the file exists."; + elseif reason == "system lib" then + reason = "Previous error (see logs), or other system error."; + else + reason = "Reason: "..tostring(reason or "unknown"):lower(); + end + log("error", "SSL/TLS: Failed to load %s: %s", file, reason); + else + log("error", "SSL/TLS: Error initialising for port %d: %s", serverport, err ); + end + ssl = false end - ssl = true - else - out_put("server.lua: ", "ssl not enabled on ", serverport); + sslctx = ctx; + end + if not ssl then + sslctx = false; + if startssl then + log("error", "Failed to listen on port %d due to SSL/TLS to SSL/TLS initialisation errors (see logs)", serverport ) + return nil, "Cannot start ssl, see log for details" + end end local accept = socket.accept @@ -219,7 +246,7 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco _socketlist[ socket ] = nil handler = nil socket = nil - mem_free( ) + --mem_free( ) out_put "server.lua: closed server handler and removed sockets from list" end handler.ip = function( ) @@ -346,7 +373,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport handler = nil end socket = nil - mem_free( ) + --mem_free( ) if server then server.remove( ) end @@ -522,7 +549,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport end end disconnect( handler, "ssl handshake failed" ) - handler.close( true ) -- forced disconnect + _ = handler and handler.close( true ) -- forced disconnect return false -- handshake failed end ) @@ -532,13 +559,16 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport socket, err = ssl_wrap( socket, sslctx ) -- wrap socket if err then out_put( "server.lua: ssl error: ", tostring(err) ) - mem_free( ) + --mem_free( ) return nil, nil, err -- fatal error end socket:settimeout( 0 ) handler.readbuffer = handshake handler.sendbuffer = handshake - handshake( socket ) -- do handshake + handshake( socket ) -- do handshake + if not socket then + return nil, nil, "ssl handshake failed"; + end else -- We're not automatically doing SSL, so we're not secure (yet) ssl = false @@ -634,7 +664,7 @@ closesocket = function( socket ) _readlistlen = removesocket( _readlist, socket, _readlistlen ) _socketlist[ socket ] = nil socket:close( ) - mem_free( ) + --mem_free( ) end ----------------------------------// PUBLIC //-- @@ -686,6 +716,7 @@ removeserver = function( port ) return nil, "no server found on port '" .. tostring( port ) "'" end handler.close( ) + _server[ port ] = nil return true end @@ -702,7 +733,7 @@ closeall = function( ) _sendlist = { } _timerlist = { } _socketlist = { } - mem_free( ) + --mem_free( ) end getsettings = function( )