settings: Add function to check permission for anonymous setting group.

This commit is contained in:
Sahil Batra
2024-08-28 19:52:27 +05:30
committed by Tim Abbott
parent ffeb542b22
commit f3fafc719f
3 changed files with 51 additions and 1 deletions

View File

@@ -126,6 +126,15 @@ export const server_emoji_schema = z.object({
export const realm_emoji_map_schema = z.record(server_emoji_schema);
export const anonymous_group_type = z.object({
direct_subgroups: z.array(z.number()),
direct_members: z.array(z.number()),
});
export const group_setting_type_schema = z.union([z.number(), anonymous_group_type]);
export type GroupSettingType = z.infer<typeof group_setting_type_schema>;
export const user_group_schema = z.object({
description: z.string(),
id: z.number(),

View File

@@ -7,7 +7,7 @@ import * as group_permission_settings from "./group_permission_settings";
import {$t} from "./i18n";
import {page_params} from "./page_params";
import * as settings_config from "./settings_config";
import type {StateData, user_group_schema} from "./state_data";
import type {GroupSettingType, StateData, user_group_schema} from "./state_data";
import {current_user} from "./state_data";
import type {UserOrMention} from "./typeahead_helper";
import type {UserGroupUpdateEvent} from "./types";
@@ -286,6 +286,28 @@ export function is_user_in_group(user_group_id: number, user_id: number): boolea
return false;
}
export function is_user_in_setting_group(
setting_group: GroupSettingType,
user_id: number,
): boolean {
if (typeof setting_group === "number") {
return is_user_in_group(setting_group, user_id);
}
const direct_members = setting_group.direct_members;
if (direct_members.includes(user_id)) {
return true;
}
const direct_subgroups = setting_group.direct_subgroups;
for (const direct_subgroup_id of direct_subgroups) {
if (is_user_in_group(direct_subgroup_id, user_id)) {
return true;
}
}
return false;
}
function get_display_name_for_system_group_option(setting_name: string, name: string): string {
// We use a special label for the "Nobody" system group for clarity.
if (setting_name === "direct_message_permission_group" && name === "Nobody") {

View File

@@ -307,6 +307,25 @@ run_test("is_user_in_group", () => {
assert.equal(user_groups.is_user_in_group(foo.id, 6), true);
assert.equal(user_groups.is_user_in_group(foo.id, 3), false);
assert.equal(user_groups.is_user_in_setting_group(test.id, 4), true);
assert.equal(user_groups.is_user_in_setting_group(test.id, 1), true);
assert.equal(user_groups.is_user_in_setting_group(test.id, 6), true);
assert.equal(user_groups.is_user_in_setting_group(test.id, 3), false);
const anonymous_setting_group = {
direct_members: [8, 9],
direct_subgroups: [admins.id, test.id],
};
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 8), true);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 9), true);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 10), false);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 1), true);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 4), true);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 6), true);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 2), false);
assert.equal(user_groups.is_user_in_setting_group(anonymous_setting_group, 3), false);
blueslip.expect("error", "Could not find user group");
assert.equal(user_groups.is_user_in_group(1111, 3), false);