make sure to set custom_domain_id when creating a new alias
This commit is contained in:
parent
b7e8324e5a
commit
9ff323c746
|
@ -218,17 +218,19 @@ def delete_alias(alias: Alias, user: User):
|
||||||
email=alias.email, domain_id=alias.custom_domain_id
|
email=alias.email, domain_id=alias.custom_domain_id
|
||||||
):
|
):
|
||||||
LOG.d("add %s to domain %s trash", alias, alias.custom_domain_id)
|
LOG.d("add %s to domain %s trash", alias, alias.custom_domain_id)
|
||||||
DomainDeletedAlias.create(
|
Session.add(
|
||||||
|
DomainDeletedAlias(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
email=alias.email,
|
email=alias.email,
|
||||||
domain_id=alias.custom_domain_id,
|
domain_id=alias.custom_domain_id,
|
||||||
commit=True,
|
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
Session.commit()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if not DeletedAlias.get_by(email=alias.email):
|
if not DeletedAlias.get_by(email=alias.email):
|
||||||
LOG.d("add %s to global trash", alias)
|
LOG.d("add %s to global trash", alias)
|
||||||
DeletedAlias.create(email=alias.email, commit=True)
|
Session.add(DeletedAlias(email=alias.email))
|
||||||
Session.commit()
|
Session.commit()
|
||||||
|
|
||||||
LOG.i("delete alias %s", alias)
|
LOG.i("delete alias %s", alias)
|
||||||
|
@ -275,15 +277,3 @@ def check_alias_prefix(alias_prefix) -> bool:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
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
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
from email_validator import EmailNotValidError
|
|
||||||
from flask import g
|
from flask import g
|
||||||
from flask import jsonify, request
|
from flask import jsonify, request
|
||||||
from itsdangerous import SignatureExpired
|
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.base import api_bp, require_api_auth
|
||||||
from app.api.serializer import (
|
from app.api.serializer import (
|
||||||
serialize_alias_info_v2,
|
serialize_alias_info_v2,
|
||||||
|
@ -94,14 +93,11 @@ def new_custom_alias_v2():
|
||||||
400,
|
400,
|
||||||
)
|
)
|
||||||
|
|
||||||
custom_domain = get_custom_domain(full_alias)
|
|
||||||
|
|
||||||
alias = Alias.create(
|
alias = Alias.create(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
email=full_alias,
|
email=full_alias,
|
||||||
mailbox_id=user.default_mailbox_id,
|
mailbox_id=user.default_mailbox_id,
|
||||||
note=note,
|
note=note,
|
||||||
custom_domain_id=custom_domain.id if custom_domain else None,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Session.commit()
|
Session.commit()
|
||||||
|
@ -211,18 +207,12 @@ def new_custom_alias_v3():
|
||||||
400,
|
400,
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
|
||||||
custom_domain = get_custom_domain(full_alias)
|
|
||||||
except EmailNotValidError:
|
|
||||||
return jsonify(error="invalid email alias"), 400
|
|
||||||
|
|
||||||
alias = Alias.create(
|
alias = Alias.create(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
email=full_alias,
|
email=full_alias,
|
||||||
note=note,
|
note=note,
|
||||||
name=name or None,
|
name=name or None,
|
||||||
mailbox_id=mailboxes[0].id,
|
mailbox_id=mailboxes[0].id,
|
||||||
custom_domain_id=custom_domain.id if custom_domain else None,
|
|
||||||
)
|
)
|
||||||
Session.flush()
|
Session.flush()
|
||||||
|
|
||||||
|
|
|
@ -298,14 +298,9 @@ def custom_alias():
|
||||||
flash(general_error_msg, "error")
|
flash(general_error_msg, "error")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
custom_domain_id = None
|
|
||||||
# get the custom_domain_id if alias is created with a custom domain
|
# get the custom_domain_id if alias is created with a custom domain
|
||||||
if alias_suffix.is_custom:
|
if alias_suffix.is_custom:
|
||||||
alias_domain = alias_suffix.domain
|
alias_domain = alias_suffix.domain
|
||||||
domain = CustomDomain.get_by(domain=alias_domain)
|
|
||||||
|
|
||||||
if domain:
|
|
||||||
custom_domain_id = domain.id
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
alias = Alias.create(
|
alias = Alias.create(
|
||||||
|
@ -313,7 +308,6 @@ def custom_alias():
|
||||||
email=full_alias,
|
email=full_alias,
|
||||||
note=alias_note,
|
note=alias_note,
|
||||||
mailbox_id=mailboxes[0].id,
|
mailbox_id=mailboxes[0].id,
|
||||||
custom_domain_id=custom_domain_id,
|
|
||||||
)
|
)
|
||||||
Session.flush()
|
Session.flush()
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
|
|
|
@ -7,6 +7,7 @@ from typing import List, Tuple, Optional
|
||||||
import arrow
|
import arrow
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from arrow import Arrow
|
from arrow import Arrow
|
||||||
|
from email_validator import validate_email
|
||||||
from flanker.addresslib import address
|
from flanker.addresslib import address
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from flask_login import UserMixin
|
from flask_login import UserMixin
|
||||||
|
@ -1243,9 +1244,20 @@ class Alias(Base, ModelMixin):
|
||||||
return True
|
return True
|
||||||
return False
|
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
|
@classmethod
|
||||||
def create(cls, **kw):
|
def create(cls, **kw):
|
||||||
# whether should call Session.commit
|
|
||||||
commit = kw.pop("commit", False)
|
commit = kw.pop("commit", False)
|
||||||
|
|
||||||
r = cls(**kw)
|
r = cls(**kw)
|
||||||
|
@ -1261,6 +1273,12 @@ class Alias(Base, ModelMixin):
|
||||||
if DomainDeletedAlias.get_by(email=email):
|
if DomainDeletedAlias.get_by(email=email):
|
||||||
raise AliasInTrashError
|
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)
|
Session.add(r)
|
||||||
if commit:
|
if commit:
|
||||||
Session.commit()
|
Session.commit()
|
||||||
|
|
|
@ -19,7 +19,6 @@ from app.models import (
|
||||||
RedirectUri,
|
RedirectUri,
|
||||||
OauthToken,
|
OauthToken,
|
||||||
DeletedAlias,
|
DeletedAlias,
|
||||||
CustomDomain,
|
|
||||||
DomainDeletedAlias,
|
DomainDeletedAlias,
|
||||||
)
|
)
|
||||||
from app.oauth.base import oauth_bp
|
from app.oauth.base import oauth_bp
|
||||||
|
@ -214,13 +213,6 @@ def authorize():
|
||||||
mailbox_id=current_user.default_mailbox_id,
|
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()
|
Session.flush()
|
||||||
flash(f"Alias {full_alias} has been created", "success")
|
flash(f"Alias {full_alias} has been created", "success")
|
||||||
# only happen if the request has been "hacked"
|
# only happen if the request has been "hacked"
|
||||||
|
|
|
@ -196,21 +196,13 @@ def test_get_aliases_v2(flask_client):
|
||||||
|
|
||||||
|
|
||||||
def test_delete_alias(flask_client):
|
def test_delete_alias(flask_client):
|
||||||
user = User.create(
|
user = login(flask_client)
|
||||||
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()
|
|
||||||
|
|
||||||
alias = Alias.create_new_random(user)
|
alias = Alias.create_new_random(user)
|
||||||
Session.commit()
|
Session.commit()
|
||||||
|
|
||||||
r = flask_client.delete(
|
r = flask_client.delete(
|
||||||
url_for("api.delete_alias", alias_id=alias.id),
|
url_for("api.delete_alias", alias_id=alias.id),
|
||||||
headers={"Authentication": api_key.code},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
|
|
Loading…
Reference in a new issue