default stream: Allows admins to remove any default stream.

This fixes a bug where administrators couldn't remove private
unsubscribed streams from the "default streams" list, because
access_stream_by_name didn't give them access to the stream object.
This commit is contained in:
Yashashvi Dave 2018-08-07 17:43:58 +05:30 committed by Tim Abbott
parent c41c82aae0
commit 6e136be975
3 changed files with 24 additions and 3 deletions

View File

@ -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:

View File

@ -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")

View File

@ -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()