Browse Source

ProtocolServer: Turn this into a multi-instance service

Everyone who connects to ProtocolServer now gets his own instance.
This means that different users can no longer talk to the same exact
ProtocolServer process, enhanching security and stability.
Andreas Kling 5 years ago
parent
commit
6f059ee830

+ 2 - 2
Base/etc/SystemServer.ini

@@ -2,10 +2,10 @@
 Socket=/tmp/portal/protocol
 Socket=/tmp/portal/protocol
 SocketPermissions=660
 SocketPermissions=660
 Lazy=1
 Lazy=1
-Priority=low
-KeepAlive=1
 User=protocol
 User=protocol
 BootModes=text,graphical
 BootModes=text,graphical
+MultiInstance=1
+AcceptSocketConnections=1
 
 
 [WebContent]
 [WebContent]
 Socket=/tmp/portal/webcontent
 Socket=/tmp/portal/webcontent

+ 2 - 0
Services/ProtocolServer/ClientConnection.cpp

@@ -48,6 +48,8 @@ ClientConnection::~ClientConnection()
 void ClientConnection::die()
 void ClientConnection::die()
 {
 {
     s_connections.remove(client_id());
     s_connections.remove(client_id());
+    if (s_connections.is_empty())
+        Core::EventLoop::current().quit(0);
 }
 }
 
 
 OwnPtr<Messages::ProtocolServer::IsSupportedProtocolResponse> ClientConnection::handle(const Messages::ProtocolServer::IsSupportedProtocol& message)
 OwnPtr<Messages::ProtocolServer::IsSupportedProtocolResponse> ClientConnection::handle(const Messages::ProtocolServer::IsSupportedProtocol& message)

+ 4 - 13
Services/ProtocolServer/main.cpp

@@ -56,18 +56,9 @@ int main(int, char**)
     (void)*new ProtocolServer::GeminiProtocol;
     (void)*new ProtocolServer::GeminiProtocol;
     (void)*new ProtocolServer::HttpProtocol;
     (void)*new ProtocolServer::HttpProtocol;
     (void)*new ProtocolServer::HttpsProtocol;
     (void)*new ProtocolServer::HttpsProtocol;
-    auto server = Core::LocalServer::construct();
-    bool ok = server->take_over_from_system_server();
-    ASSERT(ok);
-    server->on_ready_to_accept = [&] {
-        auto client_socket = server->accept();
-        if (!client_socket) {
-            dbg() << "ProtocolServer: accept failed.";
-            return;
-        }
-        static int s_next_client_id = 0;
-        int client_id = ++s_next_client_id;
-        IPC::new_client_connection<ProtocolServer::ClientConnection>(*client_socket, client_id);
-    };
+
+    auto socket = Core::LocalSocket::take_over_accepted_socket_from_system_server();
+    ASSERT(socket);
+    IPC::new_client_connection<ProtocolServer::ClientConnection>(socket.release_nonnull(), 1);
     return event_loop.exec();
     return event_loop.exec();
 }
 }