core.s2smanager: Don't recurse CNAMEs infinitely :)
[prosody.git] / net / server.lua
index da65fce214704be61cc5bb988d12c230e58e830d..971ea5530695f191cfeff18dcc1c9b3c93eae3fe 100644 (file)
@@ -172,22 +172,51 @@ 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
+        local ctx;\r
+        ctx, err = ssl_newcontext( sslctx )\r
+        if not ctx then\r
             err = err or "wrong sslctx parameters"\r
-            out_error( "server.lua: ", err )\r
-            return nil, err\r
+            local file;\r
+            file = err:match("^error loading (.-) %(");\r
+            if file then\r
+               if file == "private key" then\r
+                       file = sslctx.key or "your private key";\r
+               elseif file == "certificate" then\r
+                       file = sslctx.certificate or "your certificate file";\r
+               end\r
+               local reason = err:match("%((.+)%)$") or "some reason";\r
+               if reason == "Permission denied" then\r
+                       reason = "Check that the permissions allow Prosody to read this file.";\r
+               elseif reason == "No such file or directory" then\r
+                       reason = "Check that the path is correct, and the file exists.";\r
+               elseif reason == "system lib" then\r
+                       reason = "Previous error (see logs), or other system error.";\r
+               else\r
+                       reason = "Reason: "..tostring(reason or "unknown"):lower();\r
+               end\r
+               log("error", "SSL/TLS: Failed to load %s: %s", file, reason);\r
+           else\r
+                log("error", "SSL/TLS: Error initialising for port %d: %s", serverport, err );\r
+            end\r
+            ssl = false\r
         end\r
-        ssl = true\r
-    else\r
-       out_put("server.lua: ", "ssl not enabled on ", serverport);\r
+        sslctx = ctx;\r
+    end\r
+    if not ssl then\r
+      sslctx = false;\r
+      if startssl then\r
+         log("error", "Failed to listen on port %d due to SSL/TLS to SSL/TLS initialisation errors (see logs)", serverport )\r
+         return nil, "Cannot start ssl,  see log for details"\r
+       end\r
     end\r
 \r
     local accept = socket.accept\r
@@ -334,6 +363,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
                 send( socket, table_concat( bufferqueue, "", 1, bufferqueuelen ), 1, bufferlen )    -- forced send\r
             end\r
         end\r
+        if not handler then return true; end\r
         _ = shutdown and shutdown( socket )\r
         socket:close( )\r
         _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )\r
@@ -454,13 +484,19 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
         end\r
     end\r
     local _sendbuffer = function( )    -- this function sends data\r
-        local buffer = table_concat( bufferqueue, "", 1, bufferqueuelen )\r
-        local succ, err, byte = send( socket, buffer, 1, bufferlen )\r
-        local count = ( succ or byte or 0 ) * STAT_UNIT\r
-        sendtraffic = sendtraffic + count\r
-        _sendtraffic = _sendtraffic + count\r
-        _ = _cleanqueue and clean( bufferqueue )\r
-        --out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) )\r
+       local succ, err, byte, buffer, count;\r
+       local count;\r
+       if socket then\r
+            buffer = table_concat( bufferqueue, "", 1, bufferqueuelen )\r
+            succ, err, byte = send( socket, buffer, 1, bufferlen )\r
+            count = ( succ or byte or 0 ) * STAT_UNIT\r
+            sendtraffic = sendtraffic + count\r
+            _sendtraffic = _sendtraffic + count\r
+            _ = _cleanqueue and clean( bufferqueue )\r
+            --out_put( "server.lua: sended '", buffer, "', bytes: ", tostring(succ), ", error: ", tostring(err), ", part: ", tostring(byte), ", to: ", tostring(ip), ":", tostring(clientport) )\r
+        else\r
+            succ, err, count = false, "closed", 0;\r
+        end\r
         if succ then    -- sending succesful\r
             bufferqueuelen = 0\r
             bufferlen = 0\r
@@ -687,6 +723,7 @@ removeserver = function( port )
         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