Skip to content

Commit 7095368

Browse files
authored
Add security policy to test run endpoints (#2096)
Fixes OPS-3882.
1 parent 5a18b84 commit 7095368

5 files changed

Lines changed: 60 additions & 6 deletions

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import {
22
FastifyPluginAsyncTypebox,
33
Type,
44
} from '@fastify/type-provider-typebox';
5-
import { PrincipalType } from '@openops/shared';
5+
import { Permission, PrincipalType } from '@openops/shared';
66
import { StatusCodes } from 'http-status-codes';
7+
import { getProjectScopedRoutePolicy } from '../core/security/route-policies/route-security-policy-factory';
78
import { fileService } from './file.service';
89

910
export const fileController: FastifyPluginAsyncTypebox = async (app) => {
@@ -20,6 +21,10 @@ export const fileController: FastifyPluginAsyncTypebox = async (app) => {
2021
const GetFileRequest = {
2122
config: {
2223
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
24+
security: getProjectScopedRoutePolicy({
25+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
26+
permission: Permission.READ_RUN,
27+
}),
2328
},
2429
schema: {
2530
operationId: 'Get File',

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
WebsocketClientEvent,
2626
} from '@openops/shared';
2727
import { StatusCodes } from 'http-status-codes';
28+
import { getProjectScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
2829
import { flowRunRepo, flowRunService } from './flow-run-service';
2930

3031
const DEFAULT_PAGING_LIMIT = 10;
@@ -142,6 +143,10 @@ const FlowRunFilteredWithNoSteps = Type.Omit(FlowRun, [
142143
const ListRequest = {
143144
config: {
144145
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
146+
security: getProjectScopedRoutePolicy({
147+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
148+
permission: Permission.READ_RUN,
149+
}),
145150
},
146151
schema: {
147152
operationId: 'List Flow Runs',
@@ -159,6 +164,10 @@ const ListRequest = {
159164
const GetRequest = {
160165
config: {
161166
allowedPrincipals: [PrincipalType.SERVICE, PrincipalType.USER],
167+
security: getProjectScopedRoutePolicy({
168+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
169+
permission: Permission.READ_RUN,
170+
}),
162171
},
163172
schema: {
164173
operationId: 'Get Flow Run Details',
@@ -194,7 +203,10 @@ const ResumeFlowRunRequest = {
194203
const RetryFlowRequest = {
195204
config: {
196205
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
197-
permission: Permission.RETRY_RUN,
206+
security: getProjectScopedRoutePolicy({
207+
allowedPrincipals: [PrincipalType.USER, PrincipalType.SERVICE],
208+
permission: Permission.RETRY_RUN,
209+
}),
198210
},
199211
schema: {
200212
operationId: 'Retry Flow Run',
@@ -210,6 +222,10 @@ const RetryFlowRequest = {
210222
const StopFlowRequest = {
211223
config: {
212224
allowedPrincipals: [PrincipalType.USER],
225+
security: getProjectScopedRoutePolicy({
226+
allowedPrincipals: [PrincipalType.USER],
227+
permission: Permission.TEST_RUN_FLOW,
228+
}),
213229
},
214230
schema: {
215231
operationId: 'Stop Flow Run',

packages/server/api/src/app/flows/flow-run/flow-run-module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ const EXECUTION_DATA_RETENTION_DAYS = system.getNumberOrThrow(
1717

1818
export const flowRunModule: FastifyPluginAsync = async (app) => {
1919
app.addHook('preSerialization', entitiesMustBeOwnedByCurrentProject);
20+
2021
await app.register(controller, { prefix: '/v1/flow-runs' });
22+
2123
await webhookResponseWatcher.init();
24+
2225
systemJobHandlers.registerJobHandler(
2326
SystemJobName.LOGS_CLEANUP_TRIGGER,
2427
async () => {
@@ -67,6 +70,7 @@ export const flowRunModule: FastifyPluginAsync = async (app) => {
6770
);
6871
},
6972
);
73+
7074
await systemJobsSchedule.upsertJob({
7175
job: {
7276
name: SystemJobName.LOGS_CLEANUP_TRIGGER,

packages/server/api/src/app/flows/test/test.controller.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import {
55
} from '@fastify/type-provider-typebox';
66
import {
77
flowHelper,
8+
Permission,
89
PrincipalType,
910
TestTriggerRequestBody,
1011
} from '@openops/shared';
1112
import { StatusCodes } from 'http-status-codes';
13+
import { getProjectScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
1214
import { validateFlowVersionBelongsToProject } from '../common/flow-version-validation';
1315
import { flowRunService } from '../flow-run/flow-run-service';
1416
import { flowVersionService } from '../flow-version/flow-version.service';
@@ -119,6 +121,13 @@ export const testController: FastifyPluginAsyncTypebox = async (fastify) => {
119121
};
120122

121123
const TestStepRequest = {
124+
config: {
125+
allowedPrincipals: [PrincipalType.USER],
126+
security: getProjectScopedRoutePolicy({
127+
allowedPrincipals: [PrincipalType.USER],
128+
permission: Permission.TEST_STEP_FLOW,
129+
}),
130+
},
122131
schema: {
123132
description:
124133
'Test a workflow step with specified parameters. With this endpoint its possible to validate steps.',
@@ -144,6 +153,13 @@ const TestStepRequest = {
144153
};
145154

146155
const TestWorkflowRequest = {
156+
config: {
157+
allowedPrincipals: [PrincipalType.USER],
158+
security: getProjectScopedRoutePolicy({
159+
allowedPrincipals: [PrincipalType.USER],
160+
permission: Permission.TEST_RUN_FLOW,
161+
}),
162+
},
147163
schema: {
148164
description:
149165
'Start a test for a workflow using a defined workflow version. This endpoint starts a test run of the entire workflow.',
@@ -170,12 +186,16 @@ const TestWorkflowRequest = {
170186
};
171187

172188
const TestTriggerRequest = {
189+
config: {
190+
allowedPrincipals: [PrincipalType.USER],
191+
security: getProjectScopedRoutePolicy({
192+
allowedPrincipals: [PrincipalType.USER],
193+
permission: Permission.TEST_STEP_FLOW,
194+
}),
195+
},
173196
schema: {
174197
description:
175198
'Test a flow trigger with specified parameters. This endpoint allows users to validate and test flow triggers before deploying them to production, helping ensure proper configuration and behavior.',
176199
body: TestTriggerRequestBody,
177200
},
178-
config: {
179-
allowedPrincipals: [PrincipalType.USER],
180-
},
181201
};

packages/server/api/src/app/webhooks/webhook-simulation/webhook-simulation-controller.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import {
22
FastifyPluginCallbackTypebox,
33
Type,
44
} from '@fastify/type-provider-typebox';
5-
import { PrincipalType } from '@openops/shared';
5+
import { Permission, PrincipalType } from '@openops/shared';
6+
import { getProjectScopedRoutePolicy } from '../../core/security/route-policies/route-security-policy-factory';
67
import { webhookSimulationService } from './webhook-simulation-service';
78

89
export const webhookSimulationController: FastifyPluginCallbackTypebox = (
@@ -46,6 +47,10 @@ export const webhookSimulationController: FastifyPluginCallbackTypebox = (
4647
const CreateWebhookSimulationRequest = {
4748
config: {
4849
allowedPrincipals: [PrincipalType.USER],
50+
security: getProjectScopedRoutePolicy({
51+
allowedPrincipals: [PrincipalType.USER],
52+
permission: Permission.TEST_STEP_FLOW,
53+
}),
4954
},
5055
schema: {
5156
body: Type.Object({
@@ -59,6 +64,10 @@ const CreateWebhookSimulationRequest = {
5964
const GetWebhookSimulationRequest = {
6065
config: {
6166
allowedPrincipals: [PrincipalType.USER],
67+
security: getProjectScopedRoutePolicy({
68+
allowedPrincipals: [PrincipalType.USER],
69+
permission: Permission.TEST_STEP_FLOW,
70+
}),
6271
},
6372
schema: {
6473
querystring: Type.Object({

0 commit comments

Comments
 (0)