186 lines
7.7 KiB
Python
186 lines
7.7 KiB
Python
from flask import Blueprint, Flask, request, flash, render_template, url_for, session, redirect, abort, make_response, send_file
|
|
import sqlite3
|
|
from markupsafe import escape
|
|
from flask_bcrypt import Bcrypt
|
|
from socket import gethostname
|
|
from os import remove, system
|
|
from tools.utils import email_disp, valid_token_register, valid_passwd, valid_username, gen_token
|
|
from tools.mailer import Mailer
|
|
|
|
app = Flask( 'pywallter' )
|
|
app.config.from_pyfile('config.py')
|
|
bcrypt = Bcrypt(app)
|
|
|
|
#### Variables ####################################################################################
|
|
|
|
bcrypt = Bcrypt(app)
|
|
DATAS_USER = app.config['DOSSIER_APP']
|
|
|
|
extensionimg = app.config['EXT_IMG']
|
|
|
|
DATABASE = app.config['DATABASE']
|
|
|
|
BASE_URL = app.config['BASE_URL']
|
|
SETUID = app.config['SETUID']
|
|
MAIL_SERVER = app.config['MAIL_SERVER']
|
|
XMPP_SERVER = app.config['XMPP_SERVER']
|
|
BACKUP_TIME = app.config['BACKUP_TIME']
|
|
##################################################################################################
|
|
|
|
|
|
loginlogout = Blueprint('loginlogout', __name__, template_folder='templates')
|
|
|
|
@loginlogout.route( '/login/', methods=['GET','POST'] )
|
|
def login() :
|
|
if 'username' in session :
|
|
resp = redirect(url_for('profil.profile', _external=True))
|
|
else :
|
|
resp = redirect(url_for('loginlogout.login', _external=True))
|
|
if request.method == 'POST' :
|
|
user = request.form['user']
|
|
password = request.form['passwd']
|
|
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
|
|
cursor = conn.cursor() # Création de l'objet "curseur"
|
|
cursor.execute("""SELECT name, passwd FROM users WHERE name=?""", (user,))
|
|
user_exist = cursor.fetchone()
|
|
conn.close()
|
|
|
|
if user_exist:
|
|
user = user_exist[0]
|
|
passwd_bcrypt = user_exist[1].decode()
|
|
|
|
if user == request.form['user'] and bcrypt.check_password_hash(passwd_bcrypt, password) is True:
|
|
session['username'] = request.form['user']
|
|
resp = redirect(url_for('profil.profile', _external=True))
|
|
else:
|
|
flash(u'Mauvais mot de passe', 'error')
|
|
else:
|
|
flash(u"L'utilisateur n'existe pas", 'error')
|
|
else:
|
|
resp = render_template('accueil.html', signin_enable=app.config['SIGNIN_ENABLE'])
|
|
return resp
|
|
|
|
|
|
@loginlogout.route( '/logout/' )
|
|
def logout():
|
|
session.pop('username', None) # Supprimer username de la session s'il s'y trouve
|
|
return redirect(url_for('loginlogout.index'))
|
|
|
|
|
|
@loginlogout.route( '/delete_me/', methods=['GET','POST'])
|
|
def delete_account():
|
|
if 'username' in session :
|
|
user='%s'% escape(session['username'])
|
|
resp = render_template('delete_account.html', time_backup=BACKUP_TIME)
|
|
if request.method == 'POST' :
|
|
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
|
|
cursor = conn.cursor() # Création de l'objet "curseur"
|
|
cursor.execute("""SELECT passwd FROM users WHERE name=?""", (user,))
|
|
passwd = cursor.fetchone()[0].decode()
|
|
conn.close()
|
|
password = request.form['passwd']
|
|
if bcrypt.check_password_hash(passwd, password) is True:
|
|
not_error = True
|
|
try:
|
|
cmd = 'rm -r ' + DATAS_USER + '/' + user
|
|
if system(cmd) != 0:
|
|
raise TypeError("Remove directory error")
|
|
except:
|
|
not_error = False
|
|
flash(u'Erreur lors de la suppression de votre dossier utilisateur.', 'error')
|
|
|
|
if MAIL_SERVER:
|
|
try:
|
|
cmd = SETUID + ' set_mail_passwd del' + '"'+mail+'"'
|
|
system(cmd)
|
|
except:
|
|
not_error = False
|
|
flash(u'Erreur lors de la suppression de votre compte Mail.', 'error')
|
|
|
|
if XMPP_SERVER:
|
|
try:
|
|
tmp = mail.split('@')
|
|
cmd = SETUID+ ' prosodyctl deluser ' "'"+tmp[0]+"' " + "'"+tmp[1]+"'"
|
|
system(cmd)
|
|
except:
|
|
not_error = False
|
|
flash(u'Erreur lors de la suppression de votre compte XMPP.', 'error')
|
|
|
|
if not_error:
|
|
try:
|
|
conn = sqlite3.connect(DATABASE)
|
|
cursor = conn.cursor()
|
|
cursor.execute("""DELETE FROM users WHERE name=?""", (user,))
|
|
conn.commit()
|
|
conn.close()
|
|
except:
|
|
flash(u'Erreur lors de la suppression de votre compte.', 'error')
|
|
else:
|
|
flash(u'Désinscription réalisé avec succés, y\'a plus rien !', 'succes')
|
|
resp = redirect(url_for('loginlogout.logout'))
|
|
else:
|
|
flash(u'Mauvais mot de passe', 'error')
|
|
return resp
|
|
|
|
|
|
@loginlogout.route( '/lost_password/', methods=['GET', 'POST'])
|
|
def lost_password():
|
|
if request.method == 'POST' :
|
|
user = request.form['user']
|
|
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
|
|
cursor = conn.cursor() # Création de l'objet "curseur"
|
|
cursor.execute("""SELECT name, Mail_rescue FROM users WHERE name=?""", (user,))
|
|
find_user = cursor.fetchone()
|
|
|
|
if find_user:
|
|
token = gen_token("Lost password")
|
|
cursor.execute("UPDATE users SET Lost_password_token=? WHERE name=?",
|
|
(token, user))
|
|
conn.commit()
|
|
mail_lost_password=Mailer()
|
|
message = """
|
|
"Vous avez fait une demande pour changer votre mot de passe, cliquez sur le liens en
|
|
dessous pour changer votre mot de passe :
|
|
"""+ BASE_URL + url_for('profil.change_passwd_lost', token=token) + """
|
|
|
|
Si ce n'est pas vous qui avez fait cette demande vous pouvez détruire le lien de changement
|
|
de mot de passe en cliquant sur le lien en dessous \n
|
|
"""+ BASE_URL + url_for('profil.deltoken_passwd_lost', token=token) + """
|
|
|
|
|
|
Au plaisir de vous revoir sur pywallter """
|
|
|
|
if find_user[1]:
|
|
flash(u"Un lien pour changer votre mot de passe a été envoyer à votre adresse email de secour ", 'succes')
|
|
mail_lost_password.send_email(find_user[1], "Récupération de votre mot de passe", message )
|
|
else:
|
|
flash(u"L'utilisateur "+ user + " n'existe pas.", 'error')
|
|
|
|
|
|
return render_template('lost_password.html')
|
|
|
|
@loginlogout.route( '/' )
|
|
def index():
|
|
conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée
|
|
cursor = conn.cursor() # Création de l'objet "curseur"
|
|
cursor.execute("""SELECT token passwd FROM users where name=? """, ("pywallter", ))
|
|
tmp = cursor.fetchone()
|
|
conn.close
|
|
if tmp:
|
|
token = tmp[0]
|
|
else:
|
|
token = None
|
|
|
|
if 'username' in session :
|
|
return redirect(url_for('profil.profile'))
|
|
else :
|
|
if token:
|
|
hostname = gethostname()
|
|
url_inscription = BASE_URL+'inscription/'+token
|
|
return render_template('inscription.html', signin_enable=app.config['SIGNIN_ENABLE'],
|
|
token=token, hostname=hostname,
|
|
url_inscription=url_inscription,
|
|
MAIL_SERVER=MAIL_SERVER)
|
|
else:
|
|
return redirect(url_for('loginlogout.login', _external=True))
|