%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Middleware/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Middleware/ApiSessionMiddleware.php |
<?php
/*
* @copyright 2023 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\Middleware;
use OCA\Passwords\Controller\Api\ServiceApiController;
use OCA\Passwords\Controller\Api\SessionApiController;
use OCA\Passwords\Controller\Api\SettingsApiController;
use OCA\Passwords\Exception\ApiException;
use OCA\Passwords\Services\SessionService;
use OCA\Passwords\Services\UserChallengeService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Middleware;
use OCP\DB\Exception;
/**
* Class ApiSessionMiddleware
*
* @package OCA\Passwords\Middleware
*/
class ApiSessionMiddleware extends Middleware {
/**
* ApiSessionMiddleware constructor.
*
* @param SessionService $sessionService
* @param UserChallengeService $challengeService
*/
public function __construct(
protected SessionService $sessionService,
protected UserChallengeService $challengeService
) {
}
/**
* @param Controller $controller
* @param string $methodName
*
* @throws ApiException
*/
public function beforeController(Controller $controller, string $methodName): void {
if(!$this->isApiRequest($controller)) return;
$this->sessionService->load();
if(!$this->sessionService->isAuthorized() && $this->requiresAuthorization($controller, $methodName)) {
throw new ApiException('Authorized session required', Http::STATUS_PRECONDITION_FAILED);
}
parent::beforeController($controller, $methodName);
}
/**
* @param Controller $controller
* @param string $methodName
* @param Response $response
*
* @return Response
* @throws Exception
*/
public function afterController(Controller $controller, string $methodName, Response $response): Response {
if(!$this->isApiRequest($controller) || $response instanceof FileDisplayResponse) return $response;
$this->sessionService->save();
$sessionId = $this->sessionService->getEncryptedId();
if($sessionId) {
$response->addHeader(SessionService::API_SESSION_HEADER, $sessionId);
$response->addCookie(SessionService::API_SESSION_COOKIE, $sessionId);
}
return parent::afterController($controller, $methodName, $response);
}
/**
* @param Controller $controller
*
* @return bool
*/
protected function isApiRequest(Controller $controller): bool {
$class = get_class($controller);
return str_starts_with($class, 'OCA\Passwords\Controller\Api');
}
/**
* @param Controller $controller
* @param string $method
*
* @return bool
*/
protected function requiresAuthorization(Controller $controller, string $method): bool {
if(!$this->challengeService->hasChallenge()) {
return false;
}
if($controller instanceof SessionApiController && in_array($method, ['open', 'request', 'requestToken', 'keepAlive'])) {
return false;
}
if($controller instanceof ServiceApiController && in_array($method, ['getAvatar', 'getFavicon', 'getPreview', 'getHashes'])) {
return false;
}
if($controller instanceof SettingsApiController && in_array($method, ['get', 'list'])) {
return false;
}
return true;
}
}