make sure to add alias into global trash when deleting it
This commit is contained in:
parent
300f1d7032
commit
2f5a03dcad
|
@ -1,5 +1,7 @@
|
|||
from typing import Optional
|
||||
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from app.email_utils import (
|
||||
get_email_domain_part,
|
||||
send_cannot_create_directory_alias,
|
||||
|
@ -76,6 +78,7 @@ def try_auto_create_directory(address: str) -> Optional[Alias]:
|
|||
directory_id=directory.id,
|
||||
mailbox_id=dir_user.default_mailbox_id,
|
||||
)
|
||||
|
||||
db.session.commit()
|
||||
return alias
|
||||
|
||||
|
@ -103,7 +106,7 @@ def try_auto_create_catch_all_domain(address: str) -> Optional[Alias]:
|
|||
return None
|
||||
|
||||
# if alias has been deleted before, do not auto-create it
|
||||
if DeletedAlias.get_by(email=address, user_id=custom_domain.user_id):
|
||||
if DeletedAlias.get_by(email=address):
|
||||
LOG.warning(
|
||||
"Alias %s was deleted before, cannot auto-create using domain catch-all %s, user %s",
|
||||
address,
|
||||
|
@ -124,3 +127,18 @@ def try_auto_create_catch_all_domain(address: str) -> Optional[Alias]:
|
|||
|
||||
db.session.commit()
|
||||
return alias
|
||||
|
||||
|
||||
def delete_alias(alias: Alias, user: User):
|
||||
email = alias.email
|
||||
Alias.delete(alias.id)
|
||||
db.session.commit()
|
||||
|
||||
# try to save deleted alias
|
||||
try:
|
||||
DeletedAlias.create(user_id=user.id, email=email)
|
||||
db.session.commit()
|
||||
# this can happen when a previously deleted alias is re-created via catch-all or directory feature
|
||||
except IntegrityError:
|
||||
LOG.error("alias %s has been added before to DeletedAlias", email)
|
||||
db.session.rollback()
|
||||
|
|
|
@ -3,6 +3,7 @@ from flask import jsonify
|
|||
from flask import request
|
||||
from flask_cors import cross_origin
|
||||
|
||||
from app import alias_utils
|
||||
from app.api.base import api_bp, require_api_auth
|
||||
from app.api.serializer import (
|
||||
AliasInfo,
|
||||
|
@ -156,8 +157,7 @@ def delete_alias(alias_id):
|
|||
if alias.user_id != user.id:
|
||||
return jsonify(error="Forbidden"), 403
|
||||
|
||||
Alias.delete(alias_id)
|
||||
db.session.commit()
|
||||
alias_utils.delete_alias(alias, user)
|
||||
|
||||
return jsonify(deleted=True), 200
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ from app.config import MAX_NB_EMAIL_FREE_PLAN, ALIAS_DOMAINS
|
|||
from app.dashboard.views.custom_alias import verify_prefix_suffix, signer
|
||||
from app.extensions import db
|
||||
from app.log import LOG
|
||||
from app.models import Alias, AliasUsedOn, User, CustomDomain
|
||||
from app.models import Alias, AliasUsedOn, User, CustomDomain, DeletedAlias
|
||||
from app.utils import convert_to_id
|
||||
|
||||
|
||||
|
@ -56,7 +56,7 @@ def new_custom_alias():
|
|||
return jsonify(error="wrong alias prefix or suffix"), 400
|
||||
|
||||
full_alias = alias_prefix + alias_suffix
|
||||
if Alias.get_by(email=full_alias):
|
||||
if Alias.get_by(email=full_alias) or DeletedAlias.get_by(email=full_alias):
|
||||
LOG.d("full alias already used %s", full_alias)
|
||||
return jsonify(error=f"alias {full_alias} already exists"), 409
|
||||
|
||||
|
@ -133,7 +133,7 @@ def new_custom_alias_v2():
|
|||
return jsonify(error="wrong alias prefix or suffix"), 400
|
||||
|
||||
full_alias = alias_prefix + alias_suffix
|
||||
if Alias.get_by(email=full_alias):
|
||||
if Alias.get_by(email=full_alias) or DeletedAlias.get_by(email=full_alias):
|
||||
LOG.d("full alias already used %s", full_alias)
|
||||
return jsonify(error=f"alias {full_alias} already exists"), 409
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ from flask_login import login_required, current_user
|
|||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
from app import alias_utils
|
||||
from app.api.serializer import get_alias_infos_with_pagination_v2
|
||||
from app.dashboard.base import dashboard_bp
|
||||
from app.extensions import db
|
||||
|
@ -112,19 +113,9 @@ def index():
|
|||
|
||||
LOG.d("delete gen email %s", alias)
|
||||
email = alias.email
|
||||
Alias.delete(alias.id)
|
||||
db.session.commit()
|
||||
alias_utils.delete_alias(alias, current_user)
|
||||
flash(f"Alias {email} has been deleted", "success")
|
||||
|
||||
# try to save deleted alias
|
||||
try:
|
||||
DeletedAlias.create(user_id=current_user.id, email=email)
|
||||
db.session.commit()
|
||||
# this can happen when a previously deleted alias is re-created via catch-all or directory feature
|
||||
except IntegrityError:
|
||||
LOG.error("alias %s has been added before to DeletedAlias", email)
|
||||
db.session.rollback()
|
||||
|
||||
return redirect(
|
||||
url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)
|
||||
)
|
||||
|
|
|
@ -24,6 +24,7 @@ from app.config import (
|
|||
LANDING_PAGE_URL,
|
||||
FIRST_ALIAS_DOMAIN,
|
||||
)
|
||||
from app.errors import AliasInTrashError
|
||||
from app.extensions import db
|
||||
from app.log import LOG
|
||||
from app.oauth_models import Scope
|
||||
|
@ -652,7 +653,7 @@ class Alias(db.Model, ModelMixin):
|
|||
suffix = random_word()
|
||||
email = f"{prefix}.{suffix}@{FIRST_ALIAS_DOMAIN}"
|
||||
|
||||
if not cls.get_by(email=email):
|
||||
if not cls.get_by(email=email) and not DeletedAlias.get_by(email=email):
|
||||
break
|
||||
|
||||
return Alias.create(
|
||||
|
|
Loading…
Reference in New Issue