From 9093ddaeb5ef465ee4b60d7f69062481a4533cd1 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 22 Aug 2025 13:54:27 +0200 Subject: [PATCH] added display name to config --- src/lib/permissions.config.json | 30 +++++++++++--- src/lib/permissions.ts | 73 +++++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 23 deletions(-) diff --git a/src/lib/permissions.config.json b/src/lib/permissions.config.json index 1deec24..f65484e 100644 --- a/src/lib/permissions.config.json +++ b/src/lib/permissions.config.json @@ -2,14 +2,32 @@ "USERADMIN": { "size": 8, "permissions": { - "VIEW": 0, - "ADD": 1, - "DELETE": 2, - "EDIT": 3, - "EDIT_PASSWORD": 4 + "VIEW": { + "position": 0, + "name": "Anzeigen" + }, + "ADD": { + "position": 1, + "name": "Anlegen" + }, + "DELETE": { + "position": 2, + "name": "Entfernen" + }, + "EDIT": { + "position": 3, + "name": "Bearbeiten" + }, + "EDIT_PASSWORD": { + "position": 4, + "name": "Administration" + } }, "meta_permissions": { - "MANAGE": ["VIEW", "ADD", "DELETE", "EDIT"] + "MANAGE": { + "permissions": ["VIEW", "ADD", "DELETE", "EDIT"], + "name": "Verwalten" + } } } } diff --git a/src/lib/permissions.ts b/src/lib/permissions.ts index 5198a18..612191a 100644 --- a/src/lib/permissions.ts +++ b/src/lib/permissions.ts @@ -1,15 +1,27 @@ -type GroupPermissionsDef = Record +interface GroupPermissionDetail { + position: number + name: string +} + +interface GroupMetaPermissionDetail { + permissions: Array + name: string +} + +type GroupPermissionsDef = Record +type GroupMetaPermissionsDef = Record interface GroupDef { size: number permissions: GroupPermissionsDef - meta_permissions?: Record> + meta_permissions?: GroupMetaPermissionsDef } type PermissionDef = Record +const _display_names = new Map() import raw from "./permissions.config.json" @@ -19,11 +31,11 @@ const __validate_config = (config: unknown): config is PermissionDef => { const error = (message: string) => new Error("Failed to parse permissions.config.json: " + message) if (typeof config !== "object" || config === null) throw error("configuration is not an object or null.") - + for (const [group, definition] of Object.entries(config)) { if (typeof definition !== "object") throw error(`definition for ${group} is not an object (is ${typeof definition})`) - if (definition === null) + if (definition == null) throw error(`definition for ${group} is null`) if (typeof definition.size !== "number") @@ -31,10 +43,14 @@ const __validate_config = (config: unknown): config is PermissionDef => { if (typeof definition.permissions !== "object") throw error(`definition of permissions for group ${group} is not an object`) - for (const [name, position] of Object.entries(definition.permissions)) { - if (typeof position !== "number") - throw error(`position of ${name} in group ${group} is not a number (is ${typeof position})`) - if (position >= definition.size) + + for (const [name, detail] of Object.entries(definition.permissions)) { + if (typeof detail !== "object" || detail == null) + throw error(`definition for permission ${name} has to be an object`) + + if (typeof detail.position !== "number") + throw error(`position of ${name} in group ${group} is not a number (is ${typeof detail.position})`) + if (detail.position >= definition.size) throw error(`position ${position} of permission ${name} in group ${group} is out of bounds (size is ${definition.size})`) } @@ -46,9 +62,11 @@ const __validate_config = (config: unknown): config is PermissionDef => { for (const [name, parts] of Object.entries(definition.meta_permissions)) { if (Object.keys(definition.permissions).includes(name)) throw error(`meta permission ${name} uses the same name as the permission`) - if (typeof parts !== "object" && !(parts instanceof Array) || parts === null) - throw error(`definition of meta permission ${name} in group ${group} is not an array`) - for (const partial of (parts as Array)) { + if (typeof parts !== "object" || parts == null) + throw error(`definition of meta permission ${name} in group ${group} is not an object`) + if (typeof parts.permissions !== "object" || !(parts.permissions instanceof Array)) + throw error(`definition of meta permission ${name} has to include a key "permissions" with a value of type Array`) + for (const partial of (parts.permissions as Array)) { if (!permissions.includes(partial)) throw error(`permission ${partial} of definition of meta permission ${name} in group ${group} is not a permission of this group`) } @@ -68,20 +86,23 @@ function toPermissionObj(config: PermissionDef): Record (user_permissions & permissions) == permissions, any: (user_permissions: number, permissions: number): boolean => (user_permissions & permissions) > 0, + + display_name: (permission: number): string|undefined => { + const name = _display_names.get(permission) + if (name != undefined) return name + + const names: Array = [] + let mask = 1 + while (permission >= mask) { + const current_perm = permission & mask + const current_name = _display_names.get(current_perm) + if (current_name != undefined) names.push(current_name) + + mask <<= 1 + } + + return names.join(" | ") + } } +