Travaux sur la validité des mails et des mots de passes

This commit is contained in:
kitoy 2022-09-01 07:29:49 +02:00
parent b8f03b77da
commit 1ac275c415
3 changed files with 81 additions and 58 deletions

View File

@ -27,11 +27,12 @@ def append_to_log(log_line, user):
def email_disp(email): def email_disp(email):
disp = True disp = True
unique_at = len(email.split('@')) unique_at = len(email.split('@'))
print (unique_at)
if len(email) < 80 and unique_at == 2: if len(email) < 80 and unique_at == 2:
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
cursor = conn.cursor() # Création de l'objet "curseur" 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,)) cursor.execute("""SELECT mail FROM users WHERE mail=?""", (email,))
testmail = cursor.fetchall() testmail = cursor.fetchall()
@ -47,12 +48,25 @@ def email_disp(email):
if email in alias: if email in alias:
disp=False disp=False
for character in invalid_char:
if(email.find(character)>0):
disp=False
else: else:
disp = False disp = False
return disp return disp
def valid_passwd(password):
if '"' in password or "&" in password:
return False
else:
return True
def valid_token_register(token): def valid_token_register(token):
valid = True valid = True
print(token) print(token)

View File

@ -2,7 +2,7 @@ from flask import Blueprint, Flask, request, flash, render_template, url_for, se
from flask_bcrypt import Bcrypt from flask_bcrypt import Bcrypt
import sqlite3 import sqlite3
import glob, os, sys, time 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 from socket import gethostname
app = Flask( 'pywallter' ) app = Flask( 'pywallter' )
@ -35,23 +35,40 @@ def signin(token) :
if 'username' in session : if 'username' in session :
resp = redirect(url_for('profil.profile', _external=True)) resp = redirect(url_for('profil.profile', _external=True))
else : 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 request.method == 'POST':
if not(request.form['user']) or not(request.form['passwd']) :
if MAIL_SERVER: #On test si aucun champs du formulaire n'est vide.
if not(request.form['mail']): if MAIL_SERVER:
flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error') if len(request.form['user']) == 0 or \
return render_template('inscription.html', len(request.form['passwd']) == 0 or \
signin_enable=app.config['SIGNIN_ENABLE'], len(request.form['passwdconfirm']) == 0 or \
token=token, hostname=hostname, len(request.form['mail']) == 0 :
url_inscription=url_inscription,
MAIL_SERVER=MAIL_SERVER)
else:
flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error') flash(u'Il faut remplir le formulaire en entier, les champs ne peuvent pas etre vide ', 'error')
return render_template('inscription.html', return render_template('inscription.html',
signin_enable=app.config['SIGNIN_ENABLE'], signin_enable=app.config['SIGNIN_ENABLE'],
token=token, hostname=hostname, token=token, hostname=hostname,
url_inscription=url_inscription, url_inscription=url_inscription,
MAIL_SERVER=MAIL_SERVER) 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'] user = request.form['user']
passwd = request.form['passwd'] passwd = request.form['passwd']
@ -60,6 +77,9 @@ def signin(token) :
bcrypt_passwd = bcrypt.generate_password_hash(request.form['passwd']) bcrypt_passwd = bcrypt.generate_password_hash(request.form['passwd'])
mail_passwd_change = 0 mail_passwd_change = 0
password_valid = valid_passwd(passwd)
not_error = True
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
cursor = conn.cursor() # Création de l'objet "curseur" cursor = conn.cursor() # Création de l'objet "curseur"
@ -67,38 +87,39 @@ def signin(token) :
testuser = cursor.fetchone() testuser = cursor.fetchone()
conn.close() 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: if MAIL_SERVER:
mail = request.form['mail'].lower()+'@'+hostname mail = request.form['mail'].lower()+'@'+hostname
if not(email_disp(mail)) : if not(email_disp(mail)) :
flash(u'Adresse email déjà utilisé ou invalide, merci d\'en choisir une autre', 'error') flash(u'Adresse email déjà utilisé ou invalide, merci d\'en choisir une autre', 'error')
resp = render_template('inscription.html', not_error = False
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)
if not_error:
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:
confirmation = bcrypt.check_password_hash(bcrypt_passwd, passwdconfirm) 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 conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
cursor = conn.cursor() # Création de l'objet "curseur" 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 cursor.execute("""INSERT INTO users(name, mail, passwd) VALUES(?, ?, ?)""", (user, mail, bcrypt_passwd)) # Insérer des valeurs
conn.commit() # Sauvegarder valeurs dans la bdd 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: if XMMP_SERVER:
tmp = mail.split('@') tmp = mail.split('@')
cmd = SETUID+ ' prosodyctl register ' "'"+tmp[0]+"' " + "'"+tmp[1]+"' " + "'"+passwd+"'" cmd = SETUID+ ' prosodyctl register ' "'"+tmp[0]+"' " + "'"+tmp[1]+"' " + "'"+passwd+"'"
@ -106,12 +127,7 @@ def signin(token) :
if res != 0: if res != 0:
flash(u'Il y a eu un problème pour la création du compte XMPP !', 'error') 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""") # on créé les dossier de l'utilisateur
users = cursor.fetchall()
for i in users:
i = print('{0} - {1} - {2}'.format(i[0], i[1], i[2]))
userracine = DOSSIER_PERSO + user userracine = DOSSIER_PERSO + user
userfiles = userracine + '/files' userfiles = userracine + '/files'
userimages = userracine + '/images' userimages = userracine + '/images'
@ -141,20 +157,7 @@ def signin(token) :
flash(u'Inscription réalisée avec succés !', 'succes') flash(u'Inscription réalisée avec succés !', 'succes')
resp = redirect(url_for('loginlogout.login')) 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: else:
resp = redirect(BASE_URL, code=401) resp = redirect(BASE_URL, code=401)

View File

@ -6,7 +6,7 @@ import sqlite3
import os import os
from socket import gethostname from socket import gethostname
from flask_bcrypt import Bcrypt 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') profil = Blueprint('profil', __name__, template_folder='templates')
@ -122,15 +122,19 @@ def change_passwd() :
mailbox['alias'] = tmp[1] mailbox['alias'] = tmp[1]
mailbox['xmpp'] = tmp[2] mailbox['xmpp'] = tmp[2]
if request.method == 'POST' : 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 mail_passwd_change = 0
xmmp_passwd_change = 0 xmmp_passwd_change = 0
passwd = request.form['password'] passwd = request.form['password']
mail_passwd_change = 0
if MAIL_SERVER: 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) 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' log=TIME + ' - ' + IP + ' - ' + UTILISATEUR + ' - ' + CLIENT_PLATFORM + '\n' + '---> ' + "Changement du mot de passe" + '\n'
append_to_log(log, UTILISATEUR) append_to_log(log, UTILISATEUR)
flash(u'Votre mot de passe a été changé', 'succes') flash(u'Votre mot de passe a été changé', 'succes')
else: else:
flash(u'Il y eu un problème votre mot de passe n\'a pas été changé', 'error') if not( valid_passwd(password) ):
can_commit=False 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() conn.close()
return render_template('mailbox.html', return render_template('mailbox.html',
@ -247,7 +253,7 @@ def remove_alias(aliasrm):
aliases = aliases + "," + alias aliases = aliases + "," + alias
else: else:
aliases = alias aliases = alias
cmd = SETUID+ " set_mail_alias " + "'"+mail+"'"+" del "+"'"+alias+"'" cmd = SETUID + " set_mail_alias " + "'"+mail+"'"+" del "+"'"+alias+"'"
res = os.system(cmd) res = os.system(cmd)
if res == 0: if res == 0:
cursor.execute("UPDATE users SET alias=? WHERE name=?", cursor.execute("UPDATE users SET alias=? WHERE name=?",