Browse Source

Validate login data during account activation

sh4nks 9 years ago
parent
commit
24e5e582c5
3 changed files with 32 additions and 16 deletions
  1. 9 4
      flaskbb/auth/forms.py
  2. 18 7
      flaskbb/auth/views.py
  3. 5 5
      flaskbb/email.py

+ 9 - 4
flaskbb/auth/forms.py

@@ -125,12 +125,17 @@ class RequestActivationForm(Form):
         DataRequired(message=_("A E-Mail Address is required.")),
         DataRequired(message=_("A E-Mail Address is required.")),
         Email(message=_("Invalid E-Mail Address."))])
         Email(message=_("Invalid E-Mail Address."))])
 
 
-    password = PasswordField(_('Password'), validators=[
-        InputRequired(),
-        EqualTo('confirm_password', message=_('Passwords must match.'))])
-
     submit = SubmitField(_("Send Confirmation Mail"))
     submit = SubmitField(_("Send Confirmation Mail"))
 
 
+    def validate_email(self, field):
+        self.user = User.query.filter_by(email=field.data).first()
+        # check if the username matches the one found in the database
+        if not self.user.username == self.username.data:
+            raise ValidationError(_("Account does not exist."))
+
+        if self.user.activated is not None:
+            raise ValidationError(_("Account is already active."))
+
 
 
 class AccountActivationForm(Form):
 class AccountActivationForm(Form):
     token = StringField(_("E-Mail Confirmation Token"), validators=[
     token = StringField(_("E-Mail Confirmation Token"), validators=[

+ 18 - 7
flaskbb/auth/views.py

@@ -17,7 +17,7 @@ from flask_login import (current_user, login_user, login_required,
 from flask_babelplus import gettext as _
 from flask_babelplus import gettext as _
 
 
 from flaskbb.utils.helpers import render_template, redirect_or_next
 from flaskbb.utils.helpers import render_template, redirect_or_next
-from flaskbb.email import send_reset_token
+from flaskbb.email import send_reset_token, send_activation_token
 from flaskbb.exceptions import AuthenticationError, LoginAttemptsExceeded
 from flaskbb.exceptions import AuthenticationError, LoginAttemptsExceeded
 from flaskbb.auth.forms import (LoginForm, ReauthForm, ForgotPasswordForm,
 from flaskbb.auth.forms import (LoginForm, ReauthForm, ForgotPasswordForm,
                                 ResetPasswordForm, RegisterForm,
                                 ResetPasswordForm, RegisterForm,
@@ -100,13 +100,15 @@ def register():
 
 
     if form.validate_on_submit():
     if form.validate_on_submit():
         user = form.save()
         user = form.save()
-        login_user(user)
 
 
         if flaskbb_config["ACTIVATE_ACCOUNT"]:
         if flaskbb_config["ACTIVATE_ACCOUNT"]:
-
-            flash(_("verify your email by blablaabla"))
+            send_activation_token(user)
+            flash(_("An account activation email has been sent to %(email)s",
+                    email=user.email), "success")
         else:
         else:
+            login_user(user)
             flash(_("Thanks for registering."), "success")
             flash(_("Thanks for registering."), "success")
+
         return redirect_or_next(current_user.url)
         return redirect_or_next(current_user.url)
 
 
     return render_template("auth/register.html", form=form)
     return render_template("auth/register.html", form=form)
@@ -167,13 +169,16 @@ def reset_password(token):
 def request_activation_token(token=None):
 def request_activation_token(token=None):
     """Requests a new account activation token."""
     """Requests a new account activation token."""
     if current_user.is_active or not flaskbb_config["ACTIVATE_ACCOUNT"]:
     if current_user.is_active or not flaskbb_config["ACTIVATE_ACCOUNT"]:
+        flash(_("This account is already activated."), "info")
         return redirect(url_for('forum.index'))
         return redirect(url_for('forum.index'))
 
 
     form = RequestActivationForm()
     form = RequestActivationForm()
     if form.validate_on_submit():
     if form.validate_on_submit():
-        # TODO: make sure validate some data (make sure this is the user whose
-        # token expired and/or is invalid).
-        pass
+        user = User.query.filter_by(email=form.email.data).first()
+        send_activation_token(user)
+        flash(_("A new account activation token has been sent to "
+                "your email address."), "success")
+        return redirect(url_for("auth.activate_account"))
 
 
     return render_template("auth/request_account_activation.html", form=form)
     return render_template("auth/request_account_activation.html", form=form)
 
 
@@ -182,6 +187,7 @@ def request_activation_token(token=None):
 def activate_account(token=None):
 def activate_account(token=None):
     """Handles the account activation process."""
     """Handles the account activation process."""
     if current_user.is_active or not flaskbb_config["ACTIVATE_ACCOUNT"]:
     if current_user.is_active or not flaskbb_config["ACTIVATE_ACCOUNT"]:
+        flash(_("This account is already activated."), "info")
         return redirect(url_for('forum.index'))
         return redirect(url_for('forum.index'))
 
 
     form = None
     form = None
@@ -204,6 +210,11 @@ def activate_account(token=None):
     if user:
     if user:
         user.activated = datetime.utcnow()
         user.activated = datetime.utcnow()
         user.save()
         user.save()
+
+        if current_user != user:
+            logout_user()
+            login_user(user)
+
         flash(_("Your Account has been activated.", "success"))
         flash(_("Your Account has been activated.", "success"))
         return redirect(url_for("forum.index"))
         return redirect(url_for("forum.index"))
 
 

+ 5 - 5
flaskbb/email.py

@@ -34,18 +34,18 @@ def send_reset_token(user):
     )
     )
 
 
 
 
-def send_email_confirmation(user):
-    token = make_token(user=user, operation="confirm_email")
+def send_activation_token(user):
+    token = make_token(user=user, operation="activate_account")
     send_email(
     send_email(
-        subject=_("E-Mail Confirmation"),
+        subject=_("Account Activation"),
         recipients=[user.email],
         recipients=[user.email],
         text_body=render_template(
         text_body=render_template(
-            "email/confirm_email.txt",
+            "email/activate_account.txt",
             user=user,
             user=user,
             token=token
             token=token
         ),
         ),
         html_body=render_template(
         html_body=render_template(
-            "email/confirm_email.html",
+            "email/activate_account.html",
             user=user,
             user=user,
             token=token
             token=token
         )
         )