This commit is contained in:
2024-02-06 16:24:57 +01:00
parent 38895b1502
commit 72bd8b8bd1
15 changed files with 278 additions and 361 deletions

View File

@@ -5,36 +5,36 @@ use Random\RandomException;
function isLoggedIn(): bool
{
global $routerConfig;
return $_SESSION["ID"] > 0 && !empty($_SESSION["email"]) && $_SESSION["privilege_level"] >= $routerConfig["logged_in_default_permission_level"];
return $_SESSION["ID"] > 0 && !empty($_SESSION["email"]) && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["logged_in_default"];
}
function isVerified(): bool
{
global $routerConfig;
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["verified_permission_level"];
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["verified"];
}
function isTrustWorthy(): bool
{
global $routerConfig;
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["trustworthy_permission_level"];
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["trustworthy"];
}
function isModerator(): bool
{
global $routerConfig;
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["moderator_permission_level"];
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["moderator"];
}
function isUserAdmin(): bool
{
global $routerConfig;
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["user_admin_permission_level"];
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["user_admin"];
}
function isAdmin(): bool
{
global $routerConfig;
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["admin_permission_level"];
return isLoggedIn() && $_SESSION["privilege_level"] >= $routerConfig["permissions"]["admin"];
}
@@ -69,7 +69,7 @@ function setDefaultSessionData(): void
$_SESSION["nickname"] = "";
$_SESSION["email"] = "";
$_SESSION["minecraft_nickname"] = "";
$_SESSION["privilege_level"] = $routerConfig["logged_out_permission_level"];
$_SESSION["privilege_level"] = $routerConfig["permissions"]["logged_out"];
}
function verifyPassword($userID, $password): bool
@@ -86,17 +86,16 @@ function verifyPassword($userID, $password): bool
return !empty($password_hash) && !empty($password) && password_verify($password, $password_hash);
}
function UpdateSession(){
function UpdateSession(): void
{
global $mysqli;
$stmt = $mysqli->prepare("SELECT FirstName, LastName, Nickname, Email, MinecraftNick, PrivilegeLevel, LastLoginAt, LoginCount, ClassID, FavoriteColor FROM Users WHERE ID = ? AND isActivated = 1");
$stmt->bind_param("i", $_SESSION["ID"]);
$stmt->execute();
$uid = 0;
$first_name = "";
$last_name = "";
$nickname = "";
$password_hash = "";
$email = "";
$minecraft_nickname = "";
$privilege_level = 0;
@@ -123,7 +122,7 @@ function UpdateSession(){
function doLogin($email, $password): array
{
global $mysqli, $routerConfig;
global $mysqli;
$found = false;
if (!empty($email) && !empty($password)) {
$stmt = $mysqli->prepare("SELECT ID, PasswordHash FROM Users WHERE Email = ? AND isActivated = 1");
@@ -171,7 +170,7 @@ function doRegister($firstname, $lastname, $email, $password, $activation_token)
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $mysqli->prepare("UPDATE Users SET FirstName=?, LastName=?, Email=?, PasswordHash=?, PrivilegeLevel=?, isActivated=1, ActivationToken='', RegisteredAt=NOW() WHERE ActivationToken = ?");
$privilege_level = $routerConfig["logged_in_default_permission_level"];
$privilege_level = $routerConfig["permissions"]["logged_in_default"];
/** @noinspection SpellCheckingInspection */
$stmt->bind_param("ssssis", $firstname, $lastname, $email, $passwordHash, $privilege_level, $activation_token);
@@ -315,7 +314,7 @@ function getUserInfo(): array
function addActivationCodes($count): array
{
global $mysqli, $routerConfig;
global $mysqli;
$activationCodes = [];
$output = ["Status" => "Fail"]; // Default Status is "Fail"
@@ -347,7 +346,7 @@ function addActivationCodes($count): array
function listUsers(): array
{
global $mysqli, $routerConfig;
global $mysqli;
$output = ["Status" => "Fail"]; // Default Status is "Fail"
if (isUserAdmin()) {
@@ -369,7 +368,7 @@ function listUsers(): array
function listActivationCodes(): array
{
global $mysqli, $routerConfig;
global $mysqli;
$output = ["Status" => "Fail"]; // Default Status is "Fail"
if (isUserAdmin()) {
@@ -414,7 +413,7 @@ function listActivationCodes(): array
function deleteUser($userID): array
{
global $mysqli, $routerConfig;
global $mysqli;
$status = ["Status" => "Fail"];
if (!empty($userID) && isUserAdmin()) {
$stmt = $mysqli->prepare("DELETE FROM Users WHERE ID = ?");
@@ -430,7 +429,7 @@ function deleteUser($userID): array
function deleteActivationCode($activationCode): array
{
global $mysqli, $routerConfig;
global $mysqli;
$status = ["Status" => "Fail"];
if (!empty($activationCode) && isUserAdmin()) {
$stmt = $mysqli->prepare("DELETE FROM Users WHERE ActivationToken = ?");

View File

@@ -1,35 +1,30 @@
<?php
function loadRouterConfig(): void
function loadRouterConfig(): array
{
global $routerConfig;
$routerConfig["default_page"] = "index";
$routerConfig["default_site"] = "home";
return [
'inlining' => false,
'domain' => 'adlerka',
'tld' => 'top',
'default_page' => 'index',
'default_site' => 'home',
'template_dir' => 'templates/',
'endpoint_dir' => 'endpoints/',
'page_dir' => 'pages/',
'protocol' => 'https://',
'permissions' => [
'logged_out' => 1,
'logged_in_default' => 2,
'verified' => 3,
'trustworthy' => 4,
'moderator' => 5,
'user_admin' => 254,
'admin' => 255,
],
'page' => [
'default_secret' => 1,
'default_permissions' => 255,
$routerConfig["template_dir"] = "templates/";
$routerConfig["endpoint_dir"] = "endpoints/";
$routerConfig["page_dir"] = "pages/";
$routerConfig["protocol"] = "https://";
$routerConfig["logged_out_permission_level"] = 1;
$routerConfig["logged_in_default_permission_level"] = 2;
$routerConfig["verified_permission_level"] = 3;
$routerConfig["trustworthy_permission_level"] = 4;
$routerConfig["moderator_permission_level"] = 5;
$routerConfig["user_admin_permission_level"] = 254;
$routerConfig["admin_permission_level"] = 255;
$routerConfig["default_page_permission_level"] = 255;
$routerConfig["default_page_secret"] = 1;
]
];
}

View File

@@ -21,21 +21,9 @@ function getEndpoint($endpoint_name): string
$endpoint_name = $routerRequest["page_name"];
}
if($routerRequest["isToApex"]){
$subdomain_part = "";
}
else{
$subdomain_part = $routerRequest["subdomain"] . "/";
}
$endpoint_file = $routerConfig["endpoint_dir"] . $endpoint_name . ".php";
$endpoint_file = $routerConfig["endpoint_dir"] . $subdomain_part . $endpoint_name . ".php";
$endpoint_file_global = $routerConfig["endpoint_dir"] . "global/" . $endpoint_name . ".php";
if (file_exists($endpoint_file_global)){
$output = runEndpoint($endpoint_file_global);
}
elseif (file_exists($endpoint_file)){
if (file_exists($endpoint_file)){
$output = runEndpoint($endpoint_file);
}
else{

View File

@@ -1,9 +1,10 @@
<?php
function inlineLocalStylesFromHref($inputString) {
function inlineLocalStylesFromHref($inputString): string
{
$pattern = '/<link[^>]*?\srel=["\']?stylesheet["\'].*?\shref=["\']?\/(.*?)["\'][^>]*?>/i';
$outputString = preg_replace_callback($pattern, function($match) {
return preg_replace_callback($pattern, function($match) {
$href = $match[1];
$cssFilePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $href;
$cssContent = file_get_contents($cssFilePath);
@@ -28,14 +29,13 @@ function inlineLocalStylesFromHref($inputString) {
return "<style>{$cssContent}</style>";
}, $inputString);
return $outputString;
}
function inlineScriptFromSrc($inputString) {
function inlineScriptFromSrc($inputString): string
{
$pattern = '/<script.*?src=["\']\/(.*?)["\'].*?>\s*<\/script>/i';
$outputString = preg_replace_callback($pattern, function($match) {
return preg_replace_callback($pattern, function($match) {
$src = $match[1];
$jsContent = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/' . $src);
@@ -43,11 +43,10 @@ function inlineScriptFromSrc($inputString) {
$jsContent = minifyJs($jsContent);
return "<script>{$jsContent}</script>";
}, $inputString);
return $outputString;
}
function minifyCss($css) {
function minifyCss($css): string
{
// Remove comments
$css = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css);
@@ -66,7 +65,8 @@ function minifyCss($css) {
return trim($css);
}
function minifyJs($js) {
function minifyJs($js): string
{
// Remove newlines and tabs
$js = str_replace("\t", '', $js);

View File

@@ -7,11 +7,11 @@ function getDynamicPermission($file): int {
$permission_level = $page_tmp["parameters"]["minimal_permission_level"];
if (!is_numeric($permission_level) || $permission_level <= 0) {
$permission_level = $routerConfig["default_page_permission_level"];
$permission_level = $routerConfig["page"]["default_permissions"];
}
}
catch (Exception){
$permission_level = $routerConfig["default_page_permission_level"];
$permission_level = $routerConfig["page"]["default_permissions"];
} finally {
return $permission_level;
}
@@ -32,16 +32,11 @@ function generateNavigation(): string
$site_name = str_replace("_", " ", $site_dir);
$site_subdomain = $site_dir . ".";
if ($site_name == $routerConfig["default_site"]) {
$site_subdomain = "";
}
$site_name = ucfirst($site_name);
$site_location = $routerConfig["protocol"] . $site_subdomain . $routerRequest["domain"] . "." . $routerRequest["tld"] . "/" . $routerConfig["default_page"];
$site_location = "/" . $site_dir . "/" . $routerConfig["default_page"];
if ($routerRequest["subdomain"] == $site_dir) {
if ($routerRequest["site_name"] == $site_dir) {
//this is the current page
$site_class = "class=\"navsite_link active\"";
}
@@ -49,17 +44,17 @@ function generateNavigation(): string
$site_class = "class=\"navsite_link\"";
}
$navpages = "";
$navigation_pages = "";
foreach ($pages_dir as $page_file) {
$page_file_tmp = explode(".", $page_file);
$page_basename = $page_file_tmp[0];
$page_class = "class=\"navpage_link\"";
if ($routerRequest["subdomain"] == $site_dir && $routerRequest["page_name"] == $page_basename) {
if ($routerRequest["site_name"] == $site_dir && $routerRequest["page_name"] == $page_basename) {
$page_class = "class=\"navpage_link active\"";
}
$page_location = $routerConfig["protocol"] . $site_subdomain . $routerRequest["domain"] . "." . $routerRequest["tld"] . "/" . $page_basename;
$page_location = "/" . $site_dir . "/" . $page_basename;
$page_name = str_replace("_", " ", $page_basename);
$page_name = explode(".", $page_name)[0];
@@ -73,23 +68,26 @@ function generateNavigation(): string
$page_required_permission = intval($pageMetadata["parameters"]["minimal_permission_level"]);
}
else{
$page_required_permission = $routerConfig["default_page_permission_level"];
$page_required_permission = $routerConfig["page"]["default_permissions"];
}
}
elseif($page_file_tmp[1] == "php"){
$page_required_permission = getDynamicPermission($page_file_path);
}
else{
$page_required_permission = $routerConfig["default_page_permission_level"];
$page_required_permission = $routerConfig["page"]["default_permissions"];
}
if($page_required_permission <= $_SESSION["privilege_level"]) {
$navpages .= "<li class='navpage_item' data-site='$site_dir' data-page='$page_basename'><a data-site='$site_dir' data-page='$page_basename' href='$page_location' $page_class>$page_name</a></li>";
$navpage_attributes = "data-site='$site_dir' data-page='$page_basename'";
$navigation_pages .= "<li class='navpage_item' $navpage_attributes ><a $navpage_attributes href='$page_location' $page_class>$page_name</a></li>";
}
}
if(!empty($navpages)){
if(!empty($navigation_pages)){
$default_page = $routerConfig["default_page"];
$nav_out .= "<li class='navsite_item' data-page='$default_page' data-site='$site_dir'><a data-page='$default_page' data-site='$site_dir' href='$site_location' $site_class>$site_name</a><ul class='navpage_list'>$navpages</ul></li>";
$navsite_attributes = "data-page='$default_page' data-site='$site_dir'";
$nav_out .= "<li class='navsite_item' ><a $navsite_attributes href='$site_location' $site_class>$site_name</a><ul class='navpage_list'>$navigation_pages</ul></li>";
}
}

View File

@@ -1,5 +1,4 @@
<?php
require_once "lib/inliner.php";
require_once "lib/dynamic_style.php";
require_once "lib/script_data.php";
function renderDynamicPage($page_file): array
@@ -38,7 +37,7 @@ function renderPage($page_name = null, $site_name = null): array
global $routerRequest;
if(!$site_name) {
$site_name = $routerRequest["subdomain"];
$site_name = $routerRequest["site_name"];
}
if(!$page_name){
@@ -70,7 +69,7 @@ function renderPage($page_name = null, $site_name = null): array
$page_required_permission = intval($pageMetadata["parameters"]["minimal_permission_level"]);
}
else{
$page_required_permission = $routerConfig["default_page_permission_level"];
$page_required_permission = $routerConfig["page"]["default_permissions"];
}
if(!empty($pageMetadata["parameters"]["secret"])){
@@ -82,11 +81,11 @@ function renderPage($page_name = null, $site_name = null): array
$is_secret_page = 0;
}
else{
$is_secret_page = $routerConfig["default_page_secret"];
$is_secret_page = $routerConfig["page"]["default_secret"];
}
}
else{
$is_secret_page = $routerConfig["default_page_secret"];
$is_secret_page = $routerConfig["page"]["default_secret"];
}
@@ -117,7 +116,7 @@ function renderPage($page_name = null, $site_name = null): array
}
function getPage($page_name_in = null, $site_name_in = null): string
function getPage($site_name_in = null, $page_name_in = null): string
{
$page_tmp = renderPage($page_name_in, $site_name_in);
@@ -142,28 +141,24 @@ function getPage($page_name_in = null, $site_name_in = null): string
"defaultPage" => $routerConfig["default_page"],
]);
$navpages = generateNavigation();
$navigation = generateNavigation();
$out = $skeleton;
$out = str_replace("__TEMPLATE__NAV__", $navpages, $out);
$out = str_replace("__TEMPLATE__NAV__", $navigation, $out);
$out = str_replace("__TEMPLATE__PAGE__", $page, $out);
$out = str_replace("__TEMPLATE__DYNASCRIPT__", $dynamic_script, $out);
$out = str_replace("__TEMPLATE__DYNASTYLE__", $dynamic_style, $out);
$out = inlineLocalStylesFromHref($out);
$out = inlineScriptFromSrc($out);
$out = str_replace("__TEMPLATE__DYNAMIC__SCRIPT__", $dynamic_script, $out);
$out = str_replace("__TEMPLATE__DYNAMIC__STYLE__", $dynamic_style, $out);
if($routerConfig["inlining"]) {
require_once "lib/inliner.php";
$out = inlineLocalStylesFromHref($out);
$out = inlineScriptFromSrc($out);
}
return str_replace("__TEMPLATE_PAGE_TITLE__", $page_title, $out);
}
function getPageEndpoint($page_name, $site_name) :array
{
global $routerRequest, $routerConfig;
if(!empty($site_name)){
$subdomain = "$site_name.";
}
else{
$subdomain = "";
}
$page_location = $routerConfig["protocol"] . $subdomain . $routerRequest["domain"] . "." . $routerRequest["tld"] . "/" . $page_name;
$page_location = "/" . $site_name . "/" . $page_name;
$page_tmp = renderPage($page_name, $site_name);
return [
"Status" => "Success",

View File

@@ -1,68 +1,36 @@
<?php
function initRouter(): bool
function initRouter(): array
{
global $routerRequest;
global $routerConfig;
$routerRequest = array();
$routerRequest["requestAddress"] = array_slice(explode('.', $_SERVER['HTTP_HOST']), -3, 3); //get the last 3 elements
$needsRedirect = false;
$request_uri = explode("/", $_SERVER["QUERY_STRING"]);
if(count($routerRequest["requestAddress"]) < 3){
// Root domain accessed directly
$routerRequest["subdomain"] = $routerConfig["default_site"];
$routerRequest["domain"] = basename($routerRequest["requestAddress"][0]);
$routerRequest["tld"] = basename($routerRequest["requestAddress"][1]);
$routerRequest["isToApex"] = true;
$request_uri = array_slice($request_uri, -3, 3);
$routerRequest["site_name"] = basename($request_uri[1]);
$routerRequest["page_name"] = basename($request_uri[2]);
if (empty($routerRequest["site_name"])) {
$routerRequest["site_name"] = $routerConfig["default_site"];
}
else {
$routerRequest["subdomain"] = basename($routerRequest["requestAddress"][0]);
$routerRequest["domain"] = basename($routerRequest["requestAddress"][1]);
$routerRequest["tld"] = basename($routerRequest["requestAddress"][2]);
if($routerRequest["subdomain"] == $routerConfig["default_site"]){
$routerRequest["subdomain"] = "";
$needsRedirect = true;
}
}
$routerRequest["page_name"] = basename($_SERVER["QUERY_STRING"]);
if (empty($routerRequest["page_name"])) {
// Page name is empty
$needsRedirect = true;
$routerRequest["page_name"] = $routerConfig["default_page"];
}
if($_SERVER["REQUEST_METHOD"] == "POST"){
$routerRequest["type"] = "api";
}
if(empty($routerRequest["type"])) {
$routerRequest["type"] = "page";
}
if ($needsRedirect) {
if(!empty($routerRequest["subdomain"])){
$sub_domain = $routerRequest["subdomain"] . ".";
}
else{
$sub_domain = "";
}
$redirectAddress = $routerConfig["protocol"] .
$sub_domain .
$routerRequest["domain"] . "." .
$routerRequest["tld"] . "/" .
$routerRequest["page_name"];
// Redirect with default page name
header("Location: $redirectAddress");
return false;
}
else{
if($_SERVER["REQUEST_METHOD"] == "POST"){
$routerRequest["type"] = "api";
}
if(empty($routerRequest["type"])){
$routerRequest["type"] = "page";
}
return true;
}
return $routerRequest;
}