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/', 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): 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, mail, passwd) VALUES(?, ?, ?)""", (user, mail, 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') # 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') # on créé les dossier de l'utilisateur userracine = DATAS_USER + user userfiles = userracine + '/files' userimages = userracine + '/images' userthumbnails = userracine + '/images/thumbnails' userprofile = userracine + '/profile' userlog = userracine + '/log.txt' if not os.path.exists(userracine): os.makedirs(userracine) os.makedirs(userfiles) os.makedirs(userimages) os.makedirs(userthumbnails) os.makedirs(userprofile) fp = open(userlog, 'x') fp.close() # 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