Version 2.1 amélioration sécurité et corrections bugs majeures.
This commit is contained in:
1 parent
0259427cf2
commit
e301b931c6
4 files changed
+828
-339
No files matched your search
@@ -2,34 +2,56 @@ import re
|
||||
import pyotp
|
||||
import hashlib
|
||||
import hmac
|
||||
import os
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
def validate_password_strength(password):
|
||||
"""Vérifie que le mot de passe respecte les critères de sécurité stricts."""
|
||||
if len(password) < 12:
|
||||
return "Le mot de passe doit contenir au moins 12 caractères."
|
||||
if not re.search(r"[A-Z]", password):
|
||||
return "Le mot de passe doit contenir au moins une majuscule."
|
||||
if not re.search(r"[a-z]", password):
|
||||
return "Le mot de passe doit contenir au moins une minuscule."
|
||||
if not re.search(r"[0-9]", password):
|
||||
return "Le mot de passe doit contenir au moins un chiffre."
|
||||
if not re.search(r"[!@#$%^&*(),.?\":{}|<>]", password):
|
||||
return "Le mot de passe doit contenir au moins un caractère spécial."
|
||||
if len(password) < 12: return "Le mot de passe doit contenir au moins 12 caractères."
|
||||
if not re.search(r"[A-Z]", password): return "Le mot de passe doit contenir au moins une majuscule."
|
||||
if not re.search(r"[a-z]", password): return "Le mot de passe doit contenir au moins une minuscule."
|
||||
if not re.search(r"[0-9]", password): return "Le mot de passe doit contenir au moins un chiffre."
|
||||
if not re.search(r"[!@#$%^&*(),.?\":{}|<>]", password): return "Le mot de passe doit contenir au moins un caractère spécial."
|
||||
return None
|
||||
|
||||
def hash_password(password):
|
||||
"""Hachage sécurisé du mot de passe."""
|
||||
return hashlib.sha256(password.encode()).hexdigest()
|
||||
|
||||
def verify_password(stored_hash, provided_password):
|
||||
"""Vérifie un mot de passe par rapport à son haché."""
|
||||
return hmac.compare_digest(stored_hash, hash_password(provided_password))
|
||||
|
||||
def generate_totp_secret():
|
||||
"""Génère une clé secrète pour le 2FA."""
|
||||
return pyotp.random_base32()
|
||||
|
||||
def verify_totp(secret, code):
|
||||
"""Vérifie le code TOTP fourni par l'application d'authentification."""
|
||||
totp = pyotp.TOTP(secret)
|
||||
return totp.verify(code)
|
||||
return totp.verify(code)
|
||||
|
||||
def send_invite_email(to_email, setup_link):
|
||||
smtp_server = os.getenv("SMTP_SERVER")
|
||||
smtp_port = int(os.getenv("SMTP_PORT", 587))
|
||||
smtp_user = os.getenv("SMTP_USER")
|
||||
smtp_pass = os.getenv("SMTP_PASS")
|
||||
|
||||
if not all([smtp_server, smtp_user, smtp_pass]):
|
||||
print("Erreur: Configuration SMTP incomplète dans .env")
|
||||
return False
|
||||
|
||||
msg = MIMEMultipart()
|
||||
msg['From'] = f"AETHAS38 <{smtp_user}>"
|
||||
msg['To'] = to_email
|
||||
msg['Subject'] = "Invitation au Hub AETHAS38"
|
||||
body = f"Vous avez été invité(e) à rejoindre le hub IA AETHAS38.\nLien de configuration 2FA : {setup_link}"
|
||||
msg.attach(MIMEText(body, 'plain', 'utf-8'))
|
||||
|
||||
try:
|
||||
server = smtplib.SMTP(smtp_server, smtp_port)
|
||||
server.starttls()
|
||||
server.login(smtp_user, smtp_pass)
|
||||
server.send_message(msg)
|
||||
server.quit()
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Erreur SMTP: {e}")
|
||||
return False
|
||||
Reference in new issue
Block a user