diff --git a/zerver/lib/streams.py b/zerver/lib/streams.py index 46870181ba..a62aee51bc 100644 --- a/zerver/lib/streams.py +++ b/zerver/lib/streams.py @@ -102,14 +102,16 @@ def check_stream_name_available(realm: Realm, name: str) -> None: pass def access_stream_by_name(user_profile: UserProfile, - stream_name: str) -> Tuple[Stream, Recipient, Optional[Subscription]]: + stream_name: str, + allow_realm_admin: bool=False) -> Tuple[Stream, Recipient, Optional[Subscription]]: error = _("Invalid stream name '%s'" % (stream_name,)) try: stream = get_realm_stream(stream_name, user_profile.realm_id) except Stream.DoesNotExist: raise JsonableError(error) - (recipient, sub) = access_stream_common(user_profile, stream, error) + (recipient, sub) = access_stream_common(user_profile, stream, error, + allow_realm_admin=allow_realm_admin) return (stream, recipient, sub) def access_stream_for_unmute_topic(user_profile: UserProfile, stream_name: str, error: str) -> Stream: diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py index 1938c736e0..5f6e42741e 100644 --- a/zerver/tests/test_subs.py +++ b/zerver/tests/test_subs.py @@ -1039,6 +1039,24 @@ class DefaultStreamTest(ZulipTestCase): self.assert_json_success(result) self.assertFalse(stream_name in self.get_default_stream_names(user_profile.realm)) + # Test admin can't add unsubscribed private stream + stream_name = "private_stream" + self.make_stream(stream_name, invite_only=True) + self.subscribe(self.example_user('iago'), stream_name) + result = self.client_post('/json/default_streams', dict(stream_name=stream_name)) + self.assert_json_error(result, "Invalid stream name '%s'" % (stream_name)) + + self.subscribe(user_profile, stream_name) + result = self.client_post('/json/default_streams', dict(stream_name=stream_name)) + self.assert_json_success(result) + self.assertTrue(stream_name in self.get_default_stream_names(user_profile.realm)) + + # Test admin can remove unsubscribed private stream + self.unsubscribe(user_profile, stream_name) + result = self.client_delete('/json/default_streams', dict(stream_name=stream_name)) + self.assert_json_success(result) + self.assertFalse(stream_name in self.get_default_stream_names(user_profile.realm)) + class DefaultStreamGroupTest(ZulipTestCase): def test_create_update_and_remove_default_stream_group(self) -> None: realm = get_realm("zulip") diff --git a/zerver/views/streams.py b/zerver/views/streams.py index 8b512b76b0..9987e87d3f 100644 --- a/zerver/views/streams.py +++ b/zerver/views/streams.py @@ -136,7 +136,8 @@ def remove_default_stream_group(request: HttpRequest, user_profile: UserProfile, def remove_default_stream(request: HttpRequest, user_profile: UserProfile, stream_name: str=REQ()) -> HttpResponse: - (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name) + (stream, recipient, sub) = access_stream_by_name(user_profile, stream_name, + allow_realm_admin=True) do_remove_default_stream(stream) return json_success()