mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 03:53:50 +00:00 
			
		
		
		
	sessions: Move session deletion code to sessions.py.
This new organization feels more thematically appropriate, and of course shrinks the amount of stuff unnecessarily in actions.py
This commit is contained in:
		| @@ -9,7 +9,6 @@ from django.utils.html import escape | |||||||
| from django.utils.translation import ugettext as _ | from django.utils.translation import ugettext as _ | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.core import validators | from django.core import validators | ||||||
| from django.contrib.sessions.models import Session |  | ||||||
| from analytics.lib.counts import COUNT_STATS, do_increment_logging_stat | from analytics.lib.counts import COUNT_STATS, do_increment_logging_stat | ||||||
| from zerver.lib.bugdown import ( | from zerver.lib.bugdown import ( | ||||||
|     BugdownRenderingException, |     BugdownRenderingException, | ||||||
| @@ -47,7 +46,6 @@ from django.db import transaction, IntegrityError, connection | |||||||
| from django.db.models import F, Q | from django.db.models import F, Q | ||||||
| from django.db.models.query import QuerySet | from django.db.models.query import QuerySet | ||||||
| from django.core.exceptions import ValidationError | from django.core.exceptions import ValidationError | ||||||
| from importlib import import_module |  | ||||||
| from django.core.mail import EmailMessage | from django.core.mail import EmailMessage | ||||||
| from django.utils import timezone | from django.utils import timezone | ||||||
|  |  | ||||||
| @@ -58,8 +56,6 @@ from six.moves import map | |||||||
| from six.moves import range | from six.moves import range | ||||||
| from six import unichr | from six import unichr | ||||||
|  |  | ||||||
| session_engine = import_module(settings.SESSION_ENGINE) |  | ||||||
|  |  | ||||||
| from zerver.lib.create_user import random_api_key | from zerver.lib.create_user import random_api_key | ||||||
| from zerver.lib.timestamp import timestamp_to_datetime, datetime_to_timestamp | from zerver.lib.timestamp import timestamp_to_datetime, datetime_to_timestamp | ||||||
| from zerver.lib.queue import queue_json_publish | from zerver.lib.queue import queue_json_publish | ||||||
| @@ -76,7 +72,7 @@ from zerver.lib.alert_words import user_alert_words, add_user_alert_words, \ | |||||||
| from zerver.lib.notifications import clear_followup_emails_queue | from zerver.lib.notifications import clear_followup_emails_queue | ||||||
| from zerver.lib.narrow import check_supported_events_narrow_filter | from zerver.lib.narrow import check_supported_events_narrow_filter | ||||||
| from zerver.lib.request import JsonableError | from zerver.lib.request import JsonableError | ||||||
| from zerver.lib.sessions import get_session_user | from zerver.lib.sessions import delete_user_sessions | ||||||
| from zerver.lib.upload import attachment_url_re, attachment_url_to_path_id, \ | from zerver.lib.upload import attachment_url_re, attachment_url_to_path_id, \ | ||||||
|     claim_attachment, delete_message_image |     claim_attachment, delete_message_image | ||||||
| from zerver.lib.str_utils import NonBinaryStr, force_str | from zerver.lib.str_utils import NonBinaryStr, force_str | ||||||
| @@ -430,45 +426,6 @@ def do_create_user(email, password, realm, full_name, short_name, | |||||||
|                                newsletter_data=newsletter_data) |                                newsletter_data=newsletter_data) | ||||||
|     return user_profile |     return user_profile | ||||||
|  |  | ||||||
| def user_sessions(user_profile): |  | ||||||
|     # type: (UserProfile) -> List[Session] |  | ||||||
|     return [s for s in Session.objects.all() |  | ||||||
|             if get_session_user(s) == user_profile.id] |  | ||||||
|  |  | ||||||
| def delete_session(session): |  | ||||||
|     # type: (Session) -> None |  | ||||||
|     session_engine.SessionStore(session.session_key).delete() # type: ignore # import_module |  | ||||||
|  |  | ||||||
| def delete_user_sessions(user_profile): |  | ||||||
|     # type: (UserProfile) -> None |  | ||||||
|     for session in Session.objects.all(): |  | ||||||
|         if get_session_user(session) == user_profile.id: |  | ||||||
|             delete_session(session) |  | ||||||
|  |  | ||||||
| def delete_realm_user_sessions(realm): |  | ||||||
|     # type: (Realm) -> None |  | ||||||
|     realm_user_ids = [user_profile.id for user_profile in |  | ||||||
|                       UserProfile.objects.filter(realm=realm)] |  | ||||||
|     for session in Session.objects.filter(expire_date__gte=timezone.now()): |  | ||||||
|         if get_session_user(session) in realm_user_ids: |  | ||||||
|             delete_session(session) |  | ||||||
|  |  | ||||||
| def delete_all_user_sessions(): |  | ||||||
|     # type: () -> None |  | ||||||
|     for session in Session.objects.all(): |  | ||||||
|         delete_session(session) |  | ||||||
|  |  | ||||||
| def delete_all_deactivated_user_sessions(): |  | ||||||
|     # type: () -> None |  | ||||||
|     for session in Session.objects.all(): |  | ||||||
|         user_profile_id = get_session_user(session) |  | ||||||
|         if user_profile_id is None: |  | ||||||
|             continue |  | ||||||
|         user_profile = get_user_profile_by_id(user_profile_id) |  | ||||||
|         if not user_profile.is_active or user_profile.realm.deactivated: |  | ||||||
|             logging.info("Deactivating session for deactivated user %s" % (user_profile.email,)) |  | ||||||
|             delete_session(session) |  | ||||||
|  |  | ||||||
| def active_humans_in_realm(realm): | def active_humans_in_realm(realm): | ||||||
|     # type: (Realm) -> Sequence[UserProfile] |     # type: (Realm) -> Sequence[UserProfile] | ||||||
|     return UserProfile.objects.filter(realm=realm, is_active=True, is_bot=False) |     return UserProfile.objects.filter(realm=realm, is_active=True, is_bot=False) | ||||||
|   | |||||||
| @@ -1,10 +1,17 @@ | |||||||
| from __future__ import absolute_import | from __future__ import absolute_import | ||||||
|  |  | ||||||
|  | import logging | ||||||
|  |  | ||||||
|  | from django.conf import settings | ||||||
| from django.contrib.auth import SESSION_KEY, get_user_model | from django.contrib.auth import SESSION_KEY, get_user_model | ||||||
| from django.contrib.sessions.models import Session | from django.contrib.sessions.models import Session | ||||||
|  | from django.utils import timezone | ||||||
|  | from importlib import import_module | ||||||
| from typing import Mapping, Optional, Text | from typing import Mapping, Optional, Text | ||||||
|  |  | ||||||
|  | from zerver.models import UserProfile, get_user_profile_by_id | ||||||
|  |  | ||||||
|  | session_engine = import_module(settings.SESSION_ENGINE) | ||||||
|  |  | ||||||
| def get_session_dict_user(session_dict): | def get_session_dict_user(session_dict): | ||||||
|     # type: (Mapping[Text, int]) -> Optional[int] |     # type: (Mapping[Text, int]) -> Optional[int] | ||||||
| @@ -17,3 +24,42 @@ def get_session_dict_user(session_dict): | |||||||
| def get_session_user(session): | def get_session_user(session): | ||||||
|     # type: (Session) -> int |     # type: (Session) -> int | ||||||
|     return get_session_dict_user(session.get_decoded()) |     return get_session_dict_user(session.get_decoded()) | ||||||
|  |  | ||||||
|  | def user_sessions(user_profile): | ||||||
|  |     # type: (UserProfile) -> List[Session] | ||||||
|  |     return [s for s in Session.objects.all() | ||||||
|  |             if get_session_user(s) == user_profile.id] | ||||||
|  |  | ||||||
|  | def delete_session(session): | ||||||
|  |     # type: (Session) -> None | ||||||
|  |     session_engine.SessionStore(session.session_key).delete() # type: ignore # import_module | ||||||
|  |  | ||||||
|  | def delete_user_sessions(user_profile): | ||||||
|  |     # type: (UserProfile) -> None | ||||||
|  |     for session in Session.objects.all(): | ||||||
|  |         if get_session_user(session) == user_profile.id: | ||||||
|  |             delete_session(session) | ||||||
|  |  | ||||||
|  | def delete_realm_user_sessions(realm): | ||||||
|  |     # type: (Realm) -> None | ||||||
|  |     realm_user_ids = [user_profile.id for user_profile in | ||||||
|  |                       UserProfile.objects.filter(realm=realm)] | ||||||
|  |     for session in Session.objects.filter(expire_date__gte=timezone.now()): | ||||||
|  |         if get_session_user(session) in realm_user_ids: | ||||||
|  |             delete_session(session) | ||||||
|  |  | ||||||
|  | def delete_all_user_sessions(): | ||||||
|  |     # type: () -> None | ||||||
|  |     for session in Session.objects.all(): | ||||||
|  |         delete_session(session) | ||||||
|  |  | ||||||
|  | def delete_all_deactivated_user_sessions(): | ||||||
|  |     # type: () -> None | ||||||
|  |     for session in Session.objects.all(): | ||||||
|  |         user_profile_id = get_session_user(session) | ||||||
|  |         if user_profile_id is None: | ||||||
|  |             continue | ||||||
|  |         user_profile = get_user_profile_by_id(user_profile_id) | ||||||
|  |         if not user_profile.is_active or user_profile.realm.deactivated: | ||||||
|  |             logging.info("Deactivating session for deactivated user %s" % (user_profile.email,)) | ||||||
|  |             delete_session(session) | ||||||
|   | |||||||
| @@ -8,7 +8,8 @@ from optparse import make_option | |||||||
|  |  | ||||||
| from django.core.management.base import BaseCommand | from django.core.management.base import BaseCommand | ||||||
|  |  | ||||||
| from zerver.lib.actions import do_deactivate_user, user_sessions | from zerver.lib.actions import do_deactivate_user | ||||||
|  | from zerver.lib.sessions import user_sessions | ||||||
| from zerver.models import get_user_profile_by_email, UserProfile | from zerver.models import get_user_profile_by_email, UserProfile | ||||||
|  |  | ||||||
| class Command(BaseCommand): | class Command(BaseCommand): | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ from argparse import ArgumentParser | |||||||
|  |  | ||||||
| from django.core.management.base import BaseCommand | from django.core.management.base import BaseCommand | ||||||
|  |  | ||||||
| from zerver.lib.actions import delete_all_user_sessions, \ | from zerver.lib.sessions import delete_all_user_sessions, \ | ||||||
|     delete_realm_user_sessions, delete_all_deactivated_user_sessions |     delete_realm_user_sessions, delete_all_deactivated_user_sessions | ||||||
| from zerver.models import get_realm | from zerver.models import get_realm | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user