Skip to content

Commit 9b30f7d

Browse files
committed
Refactor Cedar policy generation to remove group ID references across multiple files
1 parent 7a41f62 commit 9b30f7d

8 files changed

Lines changed: 6 additions & 32 deletions

File tree

backend/src/entities/cedar-authorization/cedar-authorization.service.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export class CedarAuthorizationService implements ICedarAuthorizationService, On
107107
throw new HttpException({ message: Messages.CANNOT_CHANGE_ADMIN_GROUP }, HttpStatus.BAD_REQUEST);
108108
}
109109

110-
await this.validatePolicyReferences(cedarPolicy, connectionId, groupId);
110+
await this.validatePolicyReferences(cedarPolicy, connectionId);
111111

112112
const classicalPermissions = parseCedarPolicyToClassicalPermissions(cedarPolicy, connectionId, groupId);
113113

@@ -273,9 +273,7 @@ export class CedarAuthorizationService implements ICedarAuthorizationService, On
273273
private async validatePolicyReferences(
274274
cedarPolicy: string,
275275
connectionId: string,
276-
groupId: string,
277276
): Promise<void> {
278-
279277
const connectionIds = [
280278
...cedarPolicy.matchAll(/resource\s*==\s*RocketAdmin::Connection::"([^"]+)"/g),
281279
].map((m) => m[1]);

backend/src/entities/cedar-authorization/cedar-policy-generator.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { AccessLevelEnum } from '../../enums/index.js';
22
import { IComplexPermission } from '../permission/permission.interface.js';
33

44
export function generateCedarPolicyForGroup(
5-
groupId: string,
65
connectionId: string,
76
isMain: boolean,
87
permissions: IComplexPermission,

backend/src/entities/cedar-authorization/cedar-policy-parser.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
} from '../permission/permission.interface.js';
77

88
interface ParsedPermitStatement {
9-
groupId: string | null;
109
action: string | null;
1110
resourceType: string | null;
1211
resourceId: string | null;
@@ -140,18 +139,12 @@ function extractPermitStatements(policyText: string): ParsedPermitStatement[] {
140139

141140
function parsePermitBody(body: string): ParsedPermitStatement {
142141
const result: ParsedPermitStatement = {
143-
groupId: null,
144142
action: null,
145143
resourceType: null,
146144
resourceId: null,
147145
isWildcard: false,
148146
};
149147

150-
const principalInMatch = body.match(/principal\s+in\s+RocketAdmin::Group::"([^"]+)"/);
151-
if (principalInMatch) {
152-
result.groupId = principalInMatch[1];
153-
}
154-
155148
const actionMatch = body.match(/action\s*==\s*RocketAdmin::Action::"([^"]+)"/);
156149
if (actionMatch) {
157150
result.action = actionMatch[1];

backend/src/entities/cedar-authorization/scripts/migrate-permissions-to-cedar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export async function migratePermissionsToCedar(dataSource: DataSource): Promise
5050
tables: Array.from(tableMap.values()),
5151
};
5252

53-
const cedarPolicy = generateCedarPolicyForGroup(group.id, connection.id, group.isMain, complexPermission);
53+
const cedarPolicy = generateCedarPolicyForGroup(connection.id, group.isMain, complexPermission);
5454
group.cedarPolicy = cedarPolicy;
5555
await groupRepository.save(group);
5656
migratedCount++;

backend/src/entities/connection/use-cases/create-connection.use.case.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ export class CreateConnectionUseCase
101101
);
102102
await this._dbContext.permissionRepository.createdDefaultAdminPermissionsInGroup(createdAdminGroup);
103103
createdAdminGroup.cedarPolicy = generateCedarPolicyForGroup(
104-
createdAdminGroup.id,
105104
savedConnection.id,
106105
true,
107106
{

backend/src/entities/connection/use-cases/create-group-in-connection.use.case.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export class CreateGroupInConnectionUseCase
3737
const newGroupEntity = buildNewGroupEntityForConnectionWithUser(connectionToUpdate, foundUser, title);
3838
const savedGroup = await this._dbContext.groupRepository.saveNewOrUpdatedGroup(newGroupEntity);
3939
savedGroup.cedarPolicy = generateCedarPolicyForGroup(
40-
savedGroup.id,
4140
connectionId,
4241
false,
4342
{

backend/src/entities/permission/use-cases/create-or-update-permissions.use.case.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ export class CreateOrUpdatePermissionsUseCase
189189
);
190190

191191
// Generate and save Cedar policy for this group
192-
const cedarPolicy = generateCedarPolicyForGroup(groupId, connectionId, groupToUpdate.isMain, resultPermissions);
192+
const cedarPolicy = generateCedarPolicyForGroup(connectionId, groupToUpdate.isMain, resultPermissions);
193193
groupToUpdate.cedarPolicy = cedarPolicy;
194194
await this._dbContext.groupRepository.saveNewOrUpdatedGroup(groupToUpdate);
195195
Cacher.invalidateCedarPolicyCache(connectionId);

backend/test/ava-tests/non-saas-tests/non-saas-cedar-policy-generator.test.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function makePermissions(overrides: Partial<IComplexPermission> = {}): IComplexP
1616
}
1717

1818
test('isMain=true generates a single wildcard permit', (t) => {
19-
const result = generateCedarPolicyForGroup(groupId, connectionId, true, makePermissions());
19+
const result = generateCedarPolicyForGroup(connectionId, true, makePermissions());
2020
t.true(result.includes('principal,'));
2121
t.true(result.includes('action,'));
2222
t.true(result.includes('resource'));
@@ -27,7 +27,6 @@ test('isMain=true generates a single wildcard permit', (t) => {
2727

2828
test('connection:edit generates ONLY connection:read + connection:edit (not wildcard)', (t) => {
2929
const result = generateCedarPolicyForGroup(
30-
groupId,
3130
connectionId,
3231
false,
3332
makePermissions({
@@ -49,7 +48,6 @@ test('connection:edit generates ONLY connection:read + connection:edit (not wild
4948

5049
test('connection:readonly generates only connection:read', (t) => {
5150
const result = generateCedarPolicyForGroup(
52-
groupId,
5351
connectionId,
5452
false,
5553
makePermissions({
@@ -63,14 +61,13 @@ test('connection:readonly generates only connection:read', (t) => {
6361
});
6462

6563
test('connection:none generates no connection policies', (t) => {
66-
const result = generateCedarPolicyForGroup(groupId, connectionId, false, makePermissions());
64+
const result = generateCedarPolicyForGroup(connectionId, false, makePermissions());
6765
t.false(result.includes('connection:read'));
6866
t.false(result.includes('connection:edit'));
6967
});
7068

7169
test('group:edit generates group:read + group:edit', (t) => {
7270
const result = generateCedarPolicyForGroup(
73-
groupId,
7471
connectionId,
7572
false,
7673
makePermissions({
@@ -85,7 +82,6 @@ test('group:edit generates group:read + group:edit', (t) => {
8582

8683
test('group:readonly generates only group:read', (t) => {
8784
const result = generateCedarPolicyForGroup(
88-
groupId,
8985
connectionId,
9086
false,
9187
makePermissions({
@@ -100,7 +96,6 @@ test('group:readonly generates only group:read', (t) => {
10096

10197
test('table with visibility=true only generates only table:read', (t) => {
10298
const result = generateCedarPolicyForGroup(
103-
groupId,
10499
connectionId,
105100
false,
106101
makePermissions({
@@ -122,7 +117,6 @@ test('table with visibility=true only generates only table:read', (t) => {
122117

123118
test('table with all flags true generates table:read + table:add + table:edit + table:delete', (t) => {
124119
const result = generateCedarPolicyForGroup(
125-
groupId,
126120
connectionId,
127121
false,
128122
makePermissions({
@@ -144,7 +138,6 @@ test('table with all flags true generates table:read + table:add + table:edit +
144138

145139
test('table with add=true only generates table:read + table:add (hasAnyAccess triggers table:read)', (t) => {
146140
const result = generateCedarPolicyForGroup(
147-
groupId,
148141
connectionId,
149142
false,
150143
makePermissions({
@@ -166,7 +159,6 @@ test('table with add=true only generates table:read + table:add (hasAnyAccess tr
166159

167160
test('table with all flags false generates no policies for that table', (t) => {
168161
const result = generateCedarPolicyForGroup(
169-
groupId,
170162
connectionId,
171163
false,
172164
makePermissions({
@@ -183,13 +175,12 @@ test('table with all flags false generates no policies for that table', (t) => {
183175
});
184176

185177
test('all none + no tables returns empty string', (t) => {
186-
const result = generateCedarPolicyForGroup(groupId, connectionId, false, makePermissions());
178+
const result = generateCedarPolicyForGroup(connectionId, false, makePermissions());
187179
t.is(result, '');
188180
});
189181

190182
test('multiple tables generate separate policies per table with correct resource refs', (t) => {
191183
const result = generateCedarPolicyForGroup(
192-
groupId,
193184
connectionId,
194185
false,
195186
makePermissions({
@@ -214,7 +205,6 @@ test('multiple tables generate separate policies per table with correct resource
214205

215206
test('dashboard with read=true generates only dashboard:read', (t) => {
216207
const result = generateCedarPolicyForGroup(
217-
groupId,
218208
connectionId,
219209
false,
220210
makePermissions({
@@ -236,7 +226,6 @@ test('dashboard with read=true generates only dashboard:read', (t) => {
236226

237227
test('dashboard with all flags true generates dashboard:read + dashboard:create + dashboard:edit + dashboard:delete', (t) => {
238228
const result = generateCedarPolicyForGroup(
239-
groupId,
240229
connectionId,
241230
false,
242231
makePermissions({
@@ -258,7 +247,6 @@ test('dashboard with all flags true generates dashboard:read + dashboard:create
258247

259248
test('dashboard with all flags false generates no policies for that dashboard', (t) => {
260249
const result = generateCedarPolicyForGroup(
261-
groupId,
262250
connectionId,
263251
false,
264252
makePermissions({
@@ -276,7 +264,6 @@ test('dashboard with all flags false generates no policies for that dashboard',
276264

277265
test('dashboard resource ref format uses connectionId/dashboardId', (t) => {
278266
const result = generateCedarPolicyForGroup(
279-
groupId,
280267
connectionId,
281268
false,
282269
makePermissions({
@@ -293,7 +280,6 @@ test('dashboard resource ref format uses connectionId/dashboardId', (t) => {
293280

294281
test('resource ref format validation', (t) => {
295282
const result = generateCedarPolicyForGroup(
296-
groupId,
297283
connectionId,
298284
false,
299285
makePermissions({

0 commit comments

Comments
 (0)