%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Controller/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Controller/PageController.php |
<?php /* * @copyright 2024 Passwords App * * @author Marius David Wieschollek * @license AGPL-3.0 * * This file is part of the Passwords App * created by Marius David Wieschollek. */ namespace OCA\Passwords\Controller; use Exception; use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\Attribute\UseSession; use OCP\IRequest; use OCP\AppFramework\Controller; use OCA\Passwords\AppInfo\Application; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; use OCA\Passwords\Helper\Token\ApiTokenHelper; use OCA\Passwords\Services\EnvironmentService; use OCA\Passwords\Services\NotificationService; use OCA\Passwords\Services\UserSettingsService; use OCA\Passwords\Helper\Http\SetupReportHelper; use OCA\Passwords\Services\ConfigurationService; use OCA\Passwords\Services\UserChallengeService; use OCA\Passwords\Services\DeferredActivationService; /** * Class PageController * * @package OCA\Passwords\Controller */ class PageController extends Controller { /** * @var UserSettingsService */ protected UserSettingsService $settings; /** * @var ApiTokenHelper */ protected ApiTokenHelper $tokenHelper; /** * @var EnvironmentService */ protected EnvironmentService $environment; /** * @var NotificationService */ protected NotificationService $notifications; /** * @var UserChallengeService */ protected UserChallengeService $challengeService; /** * @var SetupReportHelper */ protected SetupReportHelper $setupReportHelper; /** * @var DeferredActivationService */ protected DeferredActivationService $das; /** * @var IInitialState */ protected IInitialState $initialState; /** * @var ConfigurationService */ protected ConfigurationService $config; /** * @param IRequest $request * @param ApiTokenHelper $tokenHelper * @param IInitialState $initialState * @param UserSettingsService $settings * @param EnvironmentService $environment * @param NotificationService $notifications * @param SetupReportHelper $setupReportHelper * @param UserChallengeService $challengeService * @param DeferredActivationService $das * @param ConfigurationService $config */ public function __construct( IRequest $request, ApiTokenHelper $tokenHelper, IInitialState $initialState, UserSettingsService $settings, EnvironmentService $environment, NotificationService $notifications, SetupReportHelper $setupReportHelper, UserChallengeService $challengeService, DeferredActivationService $das, ConfigurationService $config, ) { parent::__construct(Application::APP_NAME, $request); $this->das = $das; $this->config = $config; $this->settings = $settings; $this->tokenHelper = $tokenHelper; $this->environment = $environment; $this->initialState = $initialState; $this->notifications = $notifications; $this->challengeService = $challengeService; $this->setupReportHelper = $setupReportHelper; } /** * @throws Exception */ #[UseSession] #[NoCSRFRequired] #[NoAdminRequired] public function index(): TemplateResponse { $isSecure = $this->checkIfHttpsUsed(); if($isSecure) { $this->addHeaders(); $this->checkImpersonation(); } else { $this->tokenHelper->destroyWebUiToken(); } $response = new TemplateResponse( $this->appName, 'index', $this->getTemplateVariables($isSecure) ); $this->getContentSecurityPolicy($response); $this->config->setAppValue('web/php/version/id', PHP_VERSION_ID); $this->config->setAppValue('web/php/version/string', phpversion()); return $response; } /** * @return bool */ protected function checkIfHttpsUsed(): bool { $httpsParam = $this->request->getParam('https', 'true') === 'true'; return $this->request->getServerProtocol() === 'https' && $httpsParam; } /** * * @throws Exception */ protected function addHeaders(): void { $this->initialState->provideInitialState('settings', $this->settings->list()); [$token, $user] = $this->tokenHelper->getWebUiToken(); $this->initialState->provideInitialState('api-user', $user); $this->initialState->provideInitialState('api-token', $token); $this->initialState->provideInitialState('authenticate', $this->challengeService->hasChallenge()); $this->initialState->provideInitialState('impersonate', $this->environment->isImpersonating()); $this->initialState->provideInitialState('features', $this->das->getClientFeatures()); } /** * @param TemplateResponse $response * * @throws Exception */ protected function getContentSecurityPolicy(TemplateResponse $response): void { $manualHost = parse_url($this->settings->get('server.handbook.url'), PHP_URL_HOST); $csp = $response->getContentSecurityPolicy(); $csp->addAllowedScriptDomain($this->request->getServerHost()); $csp->addAllowedConnectDomain($manualHost); $csp->addAllowedConnectDomain('data:'); $csp->addAllowedImageDomain($manualHost); $csp->addAllowedMediaDomain($manualHost); $csp->addAllowedMediaDomain('blob:'); $csp->allowInlineStyle(); $csp->allowEvalScript(); $response->setContentSecurityPolicy($csp); } /** * @throws Exception */ protected function checkImpersonation(): void { if($this->environment->isImpersonating()) { $this->notifications->sendImpersonationNotification( $this->environment->getUserId(), $this->environment->getRealUser()->getUID() ); } } /** * @param bool $isSecure * * @return array[] */ protected function getTemplateVariables(bool $isSecure): array { $variables = [ 'https' => $isSecure ]; if(!$isSecure) { $variables['report'] = $this->setupReportHelper->getHttpsSetupReport(); } if($this->config->hasAppValue('dev/app/hash')) { $variables['hash'] = $this->config->getAppValue('dev/app/hash'); } return $variables; } }