devports 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -0
- package/LICENSE +21 -0
- package/README.md +810 -29
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +329 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/allocate.command.d.ts +8 -0
- package/dist/commands/allocate.command.d.ts.map +1 -0
- package/dist/commands/allocate.command.js +84 -0
- package/dist/commands/allocate.command.js.map +1 -0
- package/dist/commands/base-command.d.ts +28 -0
- package/dist/commands/base-command.d.ts.map +1 -0
- package/dist/commands/base-command.js +33 -0
- package/dist/commands/base-command.js.map +1 -0
- package/dist/commands/check.command.d.ts +7 -0
- package/dist/commands/check.command.d.ts.map +1 -0
- package/dist/commands/check.command.js +44 -0
- package/dist/commands/check.command.js.map +1 -0
- package/dist/commands/completion.command.d.ts +7 -0
- package/dist/commands/completion.command.d.ts.map +1 -0
- package/dist/commands/completion.command.js +116 -0
- package/dist/commands/completion.command.js.map +1 -0
- package/dist/commands/gitignore.command.d.ts +7 -0
- package/dist/commands/gitignore.command.d.ts.map +1 -0
- package/dist/commands/gitignore.command.js +61 -0
- package/dist/commands/gitignore.command.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +35 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/info.command.d.ts +7 -0
- package/dist/commands/info.command.d.ts.map +1 -0
- package/dist/commands/info.command.js +40 -0
- package/dist/commands/info.command.js.map +1 -0
- package/dist/commands/list.command.d.ts +8 -0
- package/dist/commands/list.command.d.ts.map +1 -0
- package/dist/commands/list.command.js +165 -0
- package/dist/commands/list.command.js.map +1 -0
- package/dist/commands/release.command.d.ts +8 -0
- package/dist/commands/release.command.d.ts.map +1 -0
- package/dist/commands/release.command.js +89 -0
- package/dist/commands/release.command.js.map +1 -0
- package/dist/commands/render.command.d.ts +7 -0
- package/dist/commands/render.command.d.ts.map +1 -0
- package/dist/commands/render.command.js +53 -0
- package/dist/commands/render.command.js.map +1 -0
- package/dist/commands/reserve.command.d.ts +7 -0
- package/dist/commands/reserve.command.d.ts.map +1 -0
- package/dist/commands/reserve.command.js +42 -0
- package/dist/commands/reserve.command.js.map +1 -0
- package/dist/commands/setup.command.d.ts +7 -0
- package/dist/commands/setup.command.d.ts.map +1 -0
- package/dist/commands/setup.command.js +43 -0
- package/dist/commands/setup.command.js.map +1 -0
- package/dist/commands/status.command.d.ts +7 -0
- package/dist/commands/status.command.d.ts.map +1 -0
- package/dist/commands/status.command.js +41 -0
- package/dist/commands/status.command.js.map +1 -0
- package/dist/commands/unreserve.command.d.ts +7 -0
- package/dist/commands/unreserve.command.d.ts.map +1 -0
- package/dist/commands/unreserve.command.js +38 -0
- package/dist/commands/unreserve.command.js.map +1 -0
- package/dist/commands/worktree-add.command.d.ts +7 -0
- package/dist/commands/worktree-add.command.d.ts.map +1 -0
- package/dist/commands/worktree-add.command.js +68 -0
- package/dist/commands/worktree-add.command.js.map +1 -0
- package/dist/commands/worktree-remove.command.d.ts +7 -0
- package/dist/commands/worktree-remove.command.d.ts.map +1 -0
- package/dist/commands/worktree-remove.command.js +33 -0
- package/dist/commands/worktree-remove.command.js.map +1 -0
- package/dist/completion/bash-completion-template.d.ts +5 -0
- package/dist/completion/bash-completion-template.d.ts.map +1 -0
- package/dist/completion/bash-completion-template.js +14 -0
- package/dist/completion/bash-completion-template.js.map +1 -0
- package/dist/completion/bash.sh +208 -0
- package/dist/completion/completion-data.d.ts +16 -0
- package/dist/completion/completion-data.d.ts.map +1 -0
- package/dist/completion/completion-data.js +38 -0
- package/dist/completion/completion-data.js.map +1 -0
- package/dist/completion/index.d.ts +24 -0
- package/dist/completion/index.d.ts.map +1 -0
- package/dist/completion/index.js +30 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/completion/shell-config.d.ts +27 -0
- package/dist/completion/shell-config.d.ts.map +1 -0
- package/dist/completion/shell-config.js +243 -0
- package/dist/completion/shell-config.js.map +1 -0
- package/dist/completion/zsh-completion-template.d.ts +5 -0
- package/dist/completion/zsh-completion-template.d.ts.map +1 -0
- package/dist/completion/zsh-completion-template.js +14 -0
- package/dist/completion/zsh-completion-template.js.map +1 -0
- package/dist/completion/zsh.sh +164 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/devports-1.0.0.tgz +0 -0
- package/dist/execution.d.ts +31 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +110 -0
- package/dist/execution.js.map +1 -0
- package/dist/gitignore.d.ts +22 -0
- package/dist/gitignore.d.ts.map +1 -0
- package/dist/gitignore.js +142 -0
- package/dist/gitignore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/port-manager.d.ts +33 -0
- package/dist/port-manager.d.ts.map +1 -0
- package/dist/port-manager.js +169 -0
- package/dist/port-manager.js.map +1 -0
- package/dist/port-utils.d.ts +9 -0
- package/dist/port-utils.d.ts.map +1 -0
- package/dist/port-utils.js +38 -0
- package/dist/port-utils.js.map +1 -0
- package/dist/render.d.ts +54 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +286 -0
- package/dist/render.js.map +1 -0
- package/dist/services/lock-manager.d.ts +46 -0
- package/dist/services/lock-manager.d.ts.map +1 -0
- package/dist/services/lock-manager.js +118 -0
- package/dist/services/lock-manager.js.map +1 -0
- package/dist/services/response-formatter.d.ts +45 -0
- package/dist/services/response-formatter.d.ts.map +1 -0
- package/dist/services/response-formatter.js +102 -0
- package/dist/services/response-formatter.js.map +1 -0
- package/dist/services/validation-service.d.ts +109 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +267 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/setup.d.ts +20 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +243 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +69 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +344 -0
- package/dist/validation.js.map +1 -0
- package/dist/worktree.d.ts +24 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +245 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +90 -6
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for security-critical parameters
|
|
3
|
+
* Designed to prevent command injection and path traversal attacks
|
|
4
|
+
*/
|
|
5
|
+
export declare class ValidationError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validation options for different contexts
|
|
10
|
+
*/
|
|
11
|
+
export interface ValidationOptions {
|
|
12
|
+
allowRelativePaths?: boolean;
|
|
13
|
+
maxLength?: number;
|
|
14
|
+
allowedExtensions?: string[];
|
|
15
|
+
mustExist?: boolean;
|
|
16
|
+
allowShellMetachars?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate and sanitize a project name
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateProjectName(project: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Validate and sanitize a service name
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateServiceName(service: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Validate service type against known types
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateServiceType(type: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Validate port number
|
|
32
|
+
*/
|
|
33
|
+
export declare function validatePort(port: string | number): number;
|
|
34
|
+
/**
|
|
35
|
+
* Validate git branch name
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateBranchName(branch: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Validate file path for template files, scripts, etc.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateFilePath(path: string, options?: ValidationOptions): string;
|
|
42
|
+
/**
|
|
43
|
+
* Validate worktree path
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateWorktreePath(path: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Validate script path for hooks
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateScriptPath(path: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validate service list format (service:type or service)
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateServices(services: string[]): Array<{
|
|
54
|
+
service: string;
|
|
55
|
+
type: string;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Validate template file path
|
|
59
|
+
*/
|
|
60
|
+
export declare function validateTemplatePath(path: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Validate output file path
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateOutputPath(path: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Safe string for display/logging that removes dangerous characters
|
|
67
|
+
*/
|
|
68
|
+
export declare function sanitizeForDisplay(input: string, maxLength?: number): string;
|
|
69
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAuBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA6B1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA0ER;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8DzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuCvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,GACjB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC1C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAY,GACtB,MAAM,CAYR"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input validation utilities for security-critical parameters
|
|
3
|
+
* Designed to prevent command injection and path traversal attacks
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, statSync } from 'fs';
|
|
6
|
+
import { isAbsolute, normalize } from 'path';
|
|
7
|
+
export class ValidationError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'ValidationError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Shell metacharacters that could be used for injection
|
|
15
|
+
*/
|
|
16
|
+
const DANGEROUS_SHELL_CHARS = /[;|&$`<>(){}[\]"'\\*?~]/;
|
|
17
|
+
/**
|
|
18
|
+
* Valid characters for project/service names
|
|
19
|
+
*/
|
|
20
|
+
const PROJECT_SERVICE_PATTERN = /^[a-zA-Z0-9._-]+$/;
|
|
21
|
+
/**
|
|
22
|
+
* Valid characters for branch names (based on git branch naming rules)
|
|
23
|
+
*/
|
|
24
|
+
const BRANCH_NAME_PATTERN = /^[a-zA-Z0-9._/-]+$/;
|
|
25
|
+
/**
|
|
26
|
+
* Valid port number range
|
|
27
|
+
*/
|
|
28
|
+
const PORT_MIN = 1024;
|
|
29
|
+
const PORT_MAX = 65535;
|
|
30
|
+
/**
|
|
31
|
+
* Validate and sanitize a project name
|
|
32
|
+
*/
|
|
33
|
+
export function validateProjectName(project) {
|
|
34
|
+
if (!project || typeof project !== 'string') {
|
|
35
|
+
throw new ValidationError('Project name is required');
|
|
36
|
+
}
|
|
37
|
+
if (project.length > 50) {
|
|
38
|
+
throw new ValidationError('Project name must be 50 characters or less');
|
|
39
|
+
}
|
|
40
|
+
if (!PROJECT_SERVICE_PATTERN.test(project)) {
|
|
41
|
+
throw new ValidationError('Project name can only contain letters, numbers, dots, underscores, and hyphens');
|
|
42
|
+
}
|
|
43
|
+
if (project.startsWith('.') || project.startsWith('-')) {
|
|
44
|
+
throw new ValidationError('Project name cannot start with a dot or hyphen');
|
|
45
|
+
}
|
|
46
|
+
return project.trim();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate and sanitize a service name
|
|
50
|
+
*/
|
|
51
|
+
export function validateServiceName(service) {
|
|
52
|
+
if (!service || typeof service !== 'string') {
|
|
53
|
+
throw new ValidationError('Service name is required');
|
|
54
|
+
}
|
|
55
|
+
if (service.length > 30) {
|
|
56
|
+
throw new ValidationError('Service name must be 30 characters or less');
|
|
57
|
+
}
|
|
58
|
+
if (!PROJECT_SERVICE_PATTERN.test(service)) {
|
|
59
|
+
throw new ValidationError('Service name can only contain letters, numbers, dots, underscores, and hyphens');
|
|
60
|
+
}
|
|
61
|
+
if (service.startsWith('.') || service.startsWith('-')) {
|
|
62
|
+
throw new ValidationError('Service name cannot start with a dot or hyphen');
|
|
63
|
+
}
|
|
64
|
+
return service.trim();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validate service type against known types
|
|
68
|
+
*/
|
|
69
|
+
export function validateServiceType(type) {
|
|
70
|
+
if (!type || typeof type !== 'string') {
|
|
71
|
+
throw new ValidationError('Service type is required');
|
|
72
|
+
}
|
|
73
|
+
const validTypes = ['postgres', 'mysql', 'redis', 'api', 'app', 'custom'];
|
|
74
|
+
const normalizedType = type.toLowerCase().trim();
|
|
75
|
+
if (!validTypes.includes(normalizedType)) {
|
|
76
|
+
throw new ValidationError(`Invalid service type. Must be one of: ${validTypes.join(', ')}`);
|
|
77
|
+
}
|
|
78
|
+
return normalizedType;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate port number
|
|
82
|
+
*/
|
|
83
|
+
export function validatePort(port) {
|
|
84
|
+
let portNum;
|
|
85
|
+
if (typeof port === 'string') {
|
|
86
|
+
// Check for injection attempts in the string first
|
|
87
|
+
if (DANGEROUS_SHELL_CHARS.test(port)) {
|
|
88
|
+
throw new ValidationError('Port contains invalid characters');
|
|
89
|
+
}
|
|
90
|
+
portNum = parseInt(port, 10);
|
|
91
|
+
if (isNaN(portNum)) {
|
|
92
|
+
throw new ValidationError('Port must be a valid number');
|
|
93
|
+
}
|
|
94
|
+
// Ensure the string was purely numeric (no trailing chars)
|
|
95
|
+
if (port.trim() !== portNum.toString()) {
|
|
96
|
+
throw new ValidationError('Port must be a valid number');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
portNum = port;
|
|
101
|
+
}
|
|
102
|
+
if (portNum < PORT_MIN || portNum > PORT_MAX) {
|
|
103
|
+
throw new ValidationError(`Port must be between ${PORT_MIN} and ${PORT_MAX}`);
|
|
104
|
+
}
|
|
105
|
+
return portNum;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Validate git branch name
|
|
109
|
+
*/
|
|
110
|
+
export function validateBranchName(branch) {
|
|
111
|
+
if (!branch || typeof branch !== 'string') {
|
|
112
|
+
throw new ValidationError('Branch name is required');
|
|
113
|
+
}
|
|
114
|
+
if (branch.length > 100) {
|
|
115
|
+
throw new ValidationError('Branch name must be 100 characters or less');
|
|
116
|
+
}
|
|
117
|
+
if (!BRANCH_NAME_PATTERN.test(branch)) {
|
|
118
|
+
throw new ValidationError('Branch name contains invalid characters. Only letters, numbers, dots, underscores, forward slashes, and hyphens are allowed');
|
|
119
|
+
}
|
|
120
|
+
// Git branch name restrictions
|
|
121
|
+
if (branch.startsWith('-') || branch.endsWith('.') || branch.includes('..')) {
|
|
122
|
+
throw new ValidationError('Invalid branch name format');
|
|
123
|
+
}
|
|
124
|
+
if (branch.includes(' ')) {
|
|
125
|
+
throw new ValidationError('Branch name cannot contain spaces');
|
|
126
|
+
}
|
|
127
|
+
return branch.trim();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Validate file path for template files, scripts, etc.
|
|
131
|
+
*/
|
|
132
|
+
export function validateFilePath(path, options = {}) {
|
|
133
|
+
if (!path || typeof path !== 'string') {
|
|
134
|
+
throw new ValidationError('File path is required');
|
|
135
|
+
}
|
|
136
|
+
if (path.length > 500) {
|
|
137
|
+
throw new ValidationError('File path is too long (max 500 characters)');
|
|
138
|
+
}
|
|
139
|
+
// Check for shell metacharacters unless explicitly allowed
|
|
140
|
+
if (!options.allowShellMetachars && DANGEROUS_SHELL_CHARS.test(path)) {
|
|
141
|
+
throw new ValidationError('File path contains dangerous characters');
|
|
142
|
+
}
|
|
143
|
+
// Normalize the path to prevent traversal
|
|
144
|
+
const normalizedPath = normalize(path);
|
|
145
|
+
// Check for path traversal attempts
|
|
146
|
+
if (normalizedPath.includes('..')) {
|
|
147
|
+
throw new ValidationError('Path traversal is not allowed');
|
|
148
|
+
}
|
|
149
|
+
// Validate against null bytes and other dangerous sequences
|
|
150
|
+
if (normalizedPath.includes('\0') ||
|
|
151
|
+
normalizedPath.includes('\n') ||
|
|
152
|
+
normalizedPath.includes('\r')) {
|
|
153
|
+
throw new ValidationError('File path contains null bytes or newlines');
|
|
154
|
+
}
|
|
155
|
+
// Check if relative paths are allowed
|
|
156
|
+
if (!options.allowRelativePaths &&
|
|
157
|
+
!isAbsolute(normalizedPath) &&
|
|
158
|
+
normalizedPath.startsWith('../')) {
|
|
159
|
+
throw new ValidationError('Relative paths outside current directory are not allowed');
|
|
160
|
+
}
|
|
161
|
+
// Validate file extension if specified
|
|
162
|
+
if (options.allowedExtensions && options.allowedExtensions.length > 0) {
|
|
163
|
+
const hasValidExtension = options.allowedExtensions.some((ext) => normalizedPath.toLowerCase().endsWith(ext.toLowerCase()));
|
|
164
|
+
if (!hasValidExtension) {
|
|
165
|
+
throw new ValidationError(`File must have one of these extensions: ${options.allowedExtensions.join(', ')}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Check if file exists if required
|
|
169
|
+
if (options.mustExist) {
|
|
170
|
+
try {
|
|
171
|
+
if (!existsSync(normalizedPath)) {
|
|
172
|
+
throw new ValidationError(`File does not exist: ${normalizedPath}`);
|
|
173
|
+
}
|
|
174
|
+
const stats = statSync(normalizedPath);
|
|
175
|
+
if (!stats.isFile()) {
|
|
176
|
+
throw new ValidationError(`Path is not a file: ${normalizedPath}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof ValidationError) {
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
throw new ValidationError(`Cannot access file: ${normalizedPath}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return normalizedPath;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Validate worktree path
|
|
190
|
+
*/
|
|
191
|
+
export function validateWorktreePath(path) {
|
|
192
|
+
if (!path || typeof path !== 'string') {
|
|
193
|
+
throw new ValidationError('Worktree path is required');
|
|
194
|
+
}
|
|
195
|
+
if (path.length > 300) {
|
|
196
|
+
throw new ValidationError('Worktree path is too long (max 300 characters)');
|
|
197
|
+
}
|
|
198
|
+
// Check for shell metacharacters
|
|
199
|
+
if (DANGEROUS_SHELL_CHARS.test(path)) {
|
|
200
|
+
throw new ValidationError('Worktree path contains dangerous characters');
|
|
201
|
+
}
|
|
202
|
+
// Normalize the path
|
|
203
|
+
const normalizedPath = normalize(path);
|
|
204
|
+
// Check for excessive path traversal attempts (more than 2 levels)
|
|
205
|
+
const traversalCount = (path.match(/\.\./g) ?? []).length;
|
|
206
|
+
if (traversalCount > 2) {
|
|
207
|
+
throw new ValidationError('Excessive path traversal is not allowed');
|
|
208
|
+
}
|
|
209
|
+
// Check for absolute paths to sensitive locations (allow temp directories)
|
|
210
|
+
if (normalizedPath.startsWith('/etc/') ||
|
|
211
|
+
normalizedPath.startsWith('/usr/') ||
|
|
212
|
+
normalizedPath.startsWith('/boot/') ||
|
|
213
|
+
normalizedPath.endsWith('/etc/passwd') ||
|
|
214
|
+
normalizedPath.endsWith('/etc/shadow')) {
|
|
215
|
+
throw new ValidationError('Access to system directories is not allowed');
|
|
216
|
+
}
|
|
217
|
+
// Allow /var/ only for temp directories (macOS uses /var/folders/... for temp)
|
|
218
|
+
if (normalizedPath.startsWith('/var/') &&
|
|
219
|
+
!normalizedPath.startsWith('/var/folders/') &&
|
|
220
|
+
!normalizedPath.startsWith('/tmp/')) {
|
|
221
|
+
throw new ValidationError('Access to system directories is not allowed');
|
|
222
|
+
}
|
|
223
|
+
// Validate against null bytes
|
|
224
|
+
if (normalizedPath.includes('\0') ||
|
|
225
|
+
normalizedPath.includes('\n') ||
|
|
226
|
+
normalizedPath.includes('\r')) {
|
|
227
|
+
throw new ValidationError('Worktree path contains null bytes or newlines');
|
|
228
|
+
}
|
|
229
|
+
// Additional safety - ensure it doesn't start with dangerous sequences
|
|
230
|
+
if (normalizedPath.startsWith('/dev/') ||
|
|
231
|
+
normalizedPath.startsWith('/proc/') ||
|
|
232
|
+
normalizedPath.startsWith('/sys/')) {
|
|
233
|
+
throw new ValidationError('Worktree path cannot target system directories');
|
|
234
|
+
}
|
|
235
|
+
return normalizedPath;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Validate script path for hooks
|
|
239
|
+
*/
|
|
240
|
+
export function validateScriptPath(path) {
|
|
241
|
+
const validatedPath = validateFilePath(path, {
|
|
242
|
+
allowRelativePaths: true,
|
|
243
|
+
maxLength: 200,
|
|
244
|
+
allowedExtensions: [
|
|
245
|
+
'.sh',
|
|
246
|
+
'.bash',
|
|
247
|
+
'.zsh',
|
|
248
|
+
'.fish',
|
|
249
|
+
'.py',
|
|
250
|
+
'.js',
|
|
251
|
+
'.mjs',
|
|
252
|
+
'.ts',
|
|
253
|
+
],
|
|
254
|
+
mustExist: true,
|
|
255
|
+
});
|
|
256
|
+
// Additional checks for script execution safety
|
|
257
|
+
try {
|
|
258
|
+
const stats = statSync(validatedPath);
|
|
259
|
+
// Check if it's executable (on Unix-like systems)
|
|
260
|
+
if (process.platform !== 'win32') {
|
|
261
|
+
const mode = stats.mode;
|
|
262
|
+
if (!(mode & parseInt('0100', 8))) {
|
|
263
|
+
// Check if owner has execute permission
|
|
264
|
+
throw new ValidationError('Script file is not executable');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
if (error instanceof ValidationError) {
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
throw new ValidationError(`Cannot verify script permissions: ${validatedPath}`);
|
|
273
|
+
}
|
|
274
|
+
return validatedPath;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Validate service list format (service:type or service)
|
|
278
|
+
*/
|
|
279
|
+
export function validateServices(services) {
|
|
280
|
+
if (!Array.isArray(services)) {
|
|
281
|
+
throw new ValidationError('Services must be an array');
|
|
282
|
+
}
|
|
283
|
+
if (services.length === 0) {
|
|
284
|
+
throw new ValidationError('At least one service is required');
|
|
285
|
+
}
|
|
286
|
+
if (services.length > 10) {
|
|
287
|
+
throw new ValidationError('Too many services (max 10)');
|
|
288
|
+
}
|
|
289
|
+
return services.map((serviceStr, index) => {
|
|
290
|
+
if (!serviceStr || typeof serviceStr !== 'string') {
|
|
291
|
+
throw new ValidationError(`Service at index ${index} is invalid`);
|
|
292
|
+
}
|
|
293
|
+
const trimmed = serviceStr.trim();
|
|
294
|
+
const parts = trimmed.split(':');
|
|
295
|
+
if (parts.length === 1) {
|
|
296
|
+
// Format: service (use same name for type)
|
|
297
|
+
const service = validateServiceName(parts[0]);
|
|
298
|
+
const type = validateServiceType(parts[0]);
|
|
299
|
+
return { service, type };
|
|
300
|
+
}
|
|
301
|
+
else if (parts.length === 2) {
|
|
302
|
+
// Format: service:type
|
|
303
|
+
const service = validateServiceName(parts[0]);
|
|
304
|
+
const type = validateServiceType(parts[1]);
|
|
305
|
+
return { service, type };
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
throw new ValidationError(`Invalid service format at index ${index}. Use 'service' or 'service:type'`);
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Validate template file path
|
|
314
|
+
*/
|
|
315
|
+
export function validateTemplatePath(path) {
|
|
316
|
+
return validateFilePath(path, {
|
|
317
|
+
allowRelativePaths: true,
|
|
318
|
+
allowedExtensions: ['.devports', '.env', '.template', '.tmpl'],
|
|
319
|
+
mustExist: true,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Validate output file path
|
|
324
|
+
*/
|
|
325
|
+
export function validateOutputPath(path) {
|
|
326
|
+
return validateFilePath(path, {
|
|
327
|
+
allowRelativePaths: true,
|
|
328
|
+
mustExist: false,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Safe string for display/logging that removes dangerous characters
|
|
333
|
+
*/
|
|
334
|
+
export function sanitizeForDisplay(input, maxLength = 100) {
|
|
335
|
+
if (!input || typeof input !== 'string') {
|
|
336
|
+
return '';
|
|
337
|
+
}
|
|
338
|
+
// Remove control characters and limit length
|
|
339
|
+
return (input
|
|
340
|
+
// eslint-disable-next-line no-control-regex
|
|
341
|
+
.replace(/[\x00-\x1F\x7F]/g, '') // Remove control characters
|
|
342
|
+
.substring(0, maxLength));
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure worktree operations with input validation and safe command execution
|
|
3
|
+
*/
|
|
4
|
+
interface WorktreeOptions {
|
|
5
|
+
envFile?: string | null;
|
|
6
|
+
services?: string[];
|
|
7
|
+
template?: string;
|
|
8
|
+
postHook?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Secure version of createWorktree with input validation and safe command execution
|
|
12
|
+
*/
|
|
13
|
+
export declare function createWorktree(path: string, branch: string, options?: WorktreeOptions): Promise<{
|
|
14
|
+
worktreePath: string;
|
|
15
|
+
ports: Record<string, number>;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Secure version of removeWorktree with input validation
|
|
19
|
+
*/
|
|
20
|
+
export declare function removeWorktree(path: string, options?: {
|
|
21
|
+
force?: boolean;
|
|
22
|
+
}): Promise<number>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAkKlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
|