From 1ac275c4150cd38d8e17c481bc7dcd601d5d9031 Mon Sep 17 00:00:00 2001 From: kitoy Date: Thu, 1 Sep 2022 07:29:49 +0200 Subject: [PATCH] =?UTF-8?q?Travaux=20sur=20la=20validit=C3=A9=20des=20mail?= =?UTF-8?q?s=20et=20des=20mots=20de=20passes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/utils.py | 16 ++++++- views/inscription.py | 101 ++++++++++++++++++++++--------------------- views/profil.py | 22 ++++++---- 3 files changed, 81 insertions(+), 58 deletions(-) diff --git a/tools/utils.py b/tools/utils.py index fada7dc..5c7e066 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -27,11 +27,12 @@ def append_to_log(log_line, user): def email_disp(email): disp = True unique_at = len(email.split('@')) - print (unique_at) if len(email) < 80 and unique_at == 2: conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée cursor = conn.cursor() # Création de l'objet "curseur" + # Caractères non autorisés dans la RFC #822 + invalid_char = { '(', ')', '<', '>', ',', ';', ':', '"', '[', ']', '|', 'ç', '%', '&' } cursor.execute("""SELECT mail FROM users WHERE mail=?""", (email,)) testmail = cursor.fetchall() @@ -47,12 +48,25 @@ def email_disp(email): if email in alias: disp=False + for character in invalid_char: + if(email.find(character)>0): + disp=False + + else: disp = False return disp +def valid_passwd(password): + if '"' in password or "&" in password: + return False + else: + return True + + + def valid_token_register(token): valid = True print(token) diff --git a/views/inscription.py b/views/inscription.py index 28133bb..d51e1cf 100644 --- a/views/inscription.py +++ b/views/inscription.py @@ -2,7 +2,7 @@ from flask import Blueprint, Flask, request, flash, render_template, url_for, se from flask_bcrypt import Bcrypt import sqlite3 import glob, os, sys, time -from tools.utils import email_disp, valid_token_register +from tools.utils import email_disp, valid_token_register, valid_passwd from socket import gethostname app = Flask( 'pywallter' ) @@ -35,23 +35,40 @@ def signin(token) : if 'username' in session : resp = redirect(url_for('profil.profile', _external=True)) else : + + # Réponse si la requete est de type GET ou si la requete POST echoue + resp = render_template('inscription.html', + signin_enable=app.config['SIGNIN_ENABLE'], + token=token, hostname=hostname, + url_inscription=url_inscription, + MAIL_SERVER=MAIL_SERVER) + + if request.method == 'POST': - if not(request.form['user']) or not(request.form['passwd']) : - if MAIL_SERVER: - if not(request.form['mail']): - flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error') - return render_template('inscription.html', - signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, - url_inscription=url_inscription, - MAIL_SERVER=MAIL_SERVER) - else: + + #On test si aucun champs du formulaire n'est vide. + if MAIL_SERVER: + if len(request.form['user']) == 0 or \ + len(request.form['passwd']) == 0 or \ + len(request.form['passwdconfirm']) == 0 or \ + len(request.form['mail']) == 0 : flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error') return render_template('inscription.html', signin_enable=app.config['SIGNIN_ENABLE'], token=token, hostname=hostname, url_inscription=url_inscription, MAIL_SERVER=MAIL_SERVER) + else: + if len(request.form['user']) == 0 or \ + len(request.form['passwd']) == 0 or \ + len(request.form['passwdconfirm']) == 0: + + flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error') + return render_template('inscription.html', + signin_enable=app.config['SIGNIN_ENABLE'], + token=token, hostname=hostname, + url_inscription=url_inscription, + MAIL_SERVER=MAIL_SERVER) user = request.form['user'] passwd = request.form['passwd'] @@ -60,6 +77,9 @@ def signin(token) : bcrypt_passwd = bcrypt.generate_password_hash(request.form['passwd']) mail_passwd_change = 0 + password_valid = valid_passwd(passwd) + not_error = True + conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée cursor = conn.cursor() # Création de l'objet "curseur" @@ -67,38 +87,39 @@ def signin(token) : testuser = cursor.fetchone() conn.close() + if testuser: + flash(u'Non d\'utilisateur déjà utilisé, merci d\'en choisir un autre', 'error') + not_error = False + + + if not(password_valid): + flash (u'Les caractère & et " ne sont pas autorisé dans les mots de passe', 'error') + not_error = False if MAIL_SERVER: mail = request.form['mail'].lower()+'@'+hostname if not(email_disp(mail)) : flash(u'Adresse email déjà utilisé ou invalide, merci d\'en choisir une autre', 'error') - resp = render_template('inscription.html', - signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, - url_inscription=url_inscription, - MAIL_SERVER=MAIL_SERVER) - else: - cmd = SETUID + " set_mail_passwd " + "'"+mail+"' " + "'"+passwd+"'" - mail_passwd_change = os.system(cmd) + not_error = False - - if testuser or mail_passwd_change != 0 or resp: - flash(u'Non d\'utilisateur déjà utilisé, merci d\'en choisir un autre', 'error') - resp = render_template('inscription.html', - signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, - url_inscription=url_inscription, - MAIL_SERVER=MAIL_SERVER) - - else: + if not_error: confirmation = bcrypt.check_password_hash(bcrypt_passwd, passwdconfirm) - if confirmation is True: + if confirmation is False: + flash(u'Les mots de passe ne sont pas identiques !', 'error') + else: conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée cursor = conn.cursor() # Création de l'objet "curseur" cursor.execute("""INSERT INTO users(name, mail, passwd) VALUES(?, ?, ?)""", (user, mail, bcrypt_passwd)) # Insérer des valeurs conn.commit() # Sauvegarder valeurs dans la bdd + # On change le mot de passe du compte mail + if MAIL_SERVER: + cmd = SETUID + ' set_mail_passwd ' + '"'+mail+'" ' + '"'+passwd+'"' + mail_passwd_change = os.system(cmd) + if mail_passwd_change != 0: + flash(u'Il y a eu une problème lors du changement de mot passe pour le compte Mail', 'error') + # On change le mot de passe du compte XMPP if XMMP_SERVER: tmp = mail.split('@') cmd = SETUID+ ' prosodyctl register ' "'"+tmp[0]+"' " + "'"+tmp[1]+"' " + "'"+passwd+"'" @@ -106,12 +127,7 @@ def signin(token) : if res != 0: flash(u'Il y a eu un problème pour la création du compte XMPP !', 'error') - cursor.execute("""SELECT name, mail, passwd FROM users""") - - users = cursor.fetchall() - for i in users: - i = print('{0} - {1} - {2}'.format(i[0], i[1], i[2])) - + # on créé les dossier de l'utilisateur userracine = DOSSIER_PERSO + user userfiles = userracine + '/files' userimages = userracine + '/images' @@ -141,20 +157,7 @@ def signin(token) : flash(u'Inscription réalisée avec succés !', 'succes') resp = redirect(url_for('loginlogout.login')) - else: - flash(u'Les mots de passe ne sont pas identiques !', 'error') - resp = render_template('inscription.html', - signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, - url_inscription=url_inscription, - MAIL_SERVER=MAIL_SERVER) - else : - resp = render_template('inscription.html', - signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, - url_inscription=url_inscription, - MAIL_SERVER=MAIL_SERVER) else: resp = redirect(BASE_URL, code=401) diff --git a/views/profil.py b/views/profil.py index 47b5818..21326c0 100644 --- a/views/profil.py +++ b/views/profil.py @@ -6,7 +6,7 @@ import sqlite3 import os from socket import gethostname from flask_bcrypt import Bcrypt -from tools.utils import email_disp, append_to_log, gen_token +from tools.utils import email_disp, append_to_log, gen_token, valid_passwd profil = Blueprint('profil', __name__, template_folder='templates') @@ -122,15 +122,19 @@ def change_passwd() : mailbox['alias'] = tmp[1] mailbox['xmpp'] = tmp[2] + if request.method == 'POST' : - if request.form['password'] == request.form['passwd_confirm']: + password = request.form['password'] + password_confirm = request.form['passwd_confirm'] + + if password == password_confirm and valid_passwd(password): mail_passwd_change = 0 xmmp_passwd_change = 0 passwd = request.form['password'] - mail_passwd_change = 0 + if MAIL_SERVER: - cmd = SETUID+ " set_mail_passwd " + "'"+mailbox['Mail']+"' "+"'"+passwd+"'" + cmd = SETUID+ ' set_mail_passwd ' + '"'+mailbox['Mail']+'" '+ '"'+passwd+'"' mail_passwd_change = os.system(cmd) @@ -153,9 +157,11 @@ def change_passwd() : log=TIME + ' - ' + IP + ' - ' + UTILISATEUR + ' - ' + CLIENT_PLATFORM + '\n' + '---> ' + "Changement du mot de passe" + '\n' append_to_log(log, UTILISATEUR) flash(u'Votre mot de passe a été changé', 'succes') - else: - flash(u'Il y eu un problème votre mot de passe n\'a pas été changé', 'error') - can_commit=False + else: + if not( valid_passwd(password) ): + flash(u'Le mot de passe ne peut pas contenir les caractères " et &', 'error') + else: + flash(u'Les mot de passes ne sont pas identique :/ ', 'error') conn.close() return render_template('mailbox.html', @@ -247,7 +253,7 @@ def remove_alias(aliasrm): aliases = aliases + "," + alias else: aliases = alias - cmd = SETUID+ " set_mail_alias " + "'"+mail+"'"+" del "+"'"+alias+"'" + cmd = SETUID + " set_mail_alias " + "'"+mail+"'"+" del "+"'"+alias+"'" res = os.system(cmd) if res == 0: cursor.execute("UPDATE users SET alias=? WHERE name=?",