feat(firewall): add safeguarded rule creation
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -4,7 +4,9 @@ declare(strict_types=1);
|
||||
|
||||
namespace KTXC\Controllers;
|
||||
|
||||
use KTXC\Http\Request\Request;
|
||||
use KTXC\Http\Response\JsonResponse;
|
||||
use KTXC\Service\FirewallRuleConflictException;
|
||||
use KTXC\Service\SystemFirewallLogService;
|
||||
use KTXC\Service\SystemFirewallRuleService;
|
||||
use KTXC\Service\SystemFirewallStatusService;
|
||||
@@ -106,6 +108,58 @@ final class FirewallController extends ControllerAbstract
|
||||
return $this->ruleResponse($this->systemRules->fetchRule($ruleId));
|
||||
}
|
||||
|
||||
#[AuthenticatedRoute(
|
||||
'/firewall/rules',
|
||||
name: 'firewall.tenant.rules.create',
|
||||
methods: ['POST'],
|
||||
permissions: [TenantFirewallRuleService::PERMISSION_MANAGE],
|
||||
)]
|
||||
public function createTenantRule(
|
||||
Request $request,
|
||||
string $type,
|
||||
string $action,
|
||||
string $value,
|
||||
string $reason,
|
||||
?int $durationSeconds = null,
|
||||
bool $confirmCurrentIp = false
|
||||
): JsonResponse {
|
||||
return $this->mutationResponse(fn() => $this->tenantRules->createRule(
|
||||
$type,
|
||||
$action,
|
||||
$value,
|
||||
$reason,
|
||||
$durationSeconds,
|
||||
$request->getClientIp(),
|
||||
$confirmCurrentIp
|
||||
));
|
||||
}
|
||||
|
||||
#[AuthenticatedRoute(
|
||||
'/firewall/system/rules',
|
||||
name: 'firewall.system.rules.create',
|
||||
methods: ['POST'],
|
||||
permissions: [SystemFirewallRuleService::PERMISSION_MANAGE],
|
||||
)]
|
||||
public function createSystemRule(
|
||||
Request $request,
|
||||
string $type,
|
||||
string $action,
|
||||
string $value,
|
||||
string $reason,
|
||||
?int $durationSeconds = null,
|
||||
bool $confirmCurrentIp = false
|
||||
): JsonResponse {
|
||||
return $this->mutationResponse(fn() => $this->systemRules->createRule(
|
||||
$type,
|
||||
$action,
|
||||
$value,
|
||||
$reason,
|
||||
$durationSeconds,
|
||||
$request->getClientIp(),
|
||||
$confirmCurrentIp
|
||||
));
|
||||
}
|
||||
|
||||
#[AuthenticatedRoute(
|
||||
'/firewall/logs',
|
||||
name: 'firewall.tenant.logs.list',
|
||||
@@ -231,4 +285,21 @@ final class FirewallController extends ControllerAbstract
|
||||
return new JsonResponse(['error' => $error->getMessage()], JsonResponse::HTTP_BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
|
||||
private function mutationResponse(callable $mutation): JsonResponse
|
||||
{
|
||||
try {
|
||||
return new JsonResponse(['rule' => $mutation()], JsonResponse::HTTP_CREATED);
|
||||
} catch (FirewallRuleConflictException $error) {
|
||||
return new JsonResponse(['error' => [
|
||||
'code' => $error->conflictCode,
|
||||
'message' => $error->getMessage(),
|
||||
]], JsonResponse::HTTP_CONFLICT);
|
||||
} catch (\InvalidArgumentException $error) {
|
||||
return new JsonResponse(['error' => [
|
||||
'code' => 'invalid_firewall_rule',
|
||||
'message' => $error->getMessage(),
|
||||
]], JsonResponse::HTTP_BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user