This commit is contained in:
Marcel Pociot
2020-04-29 22:05:03 +02:00
parent 6cf206e0a2
commit b515a55325
27 changed files with 215 additions and 253 deletions

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Server\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Ratchet\ConnectionInterface;
use function GuzzleHttp\Psr7\str;
abstract class AdminController extends Controller
{
protected function shouldHandleRequest(Request $request, ConnectionInterface $httpConnection): bool
{
try {
$authorization = Str::after($request->header('Authorization'), 'Basic ');
$authParts = explode(':', base64_decode($authorization), 2);
list($user, $password) = $authParts;
if (! $this->credentialsAreAllowed($user, $password)) {
throw new \InvalidArgumentException('Invalid Login');
}
return true;
} catch (\Throwable $e) {
$httpConnection->send(str(new Response(401, [
'WWW-Authenticate' => 'Basic realm="Expose"'
], 'foo')));
}
return false;
}
protected function credentialsAreAllowed(string $user, string $password)
{
return config('expose.admin.users.'.$user) === $password;
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Server\Http\Controllers\Admin;
use App\Http\Controllers\PostController;
use App\Http\Controllers\Controller;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
use GuzzleHttp\Psr7\Response;
@@ -15,7 +15,7 @@ use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class DeleteUsersController extends PostController
class DeleteUsersController extends AdminController
{
protected $keepConnectionOpen = true;

View File

@@ -3,7 +3,7 @@
namespace App\Server\Http\Controllers\Admin;
use App\Contracts\ConnectionManager;
use App\Http\Controllers\PostController;
use App\Http\Controllers\Controller;
use App\Server\Configuration;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
@@ -15,7 +15,7 @@ use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class ListSitesController extends PostController
class ListSitesController extends AdminController
{
/** @var ConnectionManager */
protected $connectionManager;

View File

@@ -2,7 +2,7 @@
namespace App\Server\Http\Controllers\Admin;
use App\Http\Controllers\PostController;
use App\Http\Controllers\Controller;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
use GuzzleHttp\Psr7\Response;
@@ -13,7 +13,7 @@ use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class ListUsersController extends PostController
class ListUsersController extends AdminController
{
protected $keepConnectionOpen = true;

View File

@@ -1,25 +0,0 @@
<?php
namespace App\Server\Http\Controllers\Admin;
use App\Contracts\ConnectionManager;
use App\Http\Controllers\PostController;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Ratchet\ConnectionInterface;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class LoginController extends PostController
{
public function handle(Request $request, ConnectionInterface $httpConnection)
{
$httpConnection->send(
respond_html($this->getView('server.login'))
);
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Server\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Ratchet\ConnectionInterface;
use function GuzzleHttp\Psr7\str;
class RedirectToUsersController extends AdminController
{
public function handle(Request $request, ConnectionInterface $httpConnection)
{
$httpConnection->send(str(new Response(301, [
'Location' => '/sites'
])));
}
}

View File

@@ -2,7 +2,7 @@
namespace App\Server\Http\Controllers\Admin;
use App\Http\Controllers\PostController;
use App\Http\Controllers\Controller;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
use GuzzleHttp\Psr7\Response;
@@ -15,7 +15,7 @@ use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class StoreUsersController extends PostController
class StoreUsersController extends AdminController
{
protected $keepConnectionOpen = true;

View File

@@ -1,51 +0,0 @@
<?php
namespace App\Server\Http\Controllers\Admin;
use App\Contracts\ConnectionManager;
use App\Http\Controllers\PostController;
use Clue\React\SQLite\DatabaseInterface;
use Clue\React\SQLite\Result;
use GuzzleHttp\Psr7\Response;
use Illuminate\Http\Request;
use Ratchet\ConnectionInterface;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
use function GuzzleHttp\Psr7\str;
use function GuzzleHttp\Psr7\stream_for;
class VerifyLoginController extends PostController
{
protected $keepConnectionOpen = true;
/** @var DatabaseInterface */
protected $database;
public function __construct(DatabaseInterface $database)
{
$this->database = $database;
}
public function handle(Request $request, ConnectionInterface $httpConnection)
{
$this->database->query("SELECT * FROM users WHERE email = :email", ['email' => $request->email])
->then(function (Result $result) use ($httpConnection) {
if (!is_null($result->rows)) {
$httpConnection->send(
str(new Response(
301,
['Location' => '/users']
))
);
} else {
$httpConnection->send(
str(new Response(
301,
['Location' => '/users']
))
);
}
$httpConnection->close();
});
}
}