Skip to content

Commit 57da3e9

Browse files
Copilothuangyiirene
andcommitted
Security improvement: default dev handler to disabled
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
1 parent 8067e45 commit 57da3e9

6 files changed

Lines changed: 120 additions & 2 deletions

File tree

examples/integrations/dev-playground/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ interface DevHandlerOptions {
166166
/** Base directory for file operations (defaults to process.cwd()) */
167167
baseDir?: string;
168168

169-
/** Enable dev mode (must be explicitly enabled) */
169+
/** Enable dev mode (must be explicitly enabled, defaults to false) */
170170
enabled?: boolean;
171171

172172
/** Allowed file extensions for editing */
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: project
2+
label: Project
3+
icon: briefcase
4+
fields:
5+
name:
6+
type: text
7+
required: true
8+
label: Project Name
9+
searchable: true
10+
11+
status:
12+
type: select
13+
options:
14+
- planning
15+
- in_progress
16+
- completed
17+
- on_hold
18+
defaultValue: planning
19+
label: Status
20+
21+
priority:
22+
type: select
23+
options:
24+
- low
25+
- medium
26+
- high
27+
- urgent
28+
defaultValue: medium
29+
label: Priority
30+
31+
description:
32+
type: textarea
33+
label: Description
34+
35+
start_date:
36+
type: date
37+
label: Start Date
38+
39+
end_date:
40+
type: date
41+
label: End Date
42+
43+
budget:
44+
type: currency
45+
label: Budget
46+
scale: 2
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
name: task
2+
label: Task
3+
icon: check-square
4+
fields:
5+
title:
6+
type: text
7+
required: true
8+
label: Task Title
9+
10+
status:
11+
type: select
12+
options:
13+
- todo
14+
- in_progress
15+
- done
16+
defaultValue: todo
17+
label: Status
18+
19+
priority:
20+
type: select
21+
options:
22+
- low
23+
- medium
24+
- high
25+
defaultValue: medium
26+
label: Priority
27+
28+
description:
29+
type: textarea
30+
label: Description
31+
32+
assignee:
33+
type: text
34+
label: Assigned To
35+
36+
due_date:
37+
type: datetime
38+
label: Due Date
39+
40+
completed:
41+
type: boolean
42+
defaultValue: false
43+
label: Completed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"extends": "../../../tsconfig.base.json",
3+
"compilerOptions": {
4+
"outDir": "./dist",
5+
"rootDir": ".",
6+
"module": "ESNext",
7+
"target": "ES2020",
8+
"moduleResolution": "node"
9+
},
10+
"include": ["*.ts", "src/**/*"]
11+
}

packages/runtime/server/src/dev-handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ interface FileNode {
7272
*/
7373
export function createDevHandler(options?: DevHandlerOptions) {
7474
const baseDir = options?.baseDir || process.cwd();
75-
const enabled = options?.enabled ?? (process.env.NODE_ENV !== 'production');
75+
const enabled = options?.enabled ?? false; // Default to false for security
7676
const allowedExtensions = options?.allowedExtensions || [
7777
'.yml', '.yaml', '.ts', '.js', '.json', '.md',
7878
'.txt', '.object.yml', '.validation.yml', '.permission.yml',

packages/runtime/server/test/dev-handler.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,24 @@ describe('DevHandler', () => {
290290
});
291291

292292
describe('Security', () => {
293+
it('should be disabled by default', async () => {
294+
const defaultHandler = createDevHandler({
295+
baseDir: testDir
296+
// enabled not specified - should default to false
297+
});
298+
299+
const defaultServer = createServer(defaultHandler);
300+
301+
const response = await request(defaultServer)
302+
.get('/api/dev/files')
303+
.expect(403);
304+
305+
expect(response.body).toHaveProperty('error');
306+
expect(response.body.error.message).toContain('development mode');
307+
308+
defaultServer.close();
309+
});
310+
293311
it('should be disabled in production mode', async () => {
294312
const prodHandler = createDevHandler({
295313
baseDir: testDir,

0 commit comments

Comments
 (0)