passphera-core 0.10.0__py3-none-any.whl → 0.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passphera_core/application/generator.py +29 -50
- passphera_core/application/password.py +40 -72
- passphera_core/entities.py +15 -46
- passphera_core/exceptions.py +9 -39
- passphera_core/interfaces.py +10 -46
- {passphera_core-0.10.0.dist-info → passphera_core-0.11.0.dist-info}/METADATA +2 -2
- passphera_core-0.11.0.dist-info/RECORD +11 -0
- passphera_core/application/user.py +0 -56
- passphera_core-0.10.0.dist-info/RECORD +0 -12
- {passphera_core-0.10.0.dist-info → passphera_core-0.11.0.dist-info}/WHEEL +0 -0
- {passphera_core-0.10.0.dist-info → passphera_core-0.11.0.dist-info}/top_level.txt +0 -0
@@ -1,78 +1,57 @@
|
|
1
1
|
from datetime import datetime, timezone
|
2
2
|
from uuid import UUID
|
3
3
|
|
4
|
-
from passphera_core.entities import Generator
|
5
|
-
from passphera_core.interfaces import GeneratorRepository
|
4
|
+
from passphera_core.entities import Generator
|
5
|
+
from passphera_core.interfaces import GeneratorRepository
|
6
6
|
|
7
7
|
|
8
8
|
class GetGeneratorUseCase:
|
9
9
|
def __init__(self, generator_repository: GeneratorRepository):
|
10
10
|
self.generator_repository: GeneratorRepository = generator_repository
|
11
11
|
|
12
|
-
def execute(self,
|
13
|
-
return self.generator_repository.
|
12
|
+
def execute(self, generator_id: UUID) -> Generator:
|
13
|
+
return self.generator_repository.get(generator_id)
|
14
14
|
|
15
15
|
|
16
|
-
class
|
17
|
-
def __init__(self, generator_repository: GeneratorRepository
|
16
|
+
class GetGeneratorPropertyUseCase:
|
17
|
+
def __init__(self, generator_repository: GeneratorRepository):
|
18
18
|
self.generator_repository: GeneratorRepository = generator_repository
|
19
|
-
self.generator_config_repository: GeneratorConfigRepository = generator_config_repository
|
20
19
|
|
21
|
-
def execute(self,
|
22
|
-
generator_entity: Generator = self.generator_repository.
|
23
|
-
|
24
|
-
return getattr(generator_config_entity, field)
|
20
|
+
def execute(self, generator_id: UUID, field: str) -> str:
|
21
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
22
|
+
return getattr(generator_entity, field)
|
25
23
|
|
26
24
|
|
27
|
-
class
|
28
|
-
def __init__(
|
29
|
-
self,
|
30
|
-
generator_repository: GeneratorRepository,
|
31
|
-
generator_config_repository: GeneratorConfigRepository,
|
32
|
-
):
|
25
|
+
class UpdateGeneratorPropertyUseCase:
|
26
|
+
def __init__(self, generator_repository: GeneratorRepository):
|
33
27
|
self.generator_repository: GeneratorRepository = generator_repository
|
34
|
-
self.generator_config_repository: GeneratorConfigRepository = generator_config_repository
|
35
28
|
|
36
|
-
def execute(self,
|
37
|
-
generator_entity: Generator = self.generator_repository.
|
38
|
-
|
39
|
-
setattr(generator_config_entity, field, value)
|
29
|
+
def execute(self, generator_id: UUID, field: str, value: str) -> None:
|
30
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
31
|
+
setattr(generator_entity, field, value)
|
40
32
|
if field == 'algorithm':
|
41
|
-
|
42
|
-
|
43
|
-
self.
|
44
|
-
|
33
|
+
generator_entity.get_algorithm()
|
34
|
+
generator_entity.updated_at = datetime.now(timezone.utc)
|
35
|
+
self.generator_repository.update(generator_entity)
|
45
36
|
|
46
37
|
|
47
38
|
class AddCharacterReplacementUseCase:
|
48
|
-
def __init__(
|
49
|
-
self,
|
50
|
-
generator_repository: GeneratorRepository,
|
51
|
-
generator_config_repository: GeneratorConfigRepository,
|
52
|
-
):
|
39
|
+
def __init__(self, generator_repository: GeneratorRepository):
|
53
40
|
self.generator_repository: GeneratorRepository = generator_repository
|
54
|
-
self.generator_config_repository: GeneratorConfigRepository = generator_config_repository
|
55
41
|
|
56
|
-
def execute(self,
|
57
|
-
generator_entity: Generator = self.generator_repository.
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
self.generator_config_repository.update(generator_config_entity)
|
42
|
+
def execute(self, generator_id: UUID, character: str, replacement: str) -> None:
|
43
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
44
|
+
generator_entity.replace_character(character, replacement)
|
45
|
+
generator_entity.updated_at = datetime.now(timezone.utc)
|
46
|
+
self.generator_repository.update(generator_entity)
|
62
47
|
|
63
48
|
|
64
49
|
class ResetCharacterReplacementUseCase:
|
65
|
-
def __init__(
|
66
|
-
self,
|
67
|
-
generator_repository: GeneratorRepository,
|
68
|
-
generator_config_repository: GeneratorConfigRepository,
|
69
|
-
):
|
50
|
+
def __init__(self, generator_repository: GeneratorRepository,):
|
70
51
|
self.generator_repository: GeneratorRepository = generator_repository
|
71
|
-
self.generator_config_repository: GeneratorConfigRepository = generator_config_repository
|
72
52
|
|
73
|
-
def execute(self,
|
74
|
-
generator_entity: Generator = self.generator_repository.
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
self.generator_config_repository.update(generator_config_entity)
|
53
|
+
def execute(self, generator_id: UUID, character: str) -> None:
|
54
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
55
|
+
generator_entity.reset_character(character)
|
56
|
+
generator_entity.updated_at = datetime.now(timezone.utc)
|
57
|
+
self.generator_repository.update(generator_entity)
|
@@ -1,9 +1,8 @@
|
|
1
|
-
from datetime import datetime, timezone
|
2
1
|
from uuid import UUID
|
3
2
|
|
4
|
-
from passphera_core.entities import Password, Generator
|
5
|
-
from passphera_core.exceptions import
|
6
|
-
from passphera_core.interfaces import PasswordRepository, GeneratorRepository
|
3
|
+
from passphera_core.entities import Password, Generator
|
4
|
+
from passphera_core.exceptions import DuplicatePasswordException, PasswordNotFoundException
|
5
|
+
from passphera_core.interfaces import PasswordRepository, GeneratorRepository
|
7
6
|
|
8
7
|
|
9
8
|
class GeneratePasswordUseCase:
|
@@ -11,108 +10,77 @@ class GeneratePasswordUseCase:
|
|
11
10
|
self,
|
12
11
|
password_repository: PasswordRepository,
|
13
12
|
generator_repository: GeneratorRepository,
|
14
|
-
user_repository: UserRepository
|
15
13
|
):
|
16
14
|
self.password_repository: PasswordRepository = password_repository
|
17
15
|
self.generator_repository: GeneratorRepository = generator_repository
|
18
|
-
self.user_repository: UserRepository = user_repository
|
19
16
|
|
20
|
-
def execute(self,
|
21
|
-
|
22
|
-
|
17
|
+
def execute(self, generator_id: UUID, context: str, text: str) -> Password:
|
18
|
+
password_entity: Password = self.password_repository.get_by_context(context)
|
19
|
+
if password_entity:
|
20
|
+
raise DuplicatePasswordException(password_entity)
|
21
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
23
22
|
password: str = generator_entity.generate_password(text)
|
24
|
-
password_entity: Password = Password(
|
23
|
+
password_entity: Password = Password(context=context, text=text, password=password)
|
25
24
|
password_entity.encrypt()
|
26
25
|
self.password_repository.save(password_entity)
|
27
|
-
user_entity.add_password(password_entity.id)
|
28
|
-
self.user_repository.update(user_entity)
|
29
26
|
return password_entity
|
30
27
|
|
31
28
|
|
32
|
-
class
|
29
|
+
class GetPasswordByContextUseCase:
|
33
30
|
def __init__(self, password_repository: PasswordRepository):
|
34
31
|
self.password_repository: PasswordRepository = password_repository
|
35
32
|
|
36
|
-
def execute(self,
|
37
|
-
password_entity: Password = self.password_repository.
|
33
|
+
def execute(self, context: str) -> Password:
|
34
|
+
password_entity: Password = self.password_repository.get_by_context(context)
|
38
35
|
if not password_entity:
|
39
|
-
raise
|
36
|
+
raise PasswordNotFoundException()
|
40
37
|
return password_entity
|
41
38
|
|
42
39
|
|
43
|
-
class GetPasswordByContextUseCase:
|
44
|
-
def __init__(self, password_repository: PasswordRepository, user_repository: UserRepository):
|
45
|
-
self.password_repository: PasswordRepository = password_repository
|
46
|
-
self.user_repository: UserRepository = user_repository
|
47
|
-
|
48
|
-
def execute(self, user_id: UUID, context: str) -> Password:
|
49
|
-
user_entity: User = self.user_repository.find_by_id(user_id)
|
50
|
-
for password_id in user_entity.passwords_ids:
|
51
|
-
password_entity: Password = self.password_repository.find_by_id(password_id)
|
52
|
-
if password_entity.context == context:
|
53
|
-
return password_entity
|
54
|
-
raise EntityNotFoundException(Password())
|
55
|
-
|
56
|
-
|
57
40
|
class UpdatePasswordUseCase:
|
58
41
|
def __init__(
|
59
42
|
self,
|
60
43
|
password_repository: PasswordRepository,
|
61
44
|
generator_repository: GeneratorRepository,
|
62
|
-
user_repository: UserRepository
|
63
45
|
):
|
64
46
|
self.password_repository: PasswordRepository = password_repository
|
65
47
|
self.generator_repository: GeneratorRepository = generator_repository
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
return password_entity
|
79
|
-
raise EntityNotFoundException(Password())
|
48
|
+
|
49
|
+
def execute(self, generator_id: UUID, context: str, text: str) -> Password:
|
50
|
+
password_entity: Password = self.password_repository.get_by_context(context)
|
51
|
+
if not password_entity:
|
52
|
+
raise PasswordNotFoundException()
|
53
|
+
generator_entity: Generator = self.generator_repository.get(generator_id)
|
54
|
+
password: str = generator_entity.generate_password(text)
|
55
|
+
password_entity.text = text
|
56
|
+
password_entity.password = password
|
57
|
+
password_entity.encrypt()
|
58
|
+
self.password_repository.update(password_entity)
|
59
|
+
return password_entity
|
80
60
|
|
81
61
|
|
82
62
|
class DeletePasswordUseCase:
|
83
|
-
def __init__(self, password_repository: PasswordRepository
|
63
|
+
def __init__(self, password_repository: PasswordRepository):
|
84
64
|
self.password_repository: PasswordRepository = password_repository
|
85
|
-
self.user_repository: UserRepository = user_repository
|
86
65
|
|
87
|
-
def execute(self,
|
88
|
-
self.password_repository.
|
89
|
-
|
90
|
-
|
91
|
-
self.
|
66
|
+
def execute(self, context: str) -> None:
|
67
|
+
password_entity: Password = self.password_repository.get_by_context(context)
|
68
|
+
if not password_entity:
|
69
|
+
raise PasswordNotFoundException()
|
70
|
+
self.password_repository.delete(password_entity)
|
92
71
|
|
93
72
|
|
94
|
-
class
|
95
|
-
def __init__(self, password_repository: PasswordRepository
|
73
|
+
class GetAllPasswordsUseCase:
|
74
|
+
def __init__(self, password_repository: PasswordRepository):
|
96
75
|
self.password_repository: PasswordRepository = password_repository
|
97
|
-
self.user_repository: UserRepository = user_repository
|
98
76
|
|
99
|
-
def execute(self
|
100
|
-
|
101
|
-
passwords: list[Password] = []
|
102
|
-
for password_id in user_entity.passwords_ids:
|
103
|
-
password_entity: Password = self.password_repository.find_by_id(password_id)
|
104
|
-
passwords.append(password_entity)
|
105
|
-
return passwords
|
77
|
+
def execute(self) -> list[Password]:
|
78
|
+
return self.password_repository.list()
|
106
79
|
|
107
80
|
|
108
|
-
class
|
109
|
-
def __init__(self, password_repository: PasswordRepository
|
81
|
+
class DeleteAllPasswordsUseCase:
|
82
|
+
def __init__(self, password_repository: PasswordRepository):
|
110
83
|
self.password_repository: PasswordRepository = password_repository
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
user_entity: User = self.user_repository.find_by_id(user_id)
|
115
|
-
for password_id in user_entity.passwords_ids:
|
116
|
-
self.password_repository.delete(password_id)
|
117
|
-
user_entity.delete_password(password_id)
|
118
|
-
self.user_repository.update(user_entity)
|
84
|
+
|
85
|
+
def execute(self) -> None:
|
86
|
+
self.password_repository.flush()
|
passphera_core/entities.py
CHANGED
@@ -5,22 +5,19 @@ from uuid import UUID, uuid4
|
|
5
5
|
from cryptography.fernet import Fernet
|
6
6
|
|
7
7
|
from cipherspy.cipher import *
|
8
|
-
from cipherspy.
|
8
|
+
from cipherspy.exceptions import InvalidAlgorithmException
|
9
9
|
from cipherspy.utilities import generate_salt, derive_key
|
10
10
|
|
11
|
-
from passphera_core import exceptions
|
12
|
-
|
13
11
|
|
14
12
|
@dataclass
|
15
13
|
class Password:
|
16
14
|
id: UUID = field(default_factory=uuid4)
|
17
|
-
|
18
|
-
|
19
|
-
updated_at: datetime = field(default=datetime.now(timezone.utc))
|
15
|
+
created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
16
|
+
updated_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
|
20
17
|
context: str = field(default_factory=str)
|
21
18
|
text: str = field(default_factory=str)
|
22
19
|
password: str = field(default_factory=str)
|
23
|
-
salt: bytes = field(default_factory=bytes)
|
20
|
+
salt: bytes = field(default_factory=lambda: bytes)
|
24
21
|
|
25
22
|
def encrypt(self) -> None:
|
26
23
|
self.salt = generate_salt()
|
@@ -33,9 +30,10 @@ class Password:
|
|
33
30
|
|
34
31
|
|
35
32
|
@dataclass
|
36
|
-
class
|
33
|
+
class Generator:
|
37
34
|
id: UUID = field(default_factory=uuid4)
|
38
|
-
|
35
|
+
created_at: datetime = field(default_factory=datetime.now)
|
36
|
+
updated_at: datetime = field(default_factory=datetime.now)
|
39
37
|
shift: int = field(default=3)
|
40
38
|
multiplier: int = field(default=3)
|
41
39
|
key: str = field(default="hill")
|
@@ -56,7 +54,7 @@ class GeneratorConfig:
|
|
56
54
|
:return: BaseCipherAlgorithm: The primary algorithm used for the cipher
|
57
55
|
"""
|
58
56
|
if self.algorithm.lower() not in self._cipher_registry:
|
59
|
-
raise
|
57
|
+
raise InvalidAlgorithmException(self.algorithm)
|
60
58
|
return self._cipher_registry[self.algorithm.lower()]
|
61
59
|
|
62
60
|
def replace_character(self, char: str, replacement: str) -> None:
|
@@ -77,53 +75,24 @@ class GeneratorConfig:
|
|
77
75
|
"""
|
78
76
|
self.characters_replacements.pop(char, None)
|
79
77
|
|
80
|
-
|
81
|
-
@dataclass
|
82
|
-
class Generator:
|
83
|
-
id: UUID = field(default_factory=uuid4)
|
84
|
-
user_id: UUID = field(default_factory=uuid4)
|
85
|
-
created_at: datetime = field(default_factory=datetime.now)
|
86
|
-
updated_at: datetime = field(default_factory=datetime.now)
|
87
|
-
config_id: UUID = field(default_factory=UUID)
|
88
|
-
config: GeneratorConfig = field(default_factory=GeneratorConfig)
|
89
|
-
|
90
|
-
def __post_init__(self):
|
91
|
-
self.config = GeneratorConfig(generator_id=self.id)
|
92
|
-
|
93
78
|
def apply_replacements(self, password: str) -> str:
|
94
79
|
"""
|
95
80
|
Replace character from the ciphered password with character replacements from the generator configurations
|
81
|
+
:param password: The password to perform the action on it
|
96
82
|
:return: str: The new ciphered password after character replacements
|
97
83
|
"""
|
98
|
-
translation_table = str.maketrans(self.
|
84
|
+
translation_table: dict[int, str] = str.maketrans(self.characters_replacements)
|
99
85
|
return password.translate(translation_table)
|
100
86
|
|
101
87
|
def generate_password(self, text: str) -> str:
|
102
88
|
"""
|
103
89
|
Generate a strong password string using the raw password (add another layer of encryption to it)
|
90
|
+
:param text: The text to generate password from it
|
104
91
|
:return: str: The generated ciphered password
|
105
92
|
"""
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
password = main_algorithm.encrypt(intermediate)
|
93
|
+
main_algorithm: BaseCipherAlgorithm = self.get_algorithm()
|
94
|
+
secondary_algorithm: AffineCipherAlgorithm = AffineCipherAlgorithm(self.shift, self.multiplier)
|
95
|
+
intermediate: str = secondary_algorithm.encrypt(f"{self.prefix}{text}{self.postfix}")
|
96
|
+
password: str = main_algorithm.encrypt(intermediate)
|
110
97
|
password = self.apply_replacements(password)
|
111
98
|
return ''.join(c.upper() if c in text else c for c in password)
|
112
|
-
|
113
|
-
|
114
|
-
@dataclass
|
115
|
-
class User:
|
116
|
-
id: UUID = field(default_factory=uuid4)
|
117
|
-
created_at: datetime = field(default_factory=datetime.now)
|
118
|
-
updated_at: datetime = field(default_factory=datetime.now)
|
119
|
-
username: str = field(default_factory=str)
|
120
|
-
email: str = field(default_factory=str)
|
121
|
-
password: str = field(default_factory=str)
|
122
|
-
generator_id: UUID = field(default_factory=UUID)
|
123
|
-
passwords_ids: list[UUID] = field(default_factory=list[UUID])
|
124
|
-
|
125
|
-
def add_password(self, password_id: UUID) -> None:
|
126
|
-
self.passwords_ids.append(password_id)
|
127
|
-
|
128
|
-
def delete_password(self, password_id: UUID) -> None:
|
129
|
-
self.passwords_ids.remove(password_id)
|
passphera_core/exceptions.py
CHANGED
@@ -1,49 +1,19 @@
|
|
1
|
-
from
|
1
|
+
from passphera_core.entities import Password
|
2
2
|
|
3
|
-
from passphera_core.entities import Password, Generator, User
|
4
3
|
|
4
|
+
class PasswordNotFoundException(Exception):
|
5
|
+
def __init__(self) -> None:
|
6
|
+
super().__init__("Password not found")
|
5
7
|
|
6
|
-
class InvalidAlgorithmException(Exception):
|
7
|
-
def __init__(self, algorithm: str) -> None:
|
8
|
-
self.algorithm = algorithm
|
9
|
-
super().__init__(f"Invalid algorithm: '{algorithm}'")
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
entity_type = entity.__class__.__name__
|
16
|
-
super().__init__(f"{entity_type} not found")
|
17
|
-
|
18
|
-
|
19
|
-
class DuplicateEntityException(Exception):
|
20
|
-
def __init__(
|
21
|
-
self,
|
22
|
-
entity: Union[Password, User],
|
23
|
-
duplicate_field: Literal['context', 'email', 'username'] = None
|
24
|
-
) -> None:
|
25
|
-
self.entity = entity
|
26
|
-
self.duplicate_field = duplicate_field
|
27
|
-
message = self._build_message(entity, duplicate_field)
|
9
|
+
class DuplicatePasswordException(Exception):
|
10
|
+
def __init__(self, password: Password) -> None:
|
11
|
+
self.password = password
|
12
|
+
message = self._build_message(password)
|
28
13
|
super().__init__(message)
|
29
14
|
|
30
|
-
def _build_message(self, entity: Union[Password, User], duplicate_field: str | None) -> str:
|
31
|
-
if isinstance(entity, Password):
|
32
|
-
return self._build_password_message(entity)
|
33
|
-
elif isinstance(entity, User):
|
34
|
-
return self._build_user_message(entity, duplicate_field)
|
35
|
-
return "Duplicate entity detected"
|
36
|
-
|
37
15
|
@staticmethod
|
38
|
-
def
|
16
|
+
def _build_message(password: Password) -> str:
|
39
17
|
if hasattr(password, 'context') and password.context:
|
40
18
|
return f"Password for context '{password.context}' already exists"
|
41
19
|
return "Duplicate password detected"
|
42
|
-
|
43
|
-
@staticmethod
|
44
|
-
def _build_user_message(user: User, duplicate_field: str) -> str:
|
45
|
-
if duplicate_field == 'email':
|
46
|
-
return f"User with email '{user.email}' already exists"
|
47
|
-
elif duplicate_field == 'username':
|
48
|
-
return f"User with username '{user.username}' already exists"
|
49
|
-
return "Duplicate user detected"
|
passphera_core/interfaces.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
from abc import ABC, abstractmethod
|
2
2
|
from uuid import UUID
|
3
3
|
|
4
|
-
from passphera_core.entities import Password, Generator
|
4
|
+
from passphera_core.entities import Password, Generator
|
5
5
|
|
6
6
|
|
7
7
|
class PasswordRepository(ABC):
|
@@ -10,71 +10,35 @@ class PasswordRepository(ABC):
|
|
10
10
|
pass
|
11
11
|
|
12
12
|
@abstractmethod
|
13
|
-
def
|
14
|
-
pass
|
15
|
-
|
16
|
-
@abstractmethod
|
17
|
-
def delete(self, password_id: UUID) -> None:
|
18
|
-
pass
|
19
|
-
|
20
|
-
@abstractmethod
|
21
|
-
def find_by_id(self, password_id: UUID) -> Password:
|
22
|
-
pass
|
23
|
-
|
24
|
-
|
25
|
-
class GeneratorRepository(ABC):
|
26
|
-
@abstractmethod
|
27
|
-
def save(self, generator: Generator) -> None:
|
28
|
-
pass
|
29
|
-
|
30
|
-
@abstractmethod
|
31
|
-
def update(self, generator: Generator) -> None:
|
13
|
+
def get_by_context(self, context: str) -> Password:
|
32
14
|
pass
|
33
15
|
|
34
16
|
@abstractmethod
|
35
|
-
def
|
36
|
-
pass
|
37
|
-
|
38
|
-
@abstractmethod
|
39
|
-
def find_by_user_id(self, user_id: UUID) -> Generator:
|
40
|
-
pass
|
41
|
-
|
42
|
-
|
43
|
-
class GeneratorConfigRepository(ABC):
|
44
|
-
@abstractmethod
|
45
|
-
def save(self, generator_config: GeneratorConfig) -> None:
|
46
|
-
pass
|
47
|
-
|
48
|
-
@abstractmethod
|
49
|
-
def update(self, generator_config: GeneratorConfig) -> None:
|
17
|
+
def update(self, password: Password) -> None:
|
50
18
|
pass
|
51
19
|
|
52
20
|
@abstractmethod
|
53
|
-
def
|
21
|
+
def delete(self, password: Password) -> None:
|
54
22
|
pass
|
55
23
|
|
56
24
|
@abstractmethod
|
57
|
-
def
|
25
|
+
def list(self) -> list[Password]:
|
58
26
|
pass
|
59
27
|
|
60
|
-
|
61
|
-
class UserRepository(ABC):
|
62
28
|
@abstractmethod
|
63
|
-
def
|
29
|
+
def flush(self) -> None:
|
64
30
|
pass
|
65
31
|
|
66
|
-
@abstractmethod
|
67
|
-
def update(self, user: User) -> None:
|
68
|
-
pass
|
69
32
|
|
33
|
+
class GeneratorRepository(ABC):
|
70
34
|
@abstractmethod
|
71
|
-
def
|
35
|
+
def save(self, generator: Generator) -> None:
|
72
36
|
pass
|
73
37
|
|
74
38
|
@abstractmethod
|
75
|
-
def
|
39
|
+
def get(self, generator_id: UUID) -> Generator:
|
76
40
|
pass
|
77
41
|
|
78
42
|
@abstractmethod
|
79
|
-
def
|
43
|
+
def update(self, generator: Generator) -> None:
|
80
44
|
pass
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: passphera-core
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.11.0
|
4
4
|
Summary: The core system of passphera project
|
5
5
|
Home-page: https://github.com/passphera/core
|
6
6
|
Author: Fathi Abdelmalek
|
7
7
|
Author-email: abdelmalek.fathi.2001@gmail.com
|
8
|
-
Classifier: Development Status ::
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
9
9
|
Classifier: License :: OSI Approved :: MIT License
|
10
10
|
Classifier: Operating System :: OS Independent
|
11
11
|
Classifier: Programming Language :: Python
|
@@ -0,0 +1,11 @@
|
|
1
|
+
passphera_core/__init__.py,sha256=0kEfHV5WvMWDoFn1qCeuD52WsgaX4sQ4V9P48cnFKb8,120
|
2
|
+
passphera_core/entities.py,sha256=n93z53GfQdiVRekyzRQ-xZQNKhfbA7WvWkUmtK7ZXWA,4241
|
3
|
+
passphera_core/exceptions.py,sha256=Xir2lYIH7QYHfjDQu8WJ9qIhCvP-mYcPWYN2LbbbDj8,640
|
4
|
+
passphera_core/interfaces.py,sha256=HF4g115Rz1sp9-cRDpdOqkZ1ixhrNg1WI2UNftuEykI,911
|
5
|
+
passphera_core/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
passphera_core/application/generator.py,sha256=ljbPw3nRy6KOsF0B_zkILJqx2uMcSgT66YKJBHxvDwo,2491
|
7
|
+
passphera_core/application/password.py,sha256=Y_XnoTGS6QHeIPHDCvfj8cscaMyDkflYexE8dkLVUW0,3496
|
8
|
+
passphera_core-0.11.0.dist-info/METADATA,sha256=vihb2VnxaqxoDyvtRlTvG5D7Nqk8_xJZfqtfiLSmcZg,868
|
9
|
+
passphera_core-0.11.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
10
|
+
passphera_core-0.11.0.dist-info/top_level.txt,sha256=aDUX2iWGOyfzyf6XakLWTbgeWqNrypMHO074Qratyds,15
|
11
|
+
passphera_core-0.11.0.dist-info/RECORD,,
|
@@ -1,56 +0,0 @@
|
|
1
|
-
from uuid import UUID
|
2
|
-
|
3
|
-
from passphera_core.entities import User, Generator
|
4
|
-
from passphera_core.exceptions import DuplicateEntityException
|
5
|
-
from passphera_core.interfaces import UserRepository, GeneratorRepository
|
6
|
-
|
7
|
-
|
8
|
-
class RegisterUserUseCase:
|
9
|
-
def __init__(self, user_repository: UserRepository, generator_repository: GeneratorRepository):
|
10
|
-
self.user_repository: UserRepository = user_repository
|
11
|
-
self.generator_repository: GeneratorRepository = generator_repository
|
12
|
-
|
13
|
-
def execute(self, user: User) -> User:
|
14
|
-
if self.user_repository.find_by_email(user.email):
|
15
|
-
raise DuplicateEntityException(user, 'email')
|
16
|
-
if self.user_repository.find_by_username(user.username):
|
17
|
-
raise DuplicateEntityException(user, 'username')
|
18
|
-
user_entity: User = User(**user.__dict__)
|
19
|
-
generator_entity: Generator = Generator(user_id=user_entity.id)
|
20
|
-
self.generator_repository.save(generator_entity)
|
21
|
-
user_entity.generator_id = generator_entity.id
|
22
|
-
self.user_repository.save(user_entity)
|
23
|
-
return user_entity
|
24
|
-
|
25
|
-
|
26
|
-
class GetUserByIdUseCase:
|
27
|
-
def __init__(self, user_repository: UserRepository):
|
28
|
-
self.user_repository: UserRepository = user_repository
|
29
|
-
|
30
|
-
def execute(self, id: UUID) -> User:
|
31
|
-
user = self.user_repository.find_by_id(id)
|
32
|
-
if not user:
|
33
|
-
raise ValueError(f'User not found')
|
34
|
-
return user
|
35
|
-
|
36
|
-
|
37
|
-
class GetUserByUsernameUseCase:
|
38
|
-
def __init__(self, user_repository: UserRepository):
|
39
|
-
self.user_repository = user_repository
|
40
|
-
|
41
|
-
def execute(self, username: str) -> User:
|
42
|
-
user = self.user_repository.find_by_username(username)
|
43
|
-
if not user:
|
44
|
-
raise ValueError(f'User not found')
|
45
|
-
return user
|
46
|
-
|
47
|
-
|
48
|
-
class GetUserByEmailUseCase:
|
49
|
-
def __init__(self, user_repository: UserRepository):
|
50
|
-
self.user_repository = user_repository
|
51
|
-
|
52
|
-
def execute(self, email: str) -> User:
|
53
|
-
user = self.user_repository.find_by_email(email)
|
54
|
-
if not user:
|
55
|
-
raise ValueError(f'User not found')
|
56
|
-
return user
|
@@ -1,12 +0,0 @@
|
|
1
|
-
passphera_core/__init__.py,sha256=0kEfHV5WvMWDoFn1qCeuD52WsgaX4sQ4V9P48cnFKb8,120
|
2
|
-
passphera_core/entities.py,sha256=vzD6NMA--kUI9DZ39wHCkniRI-bimxMTpE1gh5mzr3k,5180
|
3
|
-
passphera_core/exceptions.py,sha256=5NvV6LW4Pdok6gRxvM0cN3q6JEKgaCYAX8qGr2eqX2w,1890
|
4
|
-
passphera_core/interfaces.py,sha256=plI-jQ7cOKFtcL1Dh5UVfmPbJY525h57l44On9BQfac,1782
|
5
|
-
passphera_core/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
passphera_core/application/generator.py,sha256=ABUigLMtP52CHpTKIZmwNb0pgGeL4s_WgrpxLr1M9zw,3896
|
7
|
-
passphera_core/application/password.py,sha256=osy04J0MD5cZQA47RKH9KqA-P52MB3bWSEr1oirtORM,5533
|
8
|
-
passphera_core/application/user.py,sha256=yKIDxUi56I__KFhRViiTSxEsakFvssynazr3vHX7vqw,2069
|
9
|
-
passphera_core-0.10.0.dist-info/METADATA,sha256=4kQXy2_AgAVos1pEZYB_bLEYAKn8Pen68CVmF51__zM,869
|
10
|
-
passphera_core-0.10.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
11
|
-
passphera_core-0.10.0.dist-info/top_level.txt,sha256=aDUX2iWGOyfzyf6XakLWTbgeWqNrypMHO074Qratyds,15
|
12
|
-
passphera_core-0.10.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|