| 17 | |
| 18 | |
| 19 | class PasswordHelper(PasswordHelperProtocol): |
| 20 | def __init__(self, password_hash: PasswordHash | None = None) -> None: |
| 21 | if password_hash is None: |
| 22 | self.password_hash = PasswordHash( |
| 23 | ( |
| 24 | Argon2Hasher(), |
| 25 | BcryptHasher(), |
| 26 | ) |
| 27 | ) |
| 28 | else: |
| 29 | self.password_hash = password_hash # pragma: no cover |
| 30 | |
| 31 | def verify_and_update( |
| 32 | self, plain_password: str, hashed_password: str |
| 33 | ) -> tuple[bool, str | None]: |
| 34 | return self.password_hash.verify_and_update(plain_password, hashed_password) |
| 35 | |
| 36 | def hash(self, password: str) -> str: |
| 37 | return self.password_hash.hash(password) |
| 38 | |
| 39 | def generate(self) -> str: |
| 40 | return secrets.token_urlsafe() |
no outgoing calls
no test coverage detected
searching dependent graphs…