refactor custom_alias: create available_suffixes()

This commit is contained in:
Son NK 2020-05-02 12:34:11 +02:00
parent c7ebee2118
commit 9874422700
2 changed files with 48 additions and 14 deletions

View file

@ -11,12 +11,32 @@ from app.dashboard.base import dashboard_bp
from app.email_utils import email_belongs_to_alias_domains, get_email_domain_part from app.email_utils import email_belongs_to_alias_domains, get_email_domain_part
from app.extensions import db from app.extensions import db
from app.log import LOG from app.log import LOG
from app.models import Alias, CustomDomain, DeletedAlias, Mailbox from app.models import Alias, CustomDomain, DeletedAlias, Mailbox, User
from app.utils import convert_to_id, random_word, word_exist from app.utils import convert_to_id, random_word, word_exist
signer = TimestampSigner(CUSTOM_ALIAS_SECRET) signer = TimestampSigner(CUSTOM_ALIAS_SECRET)
def available_suffixes(user: User) -> [bool, str, str]:
"""Return (is_custom_domain, alias-suffix, time-signed alias-suffix)"""
user_custom_domains = [cd.domain for cd in user.verified_custom_domains()]
# List of (is_custom_domain, alias-suffix, time-signed alias-suffix)
suffixes = []
# put custom domain first
for alias_domain in user_custom_domains:
suffix = "@" + alias_domain
suffixes.append((True, suffix, signer.sign(suffix).decode()))
# then default domain
for domain in ALIAS_DOMAINS:
suffix = ("" if DISABLE_ALIAS_SUFFIX else "." + random_word()) + "@" + domain
suffixes.append((False, suffix, signer.sign(suffix).decode()))
return suffixes
@dashboard_bp.route("/custom_alias", methods=["GET", "POST"]) @dashboard_bp.route("/custom_alias", methods=["GET", "POST"])
@login_required @login_required
def custom_alias(): def custom_alias():
@ -32,17 +52,7 @@ def custom_alias():
user_custom_domains = [cd.domain for cd in current_user.verified_custom_domains()] user_custom_domains = [cd.domain for cd in current_user.verified_custom_domains()]
# List of (is_custom_domain, alias-suffix, time-signed alias-suffix) # List of (is_custom_domain, alias-suffix, time-signed alias-suffix)
suffixes = [] suffixes = available_suffixes(current_user)
# put custom domain first
for alias_domain in user_custom_domains:
suffix = "@" + alias_domain
suffixes.append((True, suffix, signer.sign(suffix).decode()))
# then default domain
for domain in ALIAS_DOMAINS:
suffix = ("" if DISABLE_ALIAS_SUFFIX else "." + random_word()) + "@" + domain
suffixes.append((False, suffix, signer.sign(suffix).decode()))
mailboxes = [mb.email for mb in current_user.mailboxes()] mailboxes = [mb.email for mb in current_user.mailboxes()]
@ -105,7 +115,12 @@ def custom_alias():
else: else:
flash("something went wrong", "warning") flash("something went wrong", "warning")
return render_template("dashboard/custom_alias.html", **locals()) return render_template(
"dashboard/custom_alias.html",
user_custom_domains=user_custom_domains,
suffixes=suffixes,
mailboxes=mailboxes,
)
def verify_prefix_suffix(user, alias_prefix, alias_suffix) -> bool: def verify_prefix_suffix(user, alias_prefix, alias_suffix) -> bool:

View file

@ -1,7 +1,11 @@
from flask import url_for from flask import url_for
from app.config import EMAIL_DOMAIN from app.config import EMAIL_DOMAIN
from app.dashboard.views.custom_alias import signer, verify_prefix_suffix from app.dashboard.views.custom_alias import (
signer,
verify_prefix_suffix,
available_suffixes,
)
from app.extensions import db from app.extensions import db
from app.models import Mailbox, CustomDomain from app.models import Mailbox, CustomDomain
from app.utils import random_word from app.utils import random_word
@ -53,3 +57,18 @@ def test_verify_prefix_suffix(flask_client):
word = random_word() word = random_word()
suffix = f".{word}@{EMAIL_DOMAIN}" suffix = f".{word}@{EMAIL_DOMAIN}"
assert verify_prefix_suffix(user, "prefix", suffix) assert verify_prefix_suffix(user, "prefix", suffix)
def test_available_suffixes(flask_client):
user = login(flask_client)
db.session.commit()
CustomDomain.create(user_id=user.id, domain="test.com", verified=True)
assert len(available_suffixes(user)) > 0
# first suffix is custom domain
first_suffix = available_suffixes(user)[0]
assert first_suffix[0]
assert first_suffix[1] == "@test.com"
assert first_suffix[2].startswith("@test.com")