feat(firewall): add tenant and system rule scopes
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -11,6 +11,9 @@ use KTXF\Json\JsonDeserializable;
|
||||
*/
|
||||
class FirewallRuleObject implements \JsonSerializable, JsonDeserializable
|
||||
{
|
||||
public const SCOPE_TENANT = 'tenant';
|
||||
public const SCOPE_SYSTEM = 'system';
|
||||
|
||||
public const TYPE_IP = 'ip';
|
||||
public const TYPE_IP_RANGE = 'ip_range';
|
||||
public const TYPE_DEVICE = 'device';
|
||||
@@ -19,6 +22,7 @@ class FirewallRuleObject implements \JsonSerializable, JsonDeserializable
|
||||
public const ACTION_BLOCK = 'block';
|
||||
|
||||
private ?string $id = null;
|
||||
private string $scope = self::SCOPE_TENANT;
|
||||
private ?string $tenantId = null;
|
||||
private ?string $type = null; // ip, ip_range, device
|
||||
private ?string $action = null; // allow, block
|
||||
@@ -42,6 +46,10 @@ class FirewallRuleObject implements \JsonSerializable, JsonDeserializable
|
||||
$this->id = $data['id'] !== null ? (string)$data['id'] : null;
|
||||
}
|
||||
|
||||
if (!array_key_exists('scope', $data)) {
|
||||
throw new \InvalidArgumentException('Firewall rules require an explicit scope.');
|
||||
}
|
||||
$this->setScope((string)$data['scope']);
|
||||
if (array_key_exists('tenantId', $data)) {
|
||||
$this->tenantId = $data['tenantId'] !== null ? (string)$data['tenantId'] : null;
|
||||
}
|
||||
@@ -84,6 +92,7 @@ class FirewallRuleObject implements \JsonSerializable, JsonDeserializable
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'scope' => $this->scope,
|
||||
'tenantId' => $this->tenantId,
|
||||
'type' => $this->type,
|
||||
'action' => $this->action,
|
||||
@@ -134,6 +143,42 @@ class FirewallRuleObject implements \JsonSerializable, JsonDeserializable
|
||||
return $this->tenantId;
|
||||
}
|
||||
|
||||
public function getScope(): string
|
||||
{
|
||||
return $this->scope;
|
||||
}
|
||||
|
||||
public function setScope(string $scope): self
|
||||
{
|
||||
if (!in_array($scope, [self::SCOPE_TENANT, self::SCOPE_SYSTEM], true)) {
|
||||
throw new \InvalidArgumentException("Invalid firewall rule scope: {$scope}");
|
||||
}
|
||||
|
||||
$this->scope = $scope;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function isTenantScoped(): bool
|
||||
{
|
||||
return $this->scope === self::SCOPE_TENANT;
|
||||
}
|
||||
|
||||
public function isSystemScoped(): bool
|
||||
{
|
||||
return $this->scope === self::SCOPE_SYSTEM;
|
||||
}
|
||||
|
||||
public function assertValidScopeOwnership(): void
|
||||
{
|
||||
if ($this->isTenantScoped() && ($this->tenantId === null || $this->tenantId === '')) {
|
||||
throw new \InvalidArgumentException('Tenant firewall rules require a tenant ID.');
|
||||
}
|
||||
|
||||
if ($this->isSystemScoped() && $this->tenantId !== null) {
|
||||
throw new \InvalidArgumentException('System firewall rules cannot have a tenant ID.');
|
||||
}
|
||||
}
|
||||
|
||||
public function setTenantId(?string $tenantId): self
|
||||
{
|
||||
$this->tenantId = $tenantId;
|
||||
|
||||
Reference in New Issue
Block a user