diff --git a/app/dashboard/views/setting.py b/app/dashboard/views/setting.py index 576cdeef..50699628 100644 --- a/app/dashboard/views/setting.py +++ b/app/dashboard/views/setting.py @@ -28,6 +28,7 @@ from app.email_utils import ( ) from app.log import LOG from app.models import ( + BlockBehaviourEnum, PlanEnum, File, ResetPasswordCode, @@ -303,7 +304,17 @@ def setting(): Session.commit() flash("Your preference has been updated", "success") return redirect(url_for("dashboard.setting")) - + elif request.form.get("form-name") == "change-blocked-behaviour": + choose = request.form.get("blocked-behaviour") + if choose == str(BlockBehaviourEnum.return_2xx.value): + current_user.block_behaviour = BlockBehaviourEnum.return_2xx.name + elif choose == str(BlockBehaviourEnum.return_5xx.value): + current_user.block_behaviour = BlockBehaviourEnum.return_5xx.name + else: + flash("There was an error. Please try again", "warning") + return redirect(url_for("dashboard.setting")) + Session.commit() + flash("Your preference has been updated", "success") elif request.form.get("form-name") == "export-data": return redirect(url_for("api.export_data")) elif request.form.get("form-name") == "export-alias": @@ -318,6 +329,7 @@ def setting(): form=form, PlanEnum=PlanEnum, SenderFormatEnum=SenderFormatEnum, + BlockBehaviourEnum=BlockBehaviourEnum, promo_form=promo_form, change_email_form=change_email_form, pending_email=pending_email, diff --git a/app/models.py b/app/models.py index 40bc0227..512a3050 100644 --- a/app/models.py +++ b/app/models.py @@ -221,6 +221,11 @@ class AliasSuffixEnum(EnumE): random_string = 1 # Completely random string +class BlockBehaviourEnum(EnumE): + return_2xx = 0 + return_5xx = 1 + + class Hibp(Base, ModelMixin): __tablename__ = "hibp" name = sa.Column(sa.String(), nullable=False, unique=True, index=True) @@ -438,6 +443,13 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle): # in minutes phone_quota = sa.Column(sa.Integer, nullable=True) + # Status code to return if is blocked + block_behaviour = sa.Column( + sa.Enum(BlockBehaviourEnum), + nullable=False, + server_default=BlockBehaviourEnum.return_2xx.name, + ) + @property def directory_quota(self): return min( diff --git a/email_handler.py b/email_handler.py index 61f503f3..da4049ef 100644 --- a/email_handler.py +++ b/email_handler.py @@ -139,6 +139,7 @@ from app.log import LOG, set_message_id from app.models import ( Alias, Contact, + BlockBehaviourEnum, EmailLog, User, RefusedEmail, @@ -606,8 +607,13 @@ def handle_forward(envelope, msg: Message, rcpt_to: str) -> List[Tuple[bool, str alias_id=contact.alias_id, commit=True, ) + + res_status = status.E200 + if user.block_behaviour == BlockBehaviourEnum.return_5xx: + res_status = status.E502 + # do not return 5** to allow user to receive emails later when alias is enabled or contact is unblocked - return [(True, status.E200)] + return [(True, res_status)] ret = [] mailboxes = alias.mailboxes diff --git a/migrations/versions/2022_021812_9282e982bc05_.py b/migrations/versions/2022_021812_9282e982bc05_.py new file mode 100644 index 00000000..6a0d021e --- /dev/null +++ b/migrations/versions/2022_021812_9282e982bc05_.py @@ -0,0 +1,38 @@ +"""Add block_behaviour setting for user + +Revision ID: 9282e982bc05 +Revises: 07b870d7cc86 +Create Date: 2022-02-18 12:37:55.707424 + +""" +import sqlalchemy_utils +from sqlalchemy.dialects import postgresql +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9282e982bc05' +down_revision = '07b870d7cc86' +branch_labels = None +depends_on = None + +def __create_enum() -> postgresql.ENUM: + return postgresql.ENUM('return_2xx', 'return_5xx', name='block_behaviour_enum') + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + block_behaviour_enum = __create_enum() + block_behaviour_enum.create(op.get_bind()) + + op.add_column('users', sa.Column('block_behaviour', block_behaviour_enum, nullable=False, default='return_2xx', server_default='return_2xx')) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'block_behaviour') + + block_behaviour_enum = __create_enum() + block_behaviour_enum.drop(op.get_bind()) + # ### end Alembic commands ### diff --git a/templates/dashboard/setting.html b/templates/dashboard/setting.html index 62008165..7148173b 100644 --- a/templates/dashboard/setting.html +++ b/templates/dashboard/setting.html @@ -490,6 +490,34 @@ +
+
+
Blocked contact behaviour
+
+ When an email is sent to one of your blocked contacts you can decide what response they should see.
+ If you select "Ignore", they will see the message as delivered, but we won't actually forward it to you.
+ If you select "Reject", we will tell them that the alias they have does not exist. +
+
+ + + + + +
+
+
+
Alias Import