handle custom domain in custom alias

This commit is contained in:
Son NK 2019-12-02 00:34:54 +00:00
parent 3402d64249
commit 0234af03d3
2 changed files with 96 additions and 35 deletions

View file

@ -9,25 +9,25 @@
{% block default_content %}
<div class="col-md-6 offset-md-3">
<h1 class="h3 mb-5">Custom Alias</h1>
{% if error %}
<div class="text-danger text-center mb-4">{{ error }}</div>
{% endif %}
<form method="post" enctype="multipart/form-data">
{{ form.csrf_token }}
<form method="post">
<input type="hidden" name="form-name" value="non-custom-domain-name">
<div class="form-group">
<label class="form-label">Custom Alias</label>
<label class="form-label font-weight-bold">SimpleLogin domain</label>
<small class="text-muted">
You can use letter, number or dash. Alias must have at least 3 characters
</small>
<div class="row mt-4">
<div class="col">
{{ form.email(class="form-control",
pattern="[0-9|A-Z|a-z|-]{3,}",
title="Only letter, number or dash can be used and alias must have at least 3 characters.",
autofocus=True) }}
{{ render_field_errors(form.email) }}
<input name="email-prefix" class="form-control" pattern="[0-9|A-Z|a-z|-]{3,}" ,
title="Only letter, number or dash can be used and alias must have at least 3 characters." ,
autofocus>
</div>
<div class="col align-self-center">
<input type="hidden" name="email-suffix" value="{{ email_suffix }}">
@ -40,6 +40,33 @@
<button class="btn btn-primary">Create</button>
</form>
{% if custom_domains %}
<hr>
<p class="font-weight-bold">OR with your custom domains</p>
{% for custom_domain in custom_domains %}
<form method="post" class="mb-6">
<input type="hidden" name="form-name" value="custom-domain-name">
<input type="hidden" name="custom-domain-id" value="{{ custom_domain.id }}">
<div class="row mt-4">
<div class="col">
<input name="email" class="form-control">
</div>
<div class="col align-self-center">
<input type="hidden" name="email-suffix" value="{{ email_suffix }}">
<h4>
@{{ custom_domain.domain }}
</h4>
</div>
<div class="col">
<button class="submit btn btn-sm btn-success">Create</button>
</div>
</div>
</form>
{% endfor %}
{% endif %}
</div>
{% endblock %}

View file

@ -1,20 +1,14 @@
from flask import render_template, redirect, url_for, flash, request, session
from flask_login import login_required, current_user
from flask_wtf import FlaskForm
from wtforms import StringField, validators
from app.config import EMAIL_DOMAIN, HIGHLIGHT_GEN_EMAIL_ID
from app.dashboard.base import dashboard_bp
from app.extensions import db
from app.log import LOG
from app.models import GenEmail, DeletedAlias
from app.models import GenEmail, DeletedAlias, CustomDomain
from app.utils import convert_to_id, random_string
class CustomAliasForm(FlaskForm):
email = StringField("Email", validators=[validators.DataRequired()])
@dashboard_bp.route("/custom_alias", methods=["GET", "POST"])
@login_required
def custom_alias():
@ -25,41 +19,81 @@ def custom_alias():
flash("ony premium user can choose custom alias", "warning")
return redirect(url_for("dashboard.index"))
form = CustomAliasForm()
error = ""
if form.validate_on_submit():
email = form.email.data
email = convert_to_id(email)
email_suffix = request.form.get("email-suffix")
if request.method == "POST":
if request.form.get("form-name") == "non-custom-domain-name":
email_prefix = request.form.get("email-prefix")
email_prefix = convert_to_id(email_prefix)
email_suffix = request.form.get("email-suffix")
if len(email) < 3:
error = "email must be at least 3 letters"
else:
full_email = f"{email}.{email_suffix}@{EMAIL_DOMAIN}"
# check if email already exists
if GenEmail.get_by(email=full_email) or DeletedAlias.get_by(
email=full_email
):
error = "email already chosen, please choose another one"
if len(email_prefix) < 3:
error = "email must be at least 3 letters"
else:
# create the new alias
LOG.d("create custom alias %s for user %s", full_email, current_user)
full_email = f"{email_prefix}.{email_suffix}@{EMAIL_DOMAIN}"
# check if email already exists
if GenEmail.get_by(email=full_email) or DeletedAlias.get_by(
email=full_email
):
error = "email already chosen, please choose another one"
else:
# create the new alias
LOG.d(
"create custom alias %s for user %s", full_email, current_user
)
gen_email = GenEmail.create(
email=full_email, user_id=current_user.id, custom=True
)
db.session.commit()
flash(f"Alias {full_email} has been created", "success")
session[HIGHLIGHT_GEN_EMAIL_ID] = gen_email.id
return redirect(url_for("dashboard.index"))
elif request.form.get("form-name") == "custom-domain-name":
custom_domain_id = request.form.get("custom-domain-id")
email = request.form.get("email")
custom_domain = CustomDomain.get(custom_domain_id)
if not custom_domain:
flash("Unknown error. Refresh the page", "warning")
return redirect(url_for("dashboard.custom_alias"))
elif custom_domain.user_id != current_user.id:
flash("Unknown error. Refresh the page", "warning")
return redirect(url_for("dashboard.custom_alias"))
elif not custom_domain.verified:
flash("Unknown error. Refresh the page", "warning")
return redirect(url_for("dashboard.custom_alias"))
full_email = f"{email}@{custom_domain.domain}"
if GenEmail.get_by(email=full_email):
error = f"{full_email} already exist, please choose another one"
else:
LOG.d(
"create custom alias %s for custom domain %s",
full_email,
custom_domain.domain,
)
# todo: add custom_id to GenEmail
gen_email = GenEmail.create(
email=full_email, user_id=current_user.id, custom=True
email=full_email,
user_id=current_user.id,
custom=True,
custom_domain_id=custom_domain.id,
)
db.session.commit()
flash(f"Alias {full_email} has been created", "success")
flash(f"Email alias {full_email} has been created", "success")
session[HIGHLIGHT_GEN_EMAIL_ID] = gen_email.id
return redirect(url_for("dashboard.index"))
email_suffix = random_string(6)
return render_template(
"dashboard/custom_alias.html",
form=form,
error=error,
email_suffix=email_suffix,
EMAIL_DOMAIN=EMAIL_DOMAIN,
custom_domains=current_user.verified_custom_domains(),
)