Marco Ricci commited on 2024-06-08 19:06:56
Zeige 2 geänderte Dateien mit 22 Einfügungen und 5 Löschungen.
Use a static method, and treat both the original character set and the subtracted character set as sets (i.e. no repetitions allowed).
| ... | ... |
@@ -305,27 +305,35 @@ class Vault: |
| 305 | 305 |
ret = client.sign(key, cls._UUID) |
| 306 | 306 |
return ret |
| 307 | 307 |
|
| 308 |
+ @staticmethod |
|
| 308 | 309 |
def _subtract( |
| 309 |
- self, charset: bytes | bytearray, allowed: bytes | bytearray, |
|
| 310 |
+ charset: bytes | bytearray, allowed: bytes | bytearray, |
|
| 310 | 311 |
) -> bytearray: |
| 311 | 312 |
"""Remove the characters in charset from allowed. |
| 312 | 313 |
|
| 313 | 314 |
This preserves the relative order of characters in `allowed`. |
| 314 | 315 |
|
| 315 | 316 |
Args: |
| 316 |
- charset: Characters to remove. |
|
| 317 |
- allowed: Character set to remove the other characters from. |
|
| 317 |
+ charset: |
|
| 318 |
+ Characters to remove. Must not contain duplicate |
|
| 319 |
+ characters. |
|
| 320 |
+ allowed: |
|
| 321 |
+ Character set to remove the other characters from. Must |
|
| 322 |
+ not contain duplicate characters. |
|
| 318 | 323 |
|
| 319 | 324 |
Returns: |
| 320 |
- The pruned character set. |
|
| 325 |
+ The pruned "allowed" character set. |
|
| 321 | 326 |
|
| 322 | 327 |
Raises: |
| 323 |
- ValueError: `charset` contained duplicate characters. |
|
| 328 |
+ ValueError: |
|
| 329 |
+ `allowed` or `charset` contained duplicate characters. |
|
| 324 | 330 |
|
| 325 | 331 |
""" |
| 326 | 332 |
allowed = (allowed if isinstance(allowed, bytearray) |
| 327 | 333 |
else bytearray(allowed)) |
| 328 | 334 |
assert_type(allowed, bytearray) |
| 335 |
+ if len(frozenset(allowed)) != len(allowed): |
|
| 336 |
+ raise ValueError('duplicate characters in set')
|
|
| 329 | 337 |
if len(frozenset(charset)) != len(charset): |
| 330 | 338 |
raise ValueError('duplicate characters in set')
|
| 331 | 339 |
for c in charset: |
| ... | ... |
@@ -113,3 +113,12 @@ def test_220_very_limited_character_set(): |
| 113 | 113 |
generated = Vault(phrase=b'', length=24, lower=0, upper=0, |
| 114 | 114 |
space=0, symbol=0).generate('testing')
|
| 115 | 115 |
assert b'763252593304946694588866' == generated |
| 116 |
+ |
|
| 117 |
+def test_300_character_set_subtraction(): |
|
| 118 |
+ assert Vault._subtract(b'be', b'abcdef') == bytearray(b'acdf') |
|
| 119 |
+ |
|
| 120 |
+def test_301_character_set_subtraction_duplicate(): |
|
| 121 |
+ with pytest.raises(ValueError, match='duplicate characters'): |
|
| 122 |
+ Vault._subtract(b'abcdef', b'aabbccddeeff') |
|
| 123 |
+ with pytest.raises(ValueError, match='duplicate characters'): |
|
| 124 |
+ Vault._subtract(b'aabbccddeeff', b'abcdef') |
|
| 116 | 125 |