<?php namespace Misuzu\Routing; use Index\Config\Config; use Index\Http\HttpUri; use Index\Http\Routing\HandlerContext; use Index\Http\Routing\Routes\RouteInfo; use Index\Http\Routing\AccessControl\{AccessControl,SimpleAccessControlHandler}; class RoutingAccessControlHandler extends SimpleAccessControlHandler { public function __construct( private Config $config, ) {} /** @param string[] $origins */ public static function filterOrigin(array $origins, HttpUri $origin): ?string { $host = '.' . $origin->host; foreach($origins as $allowed) if(str_ends_with($host, '.' . $allowed)) return (string)$origin; return null; } #[\Override] public function checkAccess( HandlerContext $context, AccessControl $accessControl, HttpUri $origin, ?RouteInfo $routeInfo = null, ): string|bool { if($accessControl->credentials) { $result = null; if($context->request->requestTarget === '/_sockchat' || str_starts_with($context->request->requestTarget, '/_sockchat/')) { $result = self::filterOrigin($this->config->getArray('sockChat.origins'), $origin); } elseif($context->request->requestTarget === '/storage' || str_starts_with($context->request->requestTarget, '/storage/')) { $result = self::filterOrigin($this->config->getArray('storage.origins'), $origin); } if($result !== null) return $result; } return true; } }