import arrow
from flask import request, flash, render_template, redirect, url_for
from flask_login import current_user
from flask_wtf import FlaskForm
from wtforms import StringField, validators
from app import email_utils
from app.auth.base import auth_bp
from app.config import URL
from app.email_utils import notify_admin
from app.extensions import db
from app.log import LOG
from app.models import User, ActivationCode
from app.utils import random_string, encode_url
class RegisterForm(FlaskForm):
email = StringField("Email", validators=[validators.DataRequired()])
password = StringField(
"Password", validators=[validators.DataRequired(), validators.Length(min=8)]
)
name = StringField("Name", validators=[validators.DataRequired()])
@auth_bp.route("/register", methods=["GET", "POST"])
def register():
if current_user.is_authenticated:
LOG.d("user is already authenticated, redirect to dashboard")
return redirect(url_for("dashboard.index"))
form = RegisterForm(request.form)
next_url = request.args.get("next")
if form.validate_on_submit():
user = User.filter_by(email=form.email.data).first()
if user:
flash(f"Email {form.email.data} already exists", "warning")
else:
LOG.debug("create user %s", form.email.data)
user = User.create(
email=form.email.data, name=form.name.data, password=form.password.data
)
db.session.commit()
send_activation_email(user, next_url)
notify_admin(
f"new user signs up {user.email}",
f"{user.name} signs up at {arrow.now()}",
)
return render_template("auth/register_waiting_activation.html")
return render_template("auth/register.html", form=form, next_url=next_url)
def send_activation_email(user, next_url):
# the activation code is valid for 1h
activation = ActivationCode.create(
user_id=user.id, code=random_string(30), expired=arrow.now().shift(hours=1)
)
db.session.commit()
# Send user activation email
activation_link = f"{URL}/auth/activate?code={activation.code}"
if next_url:
LOG.d("redirect user to %s after activation", next_url)
activation_link = activation_link + "&next=" + encode_url(next_url)
email_utils.send(
user.email,
f"Welcome to SimpleLogin {user.name} - just one more step!",
html_content=f"""
Welcome to SimpleLogin!
Our mission is to make the login process as smooth and as secure as possible. This should be easy.
To get started, we need to confirm your email address, so please click this link
to finish creating your account. Or you can paste this link into your browser:
{activation_link}
Your feedbacks are very important to us. Please feel free to reply to this email to let us know any
of your suggestion!
Thanks!
SimpleLogin team.
""",
)