Add object-oriented bootstrap and request handling
parent
b163f4d764
commit
a80919fdce
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp;
|
||||||
|
|
||||||
|
use PDO;
|
||||||
|
|
||||||
|
interface ConnectionProvider
|
||||||
|
{
|
||||||
|
public function db(): PDO;
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp;
|
||||||
|
|
||||||
|
use PDO;
|
||||||
|
|
||||||
|
class Mcp implements ConnectionProvider
|
||||||
|
{
|
||||||
|
|
||||||
|
private ?PDO $db = null;
|
||||||
|
private array $config;
|
||||||
|
private string $templateDir;
|
||||||
|
|
||||||
|
const ROUTES = [
|
||||||
|
'api' => [
|
||||||
|
'economy' => 'Api\\Economy',
|
||||||
|
'economylandtool' => 'Api\\EconomyLandTool',
|
||||||
|
'economylandtool.php' => 'Api\\EconomyLandTool',
|
||||||
|
'getAccessList' => 'Api\\GetAccessList',
|
||||||
|
'onlineDisplay' => 'Api\\OnlineDisplay',
|
||||||
|
'viewerWelcomeSite' => 'Api\\ViewerWelcomePage',
|
||||||
|
'runCron' => 'Api\\CronStarter'
|
||||||
|
],
|
||||||
|
'page' => [
|
||||||
|
'dashboard' => 'Page\\Dashboard',
|
||||||
|
'forgot' => 'Page\\ForgotPassword',
|
||||||
|
'friends' => 'Page\\Friends',
|
||||||
|
'groups' => 'Page\\Groups',
|
||||||
|
'identities' => 'Page\\Identities',
|
||||||
|
'login' => 'Page\\Login',
|
||||||
|
'profile' => 'Page\\Profile',
|
||||||
|
'regions' => 'Page\\Regions',
|
||||||
|
'register' => 'Page\\Register',
|
||||||
|
'reset-password' => 'Page\\ResetPassword',
|
||||||
|
'user-online-state' => 'Page\\OnlineUsers',
|
||||||
|
'users' => 'Page\\ManageUsers'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
public function __construct($basedir)
|
||||||
|
{
|
||||||
|
$this->templateDir = $basedir.DIRECTORY_SEPARATOR.'templates';
|
||||||
|
require $basedir.DIRECTORY_SEPARATOR.'config.php';
|
||||||
|
$this->config = $RUNTIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function db(): PDO
|
||||||
|
{
|
||||||
|
if ($this->db == null) {
|
||||||
|
$this->db = new PDO('mysql:host='.$this->config['mysql']['host'].';dbname='.$this->config['mysql']['db'],
|
||||||
|
$this->config['mysql']['user'],
|
||||||
|
$this->config['mysql']['password']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function config($key): string|array|int
|
||||||
|
{
|
||||||
|
return $this->config[strtolower($key)];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function csrfField(): string
|
||||||
|
{
|
||||||
|
return '<input type="hidden" name="csrf" value="'.(isset($_SESSION['csrf']) ? $_SESSION['csrf'] : '').'">';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function template($name): TemplateBuilder
|
||||||
|
{
|
||||||
|
return (new TemplateBuilder($this->templateDir, $name))->vars([
|
||||||
|
'domain' => $this->config['domain'],
|
||||||
|
'title' => 'MCP',
|
||||||
|
'admin' => isset($_SESSION['LEVEL']) && $_SESSION['LEVEL'] > 100
|
||||||
|
])->unsafeVar('csrf', $this->csrfField());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleRequest()
|
||||||
|
{
|
||||||
|
$reqClass = 'Mcp\\Page\\Error';
|
||||||
|
if (empty($_GET)) {
|
||||||
|
$reqClass = 'Mcp\\'.$this::ROUTES['page'][array_key_first($this::ROUTES['page'])];
|
||||||
|
} else {
|
||||||
|
if (isset($_GET['logout'])) {
|
||||||
|
session_start();
|
||||||
|
session_destroy();
|
||||||
|
header('Location: /');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this::ROUTES as $type => $routes) {
|
||||||
|
if (isset($_GET[$type])) {
|
||||||
|
if (strlen($_GET[$type]) <= 100 && preg_match('/^[0-9a-zA-Z-_.]+$/', $_GET[$type]) && isset($routes[$_GET[$type]])) {
|
||||||
|
$reqClass = 'Mcp\\'.$routes[$_GET[$type]];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(new $reqClass($this))->handleRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Mcp;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use Mcp\Middleware\Middleware;
|
||||||
|
|
||||||
|
abstract class RequestHandler
|
||||||
|
{
|
||||||
|
|
||||||
|
protected Mcp $app;
|
||||||
|
private ?Middleware $middleware;
|
||||||
|
|
||||||
|
public function __construct(Mcp $app, Middleware $mw = null)
|
||||||
|
{
|
||||||
|
$this->app = $app;
|
||||||
|
$this->middleware = $mw;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handleRequest(): void
|
||||||
|
{
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] != 'GET' && $_SERVER['REQUEST_METHOD'] != 'POST') {
|
||||||
|
http_response_code(400);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->middleware != null) {
|
||||||
|
try {
|
||||||
|
if (!$this->middleware->canAccess()) {
|
||||||
|
$this->middleware->handleUnauthorized();
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
error_log("Middleware handling raised an exception: " + $e->getMessage());
|
||||||
|
http_response_code(500);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SERVER['REQUEST_METHOD'] == 'GET' ? $this->get() : $this->post();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get(): void
|
||||||
|
{
|
||||||
|
http_response_code(405);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function post(): void
|
||||||
|
{
|
||||||
|
http_response_code(405);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
date_default_timezone_set("Europe/Berlin");
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
|
||||||
|
$basedir = dirname(__DIR__);
|
||||||
|
require $basedir.DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR.'autoload.php';
|
||||||
|
spl_autoload_register(array(new \Mcp\Autoloader($basedir), 'load'));
|
||||||
|
|
||||||
|
(new \Mcp\Mcp($basedir))->handleRequest();
|
Loading…
Reference in New Issue