make sure to add alias into global trash when deleting it

This commit is contained in:
Son NK 2020-05-07 22:27:27 +02:00
parent 300f1d7032
commit 2f5a03dcad
5 changed files with 28 additions and 18 deletions

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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)
)

View File

@ -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(