From 9d85e5adc6fbde931ca63838f352f74c6bcb8e28 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Fri, 19 Nov 2021 11:41:37 +0100 Subject: [PATCH] Check if password respect the app policy --- main.py | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 4b03593..3bd5dd8 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,8 @@ import tkinter.messagebox as messagebox from tkinter import * +from re import sub + from users import Utilisateurs # import de mon fichier pour gérer la base de donnée def dimensionsFenetre(fenetre, taille: tuple): @@ -18,20 +20,52 @@ class GesMag: def demarrer(self) -> None: """Lance le programme GesMag.""" print("Lancement de l'interface de gestion d'une caisse d'un magasin...") - self.font = ("Comfortaa", 14) # Police par défaut - Utilisateurs().creationTable() # On créer la base de donnée si elle n'existe pas déjà - self.parent = Tk() # On créer notre fenêtre principale + self.font = ("Comfortaa", 14) # police par défaut + Utilisateurs().creationTable() # on créer la base de donnée si elle n'existe pas déjà + self.parent = Tk() # on créer notre fenêtre principale - self._interfaceConnexion() # On créer la variable `self.f` qui est la frame a affiché - self.f.grid() # On affiche la frame + self._interfaceConnexion() # on créer la variable `self.f` qui est la frame a affiché + self.f.grid() # on affiche la frame - self.parent.mainloop() # On affiche la fenêtre + self.parent.mainloop() # on affiche la fenêtre + + def motDePasseCorrect(self, motDPasse: str) -> tuple: + """Détermine si un mot de passe suit la politique du programme ou non.""" + if len(motDPasse) == 0: # si le champs est vide + return (False, "Mot de passe incorrect.") + if len(motDPasse) < 8: # si le mot de passe est plus petit que 8 caractères + return (False, "Un mot de passe doit faire 8 caractères minimum.") + """ + Pour le regex, je réfléchie comme dans la fonction `self.connexion`. + J'utilises pas `match` parce que je suis plus à l'aise avec `sub`. + """ + if not sub(r"[A-Z]", '', motDPasse) != motDPasse: + return (False, "Un mot de passe doit au moins contenir une lettre majuscule.") + if not sub(r"[a-z]", '', motDPasse) != motDPasse: + return (False, "Un mot de passe doit au moins contenir une lettre minuscule.") + if not sub(r" *?[^\w\s]+", '', motDPasse) != motDPasse: + return (False, "Un mot de passe doit au moins contenir un caractère spécial.") + + return (True,) # si aucun des tests précédents n'est valide, alors le mot de passe est valide def connexion(self, utilisateur: str, motDePasse: str): """Gère la connexion aux différentes interfaces de l'application.""" - # Vérification nom d'utilisateur / mot de passe correctement entré - if len(utilisateur) == 0 or len(motDePasse) == 0 or len(motDePasse) < 8: - messagebox.showerror("Erreur", "Utilisateur ou mot de passe incorrect.") + """ + Vérification nom d'utilisateur / mot de passe correctement entré + -> Pour le nom d'utilisateur on vérifie si le champs n'est pas vide + et si il y a bien que des lettres et des chiffres (le regex élimine tout + ce qui n'est pas ça, alors si la fonction `sub` renvoie pas exactement + la même chaîne de charactère alors c'est qu'il y avait un charactère + interdit dans le nom d'utilisateur). + -> Pour le mot de passe on demande à la fonction `motDePasseCorrect` pour + éviter de faire tout les tests ici. + """ + if len(utilisateur) == 0 or sub(r" *?[^\w\s]+", '', utilisateur) != utilisateur: + messagebox.showerror("Erreur", "Utilisateur incorrect.") + return + mdpOk = self.motDePasseCorrect(motDePasse) + if not mdpOk[0]: + messagebox.showerror("Erreur", mdpOk[1]) return # Redirection vers la bonne interface @@ -51,7 +85,7 @@ class GesMag: # Affichage des labels et boutons tentativeDeConnexion = lambda _ = None: self.connexion(utilisateur.get(), motDpasse.get()) # lambda pour envoyer les informations entrés dans le formulaire - ecart = 80 # Ecart pour avoir un affichage centré + ecart = 80 # écart pour avoir un affichage centré Label(self.f).grid(row=0, pady=50) # utilisé pour du padding (meilleur affichage) Label(self.f, text="Utilisateur", font=self.font).grid(column=0, row=1, columnspan=2, padx=ecart - 20, pady=20, sticky=W)