web-base/core/core.php

123 lines
3.2 KiB
PHP
Raw Normal View History

2020-02-09 23:02:19 +01:00
<?php
2020-06-22 19:09:02 +02:00
define("WEBBASE_VERSION", "0.1.0-alpha");
function getProtocol() {
return stripos($_SERVER['SERVER_PROTOCOL'], 'https') === 0 ? 'https' : 'http';
}
function generateRandomString($length): string {
$randomString = '';
if ($length > 0) {
$numCharacters = 26 + 26 + 10; // a-z + A-Z + 0-9
for ($i = 0; $i < $length; $i++) {
try {
$num = random_int(0, $numCharacters - 1);
} catch (Exception $e) {
$num = rand(0, $numCharacters - 1);
}
2020-06-20 15:49:53 +02:00
2020-06-22 19:09:02 +02:00
if ($num < 26) $randomString .= chr(ord('a') + $num);
else if ($num - 26 < 26) $randomString .= chr(ord('A') + $num - 26);
else $randomString .= chr(ord('0') + $num - 26 - 26);
2020-02-09 23:02:19 +01:00
}
}
2020-06-22 19:09:02 +02:00
return $randomString;
}
2020-02-10 00:52:25 +01:00
2020-06-22 19:09:02 +02:00
function startsWith($haystack, $needle) {
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
function endsWith($haystack, $needle) {
$length = strlen($needle);
if ($length == 0)
return true;
return (substr($haystack, -$length) === $needle);
}
function intendCode($code, $escape = true) {
$newCode = "";
$first = true;
$brackets = array();
$intend = 0;
foreach (explode("\n", $code) as $line) {
if (!$first) $newCode .= "\n";
if ($escape) $line = htmlspecialchars($line);
$line = trim($line);
if (count($brackets) > 0 && startsWith($line, current($brackets))) {
$intend = max(0, $intend - 2);
array_pop($brackets);
2020-02-09 23:02:19 +01:00
}
2020-06-22 19:09:02 +02:00
$newCode .= str_repeat(" ", $intend);
$newCode .= $line;
$first = false;
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
if (endsWith($line, "{")) {
$intend += 2;
array_push($brackets, "}");
} else if (endsWith($line, "(")) {
$intend += 2;
array_push($brackets, ")");
}
2020-02-09 23:02:19 +01:00
}
2020-06-22 19:09:02 +02:00
return $newCode;
}
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
function replaceCssSelector($sel) {
return preg_replace("~[.#<>]~", "_", preg_replace("~[:\-]~", "", $sel));
}
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
function getClassPath($class, $suffix = true) {
$path = str_replace('\\', '/', $class);
$path = array_values(array_filter(explode("/", $path)));
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
if (strcasecmp($path[0], "api") === 0 && count($path) > 2 && strcasecmp($path[1], "Parameter") !== 0) {
$path = "Api/" . $path[1] . "API";
} else {
$path = implode("/", $path);
}
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
$suffix = ($suffix ? ".class" : "");
return "core/$path$suffix.php";
}
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
function createError($msg) {
return json_encode(array("success" => false, "msg" => $msg));
}
2020-02-09 23:02:19 +01:00
2020-06-22 19:12:14 +02:00
function serveStatic(string $webRoot, string $file) {
2020-02-09 23:02:19 +01:00
2020-06-22 19:09:02 +02:00
$path = realpath($webRoot . "/" . $file);
if (!startsWith($path, $webRoot . "/")) {
http_response_code(406);
return "<b>Access restricted, requested file outside web root:</b> " . htmlspecialchars($path);
2020-02-09 23:02:19 +01:00
}
2020-06-22 19:09:02 +02:00
if (!file_exists($path) || !is_file($path) || !is_readable($path)) {
http_response_code(500);
return "<b>Unable to read file:</b> " . htmlspecialchars($path);
2020-02-09 23:02:19 +01:00
}
2020-04-03 15:56:04 +02:00
2020-06-22 19:12:14 +02:00
$pathInfo = pathinfo($path);
2020-06-20 20:13:51 +02:00
2020-06-22 19:09:02 +02:00
// maybe I will allow more later…
$allowedExtension = array("html", "htm");
$ext = $pathInfo["extension"] ?? "";
if (!in_array($ext, $allowedExtension)) {
http_response_code(406);
return "<b>Access restricted:</b> Extension '" . htmlspecialchars($ext) . "' not allowed.";
2020-04-03 15:56:04 +02:00
}
2020-06-22 19:12:14 +02:00
$mimeType = mime_content_type($path);
2020-06-22 19:09:02 +02:00
header("Content-Type: $mimeType");
2020-06-22 19:12:14 +02:00
readfile($path);
2020-06-22 19:09:02 +02:00
}