fix(auth): null password_hash pour utilisateurs OAuth (#88)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+8
-2
@@ -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
|
||||||
|
|||||||
@@ -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."
|
||||||
|
)
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
Reference in New Issue
Block a user