2023-07-17 19:15:18 +00:00
|
|
|
<?php declare(strict_types=1);
|
2023-06-08 15:36:44 +00:00
|
|
|
umask(0077);
|
|
|
|
|
|
|
|
set_error_handler(function ($level, $message, $file = '', $line = 0) {
|
|
|
|
throw new ErrorException($message, 0, $level, $file, $line);
|
|
|
|
});
|
|
|
|
set_exception_handler(function ($e) {
|
2023-06-20 00:32:36 +00:00
|
|
|
error_log((string) $e);
|
2023-06-08 15:36:44 +00:00
|
|
|
http_response_code(500);
|
2023-06-24 14:54:36 +00:00
|
|
|
echo '<h1>Error</h1><p>An error occured.<p>';
|
2023-06-08 15:36:44 +00:00
|
|
|
});
|
|
|
|
register_shutdown_function(function () { // Also catch fatal errors
|
|
|
|
if (($error = error_get_last()) !== NULL)
|
|
|
|
throw new ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line']);
|
|
|
|
});
|
|
|
|
|
|
|
|
const ROOT_PATH = __DIR__;
|
|
|
|
define('CONF', parse_ini_file(ROOT_PATH . '/config.ini', true, INI_SCANNER_TYPED));
|
|
|
|
|
|
|
|
define('DB', new PDO('sqlite:' . ROOT_PATH . '/db/servnest.db'));
|
|
|
|
DB->exec('PRAGMA foreign_keys = ON;');
|
|
|
|
DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
|
|
|
|
date_default_timezone_set('UTC');
|
|
|
|
|
|
|
|
foreach (explode(',', preg_replace('/[A-Z0-9]|q=|;|-|\./', '', $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '')) as $client_locale)
|
|
|
|
if (in_array($client_locale, array_diff(scandir(ROOT_PATH . '/locales'), ['..', '.']), true)) {
|
|
|
|
$locale = $client_locale;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
define('LOCALE', $locale ?? 'en');
|
|
|
|
putenv('LANG=C.UTF-8');
|
|
|
|
setlocale(LC_MESSAGES, 'C.UTF-8');
|
|
|
|
bindtextdomain('messages', ROOT_PATH . '/locales/' . LOCALE);
|
|
|
|
header('Content-Language: ' . LOCALE);
|
|
|
|
|
|
|
|
const SERVICES_USER = ['reg', 'ns', 'ht'];
|
|
|
|
|
|
|
|
const LF = "\n";
|
|
|
|
|
|
|
|
const PLACEHOLDER_DOMAIN = 'example'; // From RFC2606: Reserved Top Level DNS Names > 2. TLDs for Testing, & Documentation Examples
|
|
|
|
const PLACEHOLDER_IPV6 = '2001:db8::3'; // From RFC3849: IPv6 Address Prefix Reserved for Documentation
|
|
|
|
const PLACEHOLDER_IPV4 = '203.0.113.42'; // From RFC5737: IPv4 Address Blocks Reserved for Documentation
|
|
|
|
|
|
|
|
foreach (array_diff(scandir(ROOT_PATH . '/fn'), ['..', '.']) as $file)
|
|
|
|
require ROOT_PATH . '/fn/' . $file;
|
|
|
|
|
|
|
|
require ROOT_PATH . '/pages.php';
|