diff --git a/zephyr/lib/actions.py b/zephyr/lib/actions.py index 387afa3e9a..95f7aa27e6 100644 --- a/zephyr/lib/actions.py +++ b/zephyr/lib/actions.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.contrib.sessions.models import Session from zephyr.lib.context_managers import lockfile from zephyr.models import Realm, Stream, UserProfile, UserActivity, \ Subscription, Recipient, Message, UserMessage, \ @@ -51,6 +52,22 @@ def do_create_user(email, password, realm, full_name, short_name, 'domain': realm.domain}) return create_user(email, password, realm, full_name, short_name, active) +def user_sessions(user): + return [s for s in Session.objects.all() if s.get_decoded().get('_auth_user_id') == user.id] + +def do_deactivate(user_profile): + user_profile.user.set_unusable_password() + user_profile.user.is_active = False + user_profile.user.save() + + for session in user_sessions(user_profile.user): + session.delete() + + log_event({'type': 'user_deactivated', + 'timestamp': time.time(), + 'user': user_profile.user.email, + 'domain': user_profile.realm.domain}) + def do_change_user_email(user, new_email): old_email = user.email user.email = new_email diff --git a/zephyr/management/commands/deactivate_user.py b/zephyr/management/commands/deactivate_user.py new file mode 100644 index 0000000000..1b65a7a33c --- /dev/null +++ b/zephyr/management/commands/deactivate_user.py @@ -0,0 +1,40 @@ +from optparse import make_option + +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand + +from zephyr.lib.actions import do_deactivate, user_sessions +from zephyr.models import UserProfile + +class Command(BaseCommand): + help = "Deactivate a user, including forcibly logging them out." + + option_list = BaseCommand.option_list + ( + make_option('-f', '--for-real', + dest='for_real', + action='store_true', + default=False, + help="Actually deactivate the user. Default is a dry run."), + ) + + def handle(self, *args, **options): + if not args: + print "Please specify an e-mail address." + exit(1) + user = User.objects.get(email__iexact=args[0]) + user_profile = UserProfile.objects.get(user=user) + + sessions = user_sessions(user) + print "Deactivating %s (%s) - %s" % (user_profile.full_name, user.email, + user_profile.realm.domain) + print "%s has the following active sessions:" % (user.email,) + for session in sessions: + print session.expire_date, session.get_decoded() + print "" + + if not options["for_real"]: + print "This was a dry run. Pass -f to actually deactivate." + exit(1) + + do_deactivate(user_profile) + print "Sessions deleted, user deactivated."