mirror of
https://github.com/fuckpiracyshield/data-model.git
synced 2024-11-21 12:59:47 +01:00
Initial commit.
This commit is contained in:
commit
c38cd3f855
74 changed files with 3111 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
__pycache__/
|
||||||
|
build/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
*.egg
|
||||||
|
*.egg-info/
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
### Data Model
|
||||||
|
|
||||||
|
Mandatory requirements and rules for parameters.
|
5
pyproject.toml
Normal file
5
pyproject.toml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[build-system]
|
||||||
|
requires = [
|
||||||
|
"setuptools>=54",
|
||||||
|
]
|
||||||
|
build-backend = "setuptools.build_meta"
|
13
setup.cfg
Normal file
13
setup.cfg
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
[metadata]
|
||||||
|
name = piracyshield_data_model
|
||||||
|
version = 1.0.0
|
||||||
|
description = Data Model
|
||||||
|
|
||||||
|
[options]
|
||||||
|
package_dir=
|
||||||
|
=src
|
||||||
|
packages = find:
|
||||||
|
python_requires = >= 3.9
|
||||||
|
|
||||||
|
[options.packages.find]
|
||||||
|
where = src
|
1
src/piracyshield_data_model/__init__.py
Normal file
1
src/piracyshield_data_model/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
1
src/piracyshield_data_model/account/__init__.py
Normal file
1
src/piracyshield_data_model/account/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
1
src/piracyshield_data_model/account/flags/__init__.py
Normal file
1
src/piracyshield_data_model/account/flags/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
45
src/piracyshield_data_model/account/flags/model.py
Normal file
45
src/piracyshield_data_model/account/flags/model.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
class AccountFlagsModel(BaseModel):
|
||||||
|
|
||||||
|
flags = {
|
||||||
|
'change_password': False
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, flags: dict):
|
||||||
|
# little hack
|
||||||
|
self.flags = self.flags
|
||||||
|
|
||||||
|
if not all(flag in self.flags.keys() for flag in flags.keys()):
|
||||||
|
raise AccountFlagsModelUnknownFlagException()
|
||||||
|
|
||||||
|
self.flags['change_password'] = self._validate_flag(flags['change_password'])
|
||||||
|
|
||||||
|
def _validate_flag(self, value: bool) -> bool | Exception:
|
||||||
|
"""
|
||||||
|
Validates the single flag value.
|
||||||
|
|
||||||
|
:param value: true/false if the flag is active or not.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if isinstance(value, bool):
|
||||||
|
return value
|
||||||
|
|
||||||
|
raise AccountFlagsModelChangePasswordException()
|
||||||
|
|
||||||
|
class AccountFlagsModelUnknownFlagException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Unknown flag.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountFlagsModelValueException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
241
src/piracyshield_data_model/account/model.py
Normal file
241
src/piracyshield_data_model/account/model.py
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.account.role.model import AccountRoleModel
|
||||||
|
|
||||||
|
class AccountModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Central account data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
account_id = None
|
||||||
|
|
||||||
|
name = None
|
||||||
|
|
||||||
|
email = None
|
||||||
|
|
||||||
|
password = None
|
||||||
|
|
||||||
|
role = None
|
||||||
|
|
||||||
|
is_active = True
|
||||||
|
|
||||||
|
def __init__(self, account_id: str, name: str, email: str, password: str, confirm_password: str, role: int, is_active: bool):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param account_id: a valid account identifier.
|
||||||
|
:param name: name of the account.
|
||||||
|
:param email: e-mail of the account.
|
||||||
|
:param password: a valid password.
|
||||||
|
:param confirm_password: the exact copy of the password.
|
||||||
|
:param role: an int identifying the account role.
|
||||||
|
:param is_active: whether the account is active or not.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.account_id = self._validate_account_id(account_id)
|
||||||
|
|
||||||
|
self.name = self._validate_name(name)
|
||||||
|
|
||||||
|
self.email = self._validate_email(email)
|
||||||
|
|
||||||
|
self.password = self._validate_password(password)
|
||||||
|
|
||||||
|
self.confirm_password = self._validate_confirm_password(confirm_password)
|
||||||
|
|
||||||
|
self.role = self._validate_role(role)
|
||||||
|
|
||||||
|
self.is_active = self._validate_is_active(is_active)
|
||||||
|
|
||||||
|
def _validate_account_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account identifier.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelAccountIDException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_name(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account name.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.NAME)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelNameException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_email(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account e-mail.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.EMAIL)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelEmailException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_password(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account password.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.PASSWORD)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelPasswordException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_confirm_password(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the password confirmation.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.PASSWORD)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelConfirmPasswordException(validator.errors)
|
||||||
|
|
||||||
|
# finally verify if the two passwords match
|
||||||
|
if value != self.password:
|
||||||
|
raise AccountModelConfirmPasswordMismatchException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_role(self, value: int) -> int | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account role identifier.
|
||||||
|
|
||||||
|
:param value: a valid integer based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ROLE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AccountModelRoleException(validator.errors)
|
||||||
|
|
||||||
|
try:
|
||||||
|
enum = AccountRoleModel(value)
|
||||||
|
|
||||||
|
return enum.value
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
raise AccountModelRoleException()
|
||||||
|
|
||||||
|
def _validate_is_active(self, value: bool) -> bool | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account status.
|
||||||
|
|
||||||
|
:param value: true/false if active or not.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if isinstance(value, bool):
|
||||||
|
return value
|
||||||
|
|
||||||
|
raise AccountModelIsActiveException()
|
||||||
|
|
||||||
|
class AccountModelAccountIDException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid account identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelNameException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid name.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelEmailException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid e-mail address.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelPasswordException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelConfirmPasswordException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid confirm password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelConfirmPasswordMismatchException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Confirm password differs from password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelRoleException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid role.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AccountModelIsActiveException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid is active value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
1
src/piracyshield_data_model/account/role/__init__.py
Normal file
1
src/piracyshield_data_model/account/role/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
15
src/piracyshield_data_model/account/role/model.py
Normal file
15
src/piracyshield_data_model/account/role/model.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from enum import IntEnum
|
||||||
|
|
||||||
|
class AccountRoleModel(IntEnum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Account types with relative identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
GUEST = 100
|
||||||
|
|
||||||
|
INTERNAL = 200
|
||||||
|
|
||||||
|
REPORTER = 300
|
||||||
|
|
||||||
|
PROVIDER = 400
|
39
src/piracyshield_data_model/account/rule.py
Normal file
39
src/piracyshield_data_model/account/rule.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.email import Email
|
||||||
|
|
||||||
|
class AccountRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for new account generation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ACCOUNT_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
||||||
|
|
||||||
|
NAME = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = ' _-.'),
|
||||||
|
Length(minimum = 3, maximum = 255)
|
||||||
|
]
|
||||||
|
|
||||||
|
EMAIL = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = '@._-'),
|
||||||
|
Email()
|
||||||
|
]
|
||||||
|
|
||||||
|
PASSWORD = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = '-_%~&@'),
|
||||||
|
Length(minimum = 8, maximum = 32)
|
||||||
|
]
|
||||||
|
|
||||||
|
ROLE = [
|
||||||
|
Required(),
|
||||||
|
Length(minimum = 3, maximum = 3)
|
||||||
|
]
|
1
src/piracyshield_data_model/authentication/__init__.py
Normal file
1
src/piracyshield_data_model/authentication/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
77
src/piracyshield_data_model/authentication/model.py
Normal file
77
src/piracyshield_data_model/authentication/model.py
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.authentication.rule import AuthenticationRule
|
||||||
|
|
||||||
|
class AuthenticationModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Authentication data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
email = None
|
||||||
|
|
||||||
|
password = None
|
||||||
|
|
||||||
|
def __init__(self, email: str, password: str):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param email: e-mail of the account.
|
||||||
|
:param password: a valid password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.email = self._validate_email(email)
|
||||||
|
|
||||||
|
self.password = self._validate_password(password)
|
||||||
|
|
||||||
|
def _validate_email(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account email.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AuthenticationRule.EMAIL)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AuthenticationModelEmailException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_password(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the account password.
|
||||||
|
|
||||||
|
:param value: a valid string based on the required rules.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, AuthenticationRule.PASSWORD)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise AuthenticationModelPasswordException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class AuthenticationModelEmailException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid e-mail address.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AuthenticationModelPasswordException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid password.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
22
src/piracyshield_data_model/authentication/rule.py
Normal file
22
src/piracyshield_data_model/authentication/rule.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.email import Email
|
||||||
|
|
||||||
|
class AuthenticationRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for user authentication.
|
||||||
|
"""
|
||||||
|
|
||||||
|
EMAIL = [
|
||||||
|
Required(),
|
||||||
|
String('@._-'),
|
||||||
|
Email()
|
||||||
|
]
|
||||||
|
|
||||||
|
PASSWORD = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = '-_%~&@'),
|
||||||
|
Length(minimum = 8, maximum = 32)
|
||||||
|
]
|
19
src/piracyshield_data_model/base.py
Normal file
19
src/piracyshield_data_model/base.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
class BaseModel:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Base data modeling class with utilities.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def to_dict(self) -> dict:
|
||||||
|
"""
|
||||||
|
Exports the set data into a dictionary.
|
||||||
|
"""
|
||||||
|
|
||||||
|
output = {}
|
||||||
|
|
||||||
|
for key, value in self.__dict__.items():
|
||||||
|
if value is not None:
|
||||||
|
output[key] = value
|
||||||
|
|
||||||
|
return output
|
1
src/piracyshield_data_model/dda/__init__.py
Normal file
1
src/piracyshield_data_model/dda/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
177
src/piracyshield_data_model/dda/model.py
Normal file
177
src/piracyshield_data_model/dda/model.py
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.dda.rule import DDARule
|
||||||
|
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
class DDAModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
DDA data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
dda_id = None
|
||||||
|
|
||||||
|
description = None
|
||||||
|
|
||||||
|
instance = None
|
||||||
|
|
||||||
|
account_id = None
|
||||||
|
|
||||||
|
is_active = True
|
||||||
|
|
||||||
|
def __init__(self, dda_id: str, description: str, instance: str, account_id: str, is_active: bool):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param dda_id: a valid DDA identifier.
|
||||||
|
:param description: textual description.
|
||||||
|
:param instance: DDA instance.
|
||||||
|
:param account_id: reporter account assigned to this DDA.
|
||||||
|
:param is_active: enable/disable this item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.dda_id = self._validate_dda_id(dda_id)
|
||||||
|
|
||||||
|
self.description = self._validate_description(description)
|
||||||
|
|
||||||
|
self.instance = self._validate_instance(instance)
|
||||||
|
|
||||||
|
self.account_id = self._validate_account_id(account_id)
|
||||||
|
|
||||||
|
self.is_active = is_active
|
||||||
|
|
||||||
|
def _validate_dda_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the DDA identifier.
|
||||||
|
|
||||||
|
:param value: a valid DDA identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, DDARule.DDA_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise DDAModelDDAIdException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_description(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates description.
|
||||||
|
|
||||||
|
:param value: a valid string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise DDAModelDescriptionMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, DDARule.DESCRIPTION)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise DDAModelDescriptionNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_instance(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates DDA instance.
|
||||||
|
|
||||||
|
:param value: the DDA instance.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise DDAModelInstanceMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, DDARule.INSTANCE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise DDAModelInstanceNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_account_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates account identifier.
|
||||||
|
|
||||||
|
:param value: the account identifier.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise DDAModelAccountIdMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise DDAModelAccountIdNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class DDAModelDDAIdException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid DDA identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelDescriptionMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No description passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelDescriptionNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid description.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelInstanceMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No DDA instance passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelInstanceNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid DDA instance.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelAccountIdMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non account identifier passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DDAModelAccountIdNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid account identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
27
src/piracyshield_data_model/dda/rule.py
Normal file
27
src/piracyshield_data_model/dda/rule.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.dda import DDA
|
||||||
|
|
||||||
|
class DDARule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for a DDA item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
DDA_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
||||||
|
|
||||||
|
DESCRIPTION = [
|
||||||
|
Required(),
|
||||||
|
String(' .,-_@'),
|
||||||
|
Length(minimum = 3, maximum = 255)
|
||||||
|
]
|
||||||
|
|
||||||
|
INSTANCE = [
|
||||||
|
Required(),
|
||||||
|
DDA()
|
||||||
|
]
|
1
src/piracyshield_data_model/forensic/__init__.py
Normal file
1
src/piracyshield_data_model/forensic/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
1
src/piracyshield_data_model/forensic/archive/__init__.py
Normal file
1
src/piracyshield_data_model/forensic/archive/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
87
src/piracyshield_data_model/forensic/archive/model.py
Normal file
87
src/piracyshield_data_model/forensic/archive/model.py
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.forensic.status.model import ForensicArchiveStatusModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
from piracyshield_data_model.forensic.archive.rule import ForensicArchiveRule
|
||||||
|
|
||||||
|
class ForensicArchiveModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Forensic evidence data modeling class.
|
||||||
|
|
||||||
|
This class refers to the physical forensic evidence archive.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_id = None
|
||||||
|
|
||||||
|
name = None
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
def __init__(self, ticket_id: str, name: str):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param ticket_id: a valid ticket identifier.
|
||||||
|
:param archive_name: the name of the archive.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.ticket_id = self._validate_ticket_id(ticket_id)
|
||||||
|
|
||||||
|
self.name = self._validate_name(name)
|
||||||
|
|
||||||
|
self.status = ForensicArchiveStatusModel.SCHEDULED.value
|
||||||
|
|
||||||
|
def _validate_ticket_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.TICKET_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise ForensicModelForensicIDException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_name(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param archive_name: a valid string containing only the name of the archive.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, ForensicArchiveRule.NAME)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise ForensicArchiveModelNameException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class ForensicArchiveModelTicketIDException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ForensicArchiveModelNameException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid archive name.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
15
src/piracyshield_data_model/forensic/archive/rule.py
Normal file
15
src/piracyshield_data_model/forensic/archive/rule.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
|
||||||
|
class ForensicArchiveRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for forensic archives.
|
||||||
|
"""
|
||||||
|
|
||||||
|
NAME = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = '.-_'),
|
||||||
|
Length(minimum = 6, maximum = 128)
|
||||||
|
]
|
1
src/piracyshield_data_model/forensic/format/__init__.py
Normal file
1
src/piracyshield_data_model/forensic/format/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
13
src/piracyshield_data_model/forensic/format/model.py
Normal file
13
src/piracyshield_data_model/forensic/format/model.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
class ForensicFormatsModel:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Forensic archive formats.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ZIP = 'zip'
|
||||||
|
|
||||||
|
RAR = 'rar'
|
||||||
|
|
||||||
|
def get_formats(self):
|
||||||
|
return [attr for attr in dir(self) if attr.isupper()]
|
1
src/piracyshield_data_model/forensic/hash/__init__.py
Normal file
1
src/piracyshield_data_model/forensic/hash/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
98
src/piracyshield_data_model/forensic/hash/model.py
Normal file
98
src/piracyshield_data_model/forensic/hash/model.py
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.forensic.status.model import ForensicArchiveStatusModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.forensic.hash.rule import ForensicHashRule
|
||||||
|
|
||||||
|
class ForensicHashModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Hash data modeling class.
|
||||||
|
|
||||||
|
This is an extension to validate forensic evidences hashes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
hash_string = None
|
||||||
|
|
||||||
|
hash_type = None
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
def __init__(self, hash_string: str, hash_type: str):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param hash_string: a valid hash string based on its type.
|
||||||
|
:param hash_type: type of the hash.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.hash_type = self._validate_type(hash_type)
|
||||||
|
|
||||||
|
self.hash_string = self._validate_string(hash_string, self.hash_type)
|
||||||
|
|
||||||
|
self.status = ForensicArchiveStatusModel.PENDING.value
|
||||||
|
|
||||||
|
def _validate_type(self, hash_type: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the hash.
|
||||||
|
|
||||||
|
:param hash_type: type of the hash.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# dirty hack to get the list of rules
|
||||||
|
hash_types = ForensicHashRule().get_hash_types()
|
||||||
|
|
||||||
|
hash_type = hash_type.upper()
|
||||||
|
|
||||||
|
if hash_type not in hash_types:
|
||||||
|
raise ForensicHashModelNotSupportedException()
|
||||||
|
|
||||||
|
return hash_type
|
||||||
|
|
||||||
|
def _validate_string(self, hash_string: str, hash_type: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the hash string.
|
||||||
|
|
||||||
|
:param hash_string: a valid hash string.
|
||||||
|
:param hash_type: type of the hash.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not len(hash_string):
|
||||||
|
raise ForensicHashModelHashMissingException()
|
||||||
|
|
||||||
|
validator = Validator(hash_string, getattr(ForensicHashRule, hash_type))
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise ForensicHashModelNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return hash_string
|
||||||
|
|
||||||
|
class ForensicHashModelStringMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Hash string is missing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ForensicHashModelNotSupportedException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non supported hash type.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ForensicHashModelNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid hash string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
42
src/piracyshield_data_model/forensic/hash/rule.py
Normal file
42
src/piracyshield_data_model/forensic/hash/rule.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
|
||||||
|
class ForensicHashRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for hashes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
SHA256 = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 64, maximum = 64)
|
||||||
|
]
|
||||||
|
|
||||||
|
SHA384 = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 96, maximum = 96)
|
||||||
|
]
|
||||||
|
|
||||||
|
SHA512 = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 128, maximum = 128)
|
||||||
|
]
|
||||||
|
|
||||||
|
BLAKE2B = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 128, maximum = 128) # accept only default digest size
|
||||||
|
]
|
||||||
|
|
||||||
|
BLAKE2S = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 128, maximum = 128) # accept only default digest size
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_hash_types(self):
|
||||||
|
return [attr for attr in dir(self) if attr.isupper()]
|
1
src/piracyshield_data_model/forensic/status/__init__.py
Normal file
1
src/piracyshield_data_model/forensic/status/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
17
src/piracyshield_data_model/forensic/status/model.py
Normal file
17
src/piracyshield_data_model/forensic/status/model.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class ForensicArchiveStatusModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Forensic archive analysis status.
|
||||||
|
"""
|
||||||
|
|
||||||
|
PENDING = 'pending'
|
||||||
|
|
||||||
|
SCHEDULED = 'scheduled'
|
||||||
|
|
||||||
|
IN_PROGRESS = 'in progress'
|
||||||
|
|
||||||
|
APPROVED = 'approved'
|
||||||
|
|
||||||
|
REJECTED = 'rejected'
|
1
src/piracyshield_data_model/guest/__init__.py
Normal file
1
src/piracyshield_data_model/guest/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
19
src/piracyshield_data_model/guest/model.py
Normal file
19
src/piracyshield_data_model/guest/model.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
from piracyshield_data_model.account.model import AccountModel
|
||||||
|
from piracyshield_data_model.account.role.model import AccountRoleModel
|
||||||
|
|
||||||
|
class GuestModel(AccountModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Guest account data modeling class.
|
||||||
|
|
||||||
|
Currently not fully implemented.
|
||||||
|
"""
|
||||||
|
|
||||||
|
role = AccountRoleModel.GUEST
|
||||||
|
|
||||||
|
def __init__(self, account_id: str, name: str, email: str, password: str, confirm_password: str, is_active: bool):
|
||||||
|
"""
|
||||||
|
Extends the functionality from a general account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
super().__init__(account_id, name, email, password, confirm_password, self.role, is_active)
|
1
src/piracyshield_data_model/internal/__init__.py
Normal file
1
src/piracyshield_data_model/internal/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
17
src/piracyshield_data_model/internal/model.py
Normal file
17
src/piracyshield_data_model/internal/model.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from piracyshield_data_model.account.model import AccountModel
|
||||||
|
from piracyshield_data_model.account.role.model import AccountRoleModel
|
||||||
|
|
||||||
|
class InternalModel(AccountModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Internal account data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
role = AccountRoleModel.INTERNAL
|
||||||
|
|
||||||
|
def __init__(self, account_id: str, name: str, email: str, password: str, confirm_password: str, is_active: bool):
|
||||||
|
"""
|
||||||
|
Extends the functionality from a general account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
super().__init__(account_id, name, email, password, confirm_password, self.role, is_active)
|
1
src/piracyshield_data_model/log/__init__.py
Normal file
1
src/piracyshield_data_model/log/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
20
src/piracyshield_data_model/log/rule.py
Normal file
20
src/piracyshield_data_model/log/rule.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
|
||||||
|
class LogRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for log records.
|
||||||
|
"""
|
||||||
|
|
||||||
|
LOG_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
||||||
|
|
||||||
|
MESSAGE = [
|
||||||
|
Required(),
|
||||||
|
Length(minimum = 3, maximum = 500)
|
||||||
|
]
|
1
src/piracyshield_data_model/log/ticket/__init__.py
Normal file
1
src/piracyshield_data_model/log/ticket/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
1
src/piracyshield_data_model/log/ticket/item/__init__.py
Normal file
1
src/piracyshield_data_model/log/ticket/item/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
101
src/piracyshield_data_model/log/ticket/item/model.py
Normal file
101
src/piracyshield_data_model/log/ticket/item/model.py
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.rule import TicketItemRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.log.rule import LogRule
|
||||||
|
|
||||||
|
class LogTicketItemModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item logging data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_item_id = None
|
||||||
|
|
||||||
|
message = None
|
||||||
|
|
||||||
|
def __init__(self, ticket_item_id: str, message: str):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param ticket_item_id: a valid ticket item identifier.
|
||||||
|
:param message: value of the item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.ticket_item_id = self._validate_ticket_item_id(ticket_item_id)
|
||||||
|
|
||||||
|
self.message = self._validate_message(message)
|
||||||
|
|
||||||
|
def _validate_ticket_item_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket item identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket item identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise LogTicketItemModelTicketItemIdentifierMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketItemRule.TICKET_ITEM_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise LogTicketItemModelTicketItemIdentifierNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_message(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the message.
|
||||||
|
|
||||||
|
:param value: a valid message string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise LogTicketItemModelMessageMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, LogRule.MESSAGE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise LogTicketItemModelMessageNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class LogTicketItemModelTicketItemIdentifierMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing ticket item identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketItemModelTicketItemIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket item identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketItemModelMessageMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing message.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketItemModelMessageNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid message.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
95
src/piracyshield_data_model/log/ticket/model.py
Normal file
95
src/piracyshield_data_model/log/ticket/model.py
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.log.rule import LogRule
|
||||||
|
|
||||||
|
class LogTicketModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket logging data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_id = None
|
||||||
|
|
||||||
|
message = None
|
||||||
|
|
||||||
|
def __init__(self, ticket_id: str, message: str):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param identifier: a valid identifier that represent the service object of the logging.
|
||||||
|
:param message: value of the item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.ticket_id = self._validate_ticket_id(ticket_id)
|
||||||
|
|
||||||
|
self.message = self._validate_message(message)
|
||||||
|
|
||||||
|
def _validate_ticket_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.TICKET_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise LogTicketModelTicketIdentifierNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_message(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the message.
|
||||||
|
|
||||||
|
:param value: a valid message string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, LogRule.MESSAGE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise LogTicketModelMessageNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class LogTicketModelTicketIdentifierMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketModelTicketIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketModelMessageMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing message.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class LogTicketModelMessageNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid message.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
1
src/piracyshield_data_model/permission/__init__.py
Normal file
1
src/piracyshield_data_model/permission/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
49
src/piracyshield_data_model/permission/model.py
Normal file
49
src/piracyshield_data_model/permission/model.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
from enum import IntEnum
|
||||||
|
|
||||||
|
class PermissionModel(IntEnum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Permission types with relative identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# account permissions
|
||||||
|
|
||||||
|
CREATE_ACCOUNT = 101
|
||||||
|
|
||||||
|
VIEW_ACCOUNT = 102
|
||||||
|
|
||||||
|
EDIT_ACCOUNT = 103
|
||||||
|
|
||||||
|
DELETE_ACCOUNT = 104
|
||||||
|
|
||||||
|
# ticket permissions
|
||||||
|
|
||||||
|
CREATE_TICKET = 201
|
||||||
|
|
||||||
|
VIEW_TICKET = 202
|
||||||
|
|
||||||
|
EDIT_TICKET = 203
|
||||||
|
|
||||||
|
DELETE_TICKET = 204
|
||||||
|
|
||||||
|
UPLOAD_TICKET = 205
|
||||||
|
|
||||||
|
# whitelist permissions
|
||||||
|
|
||||||
|
CREATE_WHITELIST_ITEM = 301
|
||||||
|
|
||||||
|
VIEW_WHITELIST_ITEM = 302
|
||||||
|
|
||||||
|
EDIT_WHITELIST_ITEM = 303
|
||||||
|
|
||||||
|
DELETE_WHITELIST_ITEM = 304
|
||||||
|
|
||||||
|
# DDA permissions
|
||||||
|
|
||||||
|
CREATE_DDA = 401
|
||||||
|
|
||||||
|
VIEW_DDA = 402
|
||||||
|
|
||||||
|
EDIT_DDA = 403
|
||||||
|
|
||||||
|
DELETE_DDA = 404
|
1
src/piracyshield_data_model/provider/__init__.py
Normal file
1
src/piracyshield_data_model/provider/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
17
src/piracyshield_data_model/provider/model.py
Normal file
17
src/piracyshield_data_model/provider/model.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from piracyshield_data_model.account.model import AccountModel
|
||||||
|
from piracyshield_data_model.account.role.model import AccountRoleModel
|
||||||
|
|
||||||
|
class ProviderModel(AccountModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Provider account data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
role = AccountRoleModel.PROVIDER
|
||||||
|
|
||||||
|
def __init__(self, account_id: str, name: str, email: str, password: str, confirm_password: str, is_active: bool):
|
||||||
|
"""
|
||||||
|
Extends the functionality from a general account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
super().__init__(account_id, name, email, password, confirm_password, self.role, is_active)
|
1
src/piracyshield_data_model/reporter/__init__.py
Normal file
1
src/piracyshield_data_model/reporter/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
17
src/piracyshield_data_model/reporter/model.py
Normal file
17
src/piracyshield_data_model/reporter/model.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from piracyshield_data_model.account.model import AccountModel
|
||||||
|
from piracyshield_data_model.account.role.model import AccountRoleModel
|
||||||
|
|
||||||
|
class ReporterModel(AccountModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Reporter account data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
role = AccountRoleModel.REPORTER
|
||||||
|
|
||||||
|
def __init__(self, account_id: str, name: str, email: str, password: str, confirm_password: str, is_active: bool):
|
||||||
|
"""
|
||||||
|
Extends the functionality from a general account.
|
||||||
|
"""
|
||||||
|
|
||||||
|
super().__init__(account_id, name, email, password, confirm_password, self.role, is_active)
|
1
src/piracyshield_data_model/ticket/__init__.py
Normal file
1
src/piracyshield_data_model/ticket/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
1
src/piracyshield_data_model/ticket/error/__init__.py
Normal file
1
src/piracyshield_data_model/ticket/error/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
227
src/piracyshield_data_model/ticket/error/model.py
Normal file
227
src/piracyshield_data_model/ticket/error/model.py
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.error.rule import TicketErrorRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.genre.model import TicketGenreModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
|
||||||
|
class TicketErrorModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket error data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_error_id = None
|
||||||
|
|
||||||
|
genre = None
|
||||||
|
|
||||||
|
ticket_id = None
|
||||||
|
|
||||||
|
fqdn = []
|
||||||
|
|
||||||
|
ipv4 = []
|
||||||
|
|
||||||
|
ipv6 = []
|
||||||
|
|
||||||
|
def __init__(self, ticket_error_id: str, ticket_id: str, fqdn: list, ipv4: list, ipv6: list):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param ticket_error_id: a valid error ticket identifier.
|
||||||
|
:param ticket_id: a valid ticket identifier.
|
||||||
|
:param fqdn: a list of FQDN items.
|
||||||
|
:param ipv4: a list of IPv4 items.
|
||||||
|
:param ipv6: a list of IPv6 items.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# FQDN, IPv4 and IPv6 should never be all empty
|
||||||
|
if not any([bool(fqdn), bool(ipv4), bool(ipv6)]):
|
||||||
|
raise TicketErrorModelNoDataException
|
||||||
|
|
||||||
|
self.ticket_error_id = self._validate_ticket_error_id(ticket_error_id)
|
||||||
|
|
||||||
|
# this is an error ticket
|
||||||
|
self.genre = TicketGenreModel.ERROR.value
|
||||||
|
|
||||||
|
self.ticket_id = self._validate_ticket_id(ticket_id)
|
||||||
|
|
||||||
|
if fqdn:
|
||||||
|
self.fqdn = self._validate_fqdn(fqdn)
|
||||||
|
|
||||||
|
if ipv4:
|
||||||
|
self.ipv4 = self._validate_ipv4(ipv4)
|
||||||
|
|
||||||
|
if ipv6:
|
||||||
|
self.ipv6 = self._validate_ipv6(ipv6)
|
||||||
|
|
||||||
|
def _validate_ticket_error_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the error ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid error ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketErrorRule.TICKET_ERROR_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketErrorModelTicketErrorIdentifierException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ticket_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.TICKET_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketErrorModelTicketIdentifierException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket FQDN list.
|
||||||
|
|
||||||
|
:param value: a list of FQDNs.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketErrorModelFQDNMissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketErrorModelFQDNNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket IPv4 list.
|
||||||
|
|
||||||
|
:param value: a list of IPv4s.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketErrorModelIPv4MissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketErrorModelIPv4NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket IPv6 list.
|
||||||
|
|
||||||
|
:param value: a list of IPv6s.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketErrorModelIPv6MissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketErrorModelIPv6NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class TicketErrorModelNoDataException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No FQDN or IPv4 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelTicketErrorIdentifierException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid error ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelTicketIdentifierException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelFQDNMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No FQDN passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelFQDNNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid FQDN.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelIPv4MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv4 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelIPv4NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv4.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelIPv6MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv6 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketErrorModelIPv6NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv6.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
18
src/piracyshield_data_model/ticket/error/rule.py
Normal file
18
src/piracyshield_data_model/ticket/error/rule.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.fqdn import FQDN
|
||||||
|
from piracyshield_component.validation.rules.ipv4 import IPv4
|
||||||
|
from piracyshield_component.validation.rules.ipv6 import IPv6
|
||||||
|
|
||||||
|
class TicketErrorRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for new ticket.
|
||||||
|
"""
|
||||||
|
|
||||||
|
TICKET_ERROR_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
1
src/piracyshield_data_model/ticket/genre/__init__.py
Normal file
1
src/piracyshield_data_model/ticket/genre/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
11
src/piracyshield_data_model/ticket/genre/model.py
Normal file
11
src/piracyshield_data_model/ticket/genre/model.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class TicketGenreModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket genre types.
|
||||||
|
"""
|
||||||
|
|
||||||
|
BLOCKING = 'blocking'
|
||||||
|
|
||||||
|
ERROR = 'error'
|
1
src/piracyshield_data_model/ticket/item/__init__.py
Normal file
1
src/piracyshield_data_model/ticket/item/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
|
13
src/piracyshield_data_model/ticket/item/genre/model.py
Normal file
13
src/piracyshield_data_model/ticket/item/genre/model.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class TicketItemGenreModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item genre types with relative identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
FQDN = 'fqdn'
|
||||||
|
|
||||||
|
IPV4 = 'ipv4'
|
||||||
|
|
||||||
|
IPV6 = 'ipv6'
|
298
src/piracyshield_data_model/ticket/item/model.py
Normal file
298
src/piracyshield_data_model/ticket/item/model.py
Normal file
|
@ -0,0 +1,298 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.rule import TicketItemRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.status.model import TicketItemStatusModel
|
||||||
|
from piracyshield_data_model.ticket.item.genre.model import TicketItemGenreModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
class TicketItemModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_id = None
|
||||||
|
|
||||||
|
ticket_item_id = None
|
||||||
|
|
||||||
|
provider_id = None
|
||||||
|
|
||||||
|
value = None
|
||||||
|
|
||||||
|
genre = None
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
is_active = True
|
||||||
|
|
||||||
|
is_duplicate = False
|
||||||
|
|
||||||
|
is_whitelisted = False
|
||||||
|
|
||||||
|
is_error = False
|
||||||
|
|
||||||
|
settings = None
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
ticket_id: str,
|
||||||
|
ticket_item_id: str,
|
||||||
|
provider_id: str,
|
||||||
|
value: str,
|
||||||
|
genre: str,
|
||||||
|
is_active: bool,
|
||||||
|
is_duplicate: bool,
|
||||||
|
is_whitelisted: bool,
|
||||||
|
is_error: bool
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param ticket_id: a valid ticket identifier.
|
||||||
|
:param ticket_item_id: a valid ticket item identifier.
|
||||||
|
:param value: a valid FQDN or IPv4.
|
||||||
|
:param genre: a valid ticket item type.
|
||||||
|
:param provider_id: an account identifier assigned to the ticket item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.ticket_id = self._validate_ticket_id(ticket_id)
|
||||||
|
|
||||||
|
self.ticket_item_id = self._validate_ticket_item_id(ticket_item_id)
|
||||||
|
|
||||||
|
match genre:
|
||||||
|
case TicketItemGenreModel.FQDN.value:
|
||||||
|
self.genre = TicketItemGenreModel.FQDN.value
|
||||||
|
self.value = self._validate_fqdn(value)
|
||||||
|
|
||||||
|
case TicketItemGenreModel.IPV4.value:
|
||||||
|
self.genre = TicketItemGenreModel.IPV4.value
|
||||||
|
self.value = self._validate_ipv4(value)
|
||||||
|
|
||||||
|
case TicketItemGenreModel.IPV6.value:
|
||||||
|
self.genre = TicketItemGenreModel.IPV6.value
|
||||||
|
self.value = self._validate_ipv6(value)
|
||||||
|
|
||||||
|
case _:
|
||||||
|
raise TicketItemModelGenreNonValidException()
|
||||||
|
|
||||||
|
self.provider_id = self._validate_provider_id(provider_id)
|
||||||
|
|
||||||
|
self.status = TicketItemStatusModel.PENDING.value
|
||||||
|
|
||||||
|
self.is_active = is_active
|
||||||
|
|
||||||
|
self.is_duplicate = is_duplicate
|
||||||
|
|
||||||
|
self.is_whitelisted = is_whitelisted
|
||||||
|
|
||||||
|
self.is_error = is_error
|
||||||
|
|
||||||
|
self.settings = {
|
||||||
|
'update_max_time': 172800 # 2 days
|
||||||
|
}
|
||||||
|
|
||||||
|
def _validate_ticket_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.TICKET_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelTicketIdentifierNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ticket_item_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket item identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket item identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketItemRule.TICKET_ITEM_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelTicketIdentifierNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the FQDN genre.
|
||||||
|
|
||||||
|
:param value: a valid FQDN.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemModelFQDNMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelFQDNNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv4 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv4.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemModelIPv4MissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelIPv4NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv6 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv6.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemModelIPv6MissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelIPv6NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_provider_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the provider account identifier.
|
||||||
|
|
||||||
|
:param value: a valid account identifier.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemModelProviderIdentifierMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemModelProviderIdentifierException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class TicketItemModelTicketIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelTicketItemIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket item identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelGenreNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid genre.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelFQDNMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing FQDN.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelFQDNNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid FQDN.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelIPv4MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing IPv4.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelIPv4NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv4.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelIPv6MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing IPv6.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelIPv6NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv6.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelProviderIdentifierMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing provider account identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemModelProviderIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid provider account idenfitier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
|
@ -0,0 +1 @@
|
||||||
|
|
229
src/piracyshield_data_model/ticket/item/processed/model.py
Normal file
229
src/piracyshield_data_model/ticket/item/processed/model.py
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
from piracyshield_component.utils.time import Time, TimeFormatException
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.processed.rule import TicketItemProcessedRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.status.model import TicketItemStatusModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
class TicketItemProcessedModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item processed data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
provider_id = None
|
||||||
|
|
||||||
|
value = None
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
timestamp = None
|
||||||
|
|
||||||
|
note = None
|
||||||
|
|
||||||
|
def __init__(self, provider_id: str, value: str, timestamp: str = None, note: str = None):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param provider_id: an account identifier assigned to the ticket item.
|
||||||
|
:param value: a valid FQDN, IPv4 or IPv6.
|
||||||
|
:param timestamp: an optional ISO8601 date.
|
||||||
|
:param note: an optional string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.provider_id = self._validate_provider_id(provider_id)
|
||||||
|
|
||||||
|
self.value = self._validate_value(value)
|
||||||
|
|
||||||
|
self.status = TicketItemStatusModel.PROCESSED.value
|
||||||
|
|
||||||
|
if timestamp:
|
||||||
|
self.timestamp = self._validate_timestamp(timestamp)
|
||||||
|
|
||||||
|
if note:
|
||||||
|
self.note = self._validate_note(note)
|
||||||
|
|
||||||
|
def _validate_provider_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the provider account identifier.
|
||||||
|
|
||||||
|
:param value: a valid account identifier.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemProcessedModelProviderIdentifierMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemProcessedModelProviderIdentifierException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_value(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket item value.
|
||||||
|
|
||||||
|
:param value: a valid FQDN, IPv4 or IPv6.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemProcessedModelValueMissingException()
|
||||||
|
|
||||||
|
validators = [
|
||||||
|
self._validate_fqdn,
|
||||||
|
self._validate_ipv4,
|
||||||
|
self._validate_ipv6
|
||||||
|
]
|
||||||
|
|
||||||
|
is_valid = False
|
||||||
|
|
||||||
|
for validator in validators:
|
||||||
|
if validator(value):
|
||||||
|
is_valid = True
|
||||||
|
|
||||||
|
if not is_valid:
|
||||||
|
raise TicketItemProcessedModelValueNonValidException()
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the FQDN genre.
|
||||||
|
|
||||||
|
:param value: a valid FQDN.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv4 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv4.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv6 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv6.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_timestamp(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the timestamp against the ISO8601 format.
|
||||||
|
|
||||||
|
:param value: a valid ISO8601 date.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
Time.is_valid_iso8601(value)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
except TimeFormatException:
|
||||||
|
raise TicketItemProcessedModelTimestampNonValidException()
|
||||||
|
|
||||||
|
def _validate_note(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the note text.
|
||||||
|
|
||||||
|
:param value: a string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketItemProcessedRule.NOTE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemProcessedModelNoteNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class TicketItemProcessedModelProviderIdentifierMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing provider account identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemProcessedModelProviderIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid provider account idenfitier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemProcessedModelValueMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing ticket item value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemProcessedModelValueNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket item value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemProcessedModelTimestampNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid timestamp.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemProcessedModelNoteNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid note.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
15
src/piracyshield_data_model/ticket/item/processed/rule.py
Normal file
15
src/piracyshield_data_model/ticket/item/processed/rule.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
|
||||||
|
class TicketItemProcessedRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for processed ticket item status.
|
||||||
|
"""
|
||||||
|
|
||||||
|
NOTE = [
|
||||||
|
Required(),
|
||||||
|
String(' .,-&/$€@"'),
|
||||||
|
Length(minimum = 3, maximum = 512)
|
||||||
|
]
|
17
src/piracyshield_data_model/ticket/item/rule.py
Normal file
17
src/piracyshield_data_model/ticket/item/rule.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.fqdn import FQDN
|
||||||
|
from piracyshield_component.validation.rules.ipv4 import IPv4
|
||||||
|
|
||||||
|
class TicketItemRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for new ticket item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
TICKET_ITEM_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
|
@ -0,0 +1 @@
|
||||||
|
|
15
src/piracyshield_data_model/ticket/item/status/model.py
Normal file
15
src/piracyshield_data_model/ticket/item/status/model.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class TicketItemStatusModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item status types with relative identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
PENDING = 'pending'
|
||||||
|
|
||||||
|
PROCESSED = 'processed'
|
||||||
|
|
||||||
|
UNPROCESSED = 'unprocessed'
|
||||||
|
|
||||||
|
UNBLOCKED = 'unblocked'
|
|
@ -0,0 +1 @@
|
||||||
|
|
271
src/piracyshield_data_model/ticket/item/unprocessed/model.py
Normal file
271
src/piracyshield_data_model/ticket/item/unprocessed/model.py
Normal file
|
@ -0,0 +1,271 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
from piracyshield_component.utils.time import Time, TimeFormatException
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.unprocessed.reason.model import TicketItemUnprocessedReasonModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.unprocessed.rule import TicketItemUnprocessedRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.status.model import TicketItemStatusModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item unprocessed data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
provider_id = None
|
||||||
|
|
||||||
|
value = None
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
reason = None
|
||||||
|
|
||||||
|
timestamp = None
|
||||||
|
|
||||||
|
note = None
|
||||||
|
|
||||||
|
def __init__(self, provider_id: str, value: str, reason: str, timestamp: str = None, note: str = None):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param provider_id: an account identifier assigned to the ticket item.
|
||||||
|
:param value: a valid FQDN, IPv4 or IPv6.
|
||||||
|
:param reason: a predefined reason for the unprocessed status.
|
||||||
|
:param timestamp: an optional ISO8601 date.
|
||||||
|
:param note: an optional string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.provider_id = self._validate_provider_id(provider_id)
|
||||||
|
|
||||||
|
self.value = self._validate_value(value)
|
||||||
|
|
||||||
|
self.status = TicketItemStatusModel.UNPROCESSED.value
|
||||||
|
|
||||||
|
self.reason = self._validate_reason(reason)
|
||||||
|
|
||||||
|
if timestamp:
|
||||||
|
self.timestamp = self._validate_timestamp(timestamp)
|
||||||
|
|
||||||
|
if note:
|
||||||
|
self.note = self._validate_note(note)
|
||||||
|
|
||||||
|
def _validate_provider_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the provider account identifier.
|
||||||
|
|
||||||
|
:param value: a valid account identifier.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemUnprocessedModelProviderIdentifierMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemUnprocessedModelProviderIdentifierException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_value(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket item value.
|
||||||
|
|
||||||
|
:param value: a valid FQDN, IPv4 or IPv6.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemUnprocessedModelValueMissingException()
|
||||||
|
|
||||||
|
validators = [
|
||||||
|
self._validate_fqdn,
|
||||||
|
self._validate_ipv4,
|
||||||
|
self._validate_ipv6
|
||||||
|
]
|
||||||
|
|
||||||
|
is_valid = False
|
||||||
|
|
||||||
|
for validator in validators:
|
||||||
|
if validator(value):
|
||||||
|
is_valid = True
|
||||||
|
|
||||||
|
if not is_valid:
|
||||||
|
raise TicketItemUnprocessedModelValueNonValidException()
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the FQDN genre.
|
||||||
|
|
||||||
|
:param value: a valid FQDN.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv4 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv4.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv6 genre.
|
||||||
|
|
||||||
|
:param value: a valid IPv6.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_reason(self, value: str) -> int | Exception:
|
||||||
|
"""
|
||||||
|
Validates the reason.
|
||||||
|
|
||||||
|
:param value: a valid predefined reason.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketItemUnprocessedModelReasonMissingException()
|
||||||
|
|
||||||
|
try:
|
||||||
|
enum = TicketItemUnprocessedReasonModel(value)
|
||||||
|
|
||||||
|
return enum.value
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
raise TicketItemUnprocessedModelReasonNonValidException()
|
||||||
|
|
||||||
|
def _validate_timestamp(self, value: str) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the timestamp against the ISO8601 format.
|
||||||
|
|
||||||
|
:param value: a valid ISO8601 date.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
Time.is_valid_iso8601(value)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
except TimeFormatException:
|
||||||
|
raise TicketItemUnprocessedModelTimestampNonValidException()
|
||||||
|
|
||||||
|
def _validate_note(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the note text.
|
||||||
|
|
||||||
|
:param value: a string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketItemUnprocessedRule.NOTE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketItemUnprocessedModelNoteNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelProviderIdentifierMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing provider account identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelProviderIdentifierNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid provider account idenfitier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelValueMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing ticket item value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelValueNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket item value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelReasonMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing reason.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelReasonNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid reason.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelTimestampNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid timestamp.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketItemUnprocessedModelNoteNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid note.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class TicketItemUnprocessedReasonModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket item unprocessed status reason.
|
||||||
|
"""
|
||||||
|
|
||||||
|
UNPROCESSED_ALREADY_BLOCKED = 'ALREADY_BLOCKED'
|
||||||
|
|
||||||
|
UNPROCESSED_UNDEFINED = 'UNDEFINED'
|
||||||
|
|
||||||
|
UNPROCESSED_UNKNOWN = 'UNKNOWN'
|
15
src/piracyshield_data_model/ticket/item/unprocessed/rule.py
Normal file
15
src/piracyshield_data_model/ticket/item/unprocessed/rule.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
|
||||||
|
class TicketItemUnprocessedRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for unprocessed ticket item status.
|
||||||
|
"""
|
||||||
|
|
||||||
|
NOTE = [
|
||||||
|
Required(),
|
||||||
|
String(' .,-&/$€@"'),
|
||||||
|
Length(minimum = 3, maximum = 512)
|
||||||
|
]
|
315
src/piracyshield_data_model/ticket/model.py
Normal file
315
src/piracyshield_data_model/ticket/model.py
Normal file
|
@ -0,0 +1,315 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.status.model import TicketStatusModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.genre.model import TicketGenreModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.account.rule import AccountRule
|
||||||
|
|
||||||
|
from piracyshield_data_model.dda.rule import DDARule
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
|
||||||
|
class TicketModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
ticket_id = None
|
||||||
|
|
||||||
|
genre = None
|
||||||
|
|
||||||
|
description = None
|
||||||
|
|
||||||
|
fqdn = []
|
||||||
|
|
||||||
|
ipv4 = []
|
||||||
|
|
||||||
|
ipv6 = []
|
||||||
|
|
||||||
|
assigned_to = []
|
||||||
|
|
||||||
|
status = None
|
||||||
|
|
||||||
|
settings = None
|
||||||
|
|
||||||
|
def __init__(self, ticket_id: str, dda_id: str, fqdn: list, ipv4: list, ipv6: list, assigned_to: list, description: str = None):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param ticket_id: a valid ticket identifier.
|
||||||
|
:param dda_id: a valid DDA identifier.
|
||||||
|
:param fqdn: a list of FQDN items.
|
||||||
|
:param ipv4: a list of IPv4 items.
|
||||||
|
:param ipv6: a list of IPv6 items.
|
||||||
|
:param assigned_to: a list of account identifiers assigned to the ticket.
|
||||||
|
:param description: a generic, non mandatory, description of the ticket.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# FQDN, IPv4 and IPv6 should never be all empty
|
||||||
|
if not any([bool(fqdn), bool(ipv4), bool(ipv6)]):
|
||||||
|
raise TicketModelNoDataException
|
||||||
|
|
||||||
|
self.ticket_id = self._validate_ticket_id(ticket_id)
|
||||||
|
|
||||||
|
self.dda_id = self._validate_dda_id(dda_id)
|
||||||
|
|
||||||
|
if description:
|
||||||
|
self.description = self._validate_description(description)
|
||||||
|
|
||||||
|
if fqdn:
|
||||||
|
self.fqdn = self._validate_fqdn(fqdn)
|
||||||
|
|
||||||
|
if ipv4:
|
||||||
|
self.ipv4 = self._validate_ipv4(ipv4)
|
||||||
|
|
||||||
|
if ipv6:
|
||||||
|
self.ipv6 = self._validate_ipv6(ipv6)
|
||||||
|
|
||||||
|
self.assigned_to = self._validate_assigned_to(assigned_to) if assigned_to else None
|
||||||
|
|
||||||
|
# ticket initial status
|
||||||
|
self.status = TicketStatusModel.CREATED.value
|
||||||
|
|
||||||
|
# this is a blocking ticket
|
||||||
|
self.genre = TicketGenreModel.BLOCKING.value
|
||||||
|
|
||||||
|
self.settings = {
|
||||||
|
'autoclose_time': 1875, # 31.25 minutes in seconds, considering 75 seconds of preamble
|
||||||
|
'revoke_time': 75,
|
||||||
|
'report_error_time': 86400 # 1 day
|
||||||
|
}
|
||||||
|
|
||||||
|
def _validate_ticket_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket identifier.
|
||||||
|
|
||||||
|
:param value: a valid ticket identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.TICKET_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelTicketIdException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_dda_id(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the DDA identifier.
|
||||||
|
|
||||||
|
:param value: a valid DDA identifier string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketModelDDAIdMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, DDARule.DDA_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelDDAIdNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_description(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket description.
|
||||||
|
|
||||||
|
:param value: a valid string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.DESCRIPTION)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelDescriptionException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket FQDN list.
|
||||||
|
|
||||||
|
:param value: a list of FQDNs.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketModelFQDNMissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelFQDNNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket IPv4 list.
|
||||||
|
|
||||||
|
:param value: a list of IPv4s.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketModelIPv4MissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelIPv4NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket IPv6 list.
|
||||||
|
|
||||||
|
:param value: a list of IPv6s.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise TicketModelIPv6MissingException()
|
||||||
|
|
||||||
|
for item in value:
|
||||||
|
validator = Validator(item, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelIPv6NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_assigned_to(self, value: list) -> list | Exception:
|
||||||
|
"""
|
||||||
|
Validates the ticket assigned accounts list.
|
||||||
|
|
||||||
|
:param value: a list of account identifiers.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
validator = Validator(item, AccountRule.ACCOUNT_ID)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise TicketModelAssignedToNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class TicketModelNoDataException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No FQDN or IPv4 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelTicketIdException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid ticket identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelDDAIdMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing DDA identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelDDAIdNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid DDA identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelDescriptionException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid description.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelFQDNMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No FQDN passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelFQDNNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid FQDN.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelIPv4MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv4 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelIPv4NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv4.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelIPv6MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv6 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelIPv6NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv6.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TicketModelAssignedToNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid account id passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
39
src/piracyshield_data_model/ticket/rule.py
Normal file
39
src/piracyshield_data_model/ticket/rule.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.fqdn import FQDN
|
||||||
|
from piracyshield_component.validation.rules.ipv4 import IPv4
|
||||||
|
from piracyshield_component.validation.rules.ipv6 import IPv6
|
||||||
|
|
||||||
|
class TicketRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for new ticket.
|
||||||
|
"""
|
||||||
|
|
||||||
|
TICKET_ID = [
|
||||||
|
Required(),
|
||||||
|
String(),
|
||||||
|
Length(minimum = 32, maximum = 32)
|
||||||
|
]
|
||||||
|
|
||||||
|
DESCRIPTION = [
|
||||||
|
Required(),
|
||||||
|
String(' .,-_@'),
|
||||||
|
Length(minimum = 3, maximum = 255)
|
||||||
|
]
|
||||||
|
|
||||||
|
FQDN = [
|
||||||
|
Required(),
|
||||||
|
FQDN()
|
||||||
|
]
|
||||||
|
|
||||||
|
IPV4 = [
|
||||||
|
Required(),
|
||||||
|
IPv4()
|
||||||
|
]
|
||||||
|
|
||||||
|
IPV6 = [
|
||||||
|
Required(),
|
||||||
|
IPv6()
|
||||||
|
]
|
1
src/piracyshield_data_model/ticket/status/__init__.py
Normal file
1
src/piracyshield_data_model/ticket/status/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
13
src/piracyshield_data_model/ticket/status/model.py
Normal file
13
src/piracyshield_data_model/ticket/status/model.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class TicketStatusModel(Enum):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Ticket status types with relative identifier.
|
||||||
|
"""
|
||||||
|
|
||||||
|
CREATED = 'created'
|
||||||
|
|
||||||
|
OPEN = 'open'
|
||||||
|
|
||||||
|
CLOSED = 'closed'
|
1
src/piracyshield_data_model/whitelist/__init__.py
Normal file
1
src/piracyshield_data_model/whitelist/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
243
src/piracyshield_data_model/whitelist/model.py
Normal file
243
src/piracyshield_data_model/whitelist/model.py
Normal file
|
@ -0,0 +1,243 @@
|
||||||
|
from piracyshield_data_model.base import BaseModel
|
||||||
|
|
||||||
|
from piracyshield_component.validation.validator import Validator
|
||||||
|
|
||||||
|
from piracyshield_data_model.ticket.item.genre.model import TicketItemGenreModel
|
||||||
|
|
||||||
|
from piracyshield_data_model.whitelist.rule import WhitelistRule
|
||||||
|
from piracyshield_data_model.ticket.rule import TicketRule
|
||||||
|
|
||||||
|
class WhitelistModel(BaseModel):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Whitelist data modeling class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
genre = None
|
||||||
|
|
||||||
|
value = None
|
||||||
|
|
||||||
|
registrar = None
|
||||||
|
|
||||||
|
as_code = None
|
||||||
|
|
||||||
|
is_active = True
|
||||||
|
|
||||||
|
def __init__(self, genre: str, value: str, is_active: bool, registrar: str = None, as_code: str = None):
|
||||||
|
"""
|
||||||
|
Validates the parameters.
|
||||||
|
|
||||||
|
:param genre: FQDN, IPv4 or IPv6 type.
|
||||||
|
:param value: value of the item.
|
||||||
|
:param is_active: if the item is already active or not.
|
||||||
|
:param registrar: registrar of the FQDN item.
|
||||||
|
:param as_code: AS code of the IPv4 or IPv6 item.
|
||||||
|
"""
|
||||||
|
|
||||||
|
match genre:
|
||||||
|
case TicketItemGenreModel.FQDN.value:
|
||||||
|
self.value = self._validate_fqdn(value)
|
||||||
|
self.registrar = self._validate_registrar(registrar)
|
||||||
|
|
||||||
|
case TicketItemGenreModel.IPV4.value:
|
||||||
|
self.value = self._validate_ipv4(value)
|
||||||
|
self.as_code = self._validate_as_code(as_code)
|
||||||
|
|
||||||
|
case TicketItemGenreModel.IPV6.value:
|
||||||
|
self.value = self._validate_ipv6(value)
|
||||||
|
self.as_code = self._validate_as_code(as_code)
|
||||||
|
|
||||||
|
case _:
|
||||||
|
raise WhitelistModelGenreException()
|
||||||
|
|
||||||
|
self.genre = genre
|
||||||
|
|
||||||
|
self.is_active = is_active
|
||||||
|
|
||||||
|
def _validate_fqdn(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the FQDN.
|
||||||
|
|
||||||
|
:param value: a valid FQDN string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise WhitelistModelFQDNMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.FQDN)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise WhitelistModelFQDNNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv4(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv4.
|
||||||
|
|
||||||
|
:param value: a valid IPv4 string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise WhitelistModelIPv4MissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV4)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise WhitelistModelIPv4NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_ipv6(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the IPv6.
|
||||||
|
|
||||||
|
:param value: a valid IPv6 string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise WhitelistModelIPv6MissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, TicketRule.IPV6)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise WhitelistModelIPv6NonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_registrar(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the registrar of a FQDN item.
|
||||||
|
|
||||||
|
:param value: a valid string.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise WhitelistModelRegistrarMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, WhitelistRule.REGISTRAR)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise WhitelistModelRegistrarNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _validate_as_code(self, value: str) -> str | Exception:
|
||||||
|
"""
|
||||||
|
Validates the AS code of an IPv4 or IPv6 item.
|
||||||
|
|
||||||
|
:param value: a valid AS code.
|
||||||
|
:return: the same value.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not value or not len(value):
|
||||||
|
raise WhitelistModelASCodeMissingException()
|
||||||
|
|
||||||
|
validator = Validator(value, WhitelistRule.AS_CODE)
|
||||||
|
|
||||||
|
validator.validate()
|
||||||
|
|
||||||
|
if not validator.is_valid():
|
||||||
|
raise WhitelistModelASCodeNonValidException(validator.errors)
|
||||||
|
|
||||||
|
return value
|
||||||
|
|
||||||
|
class WhitelistModelRegistrarMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing registrar.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelASCodeMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Missing AS code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelGenreException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid genre.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelFQDNMissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No FQDN passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelFQDNNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid FQDN.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelIPv4MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv4 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelIPv4NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv4.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelIPv6MissingException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
No IPv6 passed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelIPv6NonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid IPv6.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelRegistrarNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid registrar.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WhitelistModelASCodeNonValidException(Exception):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Non valid AS code.
|
||||||
|
"""
|
||||||
|
|
||||||
|
pass
|
33
src/piracyshield_data_model/whitelist/rule.py
Normal file
33
src/piracyshield_data_model/whitelist/rule.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
from piracyshield_component.validation.rules.required import Required
|
||||||
|
from piracyshield_component.validation.rules.string import String
|
||||||
|
from piracyshield_component.validation.rules.length import Length
|
||||||
|
from piracyshield_component.validation.rules.as_code import ASCode
|
||||||
|
from piracyshield_component.validation.rules.cidr_syntax_ipv4 import CIDRSyntaxIPv4
|
||||||
|
from piracyshield_component.validation.rules.cidr_syntax_ipv6 import CIDRSyntaxIPv6
|
||||||
|
|
||||||
|
class WhitelistRule:
|
||||||
|
|
||||||
|
"""
|
||||||
|
Set of rules for new whitelist items.
|
||||||
|
"""
|
||||||
|
|
||||||
|
REGISTRAR = [
|
||||||
|
Required(),
|
||||||
|
String(allowed = ' -'),
|
||||||
|
Length(minimum = 3, maximum = 255)
|
||||||
|
]
|
||||||
|
|
||||||
|
AS_CODE = [
|
||||||
|
Required(),
|
||||||
|
ASCode()
|
||||||
|
]
|
||||||
|
|
||||||
|
CIDR_IPV4 = [
|
||||||
|
Required(),
|
||||||
|
CIDRSyntaxIPv4()
|
||||||
|
]
|
||||||
|
|
||||||
|
CIDR_IPV6 = [
|
||||||
|
Required(),
|
||||||
|
CIDRSyntaxIPv6()
|
||||||
|
]
|
Loading…
Reference in a new issue