48 lines
1.6 KiB
PHP
48 lines
1.6 KiB
PHP
<?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;
|
|
}
|
|
}
|