misuzu/src/Routing/RoutingAccessControlHandler.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;
}
}