settings: Use new group setting to check web-public stream creation.

This commit updates code in webapp to use new group-based setting
for checking web-public stream creation permission.
This commit is contained in:
Sahil Batra
2024-07-26 09:12:14 +05:30
committed by Tim Abbott
parent e71c3007f6
commit 506ead4468
13 changed files with 71 additions and 133 deletions

View File

@@ -211,8 +211,6 @@ export function build_page() {
realm_name_in_email_notifications_policy_values:
settings_config.realm_name_in_email_notifications_policy_values,
twenty_four_hour_time_values: settings_config.twenty_four_hour_time_values,
create_web_public_stream_policy_values:
settings_config.create_web_public_stream_policy_values,
disable_enable_spectator_access_setting:
!realm.server_web_public_streams_enabled || !realm.zulip_plan_is_not_limited,
realm_push_notifications_enabled: realm.realm_push_notifications_enabled,

View File

@@ -205,7 +205,6 @@ export function dispatch_normal_event(event) {
avatar_changes_disabled: settings_account.update_avatar_change_display,
bot_creation_policy: settings_bots.update_bot_permissions_ui,
create_multiuse_invite_group: noop,
create_web_public_stream_policy: noop,
invite_to_stream_policy: noop,
default_code_block_language: noop,
default_language: noop,
@@ -266,12 +265,9 @@ export function dispatch_normal_event(event) {
gear_menu.rerender();
}
if (
event.property === "create_web_public_stream_policy" ||
event.property === "enable_spectator_access"
) {
if (event.property === "enable_spectator_access") {
stream_settings_ui.update_stream_privacy_choices(
"create_web_public_stream_policy",
"can_create_web_public_channel_group",
);
}
}
@@ -293,7 +289,8 @@ export function dispatch_normal_event(event) {
if (
key === "can_create_public_channel_group" ||
key === "can_create_private_channel_group"
key === "can_create_private_channel_group" ||
key === "can_create_web_public_channel_group"
) {
stream_settings_ui.update_stream_privacy_choices(key);
}

View File

@@ -210,7 +210,6 @@ export function get_subsection_property_elements($subsection: JQuery): HTMLEleme
type simple_dropdown_realm_settings = Pick<
typeof realm,
| "realm_create_private_stream_policy"
| "realm_create_web_public_stream_policy"
| "realm_invite_to_stream_policy"
| "realm_user_group_edit_policy"
| "realm_add_custom_emoji_policy"
@@ -479,6 +478,7 @@ const dropdown_widget_map = new Map<string, DropdownWidget | null>([
["can_mention_group", null],
["realm_can_create_public_channel_group", null],
["realm_can_create_private_channel_group", null],
["realm_can_create_web_public_channel_group", null],
["realm_direct_message_initiator_group", null],
["realm_direct_message_permission_group", null],
]);
@@ -793,6 +793,7 @@ export function check_realm_settings_property_changed(elem: HTMLElement): boolea
case "realm_can_access_all_users_group":
case "realm_can_create_public_channel_group":
case "realm_can_create_private_channel_group":
case "realm_can_create_web_public_channel_group":
case "realm_direct_message_initiator_group":
case "realm_direct_message_permission_group":
proposed_val = get_dropdown_list_widget_setting_value($elem);
@@ -988,6 +989,7 @@ export function populate_data_for_realm_settings_request(
const realm_group_settings_using_new_api_format = new Set([
"can_create_private_channel_group",
"can_create_public_channel_group",
"can_create_web_public_channel_group",
"direct_message_initiator_group",
"direct_message_permission_group",
]);

View File

@@ -303,29 +303,6 @@ export const wildcard_mention_policy_values = {
},
};
export const create_web_public_stream_policy_values = {
by_moderators_only: {
order: 1,
code: 4,
description: $t({defaultMessage: "Admins and moderators"}),
},
by_admins_only: {
order: 2,
code: 2,
description: $t({defaultMessage: "Admins only"}),
},
by_owners_only: {
order: 3,
code: 7,
description: $t({defaultMessage: "Owners only"}),
},
nobody: {
order: 4,
code: 6,
description: $t({defaultMessage: "Nobody"}),
},
};
export const common_message_policy_values = {
by_everyone: {
order: 1,

View File

@@ -55,21 +55,11 @@ export function user_can_change_logo(): boolean {
}
function user_has_permission(policy_value: number): boolean {
/* At present, nobody and by_owners_only is not present in
* common_policy_values, but we include a check for it here,
* so that code using create_web_public_stream_policy_values
* or other supersets can use this function. */
if (policy_value === settings_config.create_web_public_stream_policy_values.nobody.code) {
return false;
}
if (current_user.is_owner) {
return true;
}
if (
policy_value === settings_config.create_web_public_stream_policy_values.by_owners_only.code
) {
/* At present, nobody is not present in common_policy_values,
* but we include a check for it here, so that code using
* email_invite_to_realm_policy_values or other supersets can
* use this function. */
if (policy_value === settings_config.email_invite_to_realm_policy_values.nobody.code) {
return false;
}
@@ -116,12 +106,6 @@ function user_has_permission(policy_value: number): boolean {
}
export function user_can_invite_users_by_email(): boolean {
if (
realm.realm_invite_to_realm_policy ===
settings_config.email_invite_to_realm_policy_values.nobody.code
) {
return false;
}
return user_has_permission(realm.realm_invite_to_realm_policy);
}
@@ -164,7 +148,14 @@ export function user_can_create_web_public_streams(): boolean {
return false;
}
return user_has_permission(realm.realm_create_web_public_stream_policy);
if (page_params.is_spectator) {
return false;
}
return user_groups.is_user_in_group(
realm.realm_can_create_web_public_channel_group,
current_user.user_id,
);
}
export function user_can_move_messages_between_streams(): boolean {

View File

@@ -124,7 +124,6 @@ export function get_org_type_dropdown_options() {
}
const simple_dropdown_properties = [
"realm_create_web_public_stream_policy",
"realm_invite_to_stream_policy",
"realm_user_group_edit_policy",
"realm_add_custom_emoji_policy",
@@ -363,7 +362,7 @@ function set_digest_emails_weekday_visibility() {
function set_create_web_public_stream_dropdown_visibility() {
settings_components.change_element_block_display_property(
"id_realm_create_web_public_stream_policy",
"id_realm_can_create_web_public_channel_group",
realm.server_web_public_streams_enabled &&
realm.zulip_plan_is_not_limited &&
realm.realm_enable_spectator_access,
@@ -506,6 +505,7 @@ export function discard_realm_property_element_changes(elem) {
case "realm_can_access_all_users_group":
case "realm_can_create_public_channel_group":
case "realm_can_create_private_channel_group":
case "realm_can_create_web_public_channel_group":
settings_components.set_dropdown_list_widget_setting_value(
property_name,
property_value,

View File

@@ -267,9 +267,9 @@ const realm_schema = z.object({
realm_can_access_all_users_group: z.number(),
realm_can_create_public_channel_group: z.number(),
realm_can_create_private_channel_group: z.number(),
realm_can_create_web_public_channel_group: z.number(),
realm_create_multiuse_invite_group: z.number(),
realm_create_private_stream_policy: z.number(),
realm_create_web_public_stream_policy: z.number(),
realm_date_created: z.number(),
realm_default_code_block_language: z.string(),
realm_default_external_accounts: z.record(

View File

@@ -935,7 +935,7 @@ export function update_stream_privacy_choices(policy) {
if (policy === "can_create_public_channel_group") {
stream_settings_components.update_public_stream_privacy_option_state($container);
}
if (policy === "create_web_public_stream_policy") {
if (policy === "can_create_web_public_channel_group") {
stream_ui_updates.update_web_public_stream_privacy_option_state($container);
}
}

View File

@@ -81,12 +81,11 @@
label=admin_settings_label.realm_enable_spectator_access
is_disabled=disable_enable_spectator_access_setting
help_link="/help/public-access-option"}}
<div class="input-group realm_create_web_public_stream_policy">
<label for="realm_create_web_public_stream_policy" class="settings-field-label">{{t "Who can create web-public channels" }}</label>
<select name="realm_create_web_public_stream_policy" id="id_realm_create_web_public_stream_policy" class="prop-element settings_select bootstrap-focus-style" data-setting-widget-type="number">
{{> dropdown_options_widget option_values=create_web_public_stream_policy_values}}
</select>
</div>
{{> ../dropdown_widget_with_label
widget_name="realm_can_create_web_public_channel_group"
label=(t 'Who can create web-public channels')
value_type="number"}}
{{> ../dropdown_widget_with_label
widget_name="realm_can_create_private_channel_group"

View File

@@ -491,17 +491,7 @@ run_test("realm settings", ({override}) => {
assert.equal(realm[parameter_name], 1);
}
let update_called = false;
let event = event_fixtures.realm__update__create_web_public_stream_policy;
stream_settings_ui.update_stream_privacy_choices = (property) => {
assert_same(property, "create_web_public_stream_policy");
update_called = true;
};
dispatch(event);
assert_same(realm.realm_create_web_public_stream_policy, 2);
assert_same(update_called, true);
event = event_fixtures.realm__update__invite_to_stream_policy;
let event = event_fixtures.realm__update__invite_to_stream_policy;
test_realm_integer(event, "realm_invite_to_stream_policy");
event = event_fixtures.realm__update__bot_creation_policy;
@@ -553,9 +543,9 @@ run_test("realm settings", ({override}) => {
dispatch(event);
assert_same(realm.realm_default_code_block_language, "javascript");
update_called = false;
let update_called = false;
stream_settings_ui.update_stream_privacy_choices = (property) => {
assert_same(property, "create_web_public_stream_policy");
assert_same(property, "can_create_web_public_channel_group");
update_called = true;
};
event = event_fixtures.realm__update__enable_spectator_access;

View File

@@ -263,13 +263,6 @@ exports.fixtures = {
value: 1,
},
realm__update__create_web_public_stream_policy: {
type: "realm",
op: "update",
property: "create_web_public_stream_policy",
value: 2,
},
realm__update__default_code_block_language: {
type: "realm",
op: "update",

View File

@@ -263,52 +263,6 @@ run_test("user_can_invite_others_to_realm_nobody_case", () => {
assert.equal(settings_data.user_can_invite_users_by_email(), false);
});
run_test("user_can_create_web_public_streams", () => {
current_user.is_owner = true;
realm.server_web_public_streams_enabled = true;
realm.realm_enable_spectator_access = true;
realm.realm_create_web_public_stream_policy =
settings_config.create_web_public_stream_policy_values.nobody.code;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_create_web_public_stream_policy =
settings_config.create_web_public_stream_policy_values.by_owners_only.code;
assert.equal(settings_data.user_can_create_web_public_streams(), true);
realm.realm_enable_spectator_access = false;
realm.server_web_public_streams_enabled = true;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_enable_spectator_access = true;
realm.server_web_public_streams_enabled = false;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_enable_spectator_access = false;
realm.server_web_public_streams_enabled = false;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_enable_spectator_access = true;
realm.server_web_public_streams_enabled = true;
current_user.is_owner = false;
current_user.is_admin = true;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_create_web_public_stream_policy =
settings_config.create_web_public_stream_policy_values.by_admins_only.code;
assert.equal(settings_data.user_can_create_web_public_streams(), true);
current_user.is_admin = false;
current_user.is_moderator = true;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_create_web_public_stream_policy =
settings_config.create_web_public_stream_policy_values.by_moderators_only.code;
assert.equal(settings_data.user_can_create_web_public_streams(), true);
current_user.is_moderator = false;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
});
run_test("user_email_not_configured", () => {
const user_email_not_configured = settings_data.user_email_not_configured;
@@ -473,3 +427,40 @@ run_test("user_can_create_private_streams", () => {
settings_data.user_can_create_private_streams,
);
});
run_test("user_can_create_web_public_streams", () => {
realm.server_web_public_streams_enabled = true;
realm.realm_enable_spectator_access = true;
test_realm_group_settings(
"realm_can_create_web_public_channel_group",
settings_data.user_can_create_web_public_streams,
);
const owner_user_id = 4;
const owners = {
name: "Admins",
id: 3,
members: new Set([owner_user_id]),
is_system_group: true,
direct_subgroup_ids: new Set([]),
};
current_user.user_id = owner_user_id;
user_groups.initialize({realm_user_groups: [owners]});
realm.server_web_public_streams_enabled = true;
realm.realm_enable_spectator_access = true;
realm.realm_can_create_web_public_channel_group = owners.id;
assert.equal(settings_data.user_can_create_web_public_streams(), true);
realm.realm_enable_spectator_access = false;
realm.server_web_public_streams_enabled = true;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_enable_spectator_access = true;
realm.server_web_public_streams_enabled = false;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
realm.realm_enable_spectator_access = false;
realm.server_web_public_streams_enabled = false;
assert.equal(settings_data.user_can_create_web_public_streams(), false);
});

View File

@@ -641,8 +641,8 @@ test("set_up", ({override, override_rewire}) => {
$("#allowed_domains_label").set_parent($.create("<stub-allowed-domain-label-parent>"));
const $waiting_period_parent_elem = $.create("waiting-period-parent-stub");
$("#id_realm_waiting_period_threshold").set_parent($waiting_period_parent_elem);
$("#id_realm_create_web_public_stream_policy").set_parent(
$.create("<stub-create-web-public-stream-policy-parent>"),
$("#id_realm_can_create_web_public_channel_group").set_parent(
$.create("<stub-can-create-web-public-channel-group-parent>"),
);
override_rewire(settings_components, "get_input_element_value", (elem) => {