Skip to content

Commit 9b4caf0

Browse files
authored
Add security policy for general endpoints (#2100)
Fixes OPS-3886.
1 parent 1cef4f2 commit 9b4caf0

6 files changed

Lines changed: 88 additions & 6 deletions

File tree

packages/server/api/src/app/flows/flow/flow-version.controller.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ export const flowVersionController: FastifyPluginAsyncTypebox = async (
129129
{
130130
config: {
131131
allowedPrincipals: [PrincipalType.USER],
132+
security: getProjectScopedRoutePolicy({
133+
allowedPrincipals: [PrincipalType.USER],
134+
permission: Permission.TEST_STEP_FLOW,
135+
}),
132136
},
133137
schema: {
134138
description:
@@ -172,6 +176,10 @@ export const flowVersionController: FastifyPluginAsyncTypebox = async (
172176
{
173177
config: {
174178
allowedPrincipals: [PrincipalType.USER],
179+
security: getProjectScopedRoutePolicy({
180+
allowedPrincipals: [PrincipalType.USER],
181+
permission: Permission.TEST_STEP_FLOW,
182+
}),
175183
},
176184
schema: {
177185
description:

packages/server/api/src/app/flows/flow/form/form.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import {
55
import {
66
ALL_PRINCIPAL_TYPES,
77
OpenOpsId,
8+
Permission,
89
USE_DRAFT_QUERY_PARAM_NAME,
910
} from '@openops/shared';
11+
import { getProjectScopedRoutePolicy } from '../../../core/security/route-policies/route-security-policy-factory';
1012
import { formService } from './form.service';
1113

1214
export const formController: FastifyPluginAsyncTypebox = async (app) => {
@@ -21,6 +23,10 @@ export const formController: FastifyPluginAsyncTypebox = async (app) => {
2123
const GetFormRequest = {
2224
config: {
2325
allowedPrincipals: ALL_PRINCIPAL_TYPES,
26+
security: getProjectScopedRoutePolicy({
27+
allowedPrincipals: ALL_PRINCIPAL_TYPES,
28+
permission: Permission.READ_FLOW,
29+
}),
2430
},
2531
schema: {
2632
description:

packages/server/api/src/app/flows/folder/folder.module.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
import { Type } from '@sinclair/typebox';
1212
import { StatusCodes } from 'http-status-codes';
1313
import { entitiesMustBeOwnedByCurrentProject } from '../../authentication/authorization';
14+
import { getProjectScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
1415
import { flowFolderService as folderService } from './folder.service';
1516

1617
export const folderModule: FastifyPluginAsyncTypebox = async (app) => {
@@ -19,6 +20,7 @@ export const folderModule: FastifyPluginAsyncTypebox = async (app) => {
1920

2021
const folderController: FastifyPluginAsyncTypebox = async (fastify) => {
2122
fastify.addHook('preSerialization', entitiesMustBeOwnedByCurrentProject);
23+
2224
fastify.post('/', CreateFolderParams, async (request) => {
2325
const createdFolder = await folderService.create({
2426
projectId: request.principal.projectId,
@@ -67,7 +69,10 @@ const folderController: FastifyPluginAsyncTypebox = async (fastify) => {
6769
const CreateFolderParams = {
6870
config: {
6971
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
70-
permission: Permission.WRITE_FLOW,
72+
security: getProjectScopedRoutePolicy({
73+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
74+
permission: Permission.WRITE_FOLDER,
75+
}),
7176
},
7277
schema: {
7378
tags: ['folders'],
@@ -81,7 +86,10 @@ const CreateFolderParams = {
8186
const UpdateFolderParams = {
8287
config: {
8388
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
84-
permission: Permission.WRITE_FLOW,
89+
security: getProjectScopedRoutePolicy({
90+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
91+
permission: Permission.WRITE_FOLDER,
92+
}),
8593
},
8694
schema: {
8795
tags: ['folders'],
@@ -98,7 +106,10 @@ const UpdateFolderParams = {
98106
const GetFolderParams = {
99107
config: {
100108
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
101-
permission: Permission.READ_FLOW,
109+
security: getProjectScopedRoutePolicy({
110+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
111+
permission: Permission.READ_FOLDER,
112+
}),
102113
},
103114
schema: {
104115
tags: ['folders'],
@@ -114,7 +125,10 @@ const GetFolderParams = {
114125
const ListFoldersFlowsParams = {
115126
config: {
116127
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
117-
permission: Permission.READ_FLOW,
128+
security: getProjectScopedRoutePolicy({
129+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
130+
permission: Permission.READ_FLOW,
131+
}),
118132
},
119133
schema: {
120134
tags: ['folders'],
@@ -128,7 +142,10 @@ const ListFoldersFlowsParams = {
128142
const DeleteFolderParams = {
129143
config: {
130144
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
131-
permission: Permission.WRITE_FLOW,
145+
security: getProjectScopedRoutePolicy({
146+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
147+
permission: Permission.DELETE_FOLDER,
148+
}),
132149
},
133150
schema: {
134151
params: DeleteFolderRequest,

packages/server/api/src/app/flows/trigger-events/trigger-event.module.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox';
22
import {
33
ListTriggerEventsRequest,
4+
Permission,
5+
PrincipalType,
46
TestPollingTriggerRequest,
57
} from '@openops/shared';
8+
import { getProjectScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
69
import { systemJobsSchedule } from '../../helper/system-jobs';
710
import { SystemJobName } from '../../helper/system-jobs/common';
811
import { systemJobHandlers } from '../../helper/system-jobs/job-handlers';
@@ -35,6 +38,12 @@ const triggerEventController: FastifyPluginAsyncTypebox = async (fastify) => {
3538
fastify.get(
3639
'/poll',
3740
{
41+
config: {
42+
security: getProjectScopedRoutePolicy({
43+
allowedPrincipals: [PrincipalType.USER],
44+
permission: Permission.READ_FLOW,
45+
}),
46+
},
3847
schema: {
3948
querystring: TestPollingTriggerRequest,
4049
},
@@ -55,6 +64,12 @@ const triggerEventController: FastifyPluginAsyncTypebox = async (fastify) => {
5564
fastify.post(
5665
'/',
5766
{
67+
config: {
68+
security: getProjectScopedRoutePolicy({
69+
allowedPrincipals: [PrincipalType.USER],
70+
permission: Permission.WRITE_FLOW,
71+
}),
72+
},
5873
schema: {
5974
querystring: TestPollingTriggerRequest,
6075
},
@@ -72,6 +87,12 @@ const triggerEventController: FastifyPluginAsyncTypebox = async (fastify) => {
7287
fastify.get(
7388
'/',
7489
{
90+
config: {
91+
security: getProjectScopedRoutePolicy({
92+
allowedPrincipals: [PrincipalType.USER],
93+
permission: Permission.READ_FLOW,
94+
}),
95+
},
7596
schema: {
7697
querystring: ListTriggerEventsRequest,
7798
},

packages/server/api/src/app/user-settings/user-settings.module.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
} from '@openops/shared';
1111
import { FastifyRequest } from 'fastify';
1212
import { StatusCodes } from 'http-status-codes';
13+
import { getProjectScopedRoutePolicy } from '../core/security/route-policies/route-security-policy-factory';
1314
import { userSettingsService } from './user-settings-service';
1415

1516
export const userSettingsModule: FastifyPluginAsyncTypebox = async (app) => {
@@ -19,7 +20,7 @@ export const userSettingsModule: FastifyPluginAsyncTypebox = async (app) => {
1920
};
2021

2122
const usersSettingsController: FastifyPluginAsyncTypebox = async (app) => {
22-
app.get('/', async (request, response) => {
23+
app.get('/', GetUserSettingsRequestOptions, async (request, response) => {
2324
const userSettings = await userSettingsService.get({
2425
userId: request.principal.id,
2526
projectId: request.principal.projectId,
@@ -57,9 +58,29 @@ const usersSettingsController: FastifyPluginAsyncTypebox = async (app) => {
5758
);
5859
};
5960

61+
const GetUserSettingsRequestOptions = {
62+
config: {
63+
allowedPrincipals: [PrincipalType.USER],
64+
security: getProjectScopedRoutePolicy({
65+
allowedPrincipals: [PrincipalType.USER],
66+
}),
67+
},
68+
schema: {
69+
tags: ['user'],
70+
description: 'Get user settings',
71+
security: [SERVICE_KEY_SECURITY_OPENAPI],
72+
response: {
73+
[StatusCodes.OK]: UserSettingsDefinition,
74+
},
75+
},
76+
};
77+
6078
const UpsertUserSettingsRequestOptions = {
6179
config: {
6280
allowedPrincipals: [PrincipalType.USER],
81+
security: getProjectScopedRoutePolicy({
82+
allowedPrincipals: [PrincipalType.USER],
83+
}),
6384
},
6485
schema: {
6586
tags: ['user'],

packages/server/api/src/app/workers/machine/machine-controller.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import {
1212
WorkerPrincipal,
1313
} from '@openops/shared';
1414
import { accessTokenManager } from '../../authentication/context/access-token-manager';
15+
import { organizationIdResolver } from '../../core/security/route-policies/property-source-factory';
16+
import { getOrganizationScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
1517
import { organizationService } from '../../organization/organization.service';
1618
import { machineService } from './machine-service';
1719

@@ -57,6 +59,10 @@ export const workerMachineController: FastifyPluginAsyncTypebox = async (
5759
const GenerateWorkerTokenParams = {
5860
config: {
5961
allowedPrincipals: [PrincipalType.USER],
62+
security: getOrganizationScopedRoutePolicy({
63+
allowedPrincipals: [PrincipalType.USER],
64+
organizationIdSource: organizationIdResolver.fromBody(),
65+
}),
6066
},
6167
schema: {
6268
description:
@@ -82,6 +88,9 @@ const HeartbeatParams = {
8288
const ListWorkersParams = {
8389
config: {
8490
allowedPrincipals: [PrincipalType.USER],
91+
security: getOrganizationScopedRoutePolicy({
92+
allowedPrincipals: [PrincipalType.USER],
93+
}),
8594
},
8695
schema: {
8796
description:

0 commit comments

Comments
 (0)