Skip to content

Commit 250d5a1

Browse files
authored
Add security policy for project and organizations (#2110)
Fixes OPS-3890.
1 parent 0239088 commit 250d5a1

3 files changed

Lines changed: 35 additions & 1 deletion

File tree

packages/server/api/src/app/organization/organization.controller.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import {
66
assertEqual,
77
OpenOpsId,
88
Organization,
9+
Permission,
910
PrincipalType,
1011
SERVICE_KEY_SECURITY_OPENAPI,
1112
UpdateOrganizationRequestBody,
1213
} from '@openops/shared';
1314
import { StatusCodes } from 'http-status-codes';
15+
import { organizationIdResolver } from '../core/security/route-policies/property-source-factory';
16+
import { getOrganizationScopedRoutePolicy } from '../core/security/route-policies/route-security-policy-factory';
1417
import { organizationService } from './organization.service';
1518

1619
export const organizationController: FastifyPluginAsyncTypebox = async (
@@ -37,6 +40,14 @@ export const organizationController: FastifyPluginAsyncTypebox = async (
3740
};
3841

3942
const UpdateOrganizationRequest = {
43+
config: {
44+
allowedPrincipals: [PrincipalType.USER],
45+
security: getOrganizationScopedRoutePolicy({
46+
allowedPrincipals: [PrincipalType.USER],
47+
permission: Permission.WRITE_ORGANIZATION,
48+
organizationIdSource: organizationIdResolver.fromParams('id'),
49+
}),
50+
},
4051
schema: {
4152
body: UpdateOrganizationRequestBody,
4253
params: Type.Object({
@@ -53,6 +64,10 @@ const UpdateOrganizationRequest = {
5364
const GetOrganizationRequest = {
5465
config: {
5566
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
67+
security: getOrganizationScopedRoutePolicy({
68+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
69+
organizationIdSource: organizationIdResolver.fromParams('id'),
70+
}),
5671
},
5772
schema: {
5873
tags: ['organizations'],

packages/server/api/src/app/project/project-controller.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import {
22
FastifyPluginCallbackTypebox,
33
Type,
44
} from '@fastify/type-provider-typebox';
5-
import { ApplicationError, Project, SeekPage } from '@openops/shared';
5+
import {
6+
ApplicationError,
7+
PrincipalType,
8+
Project,
9+
SeekPage,
10+
} from '@openops/shared';
11+
import { getProjectScopedRoutePolicy } from '../core/security/route-policies/route-security-policy-factory';
612
import { paginationHelper } from '../helper/pagination/pagination-utils';
713
import { projectService } from './project-service';
814

@@ -53,6 +59,11 @@ export const userProjectController: FastifyPluginCallbackTypebox = (
5359
const ProjectWithoutToken = Type.Omit(Project, ['tablesDatabaseToken']);
5460

5561
const GetUserProjectRequestOptions = {
62+
config: {
63+
security: getProjectScopedRoutePolicy({
64+
allowedPrincipals: [PrincipalType.USER],
65+
}),
66+
},
5667
schema: {
5768
response: {
5869
200: ProjectWithoutToken,
@@ -61,6 +72,11 @@ const GetUserProjectRequestOptions = {
6172
};
6273

6374
const ListUserProjectsRequestOptions = {
75+
config: {
76+
security: getProjectScopedRoutePolicy({
77+
allowedPrincipals: [PrincipalType.USER],
78+
}),
79+
},
6480
schema: {
6581
response: {
6682
200: SeekPage(ProjectWithoutToken),

packages/shared/src/lib/common/security/permission.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ export enum Permission {
3434

3535
// Analytics
3636
WRITE_ANALYTICS = 'analytics:write',
37+
38+
// Organization
39+
WRITE_ORGANIZATION = 'organization:write',
3740
}

0 commit comments

Comments
 (0)