Added CIDR syntax validators.

This commit is contained in:
Daniele Maglie 2024-01-21 14:19:18 +01:00
parent ca324d66c7
commit 3d3a9cd527
3 changed files with 94 additions and 2 deletions

View file

@ -38,7 +38,7 @@ class Config:
return toml.load(file_path)
except FileNotFoundError:
raise ConfigNotFound(f'Impossibile trovare file {file_path}')
raise ConfigNotFound(f'Could not find path `{file_path}`')
def get(self, key: str) -> str | Exception:
"""
@ -52,7 +52,7 @@ class Config:
return self.config_content[key]
except KeyError:
raise ConfigKeyNotFound(f'Impossibile trovare chiave {key}')
raise ConfigKeyNotFound(f'Could not find key `{key}`')
def get_all(self, key: str = None) -> any:
"""

View file

@ -0,0 +1,46 @@
from piracyshield_component.validation.rule import Rule
import ipaddress
class CIDRSyntaxIPv4(Rule):
"""
Rule that checks for a valid IPv4 CIDR syntax.
"""
message = 'IPv4 CIDR syntax not valid'
def __init__(self):
"""
Initialize parent __init__.
"""
super().__init__()
def __call__(self, value: str) -> None:
"""
Checks the validity of the passed string.
:param value: a valid CIDR syntax string.
"""
try:
# doesn't seem solid enough, but we're not too paranoid
if '/' not in value:
self.register_error(self.message)
return False
network = ipaddress.ip_network(value, strict = True)
# make sure we have at least one address
if network.num_addresses < 1:
self.register_error(self.message)
return False
# non valid at all
except ValueError:
self.register_error(self.message)
return False

View file

@ -0,0 +1,46 @@
from piracyshield_component.validation.rule import Rule
import ipaddress
class CIDRSyntaxIPv6(Rule):
"""
Rule that checks for a valid IPv6 CIDR syntax.
"""
message = 'IPv6 CIDR syntax not valid'
def __init__(self):
"""
Initialize parent __init__.
"""
super().__init__()
def __call__(self, value: str) -> None:
"""
Checks the validity of the passed string.
:param value: a valid CIDR syntax string.
"""
try:
# doesn't seem solid enough, but we're not too paranoid
if '/' not in value:
self.register_error(self.message)
return False
network = ipaddress.ip_network(value, strict = True)
# check for a single IPv6 address
if network.prefixlen > 128:
self.register_error(self.message)
return False
# non valid at all
except ValueError:
self.register_error(self.message)
return False