diff --git a/base.db.old b/base.db.old new file mode 100644 index 0000000..9a2091a Binary files /dev/null and b/base.db.old differ diff --git a/templates/invitation.html b/templates/invitation.html index 92e12ff..3936dbc 100644 --- a/templates/invitation.html +++ b/templates/invitation.html @@ -7,10 +7,9 @@

Si vous voulez vous pouvez inviter une personne à se crée un compte sur ce serveur - pour cela vous devez crée un lien d'inscription. Ce lien restera valable tant - que la personne ne s'est pas inscrite ou tant que vous ne créez pas un autre lien. - Les invitations se font une par une et sont limité à 20 personnes pour ne pas surcharger notre petit serveur :). - Une fois que la personne s'est incrite votre nombre d'invitations sera mis à jour + pour cela vous devez crée un lien d'inscription. Ce lien restera valable tant que vous ne créez pas un autre lien. + Les invitations sont limité à 20 personnes pour ne pas surcharger notre petit serveur :). + Une fois que la personne s'est inscrite votre nombre d'invitations sera mis à jour

@@ -20,8 +19,15 @@

Votre lien d'inscription en cours:

- {{ url_invitation }} - + {{ url_invitation }} + + + +

ou faîtes scanner ce qrcode :)

+ + + + {% else %}

Pas d'invitation en attente

{% endif %} diff --git a/tools/utils.py b/tools/utils.py index 2816952..9c6cab3 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -43,11 +43,24 @@ def valid_username(username): valid=True # Caractères non autorisés dans la RFC #822 invalid_char = { '(', ')', '<', '>', ',', ';', ':', '"', '[', ']', '|', 'ç', '%', '&', ' ' } - + for character in invalid_char: if character in username: valid=False + 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=?""", (username,)) + tmp = cursor.fetchone() + conn.close() + + if tmp: + valid = True + else: + valid = False + + return valid def set_mail_domain(): @@ -109,7 +122,7 @@ def valid_token_register(token, token_type): cursor.execute("""SELECT name FROM users where token=?""", (token,)) tmp = cursor.fetchone() conn.close() - print (tmp) + if tmp: valid = True else: @@ -121,7 +134,6 @@ def valid_token_register(token, token_type): def get_user_by_token(token, token_type): - if len(token) != 30 and len(token) != 64: user = "Invalid Token" diff --git a/views/inscription.py b/views/inscription.py index f7ce23e..d921fa9 100644 --- a/views/inscription.py +++ b/views/inscription.py @@ -35,13 +35,12 @@ def signin(token) : mail_domain = set_mail_domain() - url_inscription = BASE_URL +'/inscription/'+token + url_inscription = BASE_URL +'/'+'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'], @@ -52,6 +51,16 @@ def signin(token) : if request.method == 'POST': + # Une fois que tout c'est bien passé pour l'inscription on détruit le jeton. + conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée + cursor = conn.cursor() # Création de l'objet "curseur" + + cursor.execute("""SELECT name, invitations FROM users where Token=?""", (token,)) + tmp = cursor.fetchone() + user_invite = tmp[0] + invitations_count=tmp[1] + conn.close() + #On test si aucun champs du formulaire n'est vide. if len(request.form['user']) == 0 or \ len(request.form['passwd']) == 0 or \ @@ -60,7 +69,7 @@ def signin(token) : 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, + token=token, hostname=mail_domain, url_inscription=url_inscription, MAIL_SERVER=MAIL_SERVER, XMPP_SERVER=XMPP_SERVER) @@ -73,16 +82,11 @@ def signin(token) : 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() - - print("user :" +user) - print ("passwd: "+ passwd) - if testuser and valid_username(user): + if invitations_count < 1 : + flash(u'Votre lien d\'inscription est invalide', 'error') + not_error=False + + if not_error and valid_username(user): flash(u'Le Nom 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 @@ -131,17 +135,16 @@ def signin(token) : with open(log_file, 'x') as file: file.write(log) except FileExistsError: - print('The file '+log_file +' already exists') + print('The file '+log_file +' already exists') - # 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,)) + + if user_invite == "pywallter": + cursor.execute("""DELETE from users where name = ?""", (user_invite,)) + elif invitations_count > 0: + invitations_count= invitations_count - 1 + cursor.execute("""UPDATE users set invitations=? where name=?""", (invitations_count, user_invite,)) else: - cursor.execute("""UPDATE users set invitations=?, Token='' where name=?""", (invitations_count, username,)) + cursor.execute("""UPDATE users set invitations=?, Token='' where name=?""", (invitations_count, user_invite,)) conn.commit() flash(u'Inscription réalisée avec succés !', 'success') @@ -149,7 +152,7 @@ def signin(token) : else: return render_template('inscription.html', signin_enable=app.config['SIGNIN_ENABLE'], - token=token, hostname=hostname, + token=token, hostname=mail_domain, url_inscription=url_inscription, MAIL_SERVER=MAIL_SERVER, XMPP_SERVER=XMPP_SERVER) else: diff --git a/views/loginlogout.py b/views/loginlogout.py index d81c133..d41eb74 100644 --- a/views/loginlogout.py +++ b/views/loginlogout.py @@ -50,7 +50,7 @@ def index(): else : if token: hostname = gethostname() - url_inscription = BASE_URL+'inscription/'+token + 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, diff --git a/views/profil.py b/views/profil.py index efe90ba..8ff6be4 100644 --- a/views/profil.py +++ b/views/profil.py @@ -349,39 +349,51 @@ def deltoken_passwd_lost(token) : @profil.route('/invitation/', methods=['GET']) @login_required def invitation(): - UTILISATEUR='%s' % escape(session['username']) + user='%s' % escape(session['username']) conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée cursor = conn.cursor() # Création de l'objet "curseur" - cursor.execute("""SELECT Token, invitations FROM users WHERE name=?""", (UTILISATEUR,)) + cursor.execute("""SELECT Token, invitations FROM users WHERE name=?""", (user,)) tmp = cursor.fetchone() token = tmp[0] - if token: - url_invitation = BASE_URL + 'inscription/' + token + nb_invitations = tmp[1] + if token and nb_invitations > 0: + url_invitation = BASE_URL + '/inscription/' + token + img = qrcode.make(url_invitation) + img.save(os.path.join(DOSSIER_PERSO, user, "invitation.png")) else: url_invitation = "" - invitations_count = tmp[1] conn.close() return render_template('invitation.html', section='Profil', - nb_invitation=invitations_count, + nb_invitation=nb_invitations, token=token, url_invitation=url_invitation) +@profil.route('/invitation.png', methods=['GET']) +@login_required +def invitation_qrcode(): + user='%s' % escape(session['username']) + return send_file( + os.path.join(DOSSIER_PERSO, user, "invitation.png")) + @profil.route('/gen_token/', methods=['GET']) @login_required def generate_token(): user='%s' % escape(session['username']) conn = sqlite3.connect(DATABASE) # Connexion à la base de donnée cursor = conn.cursor() # Création de l'objet "curseur" + cursor.execute("""SELECT invitations FROM users WHERE name=?""", (user,)) + tmp = cursor.fetchone() + token = tmp[0] token = gen_token("Invitation") cursor.execute("UPDATE users SET Token=? WHERE name=?", (token, user)) conn.commit() conn.close() - return redirect(BASE_URL+'invitation/') + return redirect(BASE_URL+'/invitation/') @profil.route( '/delete_me/', methods=['GET','POST'])