make sure to set custom_domain_id when creating a new alias

This commit is contained in:
Son 2022-01-06 15:29:37 +01:00
parent b7e8324e5a
commit 9ff323c746
6 changed files with 29 additions and 53 deletions

View File

@ -218,17 +218,19 @@ def delete_alias(alias: Alias, user: User):
email=alias.email, domain_id=alias.custom_domain_id
):
LOG.d("add %s to domain %s trash", alias, alias.custom_domain_id)
DomainDeletedAlias.create(
user_id=user.id,
email=alias.email,
domain_id=alias.custom_domain_id,
commit=True,
Session.add(
DomainDeletedAlias(
user_id=user.id,
email=alias.email,
domain_id=alias.custom_domain_id,
)
)
Session.commit()
else:
if not DeletedAlias.get_by(email=alias.email):
LOG.d("add %s to global trash", alias)
DeletedAlias.create(email=alias.email, commit=True)
Session.add(DeletedAlias(email=alias.email))
Session.commit()
LOG.i("delete alias %s", alias)
@ -275,15 +277,3 @@ def check_alias_prefix(alias_prefix) -> bool:
return False
return True
def get_custom_domain(alias_address) -> Optional[CustomDomain]:
alias_domain = validate_email(
alias_address, check_deliverability=False, allow_smtputf8=False
).domain
# handle the case a SLDomain is also a CustomDomain
if SLDomain.get_by(domain=alias_domain) is None:
custom_domain = CustomDomain.get_by(domain=alias_domain)
if custom_domain:
return custom_domain

View File

@ -1,9 +1,8 @@
from email_validator import EmailNotValidError
from flask import g
from flask import jsonify, request
from itsdangerous import SignatureExpired
from app.alias_utils import check_alias_prefix, get_custom_domain
from app.alias_utils import check_alias_prefix
from app.api.base import api_bp, require_api_auth
from app.api.serializer import (
serialize_alias_info_v2,
@ -94,14 +93,11 @@ def new_custom_alias_v2():
400,
)
custom_domain = get_custom_domain(full_alias)
alias = Alias.create(
user_id=user.id,
email=full_alias,
mailbox_id=user.default_mailbox_id,
note=note,
custom_domain_id=custom_domain.id if custom_domain else None,
)
Session.commit()
@ -211,18 +207,12 @@ def new_custom_alias_v3():
400,
)
try:
custom_domain = get_custom_domain(full_alias)
except EmailNotValidError:
return jsonify(error="invalid email alias"), 400
alias = Alias.create(
user_id=user.id,
email=full_alias,
note=note,
name=name or None,
mailbox_id=mailboxes[0].id,
custom_domain_id=custom_domain.id if custom_domain else None,
)
Session.flush()

View File

@ -298,14 +298,9 @@ def custom_alias():
flash(general_error_msg, "error")
else:
custom_domain_id = None
# get the custom_domain_id if alias is created with a custom domain
if alias_suffix.is_custom:
alias_domain = alias_suffix.domain
domain = CustomDomain.get_by(domain=alias_domain)
if domain:
custom_domain_id = domain.id
try:
alias = Alias.create(
@ -313,7 +308,6 @@ def custom_alias():
email=full_alias,
note=alias_note,
mailbox_id=mailboxes[0].id,
custom_domain_id=custom_domain_id,
)
Session.flush()
except IntegrityError:

View File

@ -7,6 +7,7 @@ from typing import List, Tuple, Optional
import arrow
import sqlalchemy as sa
from arrow import Arrow
from email_validator import validate_email
from flanker.addresslib import address
from flask import url_for
from flask_login import UserMixin
@ -1243,9 +1244,20 @@ class Alias(Base, ModelMixin):
return True
return False
@staticmethod
def get_custom_domain(alias_address) -> Optional["CustomDomain"]:
alias_domain = validate_email(
alias_address, check_deliverability=False, allow_smtputf8=False
).domain
# handle the case a SLDomain is also a CustomDomain
if SLDomain.get_by(domain=alias_domain) is None:
custom_domain = CustomDomain.get_by(domain=alias_domain)
if custom_domain:
return custom_domain
@classmethod
def create(cls, **kw):
# whether should call Session.commit
commit = kw.pop("commit", False)
r = cls(**kw)
@ -1261,6 +1273,12 @@ class Alias(Base, ModelMixin):
if DomainDeletedAlias.get_by(email=email):
raise AliasInTrashError
# detect whether alias should belong to a custom domain
if "custom_domain_id" not in kw:
custom_domain = Alias.get_custom_domain(email)
if custom_domain:
r.custom_domain_id = custom_domain.id
Session.add(r)
if commit:
Session.commit()

View File

@ -19,7 +19,6 @@ from app.models import (
RedirectUri,
OauthToken,
DeletedAlias,
CustomDomain,
DomainDeletedAlias,
)
from app.oauth.base import oauth_bp
@ -214,13 +213,6 @@ def authorize():
mailbox_id=current_user.default_mailbox_id,
)
# get the custom_domain_id if alias is created with a custom domain
if alias_suffix.startswith("@"):
alias_domain = alias_suffix[1:]
domain = CustomDomain.get_by(domain=alias_domain)
if domain:
alias.custom_domain_id = domain.id
Session.flush()
flash(f"Alias {full_alias} has been created", "success")
# only happen if the request has been "hacked"

View File

@ -196,21 +196,13 @@ def test_get_aliases_v2(flask_client):
def test_delete_alias(flask_client):
user = User.create(
email="a@b.c", password="password", name="Test User", activated=True
)
Session.commit()
# create api_key
api_key = ApiKey.create(user.id, "for test")
Session.commit()
user = login(flask_client)
alias = Alias.create_new_random(user)
Session.commit()
r = flask_client.delete(
url_for("api.delete_alias", alias_id=alias.id),
headers={"Authentication": api_key.code},
)
assert r.status_code == 200