Marco Ricci commited on 2024-06-08 19:06:56
Zeige 2 geänderte Dateien mit 24 Einfügungen und 12 Löschungen.
The prototype implementation is based off a JavaScript program, and is clumsy to read and hard to verify if translated directly to Python. (It also interacts badly with type checking.) Rewrite the check in a pythonic manner, from scratch, that is much easier to verify.
| ... | ... |
@@ -257,18 +257,11 @@ class Vault: |
| 257 | 257 |
# (where r is the repeat limit that must not be |
| 258 | 258 |
# reached), and if so, remove this same character |
| 259 | 259 |
# from the current character's allowed set. |
| 260 |
- previous = result[-1] if result else None |
|
| 261 |
- i = self._repeat - 1 |
|
| 262 |
- same = (i >= 0) if previous is not None else False |
|
| 263 |
- while same and i > 0: |
|
| 264 |
- i -= 1 |
|
| 265 |
- if same: |
|
| 266 |
- other_pos = -(self._repeat - i) |
|
| 267 |
- same = (result[other_pos] == previous) |
|
| 268 |
- if same: |
|
| 269 |
- assert previous is not None # for the type checker |
|
| 270 |
- charset = self._subtract(bytes([previous]), charset) |
|
| 271 |
- # End checking for repeated characters. |
|
| 260 |
+ if self._repeat and result: |
|
| 261 |
+ bad_suffix = bytes(result[-1:]) * (self._repeat - 1) |
|
| 262 |
+ if result.endswith(bad_suffix): |
|
| 263 |
+ charset = self._subtract(bytes(result[-1:]), |
|
| 264 |
+ charset) |
|
| 272 | 265 |
pos = seq.generate(len(charset)) |
| 273 | 266 |
result.extend(charset[pos:pos+1]) |
| 274 | 267 |
except sequin.SequinExhaustedException: |
| ... | ... |
@@ -94,3 +94,22 @@ def test_218_all_character_classes(): |
| 94 | 94 |
space=3, dash=2, symbol=1).generate('google') ==
|
| 95 | 95 |
b': : fv_wqt>a-4w1S R' |
| 96 | 96 |
) |
| 97 |
+ |
|
| 98 |
+def test_219_only_numbers_and_very_high_repetition_limit(): |
|
| 99 |
+ generated = Vault(phrase=b'', length=40, lower=0, upper=0, space=0, |
|
| 100 |
+ dash=0, symbol=0, repeat=4).generate('abcdef')
|
|
| 101 |
+ assert b'0000' not in generated |
|
| 102 |
+ assert b'1111' not in generated |
|
| 103 |
+ assert b'2222' not in generated |
|
| 104 |
+ assert b'3333' not in generated |
|
| 105 |
+ assert b'4444' not in generated |
|
| 106 |
+ assert b'5555' not in generated |
|
| 107 |
+ assert b'6666' not in generated |
|
| 108 |
+ assert b'7777' not in generated |
|
| 109 |
+ assert b'8888' not in generated |
|
| 110 |
+ assert b'9999' not in generated |
|
| 111 |
+ |
|
| 112 |
+def test_220_very_limited_character_set(): |
|
| 113 |
+ generated = Vault(phrase=b'', length=24, lower=0, upper=0, |
|
| 114 |
+ space=0, symbol=0).generate('testing')
|
|
| 115 |
+ assert b'763252593304946694588866' == generated |
|
| 97 | 116 |