diff --git a/api.php b/api.php index 25b6cd5c..63179a99 100644 --- a/api.php +++ b/api.php @@ -22,11 +22,11 @@ * along with sysPass. If not, see . */ -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapApi; const APP_ROOT = __DIR__; const APP_MODULE = 'api'; $dic = require APP_ROOT.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'Base.php'; -Bootstrap::runApi($dic); +BootstrapApi::run($dic); diff --git a/app/modules/web/Controllers/AccountController.php b/app/modules/web/Controllers/AccountController.php index f2338214..1f2a2580 100644 --- a/app/modules/web/Controllers/AccountController.php +++ b/app/modules/web/Controllers/AccountController.php @@ -30,9 +30,9 @@ use DI\NotFoundException; use Exception; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Context\ContextBase; use SP\Core\Crypt\Vault; use SP\Core\Events\Event; @@ -81,7 +81,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn use JsonTrait, ItemTrait; protected ?AccountService $accountService = null; - protected ?ThemeIcons $icons = null; + protected ?ThemeIcons $icons = null; /** * Index action @@ -131,7 +131,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn ); return $this->returnJsonResponseData([ - 'html' => $this->render() + 'html' => $this->render(), ]); } catch (Exception $e) { processException($e); @@ -148,7 +148,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * View action * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -171,11 +171,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn ActionsInterface::ACCOUNT_VIEW ); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleNormal', - 'name' => __('Account Details'), - 'icon' => $this->icons->getIconView()->getIcon() + 'name' => __('Account Details'), + 'icon' => $this->icons->getIconView()->getIcon(), ] ); @@ -212,7 +213,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * View public link action * - * @param string $hash Link's hash + * @param string $hash Link's hash * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -246,18 +247,21 @@ final class AccountController extends ControllerBase implements CrudControllerIn $vault->getData($publicLinkService->getPublicLinkKey($publicLinkData->getHash())->getKey()) ); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleNormal', - 'name' => __('Account Details'), - 'icon' => $this->icons->getIconView()->getIcon() + 'name' => __('Account Details'), + 'icon' => $this->icons->getIconView()->getIcon(), ] ); $this->view->assign('isView', true); - $this->view->assign('useImage', + $this->view->assign( + 'useImage', $this->configData->isPublinksImageEnabled() - || $this->configData->isAccountPassToImage()); + || $this->configData->isAccountPassToImage() + ); if ($this->view->useImage) { $imageUtil = $this->dic->get(ImageUtil::class); @@ -278,14 +282,15 @@ final class AccountController extends ControllerBase implements CrudControllerIn ? '***' : $this->request->getClientAddress(true); - $baseUrl = ($this->configData->getApplicationUrl() ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($this->configData->getApplicationUrl() ?: BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; $deepLink = new Uri($baseUrl); - $deepLink->addParam('r', Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW) . '/' . $accountData->getId()); + $deepLink->addParam('r', Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW).'/'.$accountData->getId()); $this->eventDispatcher->notifyEvent( 'show.account.link', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Link viewed')) ->addDetail(__u('Account'), $accountData->getName()) ->addDetail(__u('Client'), $accountData->getClientName()) @@ -294,7 +299,8 @@ final class AccountController extends ControllerBase implements CrudControllerIn ->addDetail(__u('IP'), $clientAddress) ->addDetail(__u('Link'), $deepLink->getUriSigned($this->configData->getPasswordSalt())) ->addExtra('userId', $publicLinkData->getUserId()) - ->addExtra('notify', $publicLinkData->isNotify())) + ->addExtra('notify', $publicLinkData->isNotify()) + ) ); } else { ErrorUtil::showErrorInView( @@ -328,11 +334,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn $accountHelper->setViewForBlank(ActionsInterface::ACCOUNT_CREATE); $this->view->addTemplate('account'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleGreen', - 'name' => __('New Account'), - 'icon' => $this->icons->getIconAdd()->getIcon() + 'name' => __('New Account'), + 'icon' => $this->icons->getIconAdd()->getIcon(), ] ); $this->view->assign('formRoute', 'account/saveCreate'); @@ -363,7 +370,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Copy action * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -384,11 +391,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn ); $this->view->addTemplate('account'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleGreen', - 'name' => __('New Account'), - 'icon' => $this->icons->getIconAdd()->getIcon() + 'name' => __('New Account'), + 'icon' => $this->icons->getIconAdd()->getIcon(), ] ); $this->view->assign('formRoute', 'account/saveCopy'); @@ -424,7 +432,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Edit action * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -445,11 +453,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn ); $this->view->addTemplate('account'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleOrange', - 'name' => __('Edit Account'), - 'icon' => $this->icons->getIconEdit()->getIcon() + 'name' => __('Edit Account'), + 'icon' => $this->icons->getIconEdit()->getIcon(), ] ); $this->view->assign('formRoute', 'account/saveEdit'); @@ -487,7 +496,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Delete action * - * @param int|null $id Account's ID + * @param int|null $id Account's ID * */ public function deleteAction(?int $id = null): void @@ -505,11 +514,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn ); $this->view->addTemplate('account'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleRed', - 'name' => __('Remove Account'), - 'icon' => $this->icons->getIconDelete()->getIcon() + 'name' => __('Remove Account'), + 'icon' => $this->icons->getIconDelete()->getIcon(), ] ); $this->view->assign('formRoute', 'account/saveDelete'); @@ -545,7 +555,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Obtener los datos para mostrar el interface para modificar la clave de cuenta * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -565,11 +575,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn ); $this->view->addTemplate('account-editpass'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleOrange', - 'name' => __('Edit Account Password'), - 'icon' => $this->icons->getIconEditPass()->getIcon() + 'name' => __('Edit Account Password'), + 'icon' => $this->icons->getIconEditPass()->getIcon(), ] ); $this->view->assign('formRoute', 'account/saveEditPass'); @@ -609,7 +620,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Obtener los datos para mostrar el interface para ver cuenta en fecha concreta * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -628,11 +639,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->view->addTemplate('account-history'); - $this->view->assign('title', + $this->view->assign( + 'title', [ 'class' => 'titleNormal', - 'name' => __('Account Details'), - 'icon' => 'access_time' + 'name' => __('Account Details'), + 'icon' => 'access_time', ] ); @@ -673,7 +685,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Obtener los datos para mostrar el interface de solicitud de cambios en una cuenta * - * @param int $id Account's ID + * @param int $id Account's ID * * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface @@ -726,8 +738,8 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Display account's password * - * @param int $id Account's ID - * @param int $parentId + * @param int $id Account's ID + * @param int $parentId * * @return bool * @throws \DI\DependencyException @@ -743,7 +755,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn $passwordPreset = $this->getPasswordPreset(); $useImage = $this->configData->isAccountPassToImage() - || ($passwordPreset !== null && $passwordPreset->isUseImage()); + || ($passwordPreset !== null && $passwordPreset->isUseImage()); $this->view->assign('isLinked', $parentId > 0); @@ -753,9 +765,11 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'show.account.pass', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Password viewed')) - ->addDetail(__u('Account'), $account->getName())) + ->addDetail(__u('Account'), $account->getName()) + ) ); return $this->returnJsonResponseData($data); @@ -794,7 +808,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Display account's password * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws \DI\DependencyException @@ -810,7 +824,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn $passwordPreset = $this->getPasswordPreset(); $useImage = $this->configData->isAccountPassToImage() - || ($passwordPreset !== null && $passwordPreset->isUseImage()); + || ($passwordPreset !== null && $passwordPreset->isUseImage()); $this->view->assign('isLinked', 0); @@ -818,9 +832,11 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'show.account.pass.history', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Password viewed')) - ->addDetail(__u('Account'), $account->getName())) + ->addDetail(__u('Account'), $account->getName()) + ) ); return $this->returnJsonResponseData($data); @@ -839,7 +855,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Copy account's password * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws Helpers\HelperException @@ -864,9 +880,11 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'copy.account.pass', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Password copied')) - ->addDetail(__u('Account'), $account->getName())) + ->addDetail(__u('Account'), $account->getName()) + ) ); return $this->returnJsonResponseData($data); @@ -875,7 +893,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Copy account's password * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws Helpers\HelperException @@ -900,9 +918,11 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'copy.account.pass.history', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Password copied')) - ->addDetail(__u('Account'), $account->getName())) + ->addDetail(__u('Account'), $account->getName()) + ) ); return $this->returnJsonResponseData($data); @@ -938,10 +958,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'create.account', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Account created')) ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName())) + ->addDetail(__u('Client'), $accountDetails->getClientName()) + ) ); $this->addCustomFieldsForItem( @@ -952,8 +974,8 @@ final class AccountController extends ControllerBase implements CrudControllerIn return $this->returnJsonResponseData( [ - 'itemId' => $accountId, - 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_EDIT) + 'itemId' => $accountId, + 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_EDIT), ], JsonResponse::JSON_SUCCESS, __u('Account created') @@ -975,7 +997,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Saves edit action * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws DependencyException @@ -998,10 +1020,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'edit.account', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Account updated')) ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName())) + ->addDetail(__u('Client'), $accountDetails->getClientName()) + ) ); $this->updateCustomFieldsForItem( @@ -1012,8 +1036,8 @@ final class AccountController extends ControllerBase implements CrudControllerIn return $this->returnJsonResponseData( [ - 'itemId' => $id, - 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW) + 'itemId' => $id, + 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW), ], JsonResponse::JSON_SUCCESS, __u('Account updated') @@ -1035,7 +1059,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Saves edit action * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws \DI\DependencyException @@ -1056,16 +1080,18 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'edit.account.pass', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Password updated')) ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName())) + ->addDetail(__u('Client'), $accountDetails->getClientName()) + ) ); return $this->returnJsonResponseData( [ - 'itemId' => $id, - 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW) + 'itemId' => $id, + 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW), ], JsonResponse::JSON_SUCCESS, __u('Password updated') @@ -1087,8 +1113,8 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Saves restore action * - * @param int $historyId Account's history ID - * @param int $id Account's ID + * @param int $historyId Account's history ID + * @param int $id Account's ID * * @return bool * @throws \DI\DependencyException @@ -1106,16 +1132,18 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'edit.account.restore', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Account restored')) ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName())) + ->addDetail(__u('Client'), $accountDetails->getClientName()) + ) ); return $this->returnJsonResponseData( [ - 'itemId' => $id, - 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW) + 'itemId' => $id, + 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW), ], JsonResponse::JSON_SUCCESS, __u('Account restored') @@ -1135,7 +1163,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Saves delete action * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws \DI\DependencyException @@ -1153,10 +1181,12 @@ final class AccountController extends ControllerBase implements CrudControllerIn $this->eventDispatcher->notifyEvent( 'delete.account', - new Event($this, EventMessage::factory() + new Event( + $this, EventMessage::factory() ->addDescription(__u('Account removed')) ->addDetail(__u('Account'), $accountDetails->getName()) - ->addDetail(__u('Client'), $accountDetails->getClientName())) + ->addDetail(__u('Client'), $accountDetails->getClientName()) + ) ); $this->deleteCustomFieldsForItem(ActionsInterface::ACCOUNT, $id); @@ -1180,7 +1210,7 @@ final class AccountController extends ControllerBase implements CrudControllerIn /** * Saves a request action * - * @param int $id Account's ID + * @param int $id Account's ID * * @return bool * @throws \DI\DependencyException @@ -1198,19 +1228,24 @@ final class AccountController extends ControllerBase implements CrudControllerIn $accountDetails = $this->accountService->getById($id)->getAccountVData(); - $baseUrl = ($this->configData->getApplicationUrl() ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($this->configData->getApplicationUrl() ?: BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; $deepLink = new Uri($baseUrl); - $deepLink->addParam('r', Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW) . '/' . $id); + $deepLink->addParam('r', Acl::getActionRoute(ActionsInterface::ACCOUNT_VIEW).'/'.$id); $usersId = [$accountDetails->userId, $accountDetails->userEditId]; $userService = $this->dic->get(UserService::class); - $this->eventDispatcher->notifyEvent('request.account', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'request.account', + new Event( + $this, EventMessage::factory() ->addDescription(__u('Request')) - ->addDetail(__u('Requester'), sprintf('%s (%s)', $this->userData->getName(), $this->userData->getLogin())) + ->addDetail( + __u('Requester'), + sprintf('%s (%s)', $this->userData->getName(), $this->userData->getLogin()) + ) ->addDetail(__u('Account'), $accountDetails->getName()) ->addDetail(__u('Client'), $accountDetails->getClientName()) ->addDetail(__u('Description'), $description) @@ -1218,18 +1253,22 @@ final class AccountController extends ControllerBase implements CrudControllerIn ->addExtra('accountId', $id) ->addExtra('whoId', $this->userData->getId()) ->setExtra('userId', $usersId) - ->setExtra('email', array_map( + ->setExtra( + 'email', + array_map( static function ($value) { return $value->email; }, - $userService->getUserEmailById($usersId)) - )) + $userService->getUserEmailById($usersId) + ) + ) + ) ); return $this->returnJsonResponseData( [ - 'itemId' => $id, - 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT) + 'itemId' => $id, + 'nextAction' => Acl::getActionRoute(ActionsInterface::ACCOUNT), ], JsonResponse::JSON_SUCCESS, __u('Request done') diff --git a/app/modules/web/Controllers/BootstrapController.php b/app/modules/web/Controllers/BootstrapController.php index 5428fe3b..eba6e1a9 100644 --- a/app/modules/web/Controllers/BootstrapController.php +++ b/app/modules/web/Controllers/BootstrapController.php @@ -27,7 +27,7 @@ namespace SP\Modules\Web\Controllers; use DI\DependencyException; use DI\NotFoundException; use Exception; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Crypt\CryptPKI; use SP\Modules\Web\Controllers\Traits\JsonTrait; use SP\Plugin\PluginManager; @@ -54,29 +54,29 @@ final class BootstrapController extends SimpleControllerBase public function getEnvironmentAction(): bool { $checkStatus = $this->session->getAuthCompleted() - && ($this->session->getUserData()->getIsAdminApp() - || $this->configData->isDemoEnabled()); + && ($this->session->getUserData()->getIsAdminApp() + || $this->configData->isDemoEnabled()); $data = [ - 'lang' => $this->getJsLang(), - 'locale' => $this->configData->getSiteLang(), - 'app_root' => Bootstrap::$WEBURI, - 'max_file_size' => $this->configData->getFilesAllowedSize(), - 'check_updates' => $checkStatus && $this->configData->isCheckUpdates(), - 'check_notices' => $checkStatus && $this->configData->isCheckNotices(), + 'lang' => $this->getJsLang(), + 'locale' => $this->configData->getSiteLang(), + 'app_root' => BootstrapBase::$WEBURI, + 'max_file_size' => $this->configData->getFilesAllowedSize(), + 'check_updates' => $checkStatus && $this->configData->isCheckUpdates(), + 'check_notices' => $checkStatus && $this->configData->isCheckNotices(), 'check_notifications' => $this->getNotificationsEnabled(), - 'timezone' => date_default_timezone_get(), - 'debug' => DEBUG || $this->configData->isDebug(), - 'cookies_enabled' => $this->getCookiesEnabled(), - 'plugins' => $this->getPlugins(), - 'loggedin' => $this->session->isLoggedIn(), + 'timezone' => date_default_timezone_get(), + 'debug' => DEBUG || $this->configData->isDebug(), + 'cookies_enabled' => $this->getCookiesEnabled(), + 'plugins' => $this->getPlugins(), + 'loggedin' => $this->session->isLoggedIn(), 'authbasic_autologin' => $this->getAuthBasicAutologinEnabled(), - 'pki_key' => $this->getPublicKey(), - 'pki_max_size' => CryptPKI::getMaxDataSize(), + 'pki_key' => $this->getPublicKey(), + 'pki_max_size' => CryptPKI::getMaxDataSize(), 'import_allowed_mime' => ImportService::ALLOWED_MIME, - 'files_allowed_mime' => $this->configData->getFilesAllowedMime(), - 'session_timeout' => $this->configData->getSessionTimeout(), - 'csrf' => $this->getCSRF() + 'files_allowed_mime' => $this->configData->getFilesAllowedMime(), + 'session_timeout' => $this->configData->getSessionTimeout(), + 'csrf' => $this->getCSRF(), ]; return $this->returnJsonResponseData($data); @@ -87,7 +87,7 @@ final class BootstrapController extends SimpleControllerBase */ private function getJsLang(): array { - return require RESOURCES_PATH . DIRECTORY_SEPARATOR . 'strings.js.inc'; + return require RESOURCES_PATH.DIRECTORY_SEPARATOR.'strings.js.inc'; } /** @@ -111,9 +111,9 @@ final class BootstrapController extends SimpleControllerBase private function getCookiesEnabled(): bool { return $this->router - ->request() - ->cookies() - ->get(session_name()) !== null; + ->request() + ->cookies() + ->get(session_name()) !== null; } /** @@ -138,7 +138,7 @@ final class BootstrapController extends SimpleControllerBase private function getAuthBasicAutologinEnabled(): bool { return $this->dic->get(Browser::class)->getServerAuthUser() !== null - && $this->configData->isAuthBasicAutoLoginEnabled(); + && $this->configData->isAuthBasicAutoLoginEnabled(); } /** diff --git a/app/modules/web/Controllers/ControllerBase.php b/app/modules/web/Controllers/ControllerBase.php index 5fc460d7..5e0e243f 100644 --- a/app/modules/web/Controllers/ControllerBase.php +++ b/app/modules/web/Controllers/ControllerBase.php @@ -29,10 +29,10 @@ defined('APP_ROOT') || die(); use Exception; use Klein\Klein; use Psr\Container\ContainerInterface; -use SP\Bootstrap; use SP\Config\Config; use SP\Config\ConfigDataInterface; use SP\Core\Acl\Acl; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Context\ContextInterface; use SP\Core\Crypt\Hash; use SP\Core\Events\EventDispatcher; @@ -97,7 +97,7 @@ abstract class ControllerBase LayoutHelper $layoutHelper ) { // TODO: remove when controllers are ready - $this->dic = Bootstrap::getContainer(); + $this->dic = BootstrapBase::getContainer(); $this->controllerName = $this->getControllerName(); $this->configData = $config->getConfigData(); diff --git a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php index 14012967..782df64c 100644 --- a/app/modules/web/Controllers/Helpers/Account/AccountHelper.php +++ b/app/modules/web/Controllers/Helpers/Account/AccountHelper.php @@ -28,11 +28,11 @@ use DI\DependencyException; use DI\NotFoundException; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; use SP\Core\Acl\AccountPermissionException; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Acl\UnauthorizedPageException; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\ConstraintException; use SP\Core\Exceptions\QueryException; use SP\Core\Exceptions\SPException; @@ -70,21 +70,21 @@ final class AccountHelper extends HelperBase { use ItemTrait; - private ?Acl $acl = null; - private ?AccountService $accountService = null; + private ?Acl $acl = null; + private ?AccountService $accountService = null; private ?AccountHistoryService $accountHistoryService = null; - private ?PublicLinkService $publicLinkService = null; - private ?ItemPresetService $itemPresetService = null; - private ?int $actionId = null; - private ?AccountAcl $accountAcl = null; - private ?int $accountId = null; - private bool $isView = false; + private ?PublicLinkService $publicLinkService = null; + private ?ItemPresetService $itemPresetService = null; + private ?int $actionId = null; + private ?AccountAcl $accountAcl = null; + private ?int $accountId = null; + private bool $isView = false; /** * Sets account's view variables * - * @param AccountDetailsResponse $accountDetailsResponse - * @param int $actionId + * @param AccountDetailsResponse $accountDetailsResponse + * @param int $actionId * * @throws AccountPermissionException * @throws SPException @@ -95,9 +95,8 @@ final class AccountHelper extends HelperBase */ public function setViewForAccount( AccountDetailsResponse $accountDetailsResponse, - int $actionId - ): void - { + int $actionId + ): void { $this->accountId = $accountDetailsResponse->getAccountVData()->getId(); $this->actionId = $actionId; @@ -152,38 +151,51 @@ final class AccountHelper extends HelperBase ) ); - $this->view->assign('otherUsersView', + $this->view->assign( + 'otherUsersView', $selectUsers->getItemsFromModelSelected($usersView) ); - $this->view->assign('otherUsersEdit', + $this->view->assign( + 'otherUsersEdit', $selectUsers->getItemsFromModelSelected($usersEdit) ); - $this->view->assign('otherUserGroupsView', + $this->view->assign( + 'otherUserGroupsView', $selectUserGroups->getItemsFromModelSelected($userGroupsView) ); - $this->view->assign('otherUserGroupsEdit', + $this->view->assign( + 'otherUserGroupsEdit', $selectUserGroups->getItemsFromModelSelected($userGroupsEdit) ); - $this->view->assign('users', + $this->view->assign( + 'users', $selectUsers->getItemsFromModelSelected([$accountData->getUserId()]) ); - $this->view->assign('userGroups', + $this->view->assign( + 'userGroups', $selectUserGroups->getItemsFromModelSelected([$accountData->getUserGroupId()]) ); - $this->view->assign('tags', - $selectTags->getItemsFromModelSelected(SelectItemAdapter::getIdFromArrayOfObjects($accountDetailsResponse->getTags())) + $this->view->assign( + 'tags', + $selectTags->getItemsFromModelSelected( + SelectItemAdapter::getIdFromArrayOfObjects($accountDetailsResponse->getTags()) + ) ); - $this->view->assign('historyData', + $this->view->assign( + 'historyData', SelectItemAdapter::factory($this->accountHistoryService->getHistoryForAccount($this->accountId)) ->getItemsFromArray() ); - $this->view->assign('isModified', + $this->view->assign( + 'isModified', strtotime($accountData->getDateEdit()) !== false ); - $this->view->assign('maxFileSize', + $this->view->assign( + 'maxFileSize', round($this->configData->getFilesAllowedSize() / 1024, 1) ); - $this->view->assign('filesAllowedExts', + $this->view->assign( + 'filesAllowedExts', implode(',', $this->configData->getFilesAllowedExts()) ); @@ -194,16 +206,19 @@ final class AccountHelper extends HelperBase $accountActionsDto->setPublicLinkCreatorId($publicLinkData->getUserId()); $baseUrl = ($this->configData->getApplicationUrl() - ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + ?: BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; - $this->view->assign('publicLinkUrl', + $this->view->assign( + 'publicLinkUrl', PublicLinkService::getLinkForHash( $baseUrl, $publicLinkData->getHash() ) ); - $this->view->assign('publicLinkId', - $publicLinkData->getId()); + $this->view->assign( + 'publicLinkId', + $publicLinkData->getId() + ); } catch (NoSuchItemException $e) { $this->view->assign('publicLinkId', 0); $this->view->assign('publicLinkUrl', null); @@ -220,14 +235,14 @@ final class AccountHelper extends HelperBase $this->view->assign( 'allowPrivate', ($userProfileData->isAccPrivate() - && $accountData->getUserId() === $userData->getId()) + && $accountData->getUserId() === $userData->getId()) || $userData->getIsAdminApp() ); $this->view->assign( 'allowPrivateGroup', ($userProfileData->isAccPrivateGroup() - && $accountData->getUserGroupId() === $userData->getUserGroupId()) + && $accountData->getUserGroupId() === $userData->getUserGroupId()) || $userData->getIsAdminApp() ); @@ -294,7 +309,7 @@ final class AccountHelper extends HelperBase /** * Comprobar si el usuario dispone de acceso al módulo * - * @param AccountDetailsResponse $accountDetailsResponse + * @param AccountDetailsResponse $accountDetailsResponse * * @return AccountAcl * @throws AccountPermissionException @@ -335,7 +350,8 @@ final class AccountHelper extends HelperBase $this->view->assign('accountIsHistory', false); - $this->view->assign('customFields', + $this->view->assign( + 'customFields', $this->getCustomFieldsForItem( ActionsInterface::ACCOUNT, $this->accountId @@ -344,13 +360,17 @@ final class AccountHelper extends HelperBase $this->view->assign( 'categories', - SelectItemAdapter::factory($this->dic->get(CategoryService::class) - ->getAllBasic())->getItemsFromModel() + SelectItemAdapter::factory( + $this->dic->get(CategoryService::class) + ->getAllBasic() + )->getItemsFromModel() ); $this->view->assign( 'clients', - SelectItemAdapter::factory($this->dic->get(ClientService::class) - ->getAllForUser())->getItemsFromModel() + SelectItemAdapter::factory( + $this->dic->get(ClientService::class) + ->getAllForUser() + )->getItemsFromModel() ); $this->view->assign( 'mailRequestEnabled', @@ -428,7 +448,7 @@ final class AccountHelper extends HelperBase /** * Sets account's view for a blank form * - * @param int $actionId + * @param int $actionId * * @return void * @throws \DI\DependencyException @@ -460,13 +480,15 @@ final class AccountHelper extends HelperBase $accountPrivate = new AccountPrivate(); - if ($itemPresetPrivate = $this->itemPresetService->getForCurrentUser(ItemPresetInterface::ITEM_TYPE_ACCOUNT_PRIVATE)) { + if ($itemPresetPrivate = + $this->itemPresetService->getForCurrentUser(ItemPresetInterface::ITEM_TYPE_ACCOUNT_PRIVATE)) { $accountPrivate = $itemPresetPrivate->hydrate(AccountPrivate::class) ?: $accountPrivate; } $accountPermission = new AccountPermission(); - if ($itemPresetPermission = $this->itemPresetService->getForCurrentUser(ItemPresetInterface::ITEM_TYPE_ACCOUNT_PERMISSION)) { + if ($itemPresetPermission = + $this->itemPresetService->getForCurrentUser(ItemPresetInterface::ITEM_TYPE_ACCOUNT_PERMISSION)) { $accountPermission = $itemPresetPermission->hydrate(AccountPermission::class) ?: $accountPermission; } @@ -539,8 +561,8 @@ final class AccountHelper extends HelperBase /** * Sets account's view variables * - * @param AccountDetailsResponse $accountDetailsResponse - * @param int $actionId + * @param AccountDetailsResponse $accountDetailsResponse + * @param int $actionId * * @return bool * @throws NoSuchItemException @@ -552,9 +574,8 @@ final class AccountHelper extends HelperBase */ public function setViewForRequest( AccountDetailsResponse $accountDetailsResponse, - int $actionId - ): bool - { + int $actionId + ): bool { $this->accountId = $accountDetailsResponse->getAccountVData()->getId(); $this->actionId = $actionId; $this->accountAcl = new AccountAcl($actionId); @@ -575,11 +596,13 @@ final class AccountHelper extends HelperBase $this->view->assign( 'accountActions', $this->dic->get(AccountActionsHelper::class) - ->getActionsForAccount($this->accountAcl, + ->getActionsForAccount( + $this->accountAcl, new AccountActionsDto( $this->accountId, null, - $accountData->getParentId()) + $accountData->getParentId() + ) ) ); @@ -587,7 +610,7 @@ final class AccountHelper extends HelperBase } /** - * @param bool $isView + * @param bool $isView */ public function setIsView(bool $isView): void { diff --git a/app/modules/web/Controllers/Helpers/LayoutHelper.php b/app/modules/web/Controllers/Helpers/LayoutHelper.php index 1434769a..bf9d7a51 100644 --- a/app/modules/web/Controllers/Helpers/LayoutHelper.php +++ b/app/modules/web/Controllers/Helpers/LayoutHelper.php @@ -26,10 +26,10 @@ namespace SP\Modules\Web\Controllers\Helpers; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\AppInfoInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Crypt\CryptPKI; use SP\Core\Exceptions\SPException; use SP\Core\Language; @@ -47,14 +47,14 @@ use SP\Util\VersionUtil; */ final class LayoutHelper extends HelperBase { - protected ?bool $loggedIn = null; - protected ?ThemeInterface $theme = null; + protected ?bool $loggedIn = null; + protected ?ThemeInterface $theme = null; /** * Sets a full layout page * - * @param string $page Page/view name - * @param Acl|null $acl + * @param string $page Page/view name + * @param Acl|null $acl * * @return LayoutHelper */ @@ -90,7 +90,7 @@ final class LayoutHelper extends HelperBase */ public function initBody(): void { - $baseUrl = $this->configData->getApplicationUrl() ?? Bootstrap::$WEBURI; + $baseUrl = $this->configData->getApplicationUrl() ?? BootstrapBase::$WEBURI; $this->view->assign('isInstalled', $this->configData->isInstalled()); $this->view->assign('app_name', AppInfoInterface::APP_NAME); @@ -98,9 +98,9 @@ final class LayoutHelper extends HelperBase $this->view->assign('app_website_url', AppInfoInterface::APP_WEBSITE_URL); $this->view->assign('app_blog_url', AppInfoInterface::APP_BLOG_URL); $this->view->assign('app_version', Installer::VERSION_TEXT); - $this->view->assign('logo_icon', $baseUrl . '/public/images/logo_icon.png'); - $this->view->assign('logo_no_bg_color', $baseUrl . '/public/images/logo_full_nobg_outline_color.png'); - $this->view->assign('logo_no_bg', $baseUrl . '/public/images/logo_full_nobg_outline.png'); + $this->view->assign('logo_icon', $baseUrl.'/public/images/logo_icon.png'); + $this->view->assign('logo_no_bg_color', $baseUrl.'/public/images/logo_full_nobg_outline_color.png'); + $this->view->assign('logo_no_bg', $baseUrl.'/public/images/logo_full_nobg_outline.png'); $this->view->assign('httpsEnabled', $this->request->isHttps()); $this->view->assign('homeRoute', Acl::getActionRoute(ActionsInterface::ACCOUNT)); @@ -128,7 +128,7 @@ final class LayoutHelper extends HelperBase protected function getResourcesLinks(): void { $version = VersionUtil::getVersionStringNormalized(); - $baseUrl = ($this->configData->getApplicationUrl() ?? Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($this->configData->getApplicationUrl() ?? BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; $jsUri = new Uri($baseUrl); $jsUri->addParam('_r', 'resource/js'); @@ -151,7 +151,7 @@ final class LayoutHelper extends HelperBase if (isset($themeInfo['js'])) { $jsUri->resetParams() - ->addParam('b', $this->theme->getThemePath() . DIRECTORY_SEPARATOR . 'js') + ->addParam('b', $this->theme->getThemePath().DIRECTORY_SEPARATOR.'js') ->addParam('f', implode(',', $themeInfo['js'])); $this->view->append( @@ -172,7 +172,7 @@ final class LayoutHelper extends HelperBase $cssUri = (new Uri($baseUrl)) ->addParam('_r', 'resource/css') - ->addParam('_v', md5($version . $resultsAsCards)); + ->addParam('_v', md5($version.$resultsAsCards)); $this->view->append( 'cssLinks', @@ -189,7 +189,7 @@ final class LayoutHelper extends HelperBase } $cssUri->resetParams() - ->addParam('b', $this->theme->getThemePath() . DIRECTORY_SEPARATOR . 'css') + ->addParam('b', $this->theme->getThemePath().DIRECTORY_SEPARATOR.'css') ->addParam('f', implode(',', $themeInfo['css'])); $this->view->append( @@ -203,14 +203,14 @@ final class LayoutHelper extends HelperBase foreach ($loadedPlugins as $plugin) { $base = str_replace(APP_ROOT, '', $plugin->getBase()); - $base .= DIRECTORY_SEPARATOR . 'public'; + $base .= DIRECTORY_SEPARATOR.'public'; $jsResources = $plugin->getJsResources(); $cssResources = $plugin->getCssResources(); if (count($jsResources) > 0) { $jsUri->resetParams() - ->addParam('b', $base . DIRECTORY_SEPARATOR . 'js') + ->addParam('b', $base.DIRECTORY_SEPARATOR.'js') ->addParam('f', implode(',', $jsResources)); $this->view->append( @@ -221,7 +221,7 @@ final class LayoutHelper extends HelperBase if (count($cssResources) > 0) { $cssUri->resetParams() - ->addParam('b', $base . DIRECTORY_SEPARATOR . 'css') + ->addParam('b', $base.DIRECTORY_SEPARATOR.'css') ->addParam('f', implode(',', $cssResources)); $this->view->append( @@ -283,7 +283,7 @@ final class LayoutHelper extends HelperBase /** * Obtener los datos para mostrar el menú de acciones * - * @param Acl $acl + * @param Acl $acl */ public function getMenu(Acl $acl): void { @@ -296,8 +296,8 @@ final class LayoutHelper extends HelperBase $actionSearch->setIcon($icons->getIconSearch()); $actionSearch->setData([ 'historyReset' => 1, - 'view' => 'search', - 'route' => Acl::getActionRoute(ActionsInterface::ACCOUNT) + 'view' => 'search', + 'route' => Acl::getActionRoute(ActionsInterface::ACCOUNT), ]); $actions[] = $actionSearch; @@ -309,8 +309,8 @@ final class LayoutHelper extends HelperBase $actionNewAccount->setIcon($icons->getIconAdd()); $actionNewAccount->setData([ 'historyReset' => 0, - 'view' => 'account', - 'route' => Acl::getActionRoute(ActionsInterface::ACCOUNT_CREATE) + 'view' => 'account', + 'route' => Acl::getActionRoute(ActionsInterface::ACCOUNT_CREATE), ]); $actions[] = $actionNewAccount; @@ -323,8 +323,8 @@ final class LayoutHelper extends HelperBase $actionAccessManager->setIcon($icons->getIconAccount()); $actionAccessManager->setData([ 'historyReset' => 0, - 'view' => 'datatabs', - 'route' => Acl::getActionRoute(ActionsInterface::ACCESS_MANAGE) + 'view' => 'datatabs', + 'route' => Acl::getActionRoute(ActionsInterface::ACCESS_MANAGE), ]); $actions[] = $actionAccessManager; @@ -337,8 +337,8 @@ final class LayoutHelper extends HelperBase $actionItemManager->setIcon($icons->getIconGroup()); $actionItemManager->setData([ 'historyReset' => 0, - 'view' => 'datatabs', - 'route' => Acl::getActionRoute(ActionsInterface::ITEMS_MANAGE) + 'view' => 'datatabs', + 'route' => Acl::getActionRoute(ActionsInterface::ITEMS_MANAGE), ]); $actions[] = $actionItemManager; @@ -351,8 +351,8 @@ final class LayoutHelper extends HelperBase $actionSecurityManager->setIcon($icons->getIconByName('security')); $actionSecurityManager->setData([ 'historyReset' => 0, - 'view' => 'datatabs', - 'route' => Acl::getActionRoute(ActionsInterface::SECURITY_MANAGE) + 'view' => 'datatabs', + 'route' => Acl::getActionRoute(ActionsInterface::SECURITY_MANAGE), ]); $actions[] = $actionSecurityManager; @@ -365,8 +365,8 @@ final class LayoutHelper extends HelperBase $actionPlugins->setIcon($icons->getIconByName('extension')); $actionPlugins->setData([ 'historyReset' => 1, - 'view' => 'plugin', - 'route' => Acl::getActionRoute(ActionsInterface::PLUGIN) + 'view' => 'plugin', + 'route' => Acl::getActionRoute(ActionsInterface::PLUGIN), ]); $actions[] = $actionPlugins; @@ -379,8 +379,8 @@ final class LayoutHelper extends HelperBase $actionConfigManager->setIcon($icons->getIconSettings()); $actionConfigManager->setData([ 'historyReset' => 1, - 'view' => 'config', - 'route' => Acl::getActionRoute(ActionsInterface::CONFIG) + 'view' => 'config', + 'route' => Acl::getActionRoute(ActionsInterface::CONFIG), ]); $actions[] = $actionConfigManager; @@ -393,8 +393,8 @@ final class LayoutHelper extends HelperBase /** * Sets a full layout page * - * @param string $template - * @param string $page Page/view name + * @param string $template + * @param string $page Page/view name * * @return LayoutHelper */ @@ -413,16 +413,15 @@ final class LayoutHelper extends HelperBase /** * Sets a custom layout page * - * @param string $template - * @param string $page Page/view name + * @param string $template + * @param string $page Page/view name * * @return LayoutHelper */ public function getCustomLayout( string $template, string $page = '' - ): LayoutHelper - { + ): LayoutHelper { $this->view->addTemplate('main', '_layouts'); $this->view->addContentTemplate($template); diff --git a/app/modules/web/Controllers/LoginController.php b/app/modules/web/Controllers/LoginController.php index a8b16e76..a0c55549 100644 --- a/app/modules/web/Controllers/LoginController.php +++ b/app/modules/web/Controllers/LoginController.php @@ -28,7 +28,6 @@ use Exception; use Klein\Klein; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; use SP\Config\Config; use SP\Core\Acl\Acl; use SP\Core\Context\ContextBase; diff --git a/app/modules/web/Controllers/PublicLinkController.php b/app/modules/web/Controllers/PublicLinkController.php index 438ea013..966df554 100644 --- a/app/modules/web/Controllers/PublicLinkController.php +++ b/app/modules/web/Controllers/PublicLinkController.php @@ -29,7 +29,6 @@ use DI\NotFoundException; use Exception; use Psr\Container\ContainerExceptionInterface; use RuntimeException; -use SP\Bootstrap; use SP\Core\Acl\Acl; use SP\Core\Acl\ActionsInterface; use SP\Core\Events\Event; @@ -160,7 +159,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Sets view data for displaying public link's data * - * @param int|null $publicLinkId + * @param int|null $publicLinkId * * @throws ContainerExceptionInterface * @throws SPException @@ -190,7 +189,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle ); if ($this->view->isView === true) { - $baseUrl = ($this->configData->getApplicationUrl() ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($this->configData->getApplicationUrl() ?: Bootstrap::$WEBURI).Bootstrap::$SUBURI; $this->view->assign( 'publicLinkURL', @@ -207,7 +206,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Create action * - * @param int $id + * @param int $id * * @return bool * @throws \DI\DependencyException @@ -250,7 +249,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Edit action * - * @param int $id + * @param int $id * * @return bool * @throws DependencyException @@ -269,7 +268,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle $this->view->assign('header', __('Edit Public Link')); $this->view->assign('isView', false); - $this->view->assign('route', 'publicLink/saveEdit/' . $id); + $this->view->assign('route', 'publicLink/saveEdit/'.$id); $this->setViewData($id); @@ -294,7 +293,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Delete action * - * @param int|null $id + * @param int|null $id * * @return bool * @throws DependencyException @@ -415,8 +414,8 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Saves create action * - * @param int $accountId - * @param int $notify + * @param int $accountId + * @param int $notify * * @return bool * @throws \DI\DependencyException @@ -465,7 +464,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * Saves edit action * - * @param int $id + * @param int $id */ public function saveEditAction(int $id): void { @@ -475,7 +474,7 @@ final class PublicLinkController extends ControllerBase implements CrudControlle /** * View action * - * @param int $id + * @param int $id * * @return bool * @throws \DI\DependencyException diff --git a/app/modules/web/Controllers/SimpleControllerBase.php b/app/modules/web/Controllers/SimpleControllerBase.php index c7ce234c..95901c14 100644 --- a/app/modules/web/Controllers/SimpleControllerBase.php +++ b/app/modules/web/Controllers/SimpleControllerBase.php @@ -26,10 +26,10 @@ namespace SP\Modules\Web\Controllers; use Klein\Klein; use Psr\Container\ContainerInterface; -use SP\Bootstrap; use SP\Config\Config; use SP\Core\Acl\Acl; use SP\Core\Acl\UnauthorizedPageException; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Context\ContextInterface; use SP\Core\Events\EventDispatcher; use SP\Core\Exceptions\SessionTimeout; @@ -75,7 +75,7 @@ abstract class SimpleControllerBase PhpExtensionChecker $extensionChecker ) { // TODO: remove when controllers are ready - $this->dic = Bootstrap::getContainer(); + $this->dic = BootstrapBase::getContainer(); $this->controllerName = $this->getControllerName(); $this->configData = $config->getConfigData(); diff --git a/app/modules/web/Controllers/Traits/ConfigTrait.php b/app/modules/web/Controllers/Traits/ConfigTrait.php index 4dc068f7..095a487c 100644 --- a/app/modules/web/Controllers/Traits/ConfigTrait.php +++ b/app/modules/web/Controllers/Traits/ConfigTrait.php @@ -25,9 +25,9 @@ namespace SP\Modules\Web\Controllers\Traits; use Exception; -use SP\Bootstrap; use SP\Config\Config; use SP\Config\ConfigDataInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Http\JsonResponse; use SP\Util\Util; @@ -49,10 +49,9 @@ trait ConfigTrait */ protected function saveConfig( ConfigDataInterface $configData, - Config $config, - callable $onSuccess = null - ): bool - { + Config $config, + callable $onSuccess = null + ): bool { try { if ($configData->isDemoEnabled()) { return $this->returnJsonResponse( @@ -63,7 +62,7 @@ trait ConfigTrait $config->saveConfig($configData); - if (Bootstrap::$LOCK !== false + if (BootstrapBase::$LOCK !== false && $configData->isMaintenance() === false) { Util::unlockApp(); } diff --git a/app/modules/web/Init.php b/app/modules/web/Init.php index 8498b4c1..4f22e882 100644 --- a/app/modules/web/Init.php +++ b/app/modules/web/Init.php @@ -27,8 +27,8 @@ namespace SP\Modules\Web; use Defuse\Crypto\Exception\CryptoException; use Exception; use Klein\Klein; -use SP\Bootstrap; use SP\Core\Application; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Context\ContextBase; use SP\Core\Context\SessionContext; use SP\Core\Crypt\CryptSessionHandler; @@ -271,7 +271,7 @@ final class Init extends HttpModuleBase private function initSession(bool $encrypt = false): void { if ($encrypt === true - && Bootstrap::$checkPhpVersion + && BootstrapBase::$checkPhpVersion && ($key = $this->secureSessionService->getKey(UUIDCookie::factory($this->request))) !== false) { session_set_save_handler(new CryptSessionHandler($key), true); } diff --git a/index.php b/index.php index ce7db44c..ffa11643 100644 --- a/index.php +++ b/index.php @@ -22,11 +22,11 @@ * along with sysPass. If not, see . */ -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapWeb; const APP_ROOT = __DIR__; const APP_MODULE = 'web'; $dic = require APP_ROOT.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.'Base.php'; -Bootstrap::runWeb($dic); +BootstrapWeb::run($dic); diff --git a/lib/Definitions.php b/lib/Definitions.php index 0476415c..d2e92cb8 100644 --- a/lib/Definitions.php +++ b/lib/Definitions.php @@ -36,7 +36,6 @@ use SP\Core\UI\Theme; use SP\Core\UI\ThemeInterface; use SP\Http\Client; use SP\Http\Request; -use SP\Providers\Auth\AuthProvider; use SP\Services\Account\AccountAclService; use SP\Services\Config\ConfigBackupService; use SP\Storage\Database\DatabaseConnectionData; @@ -96,5 +95,5 @@ return [ AccountAclService::class => autowire(AccountAclService::class), \GuzzleHttp\Client::class => create(GuzzleHttp\Client::class) ->constructor(factory([Client::class, 'getOptions'])), - CSRF::class => autowire(CSRF::class) + CSRF::class => autowire(CSRF::class), ]; \ No newline at end of file diff --git a/lib/SP/Core/Bootstrap/BootstrapApi.php b/lib/SP/Core/Bootstrap/BootstrapApi.php new file mode 100644 index 00000000..45294d7d --- /dev/null +++ b/lib/SP/Core/Bootstrap/BootstrapApi.php @@ -0,0 +1,134 @@ +. + */ + +namespace SP\Core\Bootstrap; + +use Closure; +use Klein\Response; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; +use SP\Core\HttpModuleBase; +use SP\Modules\Api\Init as InitApi; +use SP\Services\Api\ApiRequest; +use SP\Services\Api\JsonRpcResponse; + +/** + * Bootstrap API interface + */ +final class BootstrapApi extends BootstrapBase +{ + + protected HttpModuleBase $module; + + /** + * @param \Psr\Container\ContainerInterface $container + * + * @return \SP\Core\Bootstrap\BootstrapApi + */ + public static function run(ContainerInterface $container): BootstrapApi + { + logger('------------'); + logger('Boostrap:api'); + + // TODO: remove + self::$container = $container; + + try { + /** @noinspection SelfClassReferencingInspection */ + $bs = $container->get(BootstrapApi::class); + $bs->module = $container->get(InitApi::class); + $bs->handleRequest(); + + return $bs; + } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { + processException($e); + + die($e->getMessage()); + } + } + + protected function configureRouter(): void + { + // Manage requests for api module + $this->router->respond( + 'POST', + '@/api\.php', + $this->manageApiRequest() + ); + } + + private function manageApiRequest(): Closure + { + return function ($request, $response, $service) { + try { + logger('API route'); + + $apiRequest = self::$container->get(ApiRequest::class); + + [$controllerName, $action] = explode('/', $apiRequest->getMethod()); + + $controllerClass = self::getClassFor($controllerName); + + $method = $action.'Action'; + + if (!method_exists($controllerClass, $method)) { + logger($controllerClass.'::'.$method); + + /** @var Response $response */ + $response->headers() + ->set( + 'Content-type', + 'application/json; charset=utf-8' + ); + + return $response->body( + JsonRpcResponse::getResponseError( + self::OOPS_MESSAGE, + JsonRpcResponse::METHOD_NOT_FOUND, + $apiRequest->getId() + ) + ); + } + + $this->initializeCommon(); + + $this->module->initialize($controllerName); + + logger('Routing call: '.$controllerClass.'::'.$method); + + return call_user_func([new $controllerClass(self::$container, $method), $method]); + } catch (\Exception $e) { + processException($e); + + /** @var Response $response */ + $response->headers()->set('Content-type', 'application/json; charset=utf-8'); + + return $response->body(JsonRpcResponse::getResponseException($e, 0)); + } finally { + $this->router->skipRemaining(); + } + }; + } +} \ No newline at end of file diff --git a/lib/SP/Bootstrap.php b/lib/SP/Core/Bootstrap/BootstrapBase.php similarity index 53% rename from lib/SP/Bootstrap.php rename to lib/SP/Core/Bootstrap/BootstrapBase.php index 8bed51e1..72a54887 100644 --- a/lib/SP/Bootstrap.php +++ b/lib/SP/Core/Bootstrap/BootstrapBase.php @@ -4,7 +4,7 @@ * * @author nuxsmin * @link https://syspass.org - * @copyright 2012-2021, Rubén Domínguez nuxsmin@$syspass.org + * @copyright 2012-2022, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. * @@ -22,31 +22,24 @@ * along with sysPass. If not, see . */ -namespace SP; +namespace SP\Core\Bootstrap; use Closure; use Klein\Klein; use Klein\Response; use PHPMailer\PHPMailer\Exception; use Psr\Container\ContainerInterface; -use RuntimeException; use SP\Config\ConfigDataInterface; use SP\Config\ConfigUtil; use SP\Core\Exceptions\InitializationException; -use SP\Core\Exceptions\SessionTimeout; +use SP\Core\Exceptions\SPException; use SP\Core\Language; -use SP\Core\ModuleBase; use SP\Core\PhpExtensionChecker; use SP\Http\Request; -use SP\Modules\Api\Init as InitApi; -use SP\Modules\Web\Init as InitWeb; use SP\Plugin\PluginManager; -use SP\Services\Api\ApiRequest; -use SP\Services\Api\JsonRpcResponse; use SP\Services\Upgrade\UpgradeConfigService; use SP\Services\Upgrade\UpgradeUtil; use SP\Util\Checks; -use SP\Util\Filter; use SP\Util\VersionUtil; use Symfony\Component\Debug\Debug; use Throwable; @@ -54,13 +47,13 @@ use Throwable; defined('APP_ROOT') || die(); /** - * Class Bootstrap + * Class BootstrapBase * * @package SP */ -final class Bootstrap +abstract class BootstrapBase { - private const OOPS_MESSAGE = "Oops, it looks like this content does not exist..."; + protected const OOPS_MESSAGE = "Oops, it looks like this content does not exist..."; /** * @var string The current request path relative to the sysPass root (e.g. files/index.php) */ @@ -73,18 +66,17 @@ final class Bootstrap /** * @var mixed */ - public static $LOCK; - public static bool $checkPhpVersion = false; - private static ContainerInterface $container; - private Klein $router; - private Request $request; - private ConfigDataInterface $configData; - private ModuleBase $module; + public static $LOCK; + public static bool $checkPhpVersion = false; + protected static ContainerInterface $container; + protected Klein $router; + protected Request $request; + protected ConfigDataInterface $configData; /** * Bootstrap constructor. */ - public function __construct(ConfigDataInterface $configData, Klein $router, Request $request) + final public function __construct(ConfigDataInterface $configData, Klein $router, Request $request) { // Set the default language Language::setLocales('en_US'); @@ -94,6 +86,7 @@ final class Bootstrap $this->request = $request; $this->initRouter(); + $this->configureRouter(); } private function initRouter(): void @@ -126,7 +119,7 @@ final class Bootstrap }; } - private function setCors(Response $response): void + final protected function setCors(Response $response): void { $response->header( 'Access-Control-Allow-Origin', @@ -140,132 +133,16 @@ final class Bootstrap $response->header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); } + abstract protected function configureRouter(): void; + + abstract public static function run(ContainerInterface $container): BootstrapBase; + public static function getContainer(): ContainerInterface { return self::$container; } - /** - * @param \Psr\Container\ContainerInterface $container - * - * @return \SP\Bootstrap - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface - * - * TODO: Inject needed classes - */ - public static function runWeb(ContainerInterface $container): Bootstrap - { - logger('------------'); - logger('Boostrap:web'); - - // TODO: remove - self::$container = $container; - - /** @noinspection SelfClassReferencingInspection */ - $bs = $container->get(Bootstrap::class); - $bs->module = $container->get(InitWeb::class); - $bs->configureRouterForWeb(); - $bs->handleRequest(); - - return $bs; - } - - private function configureRouterForWeb(): void - { - // Manage requests for web module - $this->router->respond( - ['GET', 'POST'], - '@(?!/api\.php)', - $this->manageWebRequest() - ); - } - - private function manageWebRequest(): Closure - { - return function ($request, $response, $service) { - /** @var \Klein\Request $request */ - /** @var \Klein\Response $response */ - - try { - logger('WEB route'); - - /** @var \Klein\Request $request */ - $route = Filter::getString($request->param('r', 'index/index')); - - if (!preg_match_all( - '#(?P[a-zA-Z]+)(?:/(?P[a-zA-Z]+))?(?P(/[a-zA-Z\d.]+)+)?#', - $route, - $matches - )) { - throw new RuntimeException(self::OOPS_MESSAGE); - } - - $controllerName = $matches['controller'][0]; - $methodName = empty($matches['action'][0]) - ? 'indexAction' - : $matches['action'][0].'Action'; - $methodParams = empty($matches['params'][0]) - ? [] - : Filter::getArray( - explode( - '/', - trim( - $matches['params'][0], - '/' - ) - ) - ); - - $controllerClass = self::getClassFor($controllerName); - - $this->initializePluginClasses(); - - if (!method_exists($controllerClass, $methodName)) { - logger($controllerClass.'::'.$methodName); - - $response->code(404); - - throw new RuntimeException(self::OOPS_MESSAGE); - } - - $this->setCors($response); - - $this->initializeCommon(); - - // TODO: remove?? - if (APP_MODULE === 'web') { - $this->module->initialize($controllerName); - } - - logger( - sprintf( - 'Routing call: %s::%s::%s', - $controllerClass, - $methodName, - print_r($methodParams, true) - ) - ); - - $controller = self::$container->get($controllerClass); - - return call_user_func_array([$controller, $methodName], $methodParams); - } catch (SessionTimeout $sessionTimeout) { - logger('Session timeout'); - } catch (\Exception $e) { - processException($e); - - /** @var Response $response */ - if ($response->status()->getCode() !== 404) { - $response->code(503); - } - - return __($e->getMessage()); - } - }; - } - - private static function getClassFor(string $controllerName): string + final protected static function getClassFor(string $controllerName): string { return sprintf( 'SP\Modules\%s\Controllers\%sController', @@ -274,9 +151,14 @@ final class Bootstrap ); } - protected function initializePluginClasses(): void + /** + * Handle the request through the router + * + * @return void + */ + final protected function handleRequest(): void { - PluginManager::getPlugins(); + $this->router->dispatch($this->request->getRequest()); } /** @@ -287,7 +169,7 @@ final class Bootstrap * @throws \SP\Core\Exceptions\InitializationException * @throws \SP\Services\Upgrade\UpgradeException */ - protected function initializeCommon(): void + final protected function initializeCommon(): void { logger(__FUNCTION__); @@ -307,7 +189,7 @@ final class Bootstrap if (!self::$checkPhpVersion) { throw new InitializationException( sprintf(__('Required PHP version >= %s <= %s'), '7.4', '8.0'), - Core\Exceptions\SPException::ERROR, + SPException::ERROR, __u('Please update the PHP version to run sysPass') ); } @@ -358,14 +240,14 @@ final class Bootstrap /** * Establecer el nivel de logging */ - public function initPHPVars(): void + final public function initPHPVars(): void { if (defined('DEBUG') && DEBUG) { /** @noinspection ForgottenDebugOutputInspection */ Debug::enable(); } elseif (!defined('DEBUG') - && ($this->router->request()->cookies()->get('XDEBUG_SESSION') - || $this->configData->isDebug()) + && ($this->router->request()->cookies()->get('XDEBUG_SESSION') + || $this->configData->isDebug()) ) { define('DEBUG', true); @@ -462,107 +344,8 @@ final class Bootstrap } } - /** - * Handle the request through the router - * - * @return void - */ - private function handleRequest(): void + final protected function initializePluginClasses(): void { - $this->router->dispatch($this->request->getRequest()); - } - - /** - * @param \Psr\Container\ContainerInterface $container - * - * @return \SP\Bootstrap - * @throws \Psr\Container\ContainerExceptionInterface - * @throws \Psr\Container\NotFoundExceptionInterface - * - * TODO: Inject needed classes - */ - public static function runApi(ContainerInterface $container): Bootstrap - { - logger('------------'); - logger('Boostrap:api'); - - // TODO: remove - self::$container = $container; - - /** @noinspection SelfClassReferencingInspection */ - $bs = $container->get(Bootstrap::class); - $bs->module = $container->get(InitApi::class); - $bs->configureRouterForApi(); - $bs->handleRequest(); - - return $bs; - } - - private function configureRouterForApi(): void - { - // Manage requests for api module - $this->router->respond( - 'POST', - '@/api\.php', - $this->manageApiRequest() - ); - } - - private function manageApiRequest(): Closure - { - return function ($request, $response, $service) { - try { - logger('API route'); - - $apiRequest = self::$container->get(ApiRequest::class); - - [$controllerName, $action] = explode('/', $apiRequest->getMethod()); - - $controllerClass = self::getClassFor($controllerName); - - $method = $action.'Action'; - - if (!method_exists($controllerClass, $method)) { - logger($controllerClass.'::'.$method); - - /** @var Response $response */ - $response->headers() - ->set( - 'Content-type', - 'application/json; charset=utf-8' - ); - - return $response->body( - JsonRpcResponse::getResponseError( - self::OOPS_MESSAGE, - JsonRpcResponse::METHOD_NOT_FOUND, - $apiRequest->getId() - ) - ); - } - - $this->initializeCommon(); - - $this->module->initialize($controllerName); - - logger('Routing call: '.$controllerClass.'::'.$method); - - return call_user_func([new $controllerClass(self::$container, $method), $method]); - } catch (\Exception $e) { - processException($e); - - /** @var Response $response */ - $response->headers()->set('Content-type', 'application/json; charset=utf-8'); - - return $response->body(JsonRpcResponse::getResponseException($e, 0)); - } finally { - $this->router->skipRemaining(); - } - }; - } - - public function getRouter(): Klein - { - return $this->router; + PluginManager::getPlugins(); } } \ No newline at end of file diff --git a/lib/SP/Core/Bootstrap/BootstrapWeb.php b/lib/SP/Core/Bootstrap/BootstrapWeb.php new file mode 100644 index 00000000..746b8c4c --- /dev/null +++ b/lib/SP/Core/Bootstrap/BootstrapWeb.php @@ -0,0 +1,168 @@ +. + */ + +namespace SP\Core\Bootstrap; + + +use Closure; +use Klein\Response; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; +use RuntimeException; +use SP\Core\Exceptions\SessionTimeout; +use SP\Core\HttpModuleBase; +use SP\Modules\Web\Init as InitWeb; +use SP\Util\Filter; + +/** + * Bootstrap web interface + */ +final class BootstrapWeb extends BootstrapBase +{ + protected HttpModuleBase $module; + + /** + * @param \Psr\Container\ContainerInterface $container + * + * @return \SP\Core\Bootstrap\BootstrapWeb + * + * TODO: Inject needed classes + */ + public static function run(ContainerInterface $container): BootstrapWeb + { + logger('------------'); + logger('Boostrap:web'); + + // TODO: remove + self::$container = $container; + + try { + /** @noinspection SelfClassReferencingInspection */ + $bs = $container->get(BootstrapWeb::class); + $bs->module = $container->get(InitWeb::class); + $bs->handleRequest(); + + return $bs; + } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { + processException($e); + + die($e->getMessage()); + } + } + + protected function configureRouter(): void + { + // Manage requests for web module + $this->router->respond( + ['GET', 'POST'], + '@(?!/api\.php)', + $this->manageWebRequest() + ); + } + + private function manageWebRequest(): Closure + { + return function ($request, $response, $service) { + /** @var \Klein\Request $request */ + /** @var \Klein\Response $response */ + + try { + logger('WEB route'); + + /** @var \Klein\Request $request */ + $route = Filter::getString($request->param('r', 'index/index')); + + if (!preg_match_all( + '#(?P[a-zA-Z]+)(?:/(?P[a-zA-Z]+))?(?P(/[a-zA-Z\d.]+)+)?#', + $route, + $matches + )) { + throw new RuntimeException(self::OOPS_MESSAGE); + } + + $controllerName = $matches['controller'][0]; + $methodName = empty($matches['action'][0]) + ? 'indexAction' + : $matches['action'][0].'Action'; + $methodParams = empty($matches['params'][0]) + ? [] + : Filter::getArray( + explode( + '/', + trim( + $matches['params'][0], + '/' + ) + ) + ); + + $controllerClass = self::getClassFor($controllerName); + + $this->initializePluginClasses(); + + if (!method_exists($controllerClass, $methodName)) { + logger($controllerClass.'::'.$methodName); + + $response->code(404); + + throw new RuntimeException(self::OOPS_MESSAGE); + } + + $this->setCors($response); + + $this->initializeCommon(); + + // TODO: remove?? + if (APP_MODULE === 'web') { + $this->module->initialize($controllerName); + } + + logger( + sprintf( + 'Routing call: %s::%s::%s', + $controllerClass, + $methodName, + print_r($methodParams, true) + ) + ); + + $controller = self::$container->get($controllerClass); + + return call_user_func_array([$controller, $methodName], $methodParams); + } catch (SessionTimeout $sessionTimeout) { + logger('Session timeout'); + } catch (\Exception $e) { + processException($e); + + /** @var Response $response */ + if ($response->status()->getCode() !== 404) { + $response->code(503); + } + + return __($e->getMessage()); + } + }; + } +} \ No newline at end of file diff --git a/lib/SP/Core/Crypt/Cookie.php b/lib/SP/Core/Crypt/Cookie.php index c287699e..f2615d36 100644 --- a/lib/SP/Core/Crypt/Cookie.php +++ b/lib/SP/Core/Crypt/Cookie.php @@ -24,7 +24,7 @@ namespace SP\Core\Crypt; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Http\Request; /** @@ -106,6 +106,6 @@ abstract class Cookie return false; } - return setcookie($this->cookieName, $data, 0, Bootstrap::$WEBROOT); + return setcookie($this->cookieName, $data, 0, BootstrapBase::$WEBROOT); } } \ No newline at end of file diff --git a/lib/SP/Core/Crypt/OldCrypt.php b/lib/SP/Core/Crypt/OldCrypt.php index a6b91a0b..a15e5d15 100644 --- a/lib/SP/Core/Crypt/OldCrypt.php +++ b/lib/SP/Core/Crypt/OldCrypt.php @@ -24,8 +24,8 @@ namespace SP\Core\Crypt; -use SP\Bootstrap; use SP\Config\ConfigDataInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\SPException; use SP\Util\Checks; @@ -43,8 +43,8 @@ final class OldCrypt /** * Generar un hash de una clave utilizando un salt. * - * @param string $pwd con la clave a 'hashear' - * @param bool $prefixSalt Añadir el salt al hash + * @param string $pwd con la clave a 'hashear' + * @param bool $prefixSalt Añadir el salt al hash * * @return string con el hash de la clave */ @@ -53,21 +53,21 @@ final class OldCrypt $salt = self::makeHashSalt(); $hash = crypt($pwd, $salt); - return ($prefixSalt === true) ? $salt . $hash : $hash; + return ($prefixSalt === true) ? $salt.$hash : $hash; } /** * Crear un salt utilizando mcrypt. * - * @param string $salt - * @param bool $random + * @param string $salt + * @param bool $random * * @return string con el salt creado */ public static function makeHashSalt($salt = null, $random = true) { /** @var ConfigDataInterface $ConfigData */ - $ConfigData = Bootstrap::getContainer()['configData']; + $ConfigData = BootstrapBase::getContainer()['configData']; if ($random === true) { $salt = bin2hex(self::getIV()); @@ -77,7 +77,7 @@ final class OldCrypt $salt = $ConfigData->getPasswordSalt(); } - return '$2y$07$' . substr($salt, 0, 22) . '$'; + return '$2y$07$'.substr($salt, 0, 22).'$'; } /** @@ -118,8 +118,8 @@ final class OldCrypt /** * Generar la clave maestra encriptada con una clave * - * @param string $customPwd con la clave a encriptar - * @param string $masterPwd con la clave maestra + * @param string $customPwd con la clave a encriptar + * @param string $masterPwd con la clave maestra * * @return array con la clave encriptada */ @@ -134,9 +134,9 @@ final class OldCrypt /** * Encriptar datos con la clave maestra. * - * @param string $strValue con los datos a encriptar - * @param string $strPassword con la clave maestra - * @param string $cryptIV con el IV + * @param string $strValue con los datos a encriptar + * @param string $strPassword con la clave maestra + * @param string $cryptIV con el IV * * @return string con los datos encriptados */ @@ -158,8 +158,8 @@ final class OldCrypt /** * Encriptar datos. Devuelve un array con los datos encriptados y el IV. * - * @param mixed $data string Los datos a encriptar - * @param string $pwd La clave de encriptación + * @param mixed $data string Los datos a encriptar + * @param string $pwd La clave de encriptación * * @return array * @throws SPException @@ -210,8 +210,8 @@ final class OldCrypt * Generar datos encriptados. * Esta función llama a los métodos privados para encriptar datos. * - * @param string $data con los datos a encriptar - * @param string $masterPwd con la clave maestra + * @param string $data con los datos a encriptar + * @param string $masterPwd con la clave maestra * * @return bool */ @@ -225,9 +225,9 @@ final class OldCrypt /** * Desencriptar datos con la clave maestra. * - * @param string $cryptData Los datos a desencriptar - * @param string $cryptIV con el IV - * @param string $password La clave maestra + * @param string $cryptData Los datos a desencriptar + * @param string $cryptIV con el IV + * @param string $password La clave maestra * * @return string con los datos desencriptados */ @@ -250,8 +250,8 @@ final class OldCrypt /** * Generar una key para su uso con el algoritmo AES * - * @param string $string La cadena de la que deriva la key - * @param null $salt El salt utilizado + * @param string $string La cadena de la que deriva la key + * @param null $salt El salt utilizado * * @return string */ diff --git a/lib/SP/Core/HttpModuleBase.php b/lib/SP/Core/HttpModuleBase.php index f215a297..0d77c861 100644 --- a/lib/SP/Core/HttpModuleBase.php +++ b/lib/SP/Core/HttpModuleBase.php @@ -25,7 +25,7 @@ namespace SP\Core; use Klein\Klein; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Http\Request; use SP\Util\Util; @@ -58,13 +58,13 @@ abstract class HttpModuleBase extends ModuleBase protected function checkMaintenanceMode(): bool { if ($this->configData->isMaintenance()) { - Bootstrap::$LOCK = Util::getAppLock(); + BootstrapBase::$LOCK = Util::getAppLock(); return !$this->request->isAjax() - || !(Bootstrap::$LOCK !== false - && Bootstrap::$LOCK->userId > 0 + || !(BootstrapBase::$LOCK !== false + && BootstrapBase::$LOCK->userId > 0 && $this->context->isLoggedIn() - && Bootstrap::$LOCK->userId === $this->context->getUserData()->getId()); + && BootstrapBase::$LOCK->userId === $this->context->getUserData()->getId()); } return false; diff --git a/lib/SP/Core/UI/Theme.php b/lib/SP/Core/UI/Theme.php index bd15463a..c39e1b29 100644 --- a/lib/SP/Core/UI/Theme.php +++ b/lib/SP/Core/UI/Theme.php @@ -24,9 +24,9 @@ namespace SP\Core\UI; -use SP\Bootstrap; use SP\Config\Config; use SP\Config\ConfigDataInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Context\ContextBase; use SP\Core\Context\ContextInterface; use SP\Core\Exceptions\InvalidClassException; @@ -42,37 +42,36 @@ defined('APP_ROOT') || die(); */ final class Theme implements ThemeInterface { - public const ICONS_CACHE_FILE = CACHE_PATH . DIRECTORY_SEPARATOR . 'icons.cache'; + public const ICONS_CACHE_FILE = CACHE_PATH.DIRECTORY_SEPARATOR.'icons.cache'; /** * Cache expire time */ public const CACHE_EXPIRE = 86400; - private string $themeUri = ''; - private string $themePath = ''; - private string $themePathFull = ''; - private string $themeName = ''; - private string $viewsPath = ''; - private ?ThemeIcons $icons = null; + private string $themeUri = ''; + private string $themePath = ''; + private string $themePathFull = ''; + private string $themeName = ''; + private string $viewsPath = ''; + private ?ThemeIcons $icons = null; private ConfigDataInterface $configData; - private ContextInterface $context; - private string $module; - private FileCacheInterface $fileCache; + private ContextInterface $context; + private string $module; + private FileCacheInterface $fileCache; /** * Theme constructor. * - * @param string $module - * @param Config $config - * @param ContextInterface $context - * @param FileCacheInterface $fileCache + * @param string $module + * @param Config $config + * @param ContextInterface $context + * @param FileCacheInterface $fileCache */ public function __construct( - string $module, - Config $config, - ContextInterface $context, + string $module, + Config $config, + ContextInterface $context, FileCacheInterface $fileCache - ) - { + ) { $this->configData = $config->getConfigData(); $this->context = $context; $this->fileCache = $fileCache; @@ -82,7 +81,7 @@ final class Theme implements ThemeInterface /** * Inicializar el tema visual a utilizar * - * @param bool $force Forzar la detección del tema para los inicios de sesión + * @param bool $force Forzar la detección del tema para los inicios de sesión * * @throws InvalidClassException */ @@ -93,10 +92,10 @@ final class Theme implements ThemeInterface $this->themeName = $this->getUserTheme() ?: $this->getGlobalTheme(); } - $this->themeUri = Bootstrap::$WEBURI . '/app/modules/' . $this->module . 'themes' . $this->themeName; - $this->themePath = str_replace(APP_ROOT, '', VIEW_PATH) . DIRECTORY_SEPARATOR . $this->themeName; - $this->themePathFull = VIEW_PATH . DIRECTORY_SEPARATOR . $this->themeName; - $this->viewsPath = $this->themePathFull . DIRECTORY_SEPARATOR . 'views'; + $this->themeUri = BootstrapBase::$WEBURI.'/app/modules/'.$this->module.'themes'.$this->themeName; + $this->themePath = str_replace(APP_ROOT, '', VIEW_PATH).DIRECTORY_SEPARATOR.$this->themeName; + $this->themePathFull = VIEW_PATH.DIRECTORY_SEPARATOR.$this->themeName; + $this->viewsPath = $this->themePathFull.DIRECTORY_SEPARATOR.'views'; $this->initIcons(); } @@ -148,7 +147,7 @@ final class Theme implements ThemeInterface */ private function saveIcons(): void { - $iconsClass = $this->themePathFull . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'Icons.php'; + $iconsClass = $this->themePathFull.DIRECTORY_SEPARATOR.'inc'.DIRECTORY_SEPARATOR.'Icons.php'; if (file_exists($iconsClass)) { if (!($this->icons = require $iconsClass) instanceof ThemeIcons) { @@ -176,7 +175,7 @@ final class Theme implements ThemeInterface while (false !== ($themeDir = $themesDirs->read())) { if ($themeDir !== '.' && $themeDir !== '..') { - $themeFile = VIEW_PATH . DIRECTORY_SEPARATOR . $themeDir . DIRECTORY_SEPARATOR . 'index.php'; + $themeFile = VIEW_PATH.DIRECTORY_SEPARATOR.$themeDir.DIRECTORY_SEPARATOR.'index.php'; if (file_exists($themeFile)) { $themeInfo = require $themeFile; @@ -204,7 +203,7 @@ final class Theme implements ThemeInterface */ public function getThemeInfo(): array { - $themeFile = $this->themePathFull . DIRECTORY_SEPARATOR . 'index.php'; + $themeFile = $this->themePathFull.DIRECTORY_SEPARATOR.'index.php'; if (file_exists($themeFile)) { $themeInfo = include $themeFile; diff --git a/lib/SP/Http/Json.php b/lib/SP/Http/Json.php index 02dc9154..3e2288bd 100644 --- a/lib/SP/Http/Json.php +++ b/lib/SP/Http/Json.php @@ -27,7 +27,7 @@ namespace SP\Http; use JsonException; use Klein\Klein; use Klein\Response; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\SPException; @@ -40,7 +40,7 @@ final class Json { public const SAFE = [ 'from' => ['\\', '"', '\''], - 'to' => ['\\', '\"', '\\\''] + 'to' => ['\\', '\"', '\\\''], ]; private Response $response; @@ -63,9 +63,11 @@ final class Json */ public static function fromDic(): Json { - return new self(Bootstrap::getContainer() - ->get(Klein::class) - ->response()); + return new self( + BootstrapBase::getContainer() + ->get(Klein::class) + ->response() + ); } /** @@ -114,7 +116,7 @@ final class Json /** * Devuelve una respuesta en formato JSON * - * @param string $data JSON string + * @param string $data JSON string * * @return bool */ @@ -151,8 +153,8 @@ final class Json /** * Devuelve una cadena en formato JSON * - * @param mixed $data - * @param int $flags JSON_* flags + * @param mixed $data + * @param int $flags JSON_* flags * * @throws SPException */ diff --git a/lib/SP/Http/Request.php b/lib/SP/Http/Request.php index 4805990b..8b6e5cf0 100644 --- a/lib/SP/Http/Request.php +++ b/lib/SP/Http/Request.php @@ -27,7 +27,7 @@ namespace SP\Http; use Exception; use Klein\DataCollection\DataCollection; use Klein\DataCollection\HeaderDataCollection; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Crypt\CryptPKI; use SP\Core\Crypt\Hash; use SP\Core\Exceptions\SPException; @@ -47,10 +47,10 @@ final class Request public const SECURE_DIRS = ['css', 'js']; private HeaderDataCollection $headers; - private \Klein\Request $request; - private DataCollection $params; - private ?string $method = null; - private ?bool $https = null; + private \Klein\Request $request; + private DataCollection $params; + private ?string $method = null; + private ?bool $https = null; /** * Request constructor. @@ -82,17 +82,16 @@ final class Request private function detectHttps(): void { $this->https = Util::boolval($this->request->server()->get('HTTPS', 'off')) - || $this->request->server()->get('SERVER_PORT', 0) === 443; + || $this->request->server()->get('SERVER_PORT', 0) === 443; } /** * Devuelve un nombre de archivo seguro */ public static function getSecureAppFile( - string $file, + string $file, ?string $base = null - ): string - { + ): string { return basename(self::getSecureAppPath($file, $base)); } @@ -100,17 +99,16 @@ final class Request * Devolver una ruta segura para */ public static function getSecureAppPath( - string $path, + string $path, ?string $base = null - ): string - { + ): string { if ($base === null) { $base = APP_ROOT; } elseif (!in_array(basename($base), self::SECURE_DIRS, true)) { return ''; } - $realPath = realpath($base . DIRECTORY_SEPARATOR . $path); + $realPath = realpath($base.DIRECTORY_SEPARATOR.$path); if ($realPath === false || strpos($realPath, $base) !== 0 @@ -147,8 +145,8 @@ final class Request // Forwarded: for=12.34.56.78;host=example.com;proto=https, for=23.45.67.89 $forwarded = $this->headers->get('HTTP_FORWARDED'); - if ($forwarded !== null && - preg_match_all( + if ($forwarded !== null + && preg_match_all( '/for="?\[?([\w.:]+)]?"?/', $forwarded, $matches @@ -190,10 +188,9 @@ final class Request } public function analyzeEmail( - string $param, + string $param, ?string $default = null - ): ?string - { + ): ?string { if (!$this->params->exists($param)) { return $default; } @@ -214,7 +211,7 @@ final class Request try { // Desencriptar con la clave RSA - $clearData = Bootstrap::getContainer()->get(CryptPKI::class) + $clearData = BootstrapBase::getContainer()->get(CryptPKI::class) ->decryptRSA(base64_decode($encryptedData)); // Desencriptar con la clave RSA @@ -233,10 +230,9 @@ final class Request } public function analyzeString( - string $param, + string $param, ?string $default = null - ): ?string - { + ): ?string { if (!$this->params->exists($param)) { return $default; } @@ -245,10 +241,9 @@ final class Request } public function analyzeUnsafeString( - string $param, + string $param, ?string $default = null - ): ?string - { + ): ?string { if (!$this->params->exists($param)) { return $default; } @@ -257,17 +252,17 @@ final class Request } /** - * @param string $param - * @param callable|null $mapper - * @param null $default + * @param string $param + * @param callable|null $mapper + * @param null $default * * @return array|null */ public function analyzeArray( - string $param, + string $param, callable $mapper = null, - $default = null): ?array - { + $default = null + ): ?array { $requestValue = $this->params->get($param); if (is_array($requestValue)) { @@ -295,7 +290,7 @@ final class Request public function isAjax(): bool { return $this->headers->get('X-Requested-With') === 'XMLHttpRequest' - || $this->analyzeInt('isAjax', 0) === 1; + || $this->analyzeInt('isAjax', 0) === 1; } public function analyzeInt(string $param, ?int $default = null): ?int @@ -322,8 +317,8 @@ final class Request } /** - * @param string $key - * @param string|null $param Checks the signature only for the given param + * @param string $key + * @param string|null $param Checks the signature only for the given param * * @throws SPException */ @@ -336,7 +331,7 @@ final class Request // Strips out the hash param from the URI to get the // route which will be checked against the computed HMAC if ($param === null) { - $uri = str_replace('&h=' . $hash, '', $this->request->uri()); + $uri = str_replace('&h='.$hash, '', $this->request->uri()); $uri = substr($uri, strpos($uri, '?') + 1); } else { $uri = $this->params->get($param, ''); @@ -366,7 +361,7 @@ final class Request $forwarded = $this->getForwardedData() ?? $this->getXForwardedData(); if (null !== $forwarded) { - return strtolower($forwarded['proto'] . '://' . $forwarded['host']); + return strtolower($forwarded['proto'].'://'.$forwarded['host']); } /** @noinspection HttpUrlsUsage */ @@ -377,7 +372,7 @@ final class Request $protocol = 'https://'; } - return $protocol . $this->request->server()->get('HTTP_HOST'); + return $protocol.$this->request->server()->get('HTTP_HOST'); } /** @@ -400,7 +395,7 @@ final class Request $data = [ 'host ' => $matches['host'][1] ?? null, 'proto' => $matches['proto'][1] ?? null, - 'for' => $this->getForwardedFor() + 'for' => $this->getForwardedFor(), ]; // Check if protocol and host are not empty @@ -430,7 +425,7 @@ final class Request $data = [ 'host' => trim(str_replace('"', '', $forwardedHost)), 'proto' => trim(str_replace('"', '', $forwardedProto)), - 'for' => $this->getForwardedFor() + 'for' => $this->getForwardedFor(), ]; // Check if protocol and host are not empty diff --git a/lib/SP/Mvc/Controller/ControllerTrait.php b/lib/SP/Mvc/Controller/ControllerTrait.php index e166ba00..84843ead 100644 --- a/lib/SP/Mvc/Controller/ControllerTrait.php +++ b/lib/SP/Mvc/Controller/ControllerTrait.php @@ -25,8 +25,8 @@ namespace SP\Mvc\Controller; use Closure; -use SP\Bootstrap; use SP\Config\ConfigDataInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\SPException; use SP\Http\Json; use SP\Http\JsonResponse; @@ -77,7 +77,7 @@ trait ControllerTrait $route = $request->analyzeString('r'); $hash = $request->analyzeString('h'); - $uri = new Uri(Bootstrap::$WEBROOT.Bootstrap::$SUBURI); + $uri = new Uri(BootstrapBase::$WEBROOT.BootstrapBase::$SUBURI); $uri->addParam('_r', 'login'); if ($route && $hash) { diff --git a/lib/SP/Mvc/Controller/ItemTrait.php b/lib/SP/Mvc/Controller/ItemTrait.php index 3d1373ab..741ac723 100644 --- a/lib/SP/Mvc/Controller/ItemTrait.php +++ b/lib/SP/Mvc/Controller/ItemTrait.php @@ -27,7 +27,7 @@ namespace SP\Mvc\Controller; use Defuse\Crypto\Exception\CryptoException; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\SPException; use SP\DataModel\CustomFieldData; use SP\DataModel\ItemSearchData; @@ -53,7 +53,7 @@ trait ItemTrait */ protected function getCustomFieldsForItem(int $moduleId, ?int $itemId): array { - $customFieldService = Bootstrap::getContainer()->get(CustomFieldService::class); + $customFieldService = BootstrapBase::getContainer()->get(CustomFieldService::class); $customFields = []; foreach ($customFieldService->getForModuleAndItemId($moduleId, $itemId) as $item) { @@ -93,9 +93,9 @@ trait ItemTrait /** * Añadir los campos personalizados del elemento * - * @param int $moduleId - * @param int|int[] $itemId - * @param Request $request + * @param int $moduleId + * @param int|int[] $itemId + * @param Request $request * * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException @@ -104,10 +104,10 @@ trait ItemTrait * @throws \SP\Services\ServiceException */ protected function addCustomFieldsForItem( - int $moduleId, - $itemId, - Request $request): void - { + int $moduleId, + $itemId, + Request $request + ): void { $customFields = $request->analyzeArray( 'customfield', function ($values) { @@ -121,7 +121,7 @@ trait ItemTrait ); if (!empty($customFields)) { - $customFieldService = Bootstrap::getContainer()->get(CustomFieldService::class); + $customFieldService = BootstrapBase::getContainer()->get(CustomFieldService::class); try { foreach ($customFields as $id => $value) { @@ -142,8 +142,8 @@ trait ItemTrait /** * Eliminar los campos personalizados del elemento * - * @param int $moduleId - * @param int|int[] $itemId + * @param int $moduleId + * @param int|int[] $itemId * * @throws SPException * @throws ContainerExceptionInterface @@ -151,7 +151,7 @@ trait ItemTrait */ protected function deleteCustomFieldsForItem(int $moduleId, $itemId): void { - $customFieldService = Bootstrap::getContainer()->get(CustomFieldService::class); + $customFieldService = BootstrapBase::getContainer()->get(CustomFieldService::class); if (is_array($itemId)) { $customFieldService->deleteCustomFieldDataBatch($itemId, $moduleId); @@ -163,20 +163,19 @@ trait ItemTrait /** * Actualizar los campos personalizados del elemento * - * @param int $moduleId - * @param int|int[] $itemId - * @param Request $request + * @param int $moduleId + * @param int|int[] $itemId + * @param Request $request * * @throws \SP\Core\Exceptions\ConstraintException * @throws \SP\Core\Exceptions\QueryException * @throws \SP\Core\Exceptions\SPException */ protected function updateCustomFieldsForItem( - int $moduleId, - $itemId, + int $moduleId, + $itemId, Request $request - ): void - { + ): void { $customFields = $request->analyzeArray( 'customfield', function ($values) { @@ -190,7 +189,7 @@ trait ItemTrait ); if (!empty($customFields)) { - $customFieldService = Bootstrap::getContainer() + $customFieldService = BootstrapBase::getContainer() ->get(CustomFieldService::class); try { @@ -215,10 +214,9 @@ trait ItemTrait * Returns search data object for the current request */ protected function getSearchData( - int $limitCount, + int $limitCount, Request $request - ): ItemSearchData - { + ): ItemSearchData { $itemSearchData = new ItemSearchData(); $itemSearchData->setSeachString($request->analyzeString('search')); $itemSearchData->setLimitStart($request->analyzeInt('start', 0)); diff --git a/lib/SP/Mvc/View/Template.php b/lib/SP/Mvc/View/Template.php index 398923fa..5b0215c9 100644 --- a/lib/SP/Mvc/View/Template.php +++ b/lib/SP/Mvc/View/Template.php @@ -26,7 +26,7 @@ namespace SP\Mvc\View; defined('APP_ROOT') || die(); -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\FileNotFoundException; use SP\Core\UI\ThemeInterface; use SP\Http\Uri; @@ -43,24 +43,24 @@ use SP\Http\Uri; final class Template { public const TEMPLATE_EXTENSION = '.inc'; - public const PARTIALS_DIR = '_partials'; - public const LAYOUTS_DIR = '_layouts'; + public const PARTIALS_DIR = '_partials'; + public const LAYOUTS_DIR = '_layouts'; protected ThemeInterface $theme; /** * @var array List of templates to load into the view */ - private array $templates = []; + private array $templates = []; private TemplateVarCollection $vars; /** * @var string Base path for imcluding templates */ private string $base; - private array $contentTemplates = []; - private bool $upgraded = false; + private array $contentTemplates = []; + private bool $upgraded = false; /** - * @param ThemeInterface $theme + * @param ThemeInterface $theme */ public function __construct(ThemeInterface $theme) { @@ -71,14 +71,13 @@ final class Template /** * Añadir una nueva plantilla al array de plantillas de la clase * - * @param string $name Con el nombre del archivo de plantilla - * @param string|null $base Directorio base para la plantilla + * @param string $name Con el nombre del archivo de plantilla + * @param string|null $base Directorio base para la plantilla */ public function addContentTemplate( - string $name, + string $name, ?string $base = null - ): string - { + ): string { try { $template = $this->checkTemplate($name, $base); $this->setContentTemplate($template, $name); @@ -92,28 +91,28 @@ final class Template /** * Comprobar si un archivo de plantilla existe y se puede leer * - * @param string $template Con el nombre del archivo - * @param string|null $base Directorio base para la plantilla + * @param string $template Con el nombre del archivo + * @param string|null $base Directorio base para la plantilla * * @return string La ruta al archivo de la plantilla * * @throws FileNotFoundException */ private function checkTemplate( - string $template, + string $template, ?string $base = null - ): string - { + ): string { $base = $base ?? $this->base; if ($base === null) { - $templateFile = $this->theme->getViewsPath() . DIRECTORY_SEPARATOR . $template . self::TEMPLATE_EXTENSION; + $templateFile = $this->theme->getViewsPath().DIRECTORY_SEPARATOR.$template.self::TEMPLATE_EXTENSION; } elseif (strpos($base, APP_ROOT) === 0 - && is_dir($base) + && is_dir($base) ) { - $templateFile = $base . DIRECTORY_SEPARATOR . $template . self::TEMPLATE_EXTENSION; + $templateFile = $base.DIRECTORY_SEPARATOR.$template.self::TEMPLATE_EXTENSION; } else { - $templateFile = $this->theme->getViewsPath() . DIRECTORY_SEPARATOR . $base . DIRECTORY_SEPARATOR . $template . self::TEMPLATE_EXTENSION; + $templateFile = $this->theme->getViewsPath().DIRECTORY_SEPARATOR.$base.DIRECTORY_SEPARATOR.$template + .self::TEMPLATE_EXTENSION; } if (!is_readable($templateFile)) { @@ -130,8 +129,8 @@ final class Template /** * Añadir un nuevo archivo de plantilla al array de plantillas de contenido * - * @param string $file Con el nombre del archivo - * @param string $name Nombre de la plantilla + * @param string $file Con el nombre del archivo + * @param string $name Nombre de la plantilla */ private function setContentTemplate(string $file, string $name): void { @@ -161,9 +160,9 @@ final class Template /** * Removes a template from the stack * - * @param string $src Source template - * @param string $dst Destination template - * @param string $base + * @param string $src Source template + * @param string $dst Destination template + * @param string $base * * @return mixed|string */ @@ -191,8 +190,8 @@ final class Template /** * Añadir una nueva plantilla al array de plantillas de la clase * - * @param string $name Con el nombre del archivo de plantilla - * @param string|null $base Directorio base para la plantilla + * @param string $name Con el nombre del archivo de plantilla + * @param string|null $base Directorio base para la plantilla * * @return string */ @@ -211,8 +210,8 @@ final class Template /** * Añadir un nuevo archivo de plantilla al array de plantillas * - * @param string $file Con el nombre del archivo - * @param string $name Nombre de la plantilla + * @param string $file Con el nombre del archivo + * @param string $name Nombre de la plantilla */ private function setTemplate(string $file, string $name): void { @@ -222,7 +221,7 @@ final class Template /** * Añadir una nueva plantilla dentro de una plantilla * - * @param string $file Con el nombre del archivo de plantilla + * @param string $file Con el nombre del archivo de plantilla * * @return bool */ @@ -234,8 +233,8 @@ final class Template /** * Añadir una nueva plantilla dentro de una plantilla * - * @param string $file Con el nombre del archivo de plantilla - * @param string|null $base Directorio base para la plantilla + * @param string $file Con el nombre del archivo de plantilla + * @param string|null $base Directorio base para la plantilla * * @return bool */ @@ -260,8 +259,8 @@ final class Template * Overloading para añadir nuevas variables en al array de variables dela plantilla * pasadas como atributos dinámicos de la clase * - * @param string $name Nombre del atributo - * @param string $value Valor del atributo + * @param string $name Nombre del atributo + * @param string $value Valor del atributo */ public function __set(string $name, string $value) { @@ -287,7 +286,7 @@ final class Template * Overloading para comprobar si el atributo solicitado está declarado como variable * en el array de variables de la plantilla. * - * @param string $name Nombre del atributo + * @param string $name Nombre del atributo * * @return bool */ @@ -337,7 +336,7 @@ final class Template }; $_getRoute = static function ($path) use ($configData) { - $baseUrl = ($configData->getApplicationUrl() ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($configData->getApplicationUrl() ?: BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; $uri = new Uri($baseUrl); $uri->addParam('r', $path); @@ -358,20 +357,19 @@ final class Template /** * Anexar el valor de la variable al array de la misma en el array de variables * - * @param string $name nombre de la variable - * @param mixed $value valor de la variable - * @param string|null $scope string ámbito de la variable - * @param int|null $index string índice del array + * @param string $name nombre de la variable + * @param mixed $value valor de la variable + * @param string|null $scope string ámbito de la variable + * @param int|null $index string índice del array */ public function append( - string $name, - $value, + string $name, + $value, ?string $scope = null, - int $index = null - ): void - { + int $index = null + ): void { if (null !== $scope) { - $name = $scope . '_' . $name; + $name = $scope.'_'.$name; } $var = $this->vars->get($name, []); @@ -462,18 +460,17 @@ final class Template /** * Crear la variable y asignarle un valor en el array de variables * - * @param string $name nombre de la variable - * @param mixed $value valor de la variable - * @param string|null $scope string ámbito de la variable + * @param string $name nombre de la variable + * @param mixed $value valor de la variable + * @param string|null $scope string ámbito de la variable */ public function assign( - string $name, - $value = '', + string $name, + $value = '', ?string $scope = null - ): void - { + ): void { if (null !== $scope) { - $name = $scope . '_' . $name; + $name = $scope.'_'.$name; } $this->vars->set($name, $value); diff --git a/lib/SP/Plugin/PluginManager.php b/lib/SP/Plugin/PluginManager.php index 198a8ded..6f19478d 100644 --- a/lib/SP/Plugin/PluginManager.php +++ b/lib/SP/Plugin/PluginManager.php @@ -26,7 +26,7 @@ namespace SP\Plugin; use Exception; use ReflectionClass; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Events\Event; use SP\Core\Events\EventDispatcher; use SP\Core\Events\EventMessage; @@ -48,28 +48,28 @@ use SP\Util\VersionUtil; final class PluginManager { private static ?array $pluginsAvailable; - private ?array $enabledPlugins = null; + private ?array $enabledPlugins = null; /** * @var PluginInterface[] Plugins ya cargados */ - private array $loadedPlugins = []; - private array $disabledPlugins = []; - private PluginService $pluginService; - private EventDispatcher $eventDispatcher; + private array $loadedPlugins = []; + private array $disabledPlugins = []; + private PluginService $pluginService; + private EventDispatcher $eventDispatcher; private PluginDataService $pluginDataService; /** * PluginManager constructor. * - * @param PluginService $pluginService - * @param PluginDataService $pluginDataService - * @param EventDispatcher $eventDispatcher + * @param PluginService $pluginService + * @param PluginDataService $pluginDataService + * @param EventDispatcher $eventDispatcher */ - public function __construct(PluginService $pluginService, - PluginDataService $pluginDataService, - EventDispatcher $eventDispatcher - ) - { + public function __construct( + PluginService $pluginService, + PluginDataService $pluginDataService, + EventDispatcher $eventDispatcher + ) { $this->pluginService = $pluginService; $this->pluginDataService = $pluginDataService; $this->eventDispatcher = $eventDispatcher; @@ -90,8 +90,8 @@ final class PluginManager && ($dir = dir(PLUGINS_PATH))) { while (false !== ($entry = $dir->read())) { - $pluginDir = PLUGINS_PATH . DS . $entry; - $pluginFile = $pluginDir . DS . 'src' . DS . 'lib' . DS . 'Plugin.php'; + $pluginDir = PLUGINS_PATH.DS.$entry; + $pluginFile = $pluginDir.DS.'src'.DS.'lib'.DS.'Plugin.php'; if (strpos($entry, '.') === false && is_dir($pluginDir) @@ -99,7 +99,7 @@ final class PluginManager ) { logger(sprintf('Plugin found: %s', $pluginDir)); - $plugins[$entry] = require $pluginDir . DS . 'base.php'; + $plugins[$entry] = require $pluginDir.DS.'base.php'; } } @@ -112,8 +112,8 @@ final class PluginManager /** * Obtener la información de un plugin * - * @param string $name Nombre del plugin - * @param bool $initialize + * @param string $name Nombre del plugin + * @param bool $initialize * * @return PluginInterface */ @@ -139,8 +139,8 @@ final class PluginManager /** * Cargar un plugin * - * @param string $name Nombre del plugin - * @param string $namespace + * @param string $name Nombre del plugin + * @param string $namespace * * @return PluginInterface */ @@ -153,21 +153,26 @@ final class PluginManager } try { - $class = $namespace . 'Plugin'; + $class = $namespace.'Plugin'; $reflectionClass = new ReflectionClass($class); /** @var PluginInterface $plugin */ $plugin = $reflectionClass->newInstance( - Bootstrap::getContainer(), + BootstrapBase::getContainer(), new PluginOperation($this->pluginDataService, $pluginName) ); // Do not load plugin's data if not compatible. // Just return the plugin instance before disabling it if ($this->checkCompatibility($plugin) === false) { - $this->eventDispatcher->notifyEvent('plugin.load.error', - new Event($this, EventMessage::factory() - ->addDescription(sprintf(__('Plugin version not compatible (%s)'), implode('.', $plugin->getVersion())))) + $this->eventDispatcher->notifyEvent( + 'plugin.load.error', + new Event( + $this, EventMessage::factory() + ->addDescription( + sprintf(__('Plugin version not compatible (%s)'), implode('.', $plugin->getVersion())) + ) + ) ); $this->disabledPlugins[] = $pluginName; @@ -177,11 +182,14 @@ final class PluginManager } catch (Exception $e) { processException($e); - $this->eventDispatcher->notifyEvent('exception', - new Event($e, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'exception', + new Event( + $e, EventMessage::factory() ->addDescription(sprintf(__('Unable to load the "%s" plugin'), $pluginName)) ->addDescription($e->getMessage()) - ->addDetail(__u('Plugin'), $pluginName)) + ->addDetail(__u('Plugin'), $pluginName) + ) ); } @@ -189,7 +197,7 @@ final class PluginManager } /** - * @param PluginInterface $plugin + * @param PluginInterface $plugin * * @return bool * @throws ConstraintException @@ -223,7 +231,7 @@ final class PluginManager } /** - * @param PluginInterface $plugin + * @param PluginInterface $plugin * * @return bool */ @@ -240,11 +248,14 @@ final class PluginManager } catch (Exception $e) { processException($e); - $this->eventDispatcher->notifyEvent('exception', - new Event($e, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'exception', + new Event( + $e, EventMessage::factory() ->addDescription(sprintf(__('Unable to load the "%s" plugin'), $plugin->getName())) ->addDescription($e->getMessage()) - ->addDetail(__u('Plugin'), $plugin->getName())) + ->addDetail(__u('Plugin'), $plugin->getName()) + ) ); } @@ -275,20 +286,28 @@ final class PluginManager if ($plugin->getAvailable() === 0) { $this->pluginService->toggleAvailable($plugin->getId(), true); - $this->eventDispatcher->notifyEvent('edit.plugin.available', - new Event($this, EventMessage::factory() - ->addDetail(__u('Plugin available'), $plugin->getName())) + $this->eventDispatcher->notifyEvent( + 'edit.plugin.available', + new Event( + $this, EventMessage::factory() + ->addDetail(__u('Plugin available'), $plugin->getName()) + ) ); $this->load($plugin->getName()); } - } else if ($plugin->getAvailable() === 1) { - $this->pluginService->toggleAvailable($plugin->getId(), false); + } else { + if ($plugin->getAvailable() === 1) { + $this->pluginService->toggleAvailable($plugin->getId(), false); - $this->eventDispatcher->notifyEvent('edit.plugin.unavailable', - new Event($this, EventMessage::factory() - ->addDetail(__u('Plugin unavailable'), $plugin->getName())) - ); + $this->eventDispatcher->notifyEvent( + 'edit.plugin.unavailable', + new Event( + $this, EventMessage::factory() + ->addDetail(__u('Plugin unavailable'), $plugin->getName()) + ) + ); + } } $processed[] = $plugin->getName(); @@ -303,7 +322,7 @@ final class PluginManager } /** - * @param string $pluginName + * @param string $pluginName */ private function load(string $pluginName): void { @@ -317,9 +336,12 @@ final class PluginManager ) { logger(sprintf('Plugin loaded: %s', $pluginName)); - $this->eventDispatcher->notifyEvent('plugin.load', - new Event($this, EventMessage::factory() - ->addDetail(__u('Plugin loaded'), $pluginName)) + $this->eventDispatcher->notifyEvent( + 'plugin.load', + new Event( + $this, EventMessage::factory() + ->addDetail(__u('Plugin loaded'), $pluginName) + ) ); $this->loadedPlugins[$pluginName] = $plugin; @@ -329,7 +351,7 @@ final class PluginManager } /** - * @param string $name + * @param string $name * * @throws ConstraintException * @throws QueryException @@ -342,17 +364,20 @@ final class PluginManager $this->pluginService->create($pluginData); - $this->eventDispatcher->notifyEvent('create.plugin', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'create.plugin', + new Event( + $this, EventMessage::factory() ->addDescription(__u('New Plugin')) ->addDetail(__u('Name'), $name) - )); + ) + ); $this->disabledPlugins[] = $name; } /** - * @param string $version + * @param string $version */ public function upgradePlugins(string $version): void { @@ -365,10 +390,13 @@ final class PluginManager ); if (null === $plugin) { - $this->eventDispatcher->notifyEvent('upgrade.plugin.process', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'upgrade.plugin.process', + new Event( + $this, EventMessage::factory() ->addDescription(sprintf(__('Unable to upgrade the "%s" plugin'), $pluginName)) - ->addDetail(__u('Plugin'), $pluginName)) + ->addDetail(__u('Plugin'), $pluginName) + ) ); continue; @@ -380,10 +408,13 @@ final class PluginManager if ($pluginModel->getVersionLevel() === null || VersionUtil::checkVersion($pluginModel->getVersionLevel(), $version) ) { - $this->eventDispatcher->notifyEvent('upgrade.plugin.process', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'upgrade.plugin.process', + new Event( + $this, EventMessage::factory() ->addDescription(__u('Upgrading plugin')) - ->addDetail(__u('Name'), $pluginName)) + ->addDetail(__u('Name'), $pluginName) + ) ); $plugin->upgrade( @@ -397,20 +428,26 @@ final class PluginManager $this->pluginService->update($pluginModel); - $this->eventDispatcher->notifyEvent('upgrade.plugin.process', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'upgrade.plugin.process', + new Event( + $this, EventMessage::factory() ->addDescription(__u('Plugin upgraded')) - ->addDetail(__u('Name'), $pluginName)) + ->addDetail(__u('Name'), $pluginName) + ) ); } } catch (Exception $e) { processException($e); - $this->eventDispatcher->notifyEvent('exception', - new Event($e, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'exception', + new Event( + $e, EventMessage::factory() ->addDescription(sprintf(__('Unable to upgrade the "%s" plugin'), $pluginName)) ->addDescription($e->getMessage()) - ->addDetail(__u('Plugin'), $pluginName)) + ->addDetail(__u('Plugin'), $pluginName) + ) ); } } @@ -427,9 +464,12 @@ final class PluginManager if (!in_array($plugin, $this->loadedPlugins, true)) { $this->pluginService->toggleAvailableByName($plugin, false); - $this->eventDispatcher->notifyEvent('edit.plugin.unavailable', - new Event($this, EventMessage::factory() - ->addDetail(__u('Plugin disabled'), $plugin->getName())) + $this->eventDispatcher->notifyEvent( + 'edit.plugin.unavailable', + new Event( + $this, EventMessage::factory() + ->addDetail(__u('Plugin disabled'), $plugin->getName()) + ) ); } } diff --git a/lib/SP/Services/Account/AccountSearchItem.php b/lib/SP/Services/Account/AccountSearchItem.php index a0cc55fa..2bf13bb6 100644 --- a/lib/SP/Services/Account/AccountSearchItem.php +++ b/lib/SP/Services/Account/AccountSearchItem.php @@ -26,8 +26,8 @@ namespace SP\Services\Account; defined('APP_ROOT') || die(); -use SP\Bootstrap; use SP\Config\ConfigDataInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\DataModel\AccountSearchVData; use SP\DataModel\ItemData; use SP\Html\Html; @@ -40,21 +40,21 @@ use SP\Services\PublicLink\PublicLinkService; */ final class AccountSearchItem { - public static bool $accountLink = false; - public static bool $topNavbar = false; - public static bool $optionalActions = false; - public static bool $showTags = false; - public static bool $requestEnabled = true; - public static bool $wikiEnabled = false; - public static bool $dokuWikiEnabled = false; + public static bool $accountLink = false; + public static bool $topNavbar = false; + public static bool $optionalActions = false; + public static bool $showTags = false; + public static bool $requestEnabled = true; + public static bool $wikiEnabled = false; + public static bool $dokuWikiEnabled = false; public static bool $publicLinkEnabled = false; - public static bool $isDemoMode = false; + public static bool $isDemoMode = false; protected AccountSearchVData $accountSearchVData; - protected ?string $color = null; - protected ?string $link = null; - protected bool $favorite = false; - protected int $textMaxLength = 60; + protected ?string $color = null; + protected ?string $link = null; + protected bool $favorite = false; + protected int $textMaxLength = 60; /** * @var ItemData[]|null */ @@ -66,16 +66,15 @@ final class AccountSearchItem /** * @var ItemData[]|null */ - protected ?array $userGroups = null; + protected ?array $userGroups = null; private ConfigDataInterface $configData; - private AccountAcl $accountAcl; + private AccountAcl $accountAcl; public function __construct( - AccountSearchVData $accountSearchVData, - AccountAcl $accountAcl, + AccountSearchVData $accountSearchVData, + AccountAcl $accountAcl, ConfigDataInterface $configData - ) - { + ) { $this->accountSearchVData = $accountSearchVData; $this->accountAcl = $accountAcl; $this->configData = $configData; @@ -96,10 +95,15 @@ final class AccountSearchItem return !$this->accountAcl->isShow() && self::$requestEnabled; } + public function isShow(): bool + { + return $this->accountAcl->isShow(); + } + public function isShowCopyPass(): bool { return $this->accountAcl->isShowViewPass() - && !$this->configData->isAccountPassToImage(); + && !$this->configData->isAccountPassToImage(); } public function isShowViewPass(): bool @@ -140,7 +144,7 @@ final class AccountSearchItem public function getClientLink(): ?string { return self::$wikiEnabled - ? $this->configData->getWikiSearchurl() . $this->accountSearchVData->getClientName() + ? $this->configData->getWikiSearchurl().$this->accountSearchVData->getClientName() : null; } @@ -149,7 +153,7 @@ final class AccountSearchItem if (self::$publicLinkEnabled && $this->accountSearchVData->getPublicLinkHash() !== null ) { - $baseUrl = ($this->configData->getApplicationUrl() ?: Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($this->configData->getApplicationUrl() ?: BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; return PublicLinkService::getLinkForHash($baseUrl, $this->accountSearchVData->getPublicLinkHash()); } @@ -180,8 +184,8 @@ final class AccountSearchItem public function getAccesses(): array { $accesses = [ - '(G*) ' . $this->accountSearchVData->getUserGroupName() . '', - '(U*) ' . $this->accountSearchVData->getUserLogin() . '' + '(G*) '.$this->accountSearchVData->getUserGroupName().'', + '(U*) '.$this->accountSearchVData->getUserLogin().'', ]; $userLabel = $this->accountSearchVData->getOtherUserEdit() === 1 ? 'U+' : 'U'; @@ -213,11 +217,6 @@ final class AccountSearchItem : 0; } - public function isShow(): bool - { - return $this->accountAcl->isShow(); - } - public function isShowView(): bool { return $this->accountAcl->isShowView(); @@ -258,12 +257,12 @@ final class AccountSearchItem public function isPasswordExpired(): bool { return $this->configData->isAccountExpireEnabled() - && $this->accountSearchVData->getPassDateChange() > 0 - && time() > $this->accountSearchVData->getPassDateChange(); + && $this->accountSearchVData->getPassDateChange() > 0 + && time() > $this->accountSearchVData->getPassDateChange(); } /** - * @param ItemData[] $userGroups + * @param ItemData[] $userGroups */ public function setUserGroups(array $userGroups): void { @@ -271,7 +270,7 @@ final class AccountSearchItem } /** - * @param ItemData[] $users + * @param ItemData[] $users */ public function setUsers(array $users): void { @@ -287,7 +286,7 @@ final class AccountSearchItem } /** - * @param ItemData[] $tags + * @param ItemData[] $tags */ public function setTags(array $tags): void { @@ -297,8 +296,8 @@ final class AccountSearchItem public function isWikiMatch(string $wikiFilter): bool { return preg_match( - '/^' . $wikiFilter . '/i', - $this->accountSearchVData->getName() - ) === 1; + '/^'.$wikiFilter.'/i', + $this->accountSearchVData->getName() + ) === 1; } } \ No newline at end of file diff --git a/lib/SP/Services/Mail/MailService.php b/lib/SP/Services/Mail/MailService.php index 11ab76b0..7839e6ce 100644 --- a/lib/SP/Services/Mail/MailService.php +++ b/lib/SP/Services/Mail/MailService.php @@ -26,8 +26,8 @@ namespace SP\Services\Mail; use Exception; use PHPMailer\PHPMailer\PHPMailer; -use SP\Bootstrap; use SP\Core\AppInfoInterface; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Events\Event; use SP\Core\Events\EventMessage; use SP\Core\Exceptions\SPException; @@ -61,7 +61,9 @@ final class MailService extends Service $mailMessage = new MailMessage(); $mailMessage->setTitle(__u('Mail test')); - $mailMessage->addDescription(__u('This is a test email in order to verify that the configuration is working right.')); + $mailMessage->addDescription( + __u('This is a test email in order to verify that the configuration is working right.') + ); $mailMessage->setFooter($this->getEmailFooter()); $mailer->isHTML(); @@ -82,7 +84,8 @@ final class MailService extends Service SPException::ERROR, $e->getMessage(), $e->getCode(), - $e); + $e + ); } } @@ -99,7 +102,7 @@ final class MailService extends Service AppInfoInterface::APP_NAME, AppInfoInterface::APP_DESC ), - Html::anchorText(Bootstrap::$WEBURI) + Html::anchorText(BootstrapBase::$WEBURI), ]; } @@ -118,9 +121,9 @@ final class MailService extends Service } /** - * @param string $subject - * @param array|string $to - * @param MailMessage $mailMessage + * @param string $subject + * @param array|string $to + * @param MailMessage $mailMessage * * @throws \PHPMailer\PHPMailer\Exception * @throws \SP\Services\ServiceException @@ -152,8 +155,10 @@ final class MailService extends Service try { $this->mailer->send(); - $this->eventDispatcher->notifyEvent('send.mail', - new Event($this, EventMessage::factory() + $this->eventDispatcher->notifyEvent( + 'send.mail', + new Event( + $this, EventMessage::factory() ->addDescription(__u('Email sent')) ->addDetail( __u('Recipient'), @@ -166,7 +171,8 @@ final class MailService extends Service $this->mailer->getToAddresses() ) ) - )) + ) + ) ); } catch (Exception $e) { processException($e); @@ -185,11 +191,10 @@ final class MailService extends Service * @throws \SP\Services\ServiceException */ public function sendBatch( - string $subject, - array $to, + string $subject, + array $to, MailMessage $mailMessage - ): void - { + ): void { $this->mailer->isHTML(); foreach ($to as $address) { diff --git a/lib/SP/Services/ServiceItemTrait.php b/lib/SP/Services/ServiceItemTrait.php index e985d27a..a4d4170b 100644 --- a/lib/SP/Services/ServiceItemTrait.php +++ b/lib/SP/Services/ServiceItemTrait.php @@ -26,7 +26,7 @@ namespace SP\Services; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\DataModel\DataModelInterface; /** @@ -45,7 +45,7 @@ trait ServiceItemTrait */ public static function getItemsBasic(): array { - return Bootstrap::getContainer() + return BootstrapBase::getContainer() ->get(static::class) ->getAllBasic(); } diff --git a/lib/SP/Services/UserPassRecover/UserPassRecoverService.php b/lib/SP/Services/UserPassRecover/UserPassRecoverService.php index 9513aae0..ec7b797b 100644 --- a/lib/SP/Services/UserPassRecover/UserPassRecoverService.php +++ b/lib/SP/Services/UserPassRecover/UserPassRecoverService.php @@ -27,7 +27,7 @@ namespace SP\Services\UserPassRecover; use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; -use SP\Bootstrap; +use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Exceptions\ConstraintException; use SP\Core\Exceptions\QueryException; use SP\Core\Exceptions\SPException; @@ -64,7 +64,9 @@ final class UserPassRecoverService extends Service $mailMessage->addDescriptionLine(); $mailMessage->addDescription(__('In order to complete the process, please go to this URL:')); $mailMessage->addDescriptionLine(); - $mailMessage->addDescription(Html::anchorText(Bootstrap::$WEBURI . '/index.php?r=userPassReset/reset/' . $hash)); + $mailMessage->addDescription( + Html::anchorText(BootstrapBase::$WEBURI.'/index.php?r=userPassReset/reset/'.$hash) + ); $mailMessage->addDescriptionLine(); $mailMessage->addDescription(__('If you have not requested this action, please dismiss this message.')); @@ -79,7 +81,8 @@ final class UserPassRecoverService extends Service { if ($this->userPassRecoverRepository->toggleUsedByHash( $hash, - time() - self::MAX_PASS_RECOVER_TIME) === 0 + time() - self::MAX_PASS_RECOVER_TIME + ) === 0 ) { throw new ServiceException( __u('Wrong hash or expired'), diff --git a/lib/SP/Util/Link.php b/lib/SP/Util/Link.php index 58615d33..a9603b14 100644 --- a/lib/SP/Util/Link.php +++ b/lib/SP/Util/Link.php @@ -24,10 +24,9 @@ namespace SP\Util; - -use SP\Bootstrap; use SP\Config\ConfigDataInterface; use SP\Core\Acl\Acl; +use SP\Core\Bootstrap\BootstrapBase; use SP\Http\Uri; /** @@ -38,18 +37,17 @@ use SP\Http\Uri; final class Link { public static function getDeepLink( - int $itemId, - int $actionId, + int $itemId, + int $actionId, ConfigDataInterface $configData, - bool $useUI = false - ): string - { - $route = Acl::getActionRoute($actionId) . '/' . $itemId; + bool $useUI = false + ): string { + $route = Acl::getActionRoute($actionId).'/'.$itemId; if ($useUI) { - $baseUrl = ($configData->getApplicationUrl() ?? Bootstrap::$WEBURI) . '/index.php'; + $baseUrl = ($configData->getApplicationUrl() ?? BootstrapBase::$WEBURI).'/index.php'; } else { - $baseUrl = ($configData->getApplicationUrl() ?? Bootstrap::$WEBURI) . Bootstrap::$SUBURI; + $baseUrl = ($configData->getApplicationUrl() ?? BootstrapBase::$WEBURI).BootstrapBase::$SUBURI; } $uri = new Uri($baseUrl); diff --git a/tests/SP/Modules/Api/ApiTestCase.php b/tests/SP/Modules/Api/ApiTestCase.php index 035d0e1d..c6116dae 100644 --- a/tests/SP/Modules/Api/ApiTestCase.php +++ b/tests/SP/Modules/Api/ApiTestCase.php @@ -25,15 +25,16 @@ namespace SP\Tests\Modules\Api; use DI\ContainerBuilder; +use Klein\Klein; use Klein\Request; use Klein\Response; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use RuntimeException; -use SP\Bootstrap; use SP\Config\Config; use SP\Config\ConfigDataInterface; use SP\Core\Acl\ActionsInterface; +use SP\Core\Bootstrap\BootstrapApi; use SP\Core\Context\ContextInterface; use SP\DataModel\AuthTokenData; use SP\Services\Api\ApiRequest; @@ -58,33 +59,33 @@ abstract class ApiTestCase extends TestCase use DatabaseTrait; private const METHOD_ACTION_MAP = [ - ActionsInterface::ACCOUNT_CREATE => 'account/create', - ActionsInterface::ACCOUNT_VIEW => 'account/view', + ActionsInterface::ACCOUNT_CREATE => 'account/create', + ActionsInterface::ACCOUNT_VIEW => 'account/view', ActionsInterface::ACCOUNT_VIEW_PASS => 'account/viewPass', ActionsInterface::ACCOUNT_EDIT_PASS => 'account/editPass', - ActionsInterface::ACCOUNT_EDIT => 'account/edit', - ActionsInterface::ACCOUNT_SEARCH => 'account/search', - ActionsInterface::ACCOUNT_DELETE => 'account/delete', - ActionsInterface::CATEGORY_VIEW => 'category/view', - ActionsInterface::CATEGORY_CREATE => 'category/create', - ActionsInterface::CATEGORY_EDIT => 'category/edit', - ActionsInterface::CATEGORY_DELETE => 'category/delete', - ActionsInterface::CATEGORY_SEARCH => 'category/search', - ActionsInterface::CLIENT_VIEW => 'client/view', - ActionsInterface::CLIENT_CREATE => 'client/create', - ActionsInterface::CLIENT_EDIT => 'client/edit', - ActionsInterface::CLIENT_DELETE => 'client/delete', - ActionsInterface::CLIENT_SEARCH => 'client/search', - ActionsInterface::TAG_VIEW => 'tag/view', - ActionsInterface::TAG_CREATE => 'tag/create', - ActionsInterface::TAG_EDIT => 'tag/edit', - ActionsInterface::TAG_DELETE => 'tag/delete', - ActionsInterface::TAG_SEARCH => 'tag/search', - ActionsInterface::GROUP_VIEW => 'userGroup/view', - ActionsInterface::GROUP_CREATE => 'userGroup/create', - ActionsInterface::GROUP_EDIT => 'userGroup/edit', - ActionsInterface::GROUP_DELETE => 'userGroup/delete', - ActionsInterface::GROUP_SEARCH => 'userGroup/search', + ActionsInterface::ACCOUNT_EDIT => 'account/edit', + ActionsInterface::ACCOUNT_SEARCH => 'account/search', + ActionsInterface::ACCOUNT_DELETE => 'account/delete', + ActionsInterface::CATEGORY_VIEW => 'category/view', + ActionsInterface::CATEGORY_CREATE => 'category/create', + ActionsInterface::CATEGORY_EDIT => 'category/edit', + ActionsInterface::CATEGORY_DELETE => 'category/delete', + ActionsInterface::CATEGORY_SEARCH => 'category/search', + ActionsInterface::CLIENT_VIEW => 'client/view', + ActionsInterface::CLIENT_CREATE => 'client/create', + ActionsInterface::CLIENT_EDIT => 'client/edit', + ActionsInterface::CLIENT_DELETE => 'client/delete', + ActionsInterface::CLIENT_SEARCH => 'client/search', + ActionsInterface::TAG_VIEW => 'tag/view', + ActionsInterface::TAG_CREATE => 'tag/create', + ActionsInterface::TAG_EDIT => 'tag/edit', + ActionsInterface::TAG_DELETE => 'tag/delete', + ActionsInterface::TAG_SEARCH => 'tag/search', + ActionsInterface::GROUP_VIEW => 'userGroup/view', + ActionsInterface::GROUP_CREATE => 'userGroup/create', + ActionsInterface::GROUP_EDIT => 'userGroup/edit', + ActionsInterface::GROUP_DELETE => 'userGroup/delete', + ActionsInterface::GROUP_SEARCH => 'userGroup/search', ActionsInterface::CONFIG_BACKUP_RUN => 'config/backup', ActionsInterface::CONFIG_EXPORT_RUN => 'config/export', ]; @@ -95,9 +96,8 @@ abstract class ApiTestCase extends TestCase */ protected static function processJsonResponse( Response $response, - bool $exceptionOnError = true - ): stdClass - { + bool $exceptionOnError = true + ): stdClass { if ($exceptionOnError && $response->status()->getCode() !== 200) { throw new RuntimeException($response->status()->getMessage()); } @@ -132,7 +132,7 @@ abstract class ApiTestCase extends TestCase ->addDefinitions( APP_DEFINITIONS_FILE, [ - ApiRequest::class => function (ContainerInterface $c) use ($actionId, $params) { + ApiRequest::class => function (ContainerInterface $c) use ($actionId, $params) { $token = self::createApiToken( $c->get(AuthTokenService::class), $actionId @@ -140,20 +140,20 @@ abstract class ApiTestCase extends TestCase $data = [ 'jsonrpc' => '2.0', - 'method' => self::METHOD_ACTION_MAP[$actionId], - 'params' => array_merge( + 'method' => self::METHOD_ACTION_MAP[$actionId], + 'params' => array_merge( [ 'authToken' => $token->getToken(), 'tokenPass' => self::AUTH_TOKEN_PASS, ], $params ), - 'id' => 1 + 'id' => 1, ]; return new ApiRequest(json_encode($data, JSON_THROW_ON_ERROR)); }, - DBStorageInterface::class => create(MySQLHandler::class) + DBStorageInterface::class => create(MySQLHandler::class) ->constructor($databaseConnectionData), ConfigDataInterface::class => static function (Config $config) use ($databaseConnectionData) { $configData = $config->getConfigData() @@ -167,7 +167,7 @@ abstract class ApiTestCase extends TestCase $config->updateConfig($configData); return $configData; - } + }, ] ) ->build(); @@ -183,20 +183,23 @@ abstract class ApiTestCase extends TestCase [], [], [ - 'HTTP_HOST' => 'localhost:8080', - 'HTTP_ACCEPT' => 'application/json, text/javascript, */*; q=0.01', - 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0', + 'HTTP_HOST' => 'localhost:8080', + 'HTTP_ACCEPT' => 'application/json, text/javascript, */*; q=0.01', + 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0', 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.5', 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', - 'REQUEST_URI' => '/api.php', - 'REQUEST_METHOD' => 'POST', - 'HTTP_CONTENT_TYPE' => 'application/json' + 'REQUEST_URI' => '/api.php', + 'REQUEST_METHOD' => 'POST', + 'HTTP_CONTENT_TYPE' => 'application/json', ], [], null ); - $router = (new Bootstrap($dic))->getRouter(); + $router = $dic->get(Klein::class); + $request = $dic->get(\SP\Http\Request::class); + + $bs = new BootstrapApi(self::$configData, $router, $request); $router->dispatch($request, null, false); return $router->response(); @@ -211,9 +214,8 @@ abstract class ApiTestCase extends TestCase */ private static function createApiToken( AuthTokenService $service, - int $actionId - ): AuthTokenData - { + int $actionId + ): AuthTokenData { $data = new AuthTokenData(); $data->setActionId($actionId); $data->setCreatedBy(1);