############################################################################ # # # Description: Ensemble de méthodes pour étendre dbmain # # afin de gérer les utilisateurs # # # ############################################################################ from datetime import datetime from passlib.hash import sha512_crypt # Import de dbmain from src.database import dbmain # Extension de cette classe avec dbmain class DbUser(dbmain.DbMain): # **************************************************************************** # GESTION DES UTILISATEURS # **************************************************************************** # Enregistrement d'un nouvel utilisateur def register_user(self, email: str, password: str, userStatus: int) -> int: # On vérifie si l'email existe deja dans la bdd exist = self.check_exist_email(email) # Si non if not exist: # Chiffrement du pass passwordHash = self.crypt_pass(password) # Préparation de la requète reqAddUser = """ INSERT INTO """ + self.TABLEUSERACCOUNT + """ (email, password, inscriptionDate, userStatus) VALUES (%s, %s, %s, %s)""" # Execution de la requète self.exec_cmd( reqAddUser, [email, passwordHash, datetime.now().strftime("%Y-%m-%d %H:%M:%S"), userStatus], True ) # Retourne 1 pour réussite return 1 else: # Retourne 0 pour échec return 0 # Vérification de la combinaison email - pass pour authentification def check_user_credential(self, email, password): # Préparation de la requète pour récupérer les infos ou l'email est présent reqCheckCredential = """ SELECT userId, password FROM """ + self.TABLEUSERACCOUNT + """ WHERE email = %s """ # Execution de la requète self.exec_cmd(reqCheckCredential, [email]) result = self.cur.fetchone() # Vérifiaction de correspondance email & pass if result and sha512_crypt.verify(password, result[1]): return result[0] # Mise à jour des infos d'un utilisateur def update_user_infos(self, userInfos, userId, isPro, userJobs=None): # Préparation de la requète pour mise à jour des infos # J'ai préféré faire deux requètes distinctes et ne pas utiliser des valeurs # passées par POST (key => value) pour gérer les noms des colonnes # car je préfère les passer en "dur" dans mes requêtes (risque d'injection SQL%s). reqAddInfoClient = """ REPLACE INTO """ + self.TABLEUSERINFO + """ (lastname, firstname, phoneNumber, adress, zipCode, city, userId) VALUES (%s, %s, %s, %s, %s, %s, %s)""" reqAddInfoPro = """ REPLACE INTO """ + self.TABLEUSERINFO + """ (lastname, firstname, phoneNumber, adress, zipCode, city, degree, capability, description, userId) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" reqAddInfoProJobs = """ INSERT INTO """ + self.TABLEUSERJOB + """ (jobCategoryId, userId) VALUES (%s, %s)""" reqRemoveInfoProJobs = """ DELETE FROM """ + self.tableUserJob + """ WHERE jobCategoryId = %s AND userId = %s""" # if not isPro: # # Exécution de la requète # # https:#www.php.net/manual/fr/function.array-values.php # # Pour passer de "dict" a "list" -> array_values() # args = [i for i in userInfos] # args.push(userId) # self.exec_cmd(reqAddInfoClient, args) # else: # # https:#stackoverflow.com/questions/15986235/how-to-use-json-stringify-and-json-decode-properly # # Récupération des emplois dans le JSON et supression de ces derniers de la liste # selectedJobs = json_decode(html_entity_decode(userInfos["jobs"])) # unset(userInfos["jobs"]) # # array_value -> Qu'est ce qui est présent dans 1 mais pas dans 2 %s # # Comparaison des jobs anciennement présent avec ceux sélectionnés, donc ajoutés. # jobsAdded = array_values(array_diff(selectedJobs, userJobs)) # # Comparaison des jobs deja présent avec ceux sélectionnés, donc ajoutés. # jobsRemoved = array_values(array_diff(userJobs, selectedJobs)) # # on continue classiquement avec les autres éléments # args = array_values(userInfos) # array_push(args, userId) # self.exec_cmd(reqAddInfoPro, args) # for i in jobsAdded: # self.exec_cmd(reqAddInfoProJobs, array(jobsAdded[i], userId)) # for i in jobsRemoved: # self.exec_cmd(reqRemoveInfoProJobs, array(jobsRemoved[i], userId)) # **************************************************************************** # GESTION DU TOKEN AUTOLOGIN # **************************************************************************** # Vérification de la combinaison email - jeton d'auto-login pour authentification def check_token_autologin(self, email, token): # Préparation de la requète pour récupérer les infos ou l'email est présent reqCheckToken = """ SELECT userId, tokenAutoLogin FROM """ + self.TABLEUSERACCOUNT + """ WHERE email = %s""" # Exécution de la requète self.exec_cmd(reqCheckToken, [email]) result = self.cur.fetchone() # Vérifiaction de correspondance email & jeton d'auto-connection if result and result[1] == token: return result[0] # Mise à jour du jeton d'auto-login def update_token_autologin(self, email, token): # Préparation de la requète pour mise à jour du jeton d'auto-connection reqUpdateToken = """ UPDATE """ + self.TABLEUSERACCOUNT + """ SET tokenAutoLogin = %s WHERE email = %s""" # Execution de la requète self.exec_cmd(reqUpdateToken, [token, email]) # Supression du jeton d'auto-login def del_token_autologin(self, email): # Préparation de la requète pour supression du jeton d'auto-connection reqDeleteToken = """ UPDATE """ + self.TABLEUSERACCOUNT + """ SET tokenAutoLogin = NULL WHERE email = %s""" # Execution de la requète self.exec_cmd(reqDeleteToken, [email])