From 4bfa384f1b28b4d43f3af30091d3d10c9a11a270 Mon Sep 17 00:00:00 2001 From: Marcel Pociot Date: Tue, 8 Sep 2020 13:23:18 +0200 Subject: [PATCH] wip --- app/Server/Factory.php | 6 ++ .../DisconnectTcpConnectionController.php | 42 +++++++++++ .../Controllers/Admin/GetSitesController.php | 7 +- .../Admin/GetTcpConnectionsController.php | 41 +++++++++++ .../Controllers/Admin/ListSitesController.php | 16 ++-- .../Admin/ListTcpConnectionsController.php | 46 ++++++++++++ resources/views/server/layouts/app.twig | 6 ++ resources/views/server/tcp/index.twig | 73 +++++++++++++++++++ resources/views/server/users/index.twig | 11 +++ 9 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php create mode 100644 app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php create mode 100644 app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php create mode 100644 resources/views/server/tcp/index.twig diff --git a/app/Server/Factory.php b/app/Server/Factory.php index 29dbf90..349de6b 100644 --- a/app/Server/Factory.php +++ b/app/Server/Factory.php @@ -10,11 +10,14 @@ use App\Http\Server as HttpServer; use App\Server\Connections\ConnectionManager; use App\Server\Http\Controllers\Admin\DeleteUsersController; use App\Server\Http\Controllers\Admin\DisconnectSiteController; +use App\Server\Http\Controllers\Admin\DisconnectTcpConnectionController; use App\Server\Http\Controllers\Admin\GetSettingsController; use App\Server\Http\Controllers\Admin\GetSitesController; +use App\Server\Http\Controllers\Admin\GetTcpConnectionsController; use App\Server\Http\Controllers\Admin\GetUserDetailsController; use App\Server\Http\Controllers\Admin\GetUsersController; use App\Server\Http\Controllers\Admin\ListSitesController; +use App\Server\Http\Controllers\Admin\ListTcpConnectionsController; use App\Server\Http\Controllers\Admin\ListUsersController; use App\Server\Http\Controllers\Admin\RedirectToUsersController; use App\Server\Http\Controllers\Admin\ShowSettingsController; @@ -120,6 +123,7 @@ class Factory $this->router->get('/users', ListUsersController::class, $adminCondition); $this->router->get('/settings', ShowSettingsController::class, $adminCondition); $this->router->get('/sites', ListSitesController::class, $adminCondition); + $this->router->get('/tcp', ListTcpConnectionsController::class, $adminCondition); $this->router->get('/api/settings', GetSettingsController::class, $adminCondition); $this->router->post('/api/settings', StoreSettingsController::class, $adminCondition); @@ -129,6 +133,8 @@ class Factory $this->router->delete('/api/users/{id}', DeleteUsersController::class, $adminCondition); $this->router->get('/api/sites', GetSitesController::class, $adminCondition); $this->router->delete('/api/sites/{id}', DisconnectSiteController::class, $adminCondition); + $this->router->get('/api/tcp', GetTcpConnectionsController::class, $adminCondition); + $this->router->delete('/api/tcp/{id}', DisconnectTcpConnectionController::class, $adminCondition); } protected function bindConfiguration() diff --git a/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php b/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php new file mode 100644 index 0000000..f371c0c --- /dev/null +++ b/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php @@ -0,0 +1,42 @@ +connectionManager = $connectionManager; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $connection = $this->connectionManager->findControlConnectionForClientId($request->get('id')); + + if (! is_null($connection)) { + $connection->close(); + + $this->connectionManager->removeControlConnection($connection); + } + + $httpConnection->send(respond_json([ + 'tcp_connections' => collect($this->connectionManager->getConnections()) + ->filter(function ($connection) { + return get_class($connection) === TcpControlConnection::class; + }) + ->values(), + ])); + } +} diff --git a/app/Server/Http/Controllers/Admin/GetSitesController.php b/app/Server/Http/Controllers/Admin/GetSitesController.php index 0a9af71..76b2ead 100644 --- a/app/Server/Http/Controllers/Admin/GetSitesController.php +++ b/app/Server/Http/Controllers/Admin/GetSitesController.php @@ -4,6 +4,7 @@ namespace App\Server\Http\Controllers\Admin; use App\Contracts\ConnectionManager; use App\Server\Configuration; +use App\Server\Connections\ControlConnection; use Illuminate\Http\Request; use Ratchet\ConnectionInterface; @@ -23,7 +24,11 @@ class GetSitesController extends AdminController { $httpConnection->send( respond_json([ - 'sites' => collect($this->connectionManager->getConnections())->map(function ($site, $siteId) { + 'sites' => collect($this->connectionManager->getConnections()) + ->filter(function ($connection) { + return get_class($connection) === ControlConnection::class; + }) + ->map(function ($site, $siteId) { $site = $site->toArray(); $site['id'] = $siteId; diff --git a/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php b/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php new file mode 100644 index 0000000..5f98546 --- /dev/null +++ b/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php @@ -0,0 +1,41 @@ +connectionManager = $connectionManager; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $httpConnection->send( + respond_json([ + 'tcp_connections' => collect($this->connectionManager->getConnections()) + ->filter(function ($connection) { + return get_class($connection) === TcpControlConnection::class; + }) + ->map(function ($site, $siteId) { + $site = $site->toArray(); + $site['id'] = $siteId; + + return $site; + }) + ->values(), + ]) + ); + } +} diff --git a/app/Server/Http/Controllers/Admin/ListSitesController.php b/app/Server/Http/Controllers/Admin/ListSitesController.php index 8e23976..3ca6bcc 100644 --- a/app/Server/Http/Controllers/Admin/ListSitesController.php +++ b/app/Server/Http/Controllers/Admin/ListSitesController.php @@ -4,6 +4,7 @@ namespace App\Server\Http\Controllers\Admin; use App\Contracts\ConnectionManager; use App\Server\Configuration; +use App\Server\Connections\ControlConnection; use Illuminate\Http\Request; use Ratchet\ConnectionInterface; @@ -25,12 +26,17 @@ class ListSitesController extends AdminController $sites = $this->getView($httpConnection, 'server.sites.index', [ 'scheme' => $this->configuration->port() === 443 ? 'https' : 'http', 'configuration' => $this->configuration, - 'sites' => collect($this->connectionManager->getConnections())->map(function ($site, $siteId) { - $site = $site->toArray(); - $site['id'] = $siteId; + 'sites' => collect($this->connectionManager->getConnections()) + ->filter(function ($connection) { + return get_class($connection) === ControlConnection::class; + }) + ->map(function ($site, $siteId) { + $site = $site->toArray(); + $site['id'] = $siteId; - return $site; - })->values(), + return $site; + }) + ->values(), ]); $httpConnection->send( diff --git a/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php b/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php new file mode 100644 index 0000000..2d219fe --- /dev/null +++ b/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php @@ -0,0 +1,46 @@ +connectionManager = $connectionManager; + $this->configuration = $configuration; + } + + public function handle(Request $request, ConnectionInterface $httpConnection) + { + $sites = $this->getView($httpConnection, 'server.tcp.index', [ + 'scheme' => $this->configuration->port() === 443 ? 'https' : 'http', + 'configuration' => $this->configuration, + 'connections' => collect($this->connectionManager->getConnections()) + ->filter(function ($connection) { + return get_class($connection) === TcpControlConnection::class; + }) + ->map(function ($connection, $connectionId) { + $connection = $connection->toArray(); + $connection['id'] = $connectionId; + + return $connection; + }) + ->values(), + ]); + + $httpConnection->send( + respond_html($sites) + ); + } +} diff --git a/resources/views/server/layouts/app.twig b/resources/views/server/layouts/app.twig index cd29021..d1bdadf 100644 --- a/resources/views/server/layouts/app.twig +++ b/resources/views/server/layouts/app.twig @@ -27,6 +27,12 @@ ml-8 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out"> Shared sites + + TCP connections + +
+
+ + + + + + + + + + + + + + + + + +
+ Local Port + + Expose Port + + Shared At +
+ @{ connection.port } + + @{ connection.shared_port } + + @{ connection.shared_at } + + Disconnect +
+
+ There are no TCP connections shared with this server yet. +
+
+
+ +{% endblock %} +{% block scripts %} + +{% endblock %} diff --git a/resources/views/server/users/index.twig b/resources/views/server/users/index.twig index 67749aa..22f3f2c 100644 --- a/resources/views/server/users/index.twig +++ b/resources/views/server/users/index.twig @@ -92,6 +92,9 @@ Custom Subdomains + + TCP ports + Created At @@ -114,6 +117,14 @@ Yes + + + No + + + Yes + + @{ user.created_at }