Files
Cloud-CMS/lib/Middleware/AuthenticationTrait.php
Matt Batchelder 05ce0da296 Initial Upload
2025-12-02 10:32:59 -05:00

209 lines
5.5 KiB
PHP

<?php
/*
* Copyright (C) 2024 Xibo Signage Ltd
*
* Xibo - Digital Signage - https://xibosignage.com
*
* This file is part of Xibo.
*
* Xibo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* Xibo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Xibo\Middleware;
use Nyholm\Psr7\Factory\Psr17Factory;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
use Slim\Http\Factory\DecoratedResponseFactory;
use Slim\Routing\RouteContext;
use Xibo\Entity\User;
use Xibo\Helper\HttpsDetect;
use Xibo\Helper\UserLogProcessor;
/**
* Trait AuthenticationTrait
* @package Xibo\Middleware
*/
trait AuthenticationTrait
{
/* @var App $app */
protected $app;
/**
* Set dependencies
* @param App $app
* @return $this
*/
public function setDependencies(App $app)
{
$this->app = $app;
return $this;
}
/**
* @return \Xibo\Service\ConfigServiceInterface
*/
protected function getConfig()
{
return $this->app->getContainer()->get('configService');
}
/**
* @return \Xibo\Helper\Session
*/
protected function getSession()
{
return $this->app->getContainer()->get('session');
}
/**
* @return \Xibo\Service\LogServiceInterface
*/
protected function getLog()
{
return $this->app->getContainer()->get('logService');
}
/**
* @param $array
* @return \Xibo\Support\Sanitizer\SanitizerInterface
*/
protected function getSanitizer($array)
{
return $this->app->getContainer()->get('sanitizerService')->getSanitizer($array);
}
/**
* @return \Xibo\Factory\UserFactory
*/
protected function getUserFactory()
{
return $this->app->getContainer()->get('userFactory');
}
/**
* @return \Xibo\Factory\UserGroupFactory
*/
protected function getUserGroupFactory()
{
return $this->app->getContainer()->get('userGroupFactory');
}
/**
* @return \Xibo\Entity\User
*/
protected function getEmptyUser()
{
$container = $this->app->getContainer();
/** @var User $user */
$user = $container->get('userFactory')->create();
$user->setChildAclDependencies($container->get('userGroupFactory'));
return $user;
}
/**
* @param int $userId
* @param string $ip
* @param int $sessionHistoryId
* @return \Xibo\Entity\User
*/
protected function getUser($userId, $ip, $sessionHistoryId): User
{
$container = $this->app->getContainer();
$user = $container->get('userFactory')->getById($userId);
// Pass the page factory into the user object, so that it can check its page permissions
$user->setChildAclDependencies($container->get('userGroupFactory'));
// Load the user
$user->load(false);
// Configure the log service with the logged in user id
$container->get('logService')->setUserId($user->userId);
$container->get('logService')->setIpAddress($ip);
$container->get('logService')->setSessionHistoryId($sessionHistoryId);
return $user;
}
/**
* @param \Xibo\Entity\User $user
*/
protected function setUserForRequest($user)
{
$container = $this->app->getContainer();
$container->set('user', $user);
// Add this users information to the logger
$this->getLog()->getLoggerInterface()->pushProcessor(new UserLogProcessor(
$user->userId,
$this->getLog()->getSessionHistoryId(),
null,
));
}
/**
* @param Request $request
* @return string
*/
protected function getRoutePattern($request)
{
$routeContext = RouteContext::fromRequest($request);
$route = $routeContext->getRoute();
return $route->getPattern();
}
/**
* @return \Slim\Interfaces\RouteParserInterface
*/
protected function getRouteParser()
{
return $this->app->getRouteCollector()->getRouteParser();
}
/**
* @param \Psr\Http\Message\ServerRequestInterface $request
* @return bool
*/
protected function isAjax(Request $request)
{
return strtolower($request->getHeaderLine('X-Requested-With')) === 'xmlhttprequest';
}
/**
* @param \Psr\Http\Message\ServerRequestInterface $request
* @return \Psr\Http\Message\ResponseInterface
*/
protected function createResponse(Request $request)
{
// Create a new response
$nyholmFactory = new Psr17Factory();
$decoratedResponseFactory = new DecoratedResponseFactory($nyholmFactory, $nyholmFactory);
return HttpsDetect::decorateWithStsIfNecessary(
$this->getConfig(),
$request,
$decoratedResponseFactory->createResponse()
);
}
/**
* @param string $route
*/
protected function rememberRoute($route)
{
$this->app->getContainer()->get('flash')->addMessage('priorRoute', $route);
}
}