141 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from flask import Blueprint, Flask, request, flash, render_template, url_for, session, redirect, abort, make_response, send_file
 | 
						|
from flask_bcrypt import Bcrypt
 | 
						|
 | 
						|
import sqlite3
 | 
						|
import glob, os, sys, time
 | 
						|
from tools.utils import email_disp, valid_token_register, valid_passwd, valid_username
 | 
						|
from socket import gethostname
 | 
						|
 | 
						|
app = Flask( 'pywallter' )
 | 
						|
app.config.from_pyfile('config.py')
 | 
						|
bcrypt = Bcrypt(app)
 | 
						|
 | 
						|
#### Variables ##################################################################################
 | 
						|
 | 
						|
 | 
						|
DATAS_USER = app.config['DOSSIER_APP']
 | 
						|
extensionimg = app.config['EXT_IMG']
 | 
						|
DATABASE = app.config['DATABASE']
 | 
						|
MAIL_SERVER = app.config['MAIL_SERVER']
 | 
						|
XMPP_SERVER = app.config['XMPP_SERVER']
 | 
						|
SETUID = app.config['SETUID']
 | 
						|
BASE_URL = app.config['BASE_URL']
 | 
						|
 | 
						|
#################################################################################################
 | 
						|
 | 
						|
 | 
						|
 | 
						|
inscription = Blueprint('inscription', __name__, template_folder='templates')
 | 
						|
 | 
						|
@inscription.route( '/inscription/<token>', methods=['GET','POST'] )
 | 
						|
def signin(token) :
 | 
						|
    hostname = gethostname()
 | 
						|
    url_inscription = url_for('loginlogout.index', _external=True)+'inscription/'+token
 | 
						|
    resp = None
 | 
						|
    if valid_token_register(token, "Invitation"):
 | 
						|
        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, XMPP_SERVER=XMPP_SERVER)
 | 
						|
 | 
						|
 | 
						|
            if request.method == 'POST':
 | 
						|
 | 
						|
                #On test si aucun champs du formulaire n'est vide.
 | 
						|
                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, XMPP_SERVER=XMPP_SERVER)
 | 
						|
 | 
						|
                
 | 
						|
                user = request.form['user']
 | 
						|
                passwd = request.form['passwd']
 | 
						|
                passwdconfirm = request.form['passwdconfirm']
 | 
						|
                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"
 | 
						|
 | 
						|
                cursor.execute("""SELECT name FROM users WHERE name=?""", (user,))
 | 
						|
                testuser = cursor.fetchone()
 | 
						|
                conn.close()
 | 
						|
 | 
						|
                if testuser and valid_username(user):
 | 
						|
                    flash(u'Non d\'utilisateur déjà utilisé ou contient des caractères invalides, merci d\'en choisir un autre', 'error')
 | 
						|
                    flash(u'Les caractères espaces et \' ( ) < > , ; : " [ ] | ç % & ne sont pas autorisés', '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 = user.lower()+'@'+hostname
 | 
						|
                    if not(email_disp(mail)) :
 | 
						|
                        flash(u'Cette Adresse email est déjà utilisée , merci d\'en choisir une autre', 'error')
 | 
						|
                        not_error = False
 | 
						|
                    
 | 
						|
                if not_error:
 | 
						|
                    confirmation = bcrypt.check_password_hash(bcrypt_passwd, passwdconfirm)
 | 
						|
                    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, passwd) VALUES(?, ?)""", (user, 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')
 | 
						|
                            else:
 | 
						|
                                cursor.execute("UPDATE users SET mail=? WHERE name=?", mail, user)
 | 
						|
 | 
						|
                        # On change le mot de passe du compte XMPP
 | 
						|
                        if XMPP_SERVER:
 | 
						|
                            tmp = mail.split('@')
 | 
						|
                            cmd = SETUID+ ' prosodyctl register ' "'"+tmp[0]+"' " + "'"+tmp[1]+"' " + "'"+passwd+"'"
 | 
						|
                            res = os.system(cmd)
 | 
						|
                            if res != 0:
 | 
						|
                                flash(u'Il y a eu un problème pour la création du compte XMPP !', 'error')
 | 
						|
 | 
						|
 | 
						|
 | 
						|
                        # Une fois que tout c'est bien passé pour l'inscription on détruit le jeton.
 | 
						|
                        cursor.execute("""SELECT name, invitations FROM users where Token=?""", (token,))
 | 
						|
                        tmp = cursor.fetchone()
 | 
						|
                        username = tmp[0]
 | 
						|
                        invitations_count=tmp[1] - 1
 | 
						|
                        if username == "pywallter":
 | 
						|
                            cursor.execute("""DELETE from users where name = ?""", (username,))
 | 
						|
                        else:
 | 
						|
                            cursor.execute("""UPDATE users set invitations=?, Token='' where name=?""", (invitations_count, username,))
 | 
						|
                        conn.commit()
 | 
						|
 | 
						|
                        flash(u'Inscription réalisée avec succés !', 'succes')
 | 
						|
                        resp = redirect(url_for('loginlogout.login'))
 | 
						|
 | 
						|
    else:
 | 
						|
        resp = redirect(BASE_URL, code=401)
 | 
						|
 | 
						|
    return resp
 |