Refonte Domo91.py, mot de passe bcrypt
This commit is contained in:
114
app/domo91.py
114
app/domo91.py
@@ -23,7 +23,7 @@ st.write("Bienvenue sur l’application de supervision.")
|
||||
for key, default in {
|
||||
"authenticated": False,
|
||||
"role": None,
|
||||
"lieu_autorise": None,
|
||||
"site_autorise": None,
|
||||
"onglet_actif": "Accueil",
|
||||
"selected_date": date.today(),
|
||||
"selected_site": "Saclay",
|
||||
@@ -53,7 +53,7 @@ def verifier_password(input_password, hash_en_base):
|
||||
|
||||
|
||||
# --- Connexion utilisateur ---
|
||||
if not st.session_state["authenticated"]:
|
||||
if not st.session_state.get("authenticated", False):
|
||||
login = st.sidebar.text_input("Nom d'utilisateur")
|
||||
password = st.sidebar.text_input("Mot de passe", type="password")
|
||||
|
||||
@@ -61,27 +61,37 @@ if not st.session_state["authenticated"]:
|
||||
try:
|
||||
conn = get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
cursor.execute("SELECT * FROM MotsDePasse WHERE utilisateur = %s", (login,))
|
||||
|
||||
# On interroge la bonne table
|
||||
cursor.execute("""
|
||||
SELECT NomUtilisateur, MotDePasseHash, role, Site, DateExpiration
|
||||
FROM Acces.Utilisateurs
|
||||
WHERE NomUtilisateur = %s
|
||||
LIMIT 1
|
||||
""", (login,))
|
||||
result = cursor.fetchone()
|
||||
|
||||
if result and verifier_password(password, result["mot_de_passe"]):
|
||||
if result["Expiration"] and result["Expiration"] < date.today():
|
||||
st.sidebar.error("⛔ Accès expiré.")
|
||||
cursor.close()
|
||||
conn.close()
|
||||
st.stop()
|
||||
if not result:
|
||||
st.sidebar.error("Identifiants invalides")
|
||||
elif result["DateExpiration"] and result["DateExpiration"] < date.today():
|
||||
st.sidebar.error("⛔ Accès expiré.")
|
||||
elif not verifier_password(password, result["MotDePasseHash"]):
|
||||
st.sidebar.error("Identifiants invalides")
|
||||
else:
|
||||
# Authentification réussie
|
||||
st.session_state.update({
|
||||
"authenticated": True,
|
||||
"role": result["role"],
|
||||
"lieu_autorise": result["Lieu"]
|
||||
"site_autorise": result["Site"]
|
||||
})
|
||||
|
||||
now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
cursor.execute("INSERT INTO Connexion_Log (Utilisateur, Lieu, Date_Connexion) VALUES (%s, %s, %s)",
|
||||
(login, result["Lieu"], now_str))
|
||||
cursor.execute("""
|
||||
INSERT INTO Sondes.Connexion_Log (Utilisateur, Lieu, Date_Connexion)
|
||||
VALUES (%s, %s, %s)
|
||||
""", (result["NomUtilisateur"], result["Site"], now_str))
|
||||
conn.commit()
|
||||
st.rerun()
|
||||
else:
|
||||
st.sidebar.error("Identifiants invalides")
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
@@ -89,22 +99,61 @@ if not st.session_state["authenticated"]:
|
||||
except Exception as e:
|
||||
st.sidebar.error(f"Erreur connexion : {e}")
|
||||
else:
|
||||
st.sidebar.success(f"Connecté ({st.session_state['role']})")
|
||||
st.sidebar.success(f"Connecté ({st.session_state.get('role')})")
|
||||
if st.sidebar.button("🔓 Déconnexion"):
|
||||
for key in ["authenticated", "role", "lieu_autorise"]:
|
||||
for key in ["authenticated", "role", "site_autorise"]:
|
||||
st.session_state[key] = False if key == "authenticated" else None
|
||||
st.rerun()
|
||||
|
||||
# --- Bandeau Alertes ---
|
||||
try:
|
||||
conn = get_connection()
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
# Récupérer le site autorisé depuis la session
|
||||
site = st.session_state.get("lieu_autorise")
|
||||
|
||||
if site:
|
||||
# Lecture des alertes non acquittées pour ce site
|
||||
cursor.execute(f"""
|
||||
SELECT Id, Sonde, Debut_defaut, Etat
|
||||
FROM Alertes_{site}
|
||||
WHERE Etat != 'Acquitté'
|
||||
ORDER BY Debut_defaut DESC
|
||||
""")
|
||||
alertes = cursor.fetchall()
|
||||
|
||||
if alertes:
|
||||
st.markdown(
|
||||
f"<div style='background-color:#ffcccc;padding:10px;border-radius:8px;'>"
|
||||
f"🚨 <b>{len(alertes)} alerte(s) non résolue(s)</b> sur <b>{site}</b>"
|
||||
f"</div>",
|
||||
unsafe_allow_html=True
|
||||
)
|
||||
else:
|
||||
st.markdown(
|
||||
f"<div style='background-color:#ccffcc;padding:10px;border-radius:8px;'>"
|
||||
f"✅ Aucune alerte en cours sur <b>{site}</b>"
|
||||
f"</div>",
|
||||
unsafe_allow_html=True
|
||||
)
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except Exception as e:
|
||||
st.error(f"Erreur lors de la récupération des alertes : {e}")
|
||||
|
||||
|
||||
# --- Navigation ---
|
||||
if st.session_state["authenticated"]:
|
||||
onglets = ["Accueil", "Entretien"] if st.session_state["role"] != "superviseur" else ["Accueil", "Statistiques",
|
||||
"Entretien", "Traffic",
|
||||
"Utilisateurs"]
|
||||
"Entretien", "Traffic"]
|
||||
onglet_selectionne = st.sidebar.radio("📁 Navigation", onglets,
|
||||
index=onglets.index(st.session_state["onglet_actif"]))
|
||||
st.session_state["onglet_actif"] = onglet_selectionne
|
||||
|
||||
site_actuel = st.session_state.get("lieu_autorise") if st.session_state[
|
||||
site_actuel = st.session_state.get("site_autorise") if st.session_state[
|
||||
"role"] != "superviseur" else st.session_state.get(
|
||||
"selected_site", "Saclay")
|
||||
date_selectionnee = st.session_state.get("selected_date", date.today())
|
||||
@@ -192,7 +241,7 @@ if st.session_state["authenticated"]:
|
||||
elif onglet_selectionne == "Statistiques":
|
||||
st.markdown("## 📈 Statistiques de température")
|
||||
site = (
|
||||
st.session_state["lieu_autorise"]
|
||||
st.session_state["site_autorise"]
|
||||
if st.session_state["role"] != "superviseur"
|
||||
else st.session_state.get("selected_site", "Saclay")
|
||||
)
|
||||
@@ -203,7 +252,7 @@ if st.session_state["authenticated"]:
|
||||
cursor = conn.cursor(dictionary=True)
|
||||
|
||||
site = (
|
||||
st.session_state["lieu_autorise"]
|
||||
st.session_state["site_autorise"]
|
||||
if st.session_state["role"] != "superviseur"
|
||||
else st.session_state.get("selected_site", "Saclay")
|
||||
)
|
||||
@@ -333,26 +382,3 @@ if st.session_state["authenticated"]:
|
||||
st.error(f"Erreur : {e}")
|
||||
st.text(traceback.format_exc())
|
||||
|
||||
# --- Onglet Utilisateurs ---
|
||||
elif onglet_selectionne == "Utilisateurs":
|
||||
st.header("👥 Gestion des utilisateurs")
|
||||
with st.form("ajouter_utilisateur"):
|
||||
new_user = st.text_input("Nom d'utilisateur")
|
||||
new_pass = st.text_input("Mot de passe", type="password")
|
||||
new_role = st.selectbox("Rôle", ["utilisateur", "superviseur"])
|
||||
new_lieu = st.selectbox("Lieu", ["Saclay", "Meudon", "Roissy"])
|
||||
if st.form_submit_button("Ajouter"):
|
||||
try:
|
||||
conn = get_connection()
|
||||
cursor = conn.cursor()
|
||||
hash_mdp = hash_password(new_pass)
|
||||
cursor.execute(
|
||||
"INSERT INTO MotsDePasse (utilisateur, mot_de_passe, role, Lieu) VALUES (%s, %s, %s, %s)",
|
||||
(new_user, hash_mdp, new_role, new_lieu))
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
st.success("Utilisateur ajouté.")
|
||||
except Exception as e:
|
||||
st.error(f"Erreur : {e}")
|
||||
st.text(traceback.format_exc())
|
||||
Reference in New Issue
Block a user