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))