diff --git a/participate.py b/participate.py index 8420b32..f202fb1 100755 --- a/participate.py +++ b/participate.py @@ -327,6 +327,39 @@ def update_user_by_id(user_id, login, password, confirm, name, phone, diet): return False return True +def reset_password(login, password, confirm): + if password != confirm: + # Password does not match confirmation + print "[+] [Reset password] Password mismatch confirmation" + return False + check_user = Tetawebapp_users.query.filter_by(mail=login).count() + if check_user == 0: + # User does not exist + print "[+] [Reset password] User does not exist" + return False + user = Tetawebapp_users.query.filter_by(mail=login).first() + if len(password) > 0: + # User requested password modification + hashed_password = bcrypt.hashpw(password, bcrypt.gensalt()) + setattr(user, 'password', hashed_password) + # We also ask for a new account confirmation + link_id = gen_token(20) + setattr(user, 'link_id', link_id) + try: + db.session.add(user) + commit = db.session.commit() + send_reset_mail(login, link_id) + except Exception as e: + db.session.rollback() + print "[+] Error at reset_password:" + print "------------------------------" + print "%s" % e.message + print "------------------------------" + return False + if commit != None: + return False + return True + def delete_user(user_id): """ Delete user """ try: @@ -599,7 +632,7 @@ def get_roles(): ######################################################################## def send_mail(email, link_id): - msg = Message("Confirmation d'inscription au staff THSF", + msg = Message("[THSF] Confirmation d'inscription au staff THSF", sender="dave.null@tetalab.org", recipients=[email]) msg.body = "Bonjour,\nVous recevez ce courriel car vous avez souhaité faire partie de l'équipe du staff du THSF.\n\n" @@ -615,6 +648,19 @@ def send_mail(email, link_id): msg.body += "(Ce mail vous est envoyé par un robot qui n' a pas réussi le test de Turing, inutile de lui répondre)" mail.send(msg) +def send_reset_mail(email, link_id): + msg = Message("[THSF] Confirmation de réinitialisation de votre mot de passe", + sender="dave.null@tetalab.org", + recipients=[email]) + msg.body = "Bonjour,\nVous recevez ce courriel car vous avez demandé la réinitialisation de votre mot de passe.\n\n" + msg.body += "Pour confirmer votre noueau mot de passe, rendez vous à la page suivante:\n" + msg.body += "%s/confirm/%s\n\n" % (str(app.config['DOMAIN_URL']), str(link_id)) + msg.body += "Si vous n'êtes pas à l'origine de cette demande de réinitialisation, envoyez un email à contact@tetalab.org afin que soient prises les dispositions nécessaires.\n" + msg.body += "-- \n" + msg.body += "L'équipe d'organisation du THSF\n" + msg.body += "(Ce mail vous est envoyé par un robot qui n' a pas réussi le test de Turing, inutile de lui répondre)" + mail.send(msg) + ######################################################################## # Routes: # ------- @@ -765,6 +811,26 @@ def update_account(): except AttributeError: return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") +@app.route("/account/reset/ask", methods=['GET', 'POST']) +def ask_reset(): + """ Ask for password reset page """ + return render_template('reset_password.html') + +@app.route("/account/reset", methods=['GET', 'POST']) +def reset_account(): + """ Password reset """ + try: + login = request.form.get('login').encode('utf-8') + password = request.form.get('password').encode('utf-8') + confirm = request.form.get('confirm').encode('utf-8') + if reset_password(login, password, confirm): + message = "Une confirmation de la réinitialisation de votre mot de passe vous a été envoyé par email" + return render_template('login_or_register.html', message=message.decode('utf-8')) + message="Erreur lors de la réinitialisation du mot de passe" + return render_template('login_or_register.html', message=message.decode('utf-8')) + except AttributeError: + return render_template('login_or_register.html', message="Utilisateur ou mot de passe invalide") + @app.route("/logout", methods=['GET', 'POST']) @check_session def logout(): diff --git a/templates/login_or_register.html b/templates/login_or_register.html index 56188d8..214c164 100644 --- a/templates/login_or_register.html +++ b/templates/login_or_register.html @@ -52,7 +52,7 @@

- Mot de passe oublié ? Envoyez une demande de réinitialisation de votre mot de passe. + Mot de passe oublié ? Réinitialisation de votre mot de passe.


diff --git a/templates/reset_password.html b/templates/reset_password.html new file mode 100644 index 0000000..3d55c53 --- /dev/null +++ b/templates/reset_password.html @@ -0,0 +1,17 @@ +{% extends "index.html" %} +{% block title %}Login{% endblock %} +{% block nav %}{% endblock %} +{% block main %} +
+

Réinitialisation de votre mot de passe

+

Merci de renseigner l'adresse email avec laquelle vous vous êtes enregistré et de saisir votre nouveau mot de passe

+
+
+
+
+
+
+ +
+
+{% endblock %}