streams: Add require_active_channel access parameter.

This commit is contained in:
Tim Abbott
2025-03-07 13:33:08 -08:00
parent f68692a893
commit 494f28c64e
2 changed files with 21 additions and 2 deletions

View File

@@ -766,6 +766,7 @@ def access_stream_common(
stream: Stream, stream: Stream,
error: str, error: str,
*, *,
require_active_channel: bool = True,
require_content_access: bool = True, require_content_access: bool = True,
) -> Subscription | None: ) -> Subscription | None:
"""Common function for backend code where the target use attempts to """Common function for backend code where the target use attempts to
@@ -787,7 +788,10 @@ def access_stream_common(
except Subscription.DoesNotExist: except Subscription.DoesNotExist:
sub = None sub = None
if not stream.deactivated and check_basic_stream_access( if require_active_channel and stream.deactivated:
raise JsonableError(error)
if check_basic_stream_access(
user_profile, user_profile,
stream, stream,
is_subscribed=sub is not None, is_subscribed=sub is not None,
@@ -804,6 +808,7 @@ def access_stream_by_id(
user_profile: UserProfile, user_profile: UserProfile,
stream_id: int, stream_id: int,
*, *,
require_active_channel: bool = True,
require_content_access: bool = True, require_content_access: bool = True,
) -> tuple[Stream, Subscription | None]: ) -> tuple[Stream, Subscription | None]:
error = _("Invalid channel ID") error = _("Invalid channel ID")
@@ -816,6 +821,7 @@ def access_stream_by_id(
user_profile, user_profile,
stream, stream,
error, error,
require_active_channel=require_active_channel,
require_content_access=require_content_access, require_content_access=require_content_access,
) )
return (stream, sub) return (stream, sub)
@@ -825,6 +831,7 @@ def access_stream_by_id_for_message(
user_profile: UserProfile, user_profile: UserProfile,
stream_id: int, stream_id: int,
*, *,
require_active_channel: bool = True,
require_content_access: bool = True, require_content_access: bool = True,
) -> tuple[Stream, Subscription | None]: ) -> tuple[Stream, Subscription | None]:
""" """
@@ -841,6 +848,7 @@ def access_stream_by_id_for_message(
user_profile, user_profile,
stream, stream,
error, error,
require_active_channel=require_active_channel,
require_content_access=require_content_access, require_content_access=require_content_access,
) )
return (stream, sub) return (stream, sub)
@@ -878,7 +886,11 @@ def check_stream_name_available(realm: Realm, name: str) -> None:
def access_stream_by_name( def access_stream_by_name(
user_profile: UserProfile, stream_name: str, *, require_content_access: bool = True user_profile: UserProfile,
stream_name: str,
*,
require_active_channel: bool = True,
require_content_access: bool = True,
) -> tuple[Stream, Subscription | None]: ) -> tuple[Stream, Subscription | None]:
error = _("Invalid channel name '{channel_name}'").format(channel_name=stream_name) error = _("Invalid channel name '{channel_name}'").format(channel_name=stream_name)
try: try:
@@ -890,6 +902,7 @@ def access_stream_by_name(
user_profile, user_profile,
stream, stream,
error, error,
require_active_channel=require_active_channel,
require_content_access=require_content_access, require_content_access=require_content_access,
) )
return (stream, sub) return (stream, sub)

View File

@@ -8522,6 +8522,12 @@ class AccessStreamTest(ZulipTestCase):
access_stream_by_id(hamlet, public_stream.id) access_stream_by_id(hamlet, public_stream.id)
access_stream_by_name(hamlet, public_stream.name) access_stream_by_name(hamlet, public_stream.name)
# Archive channel to verify require_active_channel code path
do_deactivate_stream(public_stream, acting_user=hamlet)
with self.assertRaisesRegex(JsonableError, "Invalid channel ID"):
access_stream_by_id(hamlet, public_stream.id, require_active_channel=True)
access_stream_by_id(hamlet, public_stream.id, require_active_channel=False)
# Nobody can access a public stream in another realm # Nobody can access a public stream in another realm
mit_realm = get_realm("zephyr") mit_realm = get_realm("zephyr")
mit_stream = ensure_stream(mit_realm, "mit_stream", invite_only=False, acting_user=None) mit_stream = ensure_stream(mit_realm, "mit_stream", invite_only=False, acting_user=None)