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