Compare commits
55 Commits
757f153042
...
4.39.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 75f45d9365 | |||
| ead425e0c2 | |||
| 6c910d62c5 | |||
| 99ffd1ec0c | |||
| eda940f8b2 | |||
| 1dad582523 | |||
| e516266a27 | |||
| 850fc95477 | |||
| d172825900 | |||
| 026865e5bf | |||
| add94ef2a2 | |||
| 1081400948 | |||
| 5776128905 | |||
| d661860f4c | |||
| 0a52e32972 | |||
| 703dcbd0eb | |||
| ce7ed69547 | |||
| 4f5564df16 | |||
| 2fee569131 | |||
| 7ea45d6f5d | |||
| 6d24db50bd | |||
| 88f270c6a1 | |||
| 0962b1cf29 | |||
| 6051d72691 | |||
| c31a75a9ef | |||
| ef289385ff | |||
| 9b12a2ad33 | |||
| 8eb19d88f3 | |||
| e36e9d3077 | |||
| b2430cbc5b | |||
| 1258115397 | |||
| 38c134d903 | |||
| cd77e4cc2d | |||
| 87aedf3207 | |||
| 3523c9fc15 | |||
| a6f4995cb5 | |||
| 727f61a35e | |||
| ce5124605a | |||
| 2c82b03f8d | |||
| 1b7a6223ac | |||
| 75331c62a4 | |||
| 3f68a3e640 | |||
| 8ee4f9462e | |||
| 822855d584 | |||
| 1a6a7e079b | |||
| 5210cb6515 | |||
| b643f0644b | |||
| 5d093db4f6 | |||
| 0b16fcac67 | |||
| a0d294da53 | |||
| c3f755aede | |||
| 0aea62c222 | |||
| 92f4ad2237 | |||
| 20da343c54 | |||
| 02776e8478 |
@ -168,8 +168,6 @@ class NewUserStrategy(ClientMergeStrategy):
|
||||
|
||||
class ExistingUnlinkedUserStrategy(ClientMergeStrategy):
|
||||
def process(self) -> LinkResult:
|
||||
# IF it was scheduled to be deleted. Unschedule it.
|
||||
self.user.delete_on = None
|
||||
partner_user = ensure_partner_user_exists_for_user(
|
||||
self.link_request, self.user, self.partner
|
||||
)
|
||||
@ -248,8 +246,6 @@ def link_user(
|
||||
) -> LinkResult:
|
||||
# Sanitize email just in case
|
||||
link_request.email = sanitize_email(link_request.email)
|
||||
# If it was scheduled to be deleted. Unschedule it.
|
||||
current_user.delete_on = None
|
||||
partner_user = ensure_partner_user_exists_for_user(
|
||||
link_request, current_user, partner
|
||||
)
|
||||
|
||||
@ -33,9 +33,6 @@ def authorize_request() -> Optional[Tuple[str, int]]:
|
||||
if g.user.disabled:
|
||||
return jsonify(error="Disabled account"), 403
|
||||
|
||||
if not g.user.is_active():
|
||||
return jsonify(error="Account does not exist"), 401
|
||||
|
||||
g.api_key = api_key
|
||||
return None
|
||||
|
||||
|
||||
@ -727,11 +727,6 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle):
|
||||
|
||||
return True
|
||||
|
||||
def is_active(self) -> bool:
|
||||
if self.delete_on is None:
|
||||
return True
|
||||
return self.delete_on < arrow.now()
|
||||
|
||||
def in_trial(self):
|
||||
"""return True if user does not have lifetime licence or an active subscription AND is in trial period"""
|
||||
if self.lifetime_or_active_subscription():
|
||||
@ -833,9 +828,6 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle):
|
||||
Whether user can create a new alias. User can't create a new alias if
|
||||
- has more than 15 aliases in the free plan, *even in the free trial*
|
||||
"""
|
||||
if not self.is_active():
|
||||
return False
|
||||
|
||||
if self.disabled:
|
||||
return False
|
||||
|
||||
|
||||
@ -140,7 +140,7 @@ def authorize():
|
||||
Scope=Scope,
|
||||
)
|
||||
else: # POST - user allows or denies
|
||||
if not current_user.is_authenticated or not current_user.is_active():
|
||||
if not current_user.is_authenticated or not current_user.is_active:
|
||||
LOG.i(
|
||||
"Attempt to validate a OAUth allow request by an unauthenticated user"
|
||||
)
|
||||
|
||||
13
app/cron.py
13
app/cron.py
@ -62,8 +62,6 @@ from app.proton.utils import get_proton_partner
|
||||
from app.utils import sanitize_email
|
||||
from server import create_light_app
|
||||
|
||||
DELETE_GRACE_DAYS = 30
|
||||
|
||||
|
||||
def notify_trial_end():
|
||||
for user in User.filter(
|
||||
@ -1128,19 +1126,14 @@ def notify_hibp():
|
||||
Session.commit()
|
||||
|
||||
|
||||
def clear_users_scheduled_to_be_deleted(dry_run=False):
|
||||
def clear_users_scheduled_to_be_deleted():
|
||||
users = User.filter(
|
||||
and_(
|
||||
User.delete_on.isnot(None),
|
||||
User.delete_on <= arrow.now().shift(days=-DELETE_GRACE_DAYS),
|
||||
)
|
||||
and_(User.delete_on.isnot(None), User.delete_on < arrow.now())
|
||||
).all()
|
||||
for user in users:
|
||||
LOG.i(
|
||||
f"Scheduled deletion of user {user} with scheduled delete on {user.delete_on}"
|
||||
)
|
||||
if dry_run:
|
||||
continue
|
||||
User.delete(user.id)
|
||||
Session.commit()
|
||||
|
||||
@ -1213,4 +1206,4 @@ if __name__ == "__main__":
|
||||
load_unsent_mails_from_fs_and_resend()
|
||||
elif args.job == "delete_scheduled_users":
|
||||
LOG.d("Deleting users scheduled to be deleted")
|
||||
clear_users_scheduled_to_be_deleted(dry_run=True)
|
||||
clear_users_scheduled_to_be_deleted()
|
||||
|
||||
@ -62,7 +62,7 @@ jobs:
|
||||
captureStderr: true
|
||||
|
||||
- name: SimpleLogin delete users scheduled to be deleted
|
||||
command: python /code/cron.py -j delete_scheduled_users
|
||||
command: echo disabled_user_deletion #python /code/cron.py -j delete_scheduled_users
|
||||
shell: /bin/bash
|
||||
schedule: "15 11 * * *"
|
||||
captureStderr: true
|
||||
|
||||
@ -636,10 +636,6 @@ def handle_forward(envelope, msg: Message, rcpt_to: str) -> List[Tuple[bool, str
|
||||
|
||||
user = alias.user
|
||||
|
||||
if not user.is_active():
|
||||
LOG.w(f"User {user} has been soft deleted")
|
||||
return False, status.E502
|
||||
|
||||
if not user.can_send_or_receive():
|
||||
LOG.i(f"User {user} cannot receive emails")
|
||||
if should_ignore_bounce(envelope.mail_from):
|
||||
@ -1059,9 +1055,6 @@ def handle_reply(envelope, msg: Message, rcpt_to: str) -> (bool, str):
|
||||
if not contact:
|
||||
LOG.w(f"No contact with {reply_email} as reverse alias")
|
||||
return False, status.E502
|
||||
if not contact.user.is_active():
|
||||
LOG.w(f"User {contact.user} has been soft deleted")
|
||||
return False, status.E502
|
||||
|
||||
alias = contact.alias
|
||||
alias_address: str = contact.alias.email
|
||||
@ -1928,9 +1921,6 @@ def handle_bounce(envelope, email_log: EmailLog, msg: Message) -> str:
|
||||
contact,
|
||||
alias,
|
||||
)
|
||||
if not email_log.user.is_active():
|
||||
LOG.d(f"User {email_log.user} is not active")
|
||||
return status.E510
|
||||
|
||||
if email_log.is_reply:
|
||||
content_type = msg.get_content_type().lower()
|
||||
@ -1992,9 +1982,6 @@ def send_no_reply_response(mail_from: str, msg: Message):
|
||||
if not mailbox:
|
||||
LOG.d("Unknown sender. Skipping reply from {}".format(NOREPLY))
|
||||
return
|
||||
if not mailbox.user.is_active():
|
||||
LOG.d(f"User {mailbox.user} is soft-deleted. Skipping sending reply response")
|
||||
return
|
||||
send_email_at_most_times(
|
||||
mailbox.user,
|
||||
ALERT_TO_NOREPLY,
|
||||
|
||||
@ -7460,7 +7460,9 @@ villain
|
||||
vindicate
|
||||
vineyard
|
||||
vintage
|
||||
violate
|
||||
violation
|
||||
violator
|
||||
violet
|
||||
violin
|
||||
viper
|
||||
|
||||
@ -228,8 +228,6 @@ def load_user(alternative_id):
|
||||
sentry_sdk.set_user({"email": user.email, "id": user.id})
|
||||
if user.disabled:
|
||||
return None
|
||||
if not user.is_active():
|
||||
return None
|
||||
|
||||
return user
|
||||
|
||||
|
||||
@ -39,17 +39,15 @@ def test_cleanup_tokens(flask_client):
|
||||
|
||||
def test_cleanup_users():
|
||||
u_delete_none_id = create_new_user().id
|
||||
u_delete_grace_has_expired = create_new_user()
|
||||
u_delete_grace_has_expired_id = u_delete_grace_has_expired.id
|
||||
u_delete_grace_has_not_expired = create_new_user()
|
||||
u_delete_grace_has_not_expired_id = u_delete_grace_has_not_expired.id
|
||||
u_delete_after = create_new_user()
|
||||
u_delete_after_id = u_delete_after.id
|
||||
u_delete_before = create_new_user()
|
||||
u_delete_before_id = u_delete_before.id
|
||||
now = arrow.now()
|
||||
u_delete_grace_has_expired.delete_on = now.shift(days=-(cron.DELETE_GRACE_DAYS + 1))
|
||||
u_delete_grace_has_not_expired.delete_on = now.shift(
|
||||
days=-(cron.DELETE_GRACE_DAYS - 1)
|
||||
)
|
||||
u_delete_after.delete_on = now.shift(minutes=1)
|
||||
u_delete_before.delete_on = now.shift(minutes=-1)
|
||||
Session.flush()
|
||||
cron.clear_users_scheduled_to_be_deleted()
|
||||
assert User.get(u_delete_none_id) is not None
|
||||
assert User.get(u_delete_grace_has_not_expired_id) is not None
|
||||
assert User.get(u_delete_grace_has_expired_id) is None
|
||||
assert User.get(u_delete_after_id) is not None
|
||||
assert User.get(u_delete_before_id) is None
|
||||
|
||||
Reference in New Issue
Block a user