auth: validate_new_password helper (min length 8)
Single source of truth for the password policy, to be reused by the upcoming /profile/password endpoint and (optionally) the create-user CLI. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2353378b23
commit
a5982941df
2 changed files with 27 additions and 0 deletions
|
|
@ -21,6 +21,17 @@ def verify_password(raw: str, digest: str) -> bool:
|
||||||
return check_password_hash(digest, raw)
|
return check_password_hash(digest, raw)
|
||||||
|
|
||||||
|
|
||||||
|
MIN_PASSWORD_LENGTH = 8
|
||||||
|
|
||||||
|
|
||||||
|
def validate_new_password(raw: str) -> str | None:
|
||||||
|
if raw == "":
|
||||||
|
return "password must not be empty"
|
||||||
|
if len(raw) < MIN_PASSWORD_LENGTH:
|
||||||
|
return f"password must be at least {MIN_PASSWORD_LENGTH} characters"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def load_current_user() -> None:
|
def load_current_user() -> None:
|
||||||
user_id = session.get("user_id")
|
user_id = session.get("user_id")
|
||||||
if user_id is None:
|
if user_id is None:
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,22 @@ def test_create_user_cli_rejects_empty_environment_password(tmp_path, monkeypatc
|
||||||
assert "password must not be empty" in result.output
|
assert "password must not be empty" in result.output
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_new_password_rejects_empty():
|
||||||
|
from l4d2web.auth import validate_new_password
|
||||||
|
assert validate_new_password("") == "password must not be empty"
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_new_password_rejects_short():
|
||||||
|
from l4d2web.auth import MIN_PASSWORD_LENGTH, validate_new_password
|
||||||
|
assert MIN_PASSWORD_LENGTH == 8
|
||||||
|
assert validate_new_password("a" * 7) == "password must be at least 8 characters"
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_new_password_accepts_min_length():
|
||||||
|
from l4d2web.auth import validate_new_password
|
||||||
|
assert validate_new_password("a" * 8) is None
|
||||||
|
|
||||||
|
|
||||||
def test_create_user_cli_rejects_duplicate_username(tmp_path, monkeypatch) -> None:
|
def test_create_user_cli_rejects_duplicate_username(tmp_path, monkeypatch) -> None:
|
||||||
db_url = f"sqlite:///{tmp_path/'duplicate_user.db'}"
|
db_url = f"sqlite:///{tmp_path/'duplicate_user.db'}"
|
||||||
monkeypatch.setenv("DATABASE_URL", db_url)
|
monkeypatch.setenv("DATABASE_URL", db_url)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue