105 lines
3.2 KiB
PHP
105 lines
3.2 KiB
PHP
|
<?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();
|
||
|
}
|
||
|
|
||
|
}
|