. * * 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\Tools\OAuthServer\EntryPoints; use Espo\Core\Api\Request; use Espo\Core\Api\Response; use Espo\Core\EntryPoint\EntryPoint; use Espo\Core\Exceptions\BadRequest; use Espo\Tools\OAuthServer\AuthorizationService; /** * @noinspection PhpUnused */ class AuthorizeComplete implements EntryPoint { public function __construct( private AuthorizationService $service, ) {} public function run(Request $request, Response $response): void { $body = $request->getParsedBody(); $clientId = $body->clientId ?? throw new BadRequest("No 'clientId'."); $approved = ($body->approved ?? null) === 'true'; if (!is_string($clientId)) { throw new BadRequest(); } $scopes = $this->fetchScopes($request); $psr7Response = $this->service->authorizeComplete( clientId: $clientId, response: $response->toPsr7(), approved: $approved, scopes: $scopes, ); $response->applyPsr7($psr7Response); } /** * @return non-empty-string[] * @throws BadRequest */ private function fetchScopes(Request $request): array { $scopesRaw = $request->getParsedBody()->scopes ?? throw new BadRequest("No 'scopes'."); $scopes = explode(' ', $scopesRaw); foreach ($scopes as $scope) { if (!$scope) { throw new BadRequest("Bad 'scopes' item values."); } if ($scope !== trim($scope)) { throw new BadRequest("Bad scope."); } } /** @var non-empty-string[] */ return $scopes; } }