diff --git a/api_docs/changelog.md b/api_docs/changelog.md index e992c873a0..4c5d5f3659 100644 --- a/api_docs/changelog.md +++ b/api_docs/changelog.md @@ -20,6 +20,12 @@ format used by the Zulip server that they are interacting with. ## Changes in Zulip 8.0 +**Feature level 221** + +* [`POST /register`](/api/register-queue): Added `server_supported_permission_settings` + field in the response which contains configuration data for various permission + settings. + **Feature level 220** * [`GET /events`](/api/get-events): Stream creation events for web-public diff --git a/version.py b/version.py index cf4ddf8ab8..62222385bf 100644 --- a/version.py +++ b/version.py @@ -33,7 +33,7 @@ DESKTOP_WARNING_VERSION = "5.9.3" # Changes should be accompanied by documentation explaining what the # new level means in api_docs/changelog.md, as well as "**Changes**" # entries in the endpoint's documentation in `zulip.yaml`. -API_FEATURE_LEVEL = 220 +API_FEATURE_LEVEL = 221 # Bump the minor PROVISION_VERSION to indicate that folks should provision # only when going from an old version of the code to a newer version. Bump diff --git a/zerver/lib/events.py b/zerver/lib/events.py index 285142f543..3d5463d19a 100644 --- a/zerver/lib/events.py +++ b/zerver/lib/events.py @@ -51,7 +51,10 @@ from zerver.lib.subscription_info import gather_subscriptions_helper, get_web_pu from zerver.lib.timestamp import datetime_to_timestamp from zerver.lib.timezone import canonicalize_timezone from zerver.lib.topic import TOPIC_NAME -from zerver.lib.user_groups import user_groups_in_realm_serialized +from zerver.lib.user_groups import ( + get_server_supported_permission_settings, + user_groups_in_realm_serialized, +) from zerver.lib.user_status import get_user_status_dict from zerver.lib.user_topics import get_topic_mutes, get_user_topics from zerver.lib.users import ( @@ -382,6 +385,8 @@ def fetch_initial_state_data( state[ "server_typing_started_wait_period_milliseconds" ] = settings.TYPING_STARTED_WAIT_PERIOD_MILLISECONDS + + state["server_supported_permission_settings"] = get_server_supported_permission_settings() if want("realm_user_settings_defaults"): realm_user_default = RealmUserDefault.objects.get(realm=realm) state["realm_user_settings_defaults"] = {} diff --git a/zerver/lib/types.py b/zerver/lib/types.py index 38657b2db4..ef59a6ef3f 100644 --- a/zerver/lib/types.py +++ b/zerver/lib/types.py @@ -291,3 +291,10 @@ class GroupPermissionSetting: default_group_name: str id_field_name: str default_for_system_groups: Optional[str] = None + + +@dataclass +class ServerSupportedPermissionSettings: + realm: Dict[str, GroupPermissionSetting] + stream: Dict[str, GroupPermissionSetting] + group: Dict[str, GroupPermissionSetting] diff --git a/zerver/lib/user_groups.py b/zerver/lib/user_groups.py index a2be0c6de2..5a2033b472 100644 --- a/zerver/lib/user_groups.py +++ b/zerver/lib/user_groups.py @@ -10,11 +10,12 @@ from django_cte import With from django_stubs_ext import ValuesQuerySet from zerver.lib.exceptions import JsonableError -from zerver.lib.types import GroupPermissionSetting +from zerver.lib.types import GroupPermissionSetting, ServerSupportedPermissionSettings from zerver.models import ( GroupGroupMembership, Realm, RealmAuditLog, + Stream, SystemGroups, UserGroup, UserGroupMembership, @@ -540,3 +541,23 @@ def get_system_user_group_for_user(user_profile: UserProfile) -> UserGroup: name=system_user_group_name, realm=user_profile.realm, is_system_group=True ) return system_user_group + + +def get_server_supported_permission_settings() -> ServerSupportedPermissionSettings: + realm_permission_group_settings: Dict[str, GroupPermissionSetting] = {} + for permission_name, permission_config in Realm.REALM_PERMISSION_GROUP_SETTINGS.items(): + realm_permission_group_settings[permission_name] = permission_config + + stream_permission_group_settings: Dict[str, GroupPermissionSetting] = {} + for permission_name, permission_config in Stream.stream_permission_group_settings.items(): + stream_permission_group_settings[permission_name] = permission_config + + group_permission_settings: Dict[str, GroupPermissionSetting] = {} + for permission_name, permission_config in UserGroup.GROUP_PERMISSION_SETTINGS.items(): + group_permission_settings[permission_name] = permission_config + + return ServerSupportedPermissionSettings( + realm=realm_permission_group_settings, + stream=stream_permission_group_settings, + group=group_permission_settings, + ) diff --git a/zerver/openapi/zulip.yaml b/zerver/openapi/zulip.yaml index f4aff49176..9b833b6e1b 100644 --- a/zerver/openapi/zulip.yaml +++ b/zerver/openapi/zulip.yaml @@ -15154,6 +15154,37 @@ paths: nullable: true avatar_version: {} profile_data: {} + server_supported_permission_settings: + description: | + Present if `realm` is present in `fetch_event_types`. + + Configuration for various group permission settings. + + We consider this part of the Zulip API to be unstable + and may change significantly in future versions. + + **Changes**: New in Zulip 8.0 (feature level 221). + type: object + additionalProperties: false + properties: + realm: + type: object + description: | + Configuration for realm level group permission settings. + additionalProperties: + $ref: "#/components/schemas/GroupPermissionSetting" + stream: + type: object + description: | + Configuration for stream level group permission settings. + additionalProperties: + $ref: "#/components/schemas/GroupPermissionSetting" + group: + type: object + description: | + Configuration for group level group permission settings. + additionalProperties: + $ref: "#/components/schemas/GroupPermissionSetting" example: { "last_event_id": -1, @@ -19250,6 +19281,49 @@ components: - rendered_content - scheduled_delivery_timestamp - failed + GroupPermissionSetting: + description: | + Configuration for a group permission setting specifying the groups + to which the setting can be set to and the default values for the + setting. + additionalProperties: false + type: object + properties: + require_system_group: + type: boolean + description: | + Whether the setting can only be set to a system user group. + allow_internet_group: + type: boolean + description: | + Whether the setting can be set to `role:internet` system group. + allow_owners_group: + type: boolean + description: | + Whether the setting can be set to `role:owners` system group. + allow_nobody_group: + type: boolean + description: | + Whether the setting can be set to `role:nobody` system group. + allow_everyone_group: + type: boolean + description: | + Whether the setting can be set to `role:everyone` system group. + default_group_name: + type: string + description: | + Name of the default group for the setting. + id_field_name: + type: string + description: | + Name for the field used to pass the group ID for the setting. + default_for_system_groups: + type: string + nullable: true + description: | + Name of the default group for the setting for system groups. + + This is non-null only for group-level settings. User: allOf: - $ref: "#/components/schemas/UserBase" diff --git a/zerver/tests/test_home.py b/zerver/tests/test_home.py index 31f65e2df9..0bfc720abf 100644 --- a/zerver/tests/test_home.py +++ b/zerver/tests/test_home.py @@ -202,6 +202,7 @@ class HomeTest(ZulipTestCase): "server_presence_offline_threshold_seconds", "server_presence_ping_interval_seconds", "server_sentry_dsn", + "server_supported_permission_settings", "server_timestamp", "server_typing_started_expiry_period_milliseconds", "server_typing_started_wait_period_milliseconds",