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

View File

@ -8522,6 +8522,12 @@ class AccessStreamTest(ZulipTestCase):
access_stream_by_id(hamlet, public_stream.id)
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
mit_realm = get_realm("zephyr")
mit_stream = ensure_stream(mit_realm, "mit_stream", invite_only=False, acting_user=None)