Add middleware functionality
parent
024a140609
commit
b163f4d764
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp\Middleware;
|
||||||
|
|
||||||
|
class AdminMiddleware extends LoginRequiredMiddleware
|
||||||
|
{
|
||||||
|
public function canAccess(): bool
|
||||||
|
{
|
||||||
|
if (parent::canAccess()) {
|
||||||
|
return $_SESSION['UserLevel'] > 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp\Middleware;
|
||||||
|
|
||||||
|
use Mcp\ConnectionProvider;
|
||||||
|
|
||||||
|
class LoginRequiredMiddleware extends SessionMiddleware
|
||||||
|
{
|
||||||
|
|
||||||
|
private ConnectionProvider $connProvider;
|
||||||
|
|
||||||
|
public function __construct(ConnectionProvider $connProvider, string $cookieDomain)
|
||||||
|
{
|
||||||
|
parent::__construct($cookieDomain, 3600);
|
||||||
|
$this->connProvider = $connProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function canAccess(): bool
|
||||||
|
{
|
||||||
|
parent::handleSession();
|
||||||
|
if (isset($_SESSION['UUID'])) {
|
||||||
|
// User level or existence of account may have changed since session was created
|
||||||
|
$getLevel = $this->connProvider->db()->prepare('SELECT UserLevel FROM UserAccounts WHERE PrincipalID = ?');
|
||||||
|
$getLevel->execute([$_SESSION['UUID']]);
|
||||||
|
if ($row = $getLevel->fetch()) {
|
||||||
|
$_SESSION['LEVEL'] = $row['UserLevel'];
|
||||||
|
session_set_cookie_params(86400);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
session_unset();
|
||||||
|
session_destroy();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleUnauthorized(): void
|
||||||
|
{
|
||||||
|
header('Location: index.php?page=login');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp\Middleware;
|
||||||
|
|
||||||
|
interface Middleware
|
||||||
|
{
|
||||||
|
public function canAccess(): bool;
|
||||||
|
public function handleUnauthorized(): void;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp\Middleware;
|
||||||
|
|
||||||
|
class PreSessionMiddleware extends SessionMiddleware
|
||||||
|
{
|
||||||
|
public function __construct(string $cookieDomain)
|
||||||
|
{
|
||||||
|
parent::__construct($cookieDomain, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function canAccess(): bool
|
||||||
|
{
|
||||||
|
parent::handleSession();
|
||||||
|
return !isset($_SESSION['LOGIN']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleUnauthorized(): void
|
||||||
|
{
|
||||||
|
header('Location: index.php');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp\Middleware;
|
||||||
|
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
abstract class SessionMiddleware implements Middleware
|
||||||
|
{
|
||||||
|
|
||||||
|
private string $cookieDomain;
|
||||||
|
private int $cookieLifetime;
|
||||||
|
|
||||||
|
public function __construct(string $cookieDomain, int $cookieLifetime)
|
||||||
|
{
|
||||||
|
$this->cookieDomain = $cookieDomain;
|
||||||
|
$this->cookieLifetime = $cookieLifetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleSession(): void
|
||||||
|
{
|
||||||
|
switch(session_status()) {
|
||||||
|
case PHP_SESSION_DISABLED:
|
||||||
|
throw new UnexpectedValueException("Session functionality is disabled");
|
||||||
|
break;
|
||||||
|
case PHP_SESSION_NONE:
|
||||||
|
session_set_cookie_params([
|
||||||
|
'lifetime' => $this->cookieLifetime,
|
||||||
|
'path' => '/',
|
||||||
|
'domain' => $this->cookieDomain,
|
||||||
|
'httponly' => true,
|
||||||
|
'secure' => true,
|
||||||
|
'samesite' => 'Strict'
|
||||||
|
]);
|
||||||
|
session_start();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!isset($_SESSION['csrf']) || strlen($_SESSION['csrf']) != 64) {
|
||||||
|
$_SESSION['csrf'] = bin2hex(random_bytes(32));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue