Esempio n. 1
0
 def test_delete_user_sessions(self) -> None:
     user_profile = self.example_user('hamlet')
     self.do_test_session(user_profile, lambda: delete_user_sessions(user_profile),
                          get_realm("zulip"), True)
     self.do_test_session(self.example_user("othello"),
                          lambda: delete_user_sessions(user_profile),
                          get_realm("zulip"), False)
Esempio n. 2
0
 def test_delete_user_sessions(self) -> None:
     user_profile = self.example_user('hamlet')
     email = user_profile.email
     self.do_test_session(str(email),
                          lambda: delete_user_sessions(user_profile), True)
     self.do_test_session(str(self.example_email("othello")),
                          lambda: delete_user_sessions(user_profile), False)
Esempio n. 3
0
 def test_delete_user_sessions(self) -> None:
     user_profile = self.example_user('hamlet')
     email = user_profile.email
     self.do_test_session(str(email), lambda: delete_user_sessions(user_profile),
                          get_realm("zulip"), True)
     self.do_test_session(str(self.example_email("othello")),
                          lambda: delete_user_sessions(user_profile),
                          get_realm("zulip"), False)
Esempio n. 4
0
def do_deactivate_realm(realm: Realm, *,
                        acting_user: Optional[UserProfile]) -> None:
    """
    Deactivate this realm. Do NOT deactivate the users -- we need to be able to
    tell the difference between users that were intentionally deactivated,
    e.g. by a realm admin, and users who can't currently use Zulip because their
    realm has been deactivated.
    """
    if realm.deactivated:
        return

    realm.deactivated = True
    realm.save(update_fields=["deactivated"])

    if settings.BILLING_ENABLED:
        downgrade_now_without_creating_additional_invoices(realm)

    event_time = timezone_now()
    RealmAuditLog.objects.create(
        realm=realm,
        event_type=RealmAuditLog.REALM_DEACTIVATED,
        event_time=event_time,
        acting_user=acting_user,
        extra_data=orjson.dumps({
            RealmAuditLog.ROLE_COUNT:
            realm_user_count_by_role(realm),
        }).decode(),
    )

    ScheduledEmail.objects.filter(realm=realm).delete()
    for user in active_humans_in_realm(realm):
        # Don't deactivate the users, but do delete their sessions so they get
        # bumped to the login screen, where they'll get a realm deactivation
        # notice when they try to log in.
        delete_user_sessions(user)

    # This event will only ever be received by clients with an active
    # longpoll connection, because by this point clients will be
    # unable to authenticate again to their event queue (triggering an
    # immediate reload into the page explaining the realm was
    # deactivated). So the purpose of sending this is to flush all
    # active longpoll connections for the realm.
    event = dict(type="realm", op="deactivated", realm_id=realm.id)
    send_event(realm, event, active_user_ids(realm.id))
Esempio n. 5
0
 def test_delete_user_sessions(self):
     # type: () -> None
     user_profile = self.example_user('hamlet')
     email = user_profile.email
     self.do_test_session(str(email), lambda: delete_user_sessions(user_profile), True)
     self.do_test_session(str(self.example_email("othello")), lambda: delete_user_sessions(user_profile), False)
Esempio n. 6
0
def do_deactivate_user(
    user_profile: UserProfile, _cascade: bool = True, *, acting_user: Optional[UserProfile]
) -> None:
    if not user_profile.is_active:
        return

    if _cascade:
        # We need to deactivate bots before the target user, to ensure
        # that a failure partway through this function cannot result
        # in only the user being deactivated.
        bot_profiles = get_active_bots_owned_by_user(user_profile)
        for profile in bot_profiles:
            do_deactivate_user(profile, _cascade=False, acting_user=acting_user)

    with transaction.atomic():
        if user_profile.realm.is_zephyr_mirror_realm:  # nocoverage
            # For zephyr mirror users, we need to make them a mirror dummy
            # again; otherwise, other users won't get the correct behavior
            # when trying to send messages to this person inside Zulip.
            #
            # Ideally, we need to also ensure their zephyr mirroring bot
            # isn't running, but that's a separate issue.
            user_profile.is_mirror_dummy = True
            user_profile.save(update_fields=["is_mirror_dummy"])

        change_user_is_active(user_profile, False)

        clear_scheduled_emails(user_profile.id)
        revoke_invites_generated_by_user(user_profile)

        event_time = timezone_now()
        RealmAuditLog.objects.create(
            realm=user_profile.realm,
            modified_user=user_profile,
            acting_user=acting_user,
            event_type=RealmAuditLog.USER_DEACTIVATED,
            event_time=event_time,
            extra_data=orjson.dumps(
                {
                    RealmAuditLog.ROLE_COUNT: realm_user_count_by_role(user_profile.realm),
                }
            ).decode(),
        )
        do_increment_logging_stat(
            user_profile.realm,
            COUNT_STATS["active_users_log:is_bot:day"],
            user_profile.is_bot,
            event_time,
            increment=-1,
        )
        if settings.BILLING_ENABLED:
            update_license_ledger_if_needed(user_profile.realm, event_time)

    delete_user_sessions(user_profile)
    event = dict(
        type="realm_user",
        op="remove",
        person=dict(user_id=user_profile.id, full_name=user_profile.full_name),
    )
    send_event(user_profile.realm, event, active_user_ids(user_profile.realm_id))

    if user_profile.is_bot:
        event = dict(
            type="realm_bot",
            op="remove",
            bot=dict(user_id=user_profile.id, full_name=user_profile.full_name),
        )
        send_event(user_profile.realm, event, bot_owner_user_ids(user_profile))