mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	streams: Add require_active_channel access parameter.
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user