. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\EntryPoint; use Espo\Core\Exceptions\NotFound; use Espo\Core\Api\Request; use Espo\Core\Api\Response; use Espo\Core\Exceptions\NotFoundSilent; use Espo\Core\InjectableFactory; use Espo\Core\Utils\ClassFinder; use Espo\Core\Utils\Metadata; /** * Runs entry points. */ class EntryPointManager { public function __construct( private InjectableFactory $injectableFactory, private ClassFinder $classFinder, private Metadata $metadata, ) {} /** * @throws NotFound */ public function checkAuthRequired(string $name): bool { $metaParams = $this->getMetaParams($name); if ($metaParams->noAuth) { return false; } $className = $this->getClassName($name); if (!$className) { throw new NotFoundSilent("Entry point '$name' not found."); } $noAuth = false; if (isset($className::$noAuth)) { $noAuth = $className::$noAuth; } if ($noAuth) { return false; } // for backward compatibility return $className::$authRequired ?? true; } /** * @throws NotFound */ public function run(string $name, Request $request, Response $response): void { $className = $this->getClassName($name); if (!$className) { throw new NotFoundSilent("Entry point '$name' not found."); } $entryPoint = $this->injectableFactory->create($className); $entryPoint->run($request, $response); } /** * @return ?class-string */ private function getClassName(string $name): ?string { $metaParams = $this->getMetaParams($name); if ($metaParams->className) { return $metaParams->className; } /** @var ?class-string */ return $this->classFinder->find('EntryPoints', ucfirst($name)); } public function getMetaParams(string $name): MetaParams { /** * @var array{ * className?: ?class-string, * notExposed?: bool, * noAuth?: bool, * allowedMethods?: ?string[], * consumes?: ?string[] * } $params */ $params = $this->metadata->get("app.entryPoints.$name") ?? []; return new MetaParams( className: $params['className'] ?? null, notExposed: $params['notExposed'] ?? false, noAuth: $params['noAuth'] ?? false, allowedMethods: $params['allowedMethods'] ?? null, consumes: $params['consumes'] ?? null, ); } }