diff --git a/.gitignore b/.gitignore index 2002883..d0d3515 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,10 @@ __pycache__/ .pytest_cache/ .hypothesis/ +# Local Python virtual environments +.venv/ +.venv-*/ + # BenchPark repository (external reference) benchpark/ diff --git a/result_server/routes/admin.py b/result_server/routes/admin.py index c660f18..edc6905 100644 --- a/result_server/routes/admin.py +++ b/result_server/routes/admin.py @@ -17,7 +17,7 @@ url_for, ) -from utils.admin_policy import parse_affiliations +from utils.admin_policy import is_valid_email, parse_affiliations from utils.audit_logging import audit_event from utils.rate_limit import rate_limited from utils.user_store import get_user_store @@ -121,6 +121,17 @@ def add_user(): if not email: flash("Email is required.") return redirect(url_for("admin.users")) + if not is_valid_email(email): + audit_event( + "admin_user_invite_rejected", + actor=session.get("user_email"), + target=email[:64], + result="failure", + level=logging.WARNING, + details={"reason": "invalid_email_format"}, + ) + flash("Invalid email address.") + return redirect(url_for("admin.users")) if store.user_exists(email): flash(f"User {email} is already registered. Use 'Reinvite' to reset their TOTP.") diff --git a/result_server/templates/admin_users.html b/result_server/templates/admin_users.html index 3e22a09..6a30b5a 100644 --- a/result_server/templates/admin_users.html +++ b/result_server/templates/admin_users.html @@ -128,13 +128,13 @@