From d3936ae3ec59b5b3295a4078a95a5fbdcf8a99b0 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Mon, 29 Jul 2024 15:46:18 +0200 Subject: [PATCH] permissions WIP --- packages/tools/src/testPermission.ts | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/tools/src/testPermission.ts b/packages/tools/src/testPermission.ts index 2fc50bea8..85ea3ae27 100644 --- a/packages/tools/src/testPermission.ts +++ b/packages/tools/src/testPermission.ts @@ -73,3 +73,44 @@ export function testPermission(tested: string, permissions: CompiledPermissions) return allow; } + +export function testSubPermission( + tested: string, + permissions: string[], + allowSamePermission = true +): true | false | null { + let result = null; + for (const permWithSign of permissions) { + const perm = permWithSign.startsWith('~') ? permWithSign.substring(1) : permWithSign; + const deny = permWithSign.startsWith('~'); + + if (perm.endsWith('*')) { + const prefix = perm.substring(0, perm.length - 1); + if (tested.startsWith(prefix)) { + result = !deny; + } + } else { + if (allowSamePermission && tested == perm) { + result = !deny; + } + } + } + return result; +} + +export function getPredefinedPermissions(predefinedRoleName: string) { + switch (predefinedRoleName) { + case 'superadmin': + return ['*', '~*widgets/*', 'widgets/admin']; + case 'logged-user': + return ['*', '~widgets/admin', '~admin/*']; + case 'anonymouse-user': + return ['*', '~widgets/admin', '~admin/*']; + default: + return null; + } +} + +export function sortPermissionsFromTheSameLevel(permissions: string[]) { + return [...permissions.filter(x => x.startsWith('~')), ...permissions.filter(x => !x.startsWith('~'))]; +}