diff --git a/zerver/tests/test_bots.py b/zerver/tests/test_bots.py index fb8b27a6fe..c82b3f0f47 100644 --- a/zerver/tests/test_bots.py +++ b/zerver/tests/test_bots.py @@ -9,7 +9,7 @@ from django.test import override_settings from mock import patch from typing import Any, Dict, List, Mapping -from zerver.lib.actions import do_change_stream_invite_only +from zerver.lib.actions import do_change_stream_invite_only, do_deactivate_user from zerver.lib.bot_config import get_bot_config from zerver.models import get_realm, get_stream, \ Realm, Stream, UserProfile, get_user, get_bot_services, Service, \ @@ -663,6 +663,44 @@ class BotTest(ZulipTestCase, UploadSerializeMixin): profile = get_user('hambot-bot@zulip.testserver', get_realm('zulip')) self.assertEqual(profile.bot_owner, self.example_user("hamlet")) + def test_patch_bot_owner_deactivated(self) -> None: + self.login(self.example_email('hamlet')) + self.create_bot() + self.assert_num_bots_equal(1) + + target_user_profile = self.example_user("othello") + do_deactivate_user(target_user_profile) + target_user_profile = self.example_user('othello') + self.assertFalse(target_user_profile.is_active) + bot_info = { + 'bot_owner': self.example_email('othello'), + } + + result = self.client_patch("/json/bots/hambot-bot@zulip.testserver", bot_info) + self.assert_json_error(result, "Failed to change owner, user is deactivated") + profile = get_user('hambot-bot@zulip.testserver', get_realm('zulip')) + self.assertEqual(profile.bot_owner, self.example_user("hamlet")) + + def test_patch_bot_owner_a_bot(self) -> None: + self.login(self.example_email('hamlet')) + self.create_bot() + self.assert_num_bots_equal(1) + + bot_info = { + 'full_name': u'Another Bot of Hamlet', + 'short_name': u'hamelbot', + } + result = self.client_post("/json/bots", bot_info) + self.assert_json_success(result) + + bot_info = { + 'bot_owner': 'hamelbot-bot@zulip.testserver', + } + result = self.client_patch("/json/bots/hambot-bot@zulip.testserver", bot_info) + self.assert_json_error(result, "Failed to change owner, bots can't own other bots") + profile = get_user('hambot-bot@zulip.testserver', get_realm('zulip')) + self.assertEqual(profile.bot_owner, self.example_user("hamlet")) + @override_settings(LOCAL_UPLOADS_DIR='var/bot_avatar') def test_patch_bot_avatar(self) -> None: self.login(self.example_email('hamlet')) diff --git a/zerver/views/users.py b/zerver/views/users.py index 45bab269f1..192124c6a6 100644 --- a/zerver/views/users.py +++ b/zerver/views/users.py @@ -177,6 +177,10 @@ def patch_bot_backend( owner = get_user(bot_owner, user_profile.realm) except UserProfile.DoesNotExist: return json_error(_('Failed to change owner, no such user')) + if not owner.is_active: + return json_error(_('Failed to change owner, user is deactivated')) + if owner.is_bot: + return json_error(_("Failed to change owner, bots can't own other bots")) do_change_bot_owner(bot, owner, user_profile) if default_sending_stream is not None: