mirror of
https://github.com/Karaka-Management/oms-OnlineResourceWatcher.git
synced 2026-01-24 13:48:42 +00:00
194 lines
6.7 KiB
PHP
Executable File
194 lines
6.7 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Karaka
|
|
*
|
|
* PHP Version 8.1
|
|
*
|
|
* @package Install
|
|
* @copyright Dennis Eichhorn
|
|
* @license OMS License 1.0
|
|
* @version 1.0.0
|
|
* @link https://karaka.app
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Install;
|
|
|
|
use phpOMS\DataStorage\Database\DatabaseStatus;
|
|
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
|
|
use phpOMS\Dispatcher\Dispatcher;
|
|
use phpOMS\Localization\ISO639x1Enum;
|
|
use phpOMS\Localization\Localization;
|
|
use phpOMS\Log\FileLogger;
|
|
use phpOMS\Message\Http\HttpRequest;
|
|
use phpOMS\Message\Http\HttpResponse;
|
|
use phpOMS\Message\Http\RequestStatusCode;
|
|
use phpOMS\Router\RouteVerb;
|
|
use phpOMS\Router\WebRouter;
|
|
use phpOMS\System\MimeType;
|
|
use phpOMS\Uri\UriFactory;
|
|
use phpOMS\Views\View;
|
|
|
|
final class WebApplication extends InstallAbstract
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->setupHandlers();
|
|
|
|
if (!\is_dir(__DIR__ . '/../Logs')) {
|
|
\mkdir(__DIR__ . '/../Logs');
|
|
}
|
|
|
|
$this->logger = FileLogger::getInstance(__DIR__ . '/../Logs', false);
|
|
$request = $this->initRequest();
|
|
$response = $this->initResponse($request, ['en', 'de']);
|
|
|
|
UriFactory::setupUriBuilder($request->uri);
|
|
|
|
$this->run($request, $response);
|
|
|
|
$response->header->push();
|
|
echo $response->getBody();
|
|
}
|
|
|
|
private function initRequest() : HttpRequest
|
|
{
|
|
$request = HttpRequest::createFromSuperglobals();
|
|
|
|
$rootPath = $request->uri->getPath();
|
|
$offset = \strripos($rootPath, '/');
|
|
$rootPath = \substr($rootPath, -$offset);
|
|
|
|
$subDirDepth = \substr_count($rootPath, '/');
|
|
|
|
$request->createRequestHashs($subDirDepth);
|
|
$request->uri->setRootPath($rootPath);
|
|
UriFactory::setupUriBuilder($request->uri);
|
|
|
|
$langCode = \strtolower($request->uri->getPathElement(0));
|
|
$request->header->l11n->setLanguage(
|
|
empty($langCode) || !ISO639x1Enum::isValidValue($langCode) ? 'en' : $langCode
|
|
);
|
|
UriFactory::setQuery('/lang', $request->getLanguage());
|
|
|
|
return $request;
|
|
}
|
|
|
|
private function initResponse(HttpRequest $request, array $languages) : HttpResponse
|
|
{
|
|
$response = new HttpResponse(new Localization());
|
|
$response->header->set('content-type', 'text/html; charset=utf-8');
|
|
$response->header->set('x-xss-protection', '1; mode=block');
|
|
$response->header->set('x-content-type-options', 'nosniff');
|
|
$response->header->set('x-frame-options', 'SAMEORIGIN');
|
|
$response->header->set('referrer-policy', 'same-origin');
|
|
|
|
if ($request->isHttps()) {
|
|
$response->header->set('strict-transport-security', 'max-age=31536000');
|
|
}
|
|
|
|
$response->header->l11n->setLanguage(
|
|
!\in_array($request->getLanguage(), $languages) ? 'en' : $request->getLanguage()
|
|
);
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function run(HttpRequest $request, HttpResponse $response) : void
|
|
{
|
|
$this->dispatcher = new Dispatcher($this);
|
|
$this->router = new WebRouter();
|
|
|
|
$this->setupRoutes();
|
|
$response->header->set('content-language', $response->getLanguage(), true);
|
|
UriFactory::setQuery('/lang', $response->getLanguage());
|
|
|
|
$this->dispatcher->dispatch(
|
|
$this->router->route(
|
|
$request->uri->getRoute(),
|
|
$request->getData('CSRF'),
|
|
$request->getRouteVerb()
|
|
),
|
|
$request,
|
|
$response
|
|
);
|
|
}
|
|
|
|
private function setupRoutes() : void
|
|
{
|
|
$this->router->add('^.*', '\Install\WebApplication::installView', RouteVerb::GET);
|
|
$this->router->add('^.*', '\Install\WebApplication::installRequest', RouteVerb::PUT);
|
|
}
|
|
|
|
public static function installView(HttpRequest $request, HttpResponse $response) : void
|
|
{
|
|
$view = new View(null, $request, $response);
|
|
$view->setTemplate('/Install/index');
|
|
$response->set('Content', $view);
|
|
}
|
|
|
|
public static function installRequest(HttpRequest $request, HttpResponse $response) : void
|
|
{
|
|
$response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
|
|
|
|
if (!empty(self::validateRequest($request))) {
|
|
$response->header->status = RequestStatusCode::R_400;
|
|
return;
|
|
}
|
|
|
|
$db = self::setupDatabaseConnection($request);
|
|
$db->connect();
|
|
|
|
if ($db->getStatus() !== DatabaseStatus::OK) {
|
|
$response->header->status = RequestStatusCode::R_400;
|
|
return;
|
|
}
|
|
|
|
DataMapperFactory::db($db);
|
|
|
|
self::clearOld();
|
|
self::installConfigFile($request);
|
|
self::installCore($db);
|
|
self::installGroups($db);
|
|
self::installUsers($request, $db);
|
|
self::installApplications($request, $db);
|
|
|
|
$response->header->status = RequestStatusCode::R_200;
|
|
}
|
|
|
|
private static function validateRequest(HttpRequest $request) : array
|
|
{
|
|
$valid = [];
|
|
|
|
if (($valid['php_extensions'] = !self::hasPhpExtensions())
|
|
|| ($valid['iDbHost'] = empty($request->getData('dbhost')))
|
|
|| ($valid['iDbType'] = empty($request->getData('dbtype')))
|
|
|| ($valid['iDbPort'] = empty($request->getData('dbport')))
|
|
|| ($valid['iDbName'] = empty($request->getData('dbname')))
|
|
|| ($valid['iSchemaUser'] = empty($request->getData('schemauser')))
|
|
//|| ($valid['iSchemaPassword'] = empty($request->getData('schemapassword')))
|
|
|| ($valid['iCreateUser'] = empty($request->getData('createuser')))
|
|
//|| ($valid['iCreatePassword'] = empty($request->getData('createpassword')))
|
|
|| ($valid['iSelectUser'] = empty($request->getData('selectuser')))
|
|
//|| ($valid['iSelectPassword'] = empty($request->getData('selectpassword')))
|
|
|| ($valid['iDeleteUser'] = empty($request->getData('deleteuser')))
|
|
//|| ($valid['iDeletePassword'] = empty($request->getData('deletepassword')))
|
|
|| ($valid['iDbName'] = !self::testDbConnection($request))
|
|
|| ($valid['iInstallType'] = empty($request->getData('installtype')))
|
|
|| ($valid['iOrgName'] = empty($request->getData('orgname')))
|
|
|| ($valid['iAdminName'] = empty($request->getData('adminname')))
|
|
//|| ($valid['iAdminPassword'] = empty($request->getData('adminpassword')))
|
|
|| ($valid['iAdminEmail'] = empty($request->getData('adminemail')))
|
|
|| ($valid['iDomain'] = empty($request->getData('domain')))
|
|
|| ($valid['iWebSubdir'] = empty($request->getData('websubdir')))
|
|
|| ($valid['iDefaultLang'] = empty($request->getData('defaultlang')))
|
|
) {
|
|
return $valid;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
}
|