. * * 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\Metadata; use Espo\Core\Utils\Cache\DataCacheAccess; use Espo\Core\Utils\Config\ApplicationConfig; use stdClass; class AuthorizationServerMetadataProvider { private const string CACHE_KEY = 'oAuthServer/authorizationServerMetadata'; /** * @param DataCacheAccess $dataCacheAccess */ public function __construct( private DataCacheAccess $dataCacheAccess, private ApplicationConfig $applicationConfig, ) { $this->dataCacheAccess->init( key: self::CACHE_KEY, loader: fn () => $this->buildData(), ); } public function get(): stdClass { return $this->dataCacheAccess->get(); } private function buildData(): stdClass { return (object) [ 'issuer' => self::serverIdentifierFromUrl($this->applicationConfig->getSiteUrl()), 'authorization_endpoint' => $this->applicationConfig->getSiteUrl() . '/oauth/authorize', 'token_endpoint' => $this->applicationConfig->getSiteUrl() . '/oauth/token', 'revocation_endpoint' => $this->applicationConfig->getSiteUrl() . '/oauth/token/revoke', ]; } private static function serverIdentifierFromUrl(string $url): string { $parsed = parse_url($url); $scheme = isset($parsed['scheme']) ? $parsed['scheme'] . '://' : ''; $host = $parsed['host'] ?? ''; $port = isset($parsed['port']) ? ':' . $parsed['port'] : ''; return $scheme . $host . $port; } }