diff --git a/paperless-backend/src/auth/permissions.enum.spec.ts b/paperless-backend/src/auth/permissions.enum.spec.ts index e53cf84..f1aa0ad 100644 --- a/paperless-backend/src/auth/permissions.enum.spec.ts +++ b/paperless-backend/src/auth/permissions.enum.spec.ts @@ -16,9 +16,15 @@ describe('mapGroupsToPermissions', () => { ); }); - it('mappt PM_Buchhaltung auf PROCESS_MANUALLY', () => { - expect(mapGroupsToPermissions(['PM_Buchhaltung'])).toEqual([ - Permission.PROCESS_MANUALLY, + it('PM_Buchhaltung enthält den Posteingang (abgespeckte Buchhaltung)', () => { + expect(mapGroupsToPermissions(['PM_Buchhaltung']).sort()).toEqual( + [Permission.PROCESS_MANUALLY, Permission.VIEW_INBOX].sort(), + ); + }); + + it('PM_Posteingang bekommt nur den Posteingang', () => { + expect(mapGroupsToPermissions(['PM_Posteingang'])).toEqual([ + Permission.VIEW_INBOX, ]); }); @@ -52,4 +58,37 @@ describe('mapGroupsToPermissions', () => { const frontend = groupNames(readFileSync(frontendFile, 'utf8')); expect(backend).toEqual(frontend); }); + + // Gleiche Gruppennamen reichen nicht – jede Gruppe muss auch dieselben + // Berechtigungen bekommen (z.B. PM_Buchhaltung inkl. VIEW_INBOX). + it('vergibt pro Gruppe dieselben Berechtigungen wie das Frontend', () => { + const frontendFile = join( + __dirname, + '../../../paperless-frontend/src/auth/permissions.ts', + ); + if (!existsSync(frontendFile)) return; + + const mapping = (source: string) => { + const ergebnis: Record = {}; + const treffer = [...source.matchAll(/groups\.includes\('([^']+)'\)/g)]; + treffer.forEach((m, i) => { + const ende = treffer[i + 1]?.index ?? source.length; + const block = source.slice(m.index, ende); + ergebnis[m[1]] = [ + ...new Set( + [...block.matchAll(/permissions\.add\(Permission\.(\w+)\)/g)].map( + (p) => p[1], + ), + ), + ].sort(); + }); + return ergebnis; + }; + + const backend = mapping( + readFileSync(join(__dirname, 'permissions.enum.ts'), 'utf8'), + ); + expect(backend['PM_Buchhaltung']).toContain('VIEW_INBOX'); + expect(mapping(readFileSync(frontendFile, 'utf8'))).toEqual(backend); + }); }); diff --git a/paperless-backend/src/auth/permissions.enum.ts b/paperless-backend/src/auth/permissions.enum.ts index d7239d1..c646eb4 100644 --- a/paperless-backend/src/auth/permissions.enum.ts +++ b/paperless-backend/src/auth/permissions.enum.ts @@ -34,8 +34,11 @@ export function mapGroupsToPermissions( // Gruppe wurde in Authentik von 'PM_Belege' zu 'PM_Buchhaltung' umbenannt. // Muss identisch zu paperless-frontend/src/auth/permissions.ts bleiben. - if (groups.includes('PM_Buchhaltung')) + // Der Posteingang ist eine abgespeckte Buchhaltung – PM_Buchhaltung umfasst ihn. + if (groups.includes('PM_Buchhaltung')) { permissions.add(Permission.PROCESS_MANUALLY); + permissions.add(Permission.VIEW_INBOX); + } if (groups.includes('PM_Maileingang')) permissions.add(Permission.VIEW_MAIL); if (groups.includes('PM_Posteingang')) permissions.add(Permission.VIEW_INBOX); if (groups.includes('PM_Scanner')) permissions.add(Permission.VIEW_SCANNER); diff --git a/paperless-frontend/src/auth/permissions.ts b/paperless-frontend/src/auth/permissions.ts index 518f0e6..4a39f36 100644 --- a/paperless-frontend/src/auth/permissions.ts +++ b/paperless-frontend/src/auth/permissions.ts @@ -31,8 +31,11 @@ export function mapGroupsToPermissions(groups: string[] | undefined | null): Per return Array.from(permissions); } + // Der Posteingang ist eine abgespeckte Buchhaltung – PM_Buchhaltung umfasst ihn. + // Muss identisch zu paperless-backend/src/auth/permissions.enum.ts bleiben. if (groups.includes('PM_Buchhaltung')) { permissions.add(Permission.PROCESS_MANUALLY); + permissions.add(Permission.VIEW_INBOX); } if (groups.includes('PM_Maileingang')) { permissions.add(Permission.VIEW_MAIL);