fix(auth): null password_hash pour utilisateurs OAuth (#88)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Colin Maudry
2026-06-24 23:27:15 +02:00
parent aac3753226
commit 5a702ac77e
3 changed files with 14 additions and 2 deletions
+8 -2
View File
@@ -100,7 +100,9 @@ def login():
check_password_hash(_DUMMY_HASH, password) # uniformiser le temps check_password_hash(_DUMMY_HASH, password) # uniformiser le temps
return _redirect_with_error("/connexion", "invalid_credentials", email) return _redirect_with_error("/connexion", "invalid_credentials", email)
if not check_password_hash(row["password_hash"], password): if row["password_hash"] is None or not check_password_hash(
row["password_hash"], password
):
return _redirect_with_error("/connexion", "invalid_credentials", email) return _redirect_with_error("/connexion", "invalid_credentials", email)
if not row["email_verified"]: if not row["email_verified"]:
@@ -177,6 +179,8 @@ def change_password():
password_confirm = request.form.get("password_confirm") or "" password_confirm = request.form.get("password_confirm") or ""
row = db.get_user_by_id(current_user.id) row = db.get_user_by_id(current_user.id)
if row["password_hash"] is None:
return _redirect_with_error("/compte/admin", "no_password_set")
if not check_password_hash(row["password_hash"], current_pw): if not check_password_hash(row["password_hash"], current_pw):
return _redirect_with_error("/compte/admin", "invalid_current_password") return _redirect_with_error("/compte/admin", "invalid_current_password")
@@ -231,7 +235,9 @@ def confirm_email_change():
def delete_account(): def delete_account():
current_pw = request.form.get("current_password") or "" current_pw = request.form.get("current_password") or ""
row = db.get_user_by_id(current_user.id) row = db.get_user_by_id(current_user.id)
if not check_password_hash(row["password_hash"], current_pw): if row["password_hash"] is not None and not check_password_hash(
row["password_hash"], current_pw
):
return _redirect_with_error("/compte/admin", "invalid_current_password") return _redirect_with_error("/compte/admin", "invalid_current_password")
user_id = current_user.id user_id = current_user.id
+5
View File
@@ -63,3 +63,8 @@ def init_auth(app: Flask) -> None:
"LINKEDIN_CLIENT_ID non défini : la connexion LinkedIn échouera. " "LINKEDIN_CLIENT_ID non défini : la connexion LinkedIn échouera. "
"Définissez LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRET dans .env." "Définissez LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRET dans .env."
) )
if not os.getenv("APP_BASE_URL"):
logger.warning(
"APP_BASE_URL non défini : le callback LinkedIn produira une URI relative invalide."
)
+1
View File
@@ -14,6 +14,7 @@ register_page(
ERROR_MESSAGES = { ERROR_MESSAGES = {
"invalid_current_password": "Le mot de passe actuel est incorrect.", "invalid_current_password": "Le mot de passe actuel est incorrect.",
"no_password_set": "Votre compte n'a pas de mot de passe (connexion via LinkedIn). Utilisez la réinitialisation de mot de passe pour en définir un.",
"password_too_short": "Le nouveau mot de passe doit faire au moins 8 caractères.", "password_too_short": "Le nouveau mot de passe doit faire au moins 8 caractères.",
"password_mismatch": "Les nouveaux mots de passe ne correspondent pas.", "password_mismatch": "Les nouveaux mots de passe ne correspondent pas.",
"invalid_email": "L'adresse email n'est pas valide.", "invalid_email": "L'adresse email n'est pas valide.",