mcp4openapi 0.2.6 → 0.2.8
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/README.md +4 -0
- package/dist/src/generated-schemas.d.ts +36 -0
- package/dist/src/generated-schemas.d.ts.map +1 -1
- package/dist/src/generated-schemas.js +3 -1
- package/dist/src/generated-schemas.js.map +1 -1
- package/dist/src/http-transport.d.ts.map +1 -1
- package/dist/src/http-transport.js +34 -11
- package/dist/src/http-transport.js.map +1 -1
- package/dist/src/index.js +25 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/interceptors.d.ts.map +1 -1
- package/dist/src/interceptors.js +6 -6
- package/dist/src/interceptors.js.map +1 -1
- package/dist/src/logger.d.ts +0 -12
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +67 -75
- package/dist/src/logger.js.map +1 -1
- package/dist/src/mcp-server.d.ts +15 -2
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +130 -11
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/naming-warnings.js +6 -6
- package/dist/src/naming-warnings.js.map +1 -1
- package/dist/src/proxy-executor.d.ts +17 -2
- package/dist/src/proxy-executor.d.ts.map +1 -1
- package/dist/src/proxy-executor.js +298 -48
- package/dist/src/proxy-executor.js.map +1 -1
- package/dist/src/testing/listen-support.d.ts +3 -0
- package/dist/src/testing/listen-support.d.ts.map +1 -0
- package/dist/src/testing/listen-support.js +50 -0
- package/dist/src/testing/listen-support.js.map +1 -0
- package/dist/src/testing/mock-youtrack-server.d.ts.map +1 -1
- package/dist/src/testing/mock-youtrack-server.js +14 -0
- package/dist/src/testing/mock-youtrack-server.js.map +1 -1
- package/dist/src/types/profile.d.ts +18 -0
- package/dist/src/types/profile.d.ts.map +1 -1
- package/package.json +1 -1
- package/profile-schema.json +12 -0
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { ProxyDownloadOperation } from './types/profile.js';
|
|
9
9
|
import type { ResponseContext, AuthCredentials } from './interceptors.js';
|
|
10
|
+
export interface DebugLogger {
|
|
11
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
12
|
+
warn?(message: string, context?: Record<string, unknown>): void;
|
|
13
|
+
}
|
|
10
14
|
export interface HttpClient {
|
|
11
15
|
request(method: string, url: string, options?: {
|
|
12
16
|
headers?: Record<string, string>;
|
|
@@ -28,7 +32,8 @@ export interface ProxyDownloadResult {
|
|
|
28
32
|
}
|
|
29
33
|
export declare class ProxyDownloadExecutor {
|
|
30
34
|
private httpClient;
|
|
31
|
-
|
|
35
|
+
private logger;
|
|
36
|
+
constructor(httpClient: HttpClient, logger?: DebugLogger);
|
|
32
37
|
/**
|
|
33
38
|
* Execute proxy download operation
|
|
34
39
|
*
|
|
@@ -51,7 +56,9 @@ export declare class ProxyDownloadExecutor {
|
|
|
51
56
|
private extractNestedString;
|
|
52
57
|
private extractNestedNumber;
|
|
53
58
|
private extractNestedValue;
|
|
54
|
-
private
|
|
59
|
+
private getBaseOrigin;
|
|
60
|
+
private resolveHttpUrl;
|
|
61
|
+
private enforceDownloadPolicy;
|
|
55
62
|
/**
|
|
56
63
|
* Check if MIME type matches whitelist (supports wildcards like 'image/*')
|
|
57
64
|
*/
|
|
@@ -63,6 +70,14 @@ export declare class ProxyDownloadExecutor {
|
|
|
63
70
|
* Metadata endpoint still requires auth, only the final download is unauthenticated
|
|
64
71
|
*/
|
|
65
72
|
private downloadWithAuth;
|
|
73
|
+
private buildDownloadUrlWithOptionalQueryAuth;
|
|
74
|
+
private isRedirectStatus;
|
|
75
|
+
private resolveRedirectTarget;
|
|
76
|
+
private enforceAllowedDownloadTarget;
|
|
77
|
+
private lookupAllIpAddresses;
|
|
78
|
+
private isAllowedHost;
|
|
79
|
+
private isDisallowedIPv4;
|
|
80
|
+
private isDisallowedIPv6;
|
|
66
81
|
/**
|
|
67
82
|
* Handle inline data URLs (data:mime;base64,...)
|
|
68
83
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-executor.d.ts","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy-executor.d.ts","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAK1E,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,UAAU,IAAI,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAEhB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IAEb,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,MAAM;gBADN,UAAU,EAAE,UAAU,EACtB,MAAM,GAAE,WAAiC;IAGnD;;;;;;OAMG;IACG,OAAO,CACX,SAAS,EAAE,sBAAsB,EACjC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACjD,eAAe,EAAE,eAAe,EAChC,qBAAqB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,mBAAmB,CAAC;IA6H/B,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;YA6CR,qBAAqB;IAuBnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;OAKG;YACW,gBAAgB;IAqG9B,OAAO,CAAC,qCAAqC;IAiB7C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,qBAAqB;YAef,4BAA4B;YAsE5B,oBAAoB;IAkClC,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAa5B"}
|
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
* and returns base64-encoded result.
|
|
7
7
|
*/
|
|
8
8
|
import { NetworkError, ValidationError } from './errors.js';
|
|
9
|
+
import { isIP } from 'node:net';
|
|
10
|
+
import { lookup } from 'node:dns/promises';
|
|
9
11
|
const DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB
|
|
10
12
|
const DEFAULT_TIMEOUT = 30000; // 30s
|
|
13
|
+
const MAX_REDIRECTS = 5;
|
|
11
14
|
export class ProxyDownloadExecutor {
|
|
12
|
-
constructor(httpClient) {
|
|
15
|
+
constructor(httpClient, logger = { debug: () => { } }) {
|
|
13
16
|
this.httpClient = httpClient;
|
|
17
|
+
this.logger = logger;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* Execute proxy download operation
|
|
@@ -23,6 +27,7 @@ export class ProxyDownloadExecutor {
|
|
|
23
27
|
const maxSize = this.resolveMaxSize(operation);
|
|
24
28
|
const timeout = operation.timeout_ms ?? DEFAULT_TIMEOUT;
|
|
25
29
|
const urlField = operation.url_field ?? 'url';
|
|
30
|
+
const baseOrigin = this.getBaseOrigin();
|
|
26
31
|
// Step 1: Fetch metadata
|
|
27
32
|
const metadataResponse = await this.httpClient.request(metadataRequest.method, metadataRequest.path);
|
|
28
33
|
const metadata = metadataResponse.body;
|
|
@@ -38,9 +43,9 @@ export class ProxyDownloadExecutor {
|
|
|
38
43
|
'application/octet-stream';
|
|
39
44
|
// Step 2A: Direct download endpoint path (preferred when configured)
|
|
40
45
|
if (directDownloadRequest) {
|
|
41
|
-
const downloadUrl = this.buildAbsoluteUrl(directDownloadRequest.path);
|
|
42
46
|
const skipAuth = operation.skip_auth ?? false;
|
|
43
|
-
const
|
|
47
|
+
const downloadUrl = this.resolveHttpUrl(directDownloadRequest.path);
|
|
48
|
+
const { content, size, mimeType } = await this.downloadWithAuth(downloadUrl, authCredentials, maxSize, timeout, baseOrigin, skipAuth, directDownloadRequest.method, operation);
|
|
44
49
|
if (reportedSize && reportedSize > maxSize) {
|
|
45
50
|
throw new ValidationError(`File size ${reportedSize} exceeds maximum ${maxSize} bytes`);
|
|
46
51
|
}
|
|
@@ -86,7 +91,8 @@ export class ProxyDownloadExecutor {
|
|
|
86
91
|
};
|
|
87
92
|
}
|
|
88
93
|
const skipAuth = operation.skip_auth ?? false;
|
|
89
|
-
const
|
|
94
|
+
const downloadUrl = this.resolveHttpUrl(url);
|
|
95
|
+
const { content, size, mimeType: responseMime } = await this.downloadWithAuth(downloadUrl, authCredentials, maxSize, timeout, baseOrigin, skipAuth, 'GET', operation);
|
|
90
96
|
return {
|
|
91
97
|
metadata,
|
|
92
98
|
content,
|
|
@@ -145,12 +151,68 @@ export class ProxyDownloadExecutor {
|
|
|
145
151
|
}
|
|
146
152
|
return current;
|
|
147
153
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return
|
|
154
|
+
getBaseOrigin() {
|
|
155
|
+
try {
|
|
156
|
+
return new URL(this.httpClient.getBaseUrl()).origin;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
throw new ValidationError('Invalid API base URL - expected absolute http(s) URL');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
resolveHttpUrl(input) {
|
|
163
|
+
// Absolute URL
|
|
164
|
+
let absoluteUrl;
|
|
165
|
+
try {
|
|
166
|
+
absoluteUrl = new URL(input);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
this.logger.debug('resolveHttpUrl: input is not an absolute URL, resolving relative', {
|
|
170
|
+
error: error instanceof Error ? error.message : String(error),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (absoluteUrl) {
|
|
174
|
+
if (absoluteUrl.protocol === 'http:' || absoluteUrl.protocol === 'https:') {
|
|
175
|
+
return absoluteUrl.toString();
|
|
176
|
+
}
|
|
177
|
+
throw new ValidationError(`Unsupported download URL scheme: '${absoluteUrl.protocol}'`);
|
|
151
178
|
}
|
|
152
179
|
const baseUrl = this.httpClient.getBaseUrl();
|
|
153
|
-
|
|
180
|
+
let base;
|
|
181
|
+
try {
|
|
182
|
+
base = new URL(baseUrl);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
throw new ValidationError('Invalid API base URL - expected absolute http(s) URL');
|
|
186
|
+
}
|
|
187
|
+
if (base.protocol !== 'http:' && base.protocol !== 'https:') {
|
|
188
|
+
throw new ValidationError(`Unsupported API base URL scheme: '${base.protocol}'`);
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
if (input.startsWith('/')) {
|
|
192
|
+
// Preserve base URL path segments (e.g., https://host/api/v4 + /projects -> https://host/api/v4/projects)
|
|
193
|
+
const combined = `${baseUrl.replace(/\/$/, '')}${input}`;
|
|
194
|
+
return new URL(combined).toString();
|
|
195
|
+
}
|
|
196
|
+
// Relative (no leading slash) uses URL resolution semantics
|
|
197
|
+
const baseForRelative = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
|
|
198
|
+
return new URL(input, baseForRelative).toString();
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
throw new ValidationError(`Invalid download URL: '${input}'`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async enforceDownloadPolicy(downloadUrl, baseOrigin, operation, skipAuth) {
|
|
205
|
+
const downloadOrigin = new URL(downloadUrl).origin;
|
|
206
|
+
if (!skipAuth) {
|
|
207
|
+
if (downloadOrigin !== baseOrigin) {
|
|
208
|
+
throw new ValidationError(`Cross-origin download URL not allowed with authentication (base origin '${baseOrigin}', download origin '${downloadOrigin}'). Set skip_auth=true or use a same-origin download endpoint.`);
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// With skip_auth, allow same-origin without additional restrictions
|
|
213
|
+
if (downloadOrigin === baseOrigin)
|
|
214
|
+
return;
|
|
215
|
+
await this.enforceAllowedDownloadTarget(downloadUrl, operation);
|
|
154
216
|
}
|
|
155
217
|
/**
|
|
156
218
|
* Check if MIME type matches whitelist (supports wildcards like 'image/*')
|
|
@@ -170,56 +232,244 @@ export class ProxyDownloadExecutor {
|
|
|
170
232
|
* @param skipAuth If true, download URL is fetched without authentication headers/params
|
|
171
233
|
* Metadata endpoint still requires auth, only the final download is unauthenticated
|
|
172
234
|
*/
|
|
173
|
-
async downloadWithAuth(url, authCredentials, maxSize, timeout, skipAuth = false, method = 'GET') {
|
|
235
|
+
async downloadWithAuth(url, authCredentials, maxSize, timeout, baseOrigin, skipAuth = false, method = 'GET', operation) {
|
|
174
236
|
const controller = new AbortController();
|
|
175
237
|
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
176
238
|
try {
|
|
177
|
-
|
|
178
|
-
let
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
239
|
+
const initialUrl = this.buildDownloadUrlWithOptionalQueryAuth(url, authCredentials, skipAuth);
|
|
240
|
+
let currentUrl = initialUrl;
|
|
241
|
+
let currentMethod = method;
|
|
242
|
+
let currentHeaders = skipAuth ? {} : authCredentials.headers;
|
|
243
|
+
if (operation) {
|
|
244
|
+
await this.enforceDownloadPolicy(currentUrl, baseOrigin, operation, skipAuth);
|
|
245
|
+
}
|
|
246
|
+
for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects++) {
|
|
247
|
+
const response = await fetch(currentUrl, {
|
|
248
|
+
method: currentMethod,
|
|
249
|
+
headers: currentHeaders,
|
|
250
|
+
signal: controller.signal,
|
|
251
|
+
redirect: 'manual',
|
|
252
|
+
});
|
|
253
|
+
if (this.isRedirectStatus(response.status)) {
|
|
254
|
+
if (redirects === MAX_REDIRECTS) {
|
|
255
|
+
throw new NetworkError(`Too many redirects (max ${MAX_REDIRECTS})`);
|
|
256
|
+
}
|
|
257
|
+
const location = response.headers.get('location');
|
|
258
|
+
if (!location) {
|
|
259
|
+
throw new NetworkError(`Redirect without Location header: HTTP ${response.status}`);
|
|
260
|
+
}
|
|
261
|
+
const nextUrl = this.resolveRedirectTarget(currentUrl, location);
|
|
262
|
+
if (operation) {
|
|
263
|
+
// Enforce the same policy on every redirect hop
|
|
264
|
+
await this.enforceDownloadPolicy(nextUrl, baseOrigin, operation, skipAuth);
|
|
265
|
+
}
|
|
266
|
+
const isCrossOrigin = new URL(nextUrl).origin !== new URL(currentUrl).origin;
|
|
267
|
+
if (isCrossOrigin) {
|
|
268
|
+
currentHeaders = {};
|
|
269
|
+
}
|
|
270
|
+
if (response.status === 303 ||
|
|
271
|
+
((response.status === 301 || response.status === 302) &&
|
|
272
|
+
currentMethod !== 'GET' &&
|
|
273
|
+
currentMethod !== 'HEAD')) {
|
|
274
|
+
currentMethod = 'GET';
|
|
275
|
+
}
|
|
276
|
+
currentUrl = nextUrl;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (!response.ok) {
|
|
280
|
+
throw new NetworkError(`Download failed: HTTP ${response.status}`, response.status);
|
|
281
|
+
}
|
|
282
|
+
// Check content-length header
|
|
283
|
+
const contentLength = response.headers.get('content-length');
|
|
284
|
+
if (contentLength && parseInt(contentLength, 10) > maxSize) {
|
|
285
|
+
throw new ValidationError(`File size ${contentLength} exceeds maximum ${maxSize} bytes`);
|
|
286
|
+
}
|
|
287
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
288
|
+
// Final size check
|
|
289
|
+
if (arrayBuffer.byteLength > maxSize) {
|
|
290
|
+
throw new ValidationError(`Downloaded file size ${arrayBuffer.byteLength} exceeds maximum ${maxSize} bytes`);
|
|
186
291
|
}
|
|
292
|
+
// Convert to base64
|
|
293
|
+
const content = Buffer.from(arrayBuffer).toString('base64');
|
|
294
|
+
return {
|
|
295
|
+
content,
|
|
296
|
+
size: arrayBuffer.byteLength,
|
|
297
|
+
mimeType: response.headers.get('content-type') || undefined,
|
|
298
|
+
};
|
|
187
299
|
}
|
|
188
|
-
|
|
189
|
-
method,
|
|
190
|
-
headers: skipAuth ? {} : authCredentials.headers,
|
|
191
|
-
signal: controller.signal,
|
|
192
|
-
});
|
|
193
|
-
if (!response.ok) {
|
|
194
|
-
throw new NetworkError(`Download failed: HTTP ${response.status}`, response.status);
|
|
195
|
-
}
|
|
196
|
-
// Check content-length header
|
|
197
|
-
const contentLength = response.headers.get('content-length');
|
|
198
|
-
if (contentLength && parseInt(contentLength, 10) > maxSize) {
|
|
199
|
-
throw new ValidationError(`File size ${contentLength} exceeds maximum ${maxSize} bytes`);
|
|
200
|
-
}
|
|
201
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
202
|
-
// Final size check
|
|
203
|
-
if (arrayBuffer.byteLength > maxSize) {
|
|
204
|
-
throw new ValidationError(`Downloaded file size ${arrayBuffer.byteLength} exceeds maximum ${maxSize} bytes`);
|
|
205
|
-
}
|
|
206
|
-
// Convert to base64
|
|
207
|
-
const bytes = new Uint8Array(arrayBuffer);
|
|
208
|
-
let binary = '';
|
|
209
|
-
for (let i = 0; i < bytes.byteLength; i++) {
|
|
210
|
-
binary += String.fromCharCode(bytes[i]);
|
|
211
|
-
}
|
|
212
|
-
const content = btoa(binary);
|
|
213
|
-
return {
|
|
214
|
-
content,
|
|
215
|
-
size: arrayBuffer.byteLength,
|
|
216
|
-
mimeType: response.headers.get('content-type') || undefined,
|
|
217
|
-
};
|
|
300
|
+
throw new NetworkError('Download failed: unexpected redirect handling state');
|
|
218
301
|
}
|
|
219
302
|
finally {
|
|
220
303
|
clearTimeout(timeoutId);
|
|
221
304
|
}
|
|
222
305
|
}
|
|
306
|
+
buildDownloadUrlWithOptionalQueryAuth(url, authCredentials, skipAuth) {
|
|
307
|
+
if (skipAuth || !authCredentials.queryParams)
|
|
308
|
+
return url;
|
|
309
|
+
const urlObj = new URL(url);
|
|
310
|
+
const { key, value } = authCredentials.queryParams;
|
|
311
|
+
// Only add if not already present (URL may have pre-signed token)
|
|
312
|
+
if (!urlObj.searchParams.has(key)) {
|
|
313
|
+
urlObj.searchParams.set(key, value);
|
|
314
|
+
}
|
|
315
|
+
return urlObj.toString();
|
|
316
|
+
}
|
|
317
|
+
isRedirectStatus(status) {
|
|
318
|
+
return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
|
|
319
|
+
}
|
|
320
|
+
resolveRedirectTarget(currentUrl, location) {
|
|
321
|
+
let resolved;
|
|
322
|
+
try {
|
|
323
|
+
resolved = new URL(location, currentUrl);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
throw new NetworkError(`Invalid redirect URL: '${location}'`);
|
|
327
|
+
}
|
|
328
|
+
if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:') {
|
|
329
|
+
throw new ValidationError(`Unsupported redirect URL scheme: '${resolved.protocol}'`);
|
|
330
|
+
}
|
|
331
|
+
return resolved.toString();
|
|
332
|
+
}
|
|
333
|
+
async enforceAllowedDownloadTarget(targetUrl, operation) {
|
|
334
|
+
const url = new URL(targetUrl);
|
|
335
|
+
const hostnameRaw = url.hostname.toLowerCase();
|
|
336
|
+
const hostname = hostnameRaw.startsWith('[') && hostnameRaw.endsWith(']')
|
|
337
|
+
? hostnameRaw.slice(1, -1)
|
|
338
|
+
: hostnameRaw;
|
|
339
|
+
const allowPrivateNetwork = operation.allow_private_network ?? false;
|
|
340
|
+
if (operation.allowed_hosts && operation.allowed_hosts.length > 0) {
|
|
341
|
+
if (!this.isAllowedHost(hostname, operation.allowed_hosts)) {
|
|
342
|
+
this.logger.warn?.('proxy_download blocked: host not in allowlist', {
|
|
343
|
+
hostname,
|
|
344
|
+
allowed_hosts: operation.allowed_hosts,
|
|
345
|
+
how_to_fix: "Add hostname to allowed_hosts, or use same-origin download endpoint.",
|
|
346
|
+
});
|
|
347
|
+
throw new ValidationError(`Download host not in allowlist: '${hostname}' (allowed_hosts: ${operation.allowed_hosts.join(', ')})`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (allowPrivateNetwork)
|
|
351
|
+
return;
|
|
352
|
+
if (hostname === 'localhost') {
|
|
353
|
+
this.logger.warn?.('proxy_download blocked: localhost target', {
|
|
354
|
+
hostname,
|
|
355
|
+
how_to_fix: "If you really need localhost, set allow_private_network=true (and consider allowed_hosts).",
|
|
356
|
+
});
|
|
357
|
+
throw new ValidationError('Download hostname not allowed');
|
|
358
|
+
}
|
|
359
|
+
const ipVersion = isIP(hostname);
|
|
360
|
+
if (ipVersion === 4) {
|
|
361
|
+
if (this.isDisallowedIPv4(hostname)) {
|
|
362
|
+
this.logger.warn?.('proxy_download blocked: private/loopback/link-local IPv4 target', {
|
|
363
|
+
hostname,
|
|
364
|
+
how_to_fix: "If you really need private IPs, set allow_private_network=true (and consider allowed_hosts).",
|
|
365
|
+
});
|
|
366
|
+
throw new ValidationError('Download IP not allowed');
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
else if (ipVersion === 6) {
|
|
370
|
+
if (this.isDisallowedIPv6(hostname)) {
|
|
371
|
+
this.logger.warn?.('proxy_download blocked: private/loopback/link-local IPv6 target', {
|
|
372
|
+
hostname,
|
|
373
|
+
how_to_fix: "If you really need private IPs, set allow_private_network=true (and consider allowed_hosts).",
|
|
374
|
+
});
|
|
375
|
+
throw new ValidationError('Download IP not allowed');
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
// Hostname: resolve to all IPs and block if any are private/loopback/link-local (SSRF defense)
|
|
380
|
+
const addresses = await this.lookupAllIpAddresses(hostname);
|
|
381
|
+
const disallowed = addresses.find(address => {
|
|
382
|
+
const family = isIP(address);
|
|
383
|
+
if (family === 4)
|
|
384
|
+
return this.isDisallowedIPv4(address);
|
|
385
|
+
if (family === 6)
|
|
386
|
+
return this.isDisallowedIPv6(address);
|
|
387
|
+
return false;
|
|
388
|
+
});
|
|
389
|
+
if (disallowed) {
|
|
390
|
+
this.logger.warn?.('proxy_download blocked: hostname resolves to private/loopback/link-local IP', {
|
|
391
|
+
hostname,
|
|
392
|
+
resolved_addresses: addresses,
|
|
393
|
+
how_to_fix: "If this hostname must be allowed, set allow_private_network=true and restrict with allowed_hosts.",
|
|
394
|
+
});
|
|
395
|
+
throw new ValidationError('Download hostname resolves to disallowed IP');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
async lookupAllIpAddresses(hostname) {
|
|
400
|
+
const timeoutMs = 1000;
|
|
401
|
+
let results = [];
|
|
402
|
+
try {
|
|
403
|
+
results = (await Promise.race([
|
|
404
|
+
lookup(hostname, { all: true, verbatim: true }),
|
|
405
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`DNS lookup timeout after ${timeoutMs}ms`)), timeoutMs)),
|
|
406
|
+
]));
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
this.logger.warn?.('proxy_download blocked: DNS lookup failed', {
|
|
410
|
+
hostname,
|
|
411
|
+
error: error instanceof Error ? error.message : String(error),
|
|
412
|
+
how_to_fix: "If you need to allow internal hostnames, set allow_private_network=true and restrict with allowed_hosts.",
|
|
413
|
+
});
|
|
414
|
+
throw new ValidationError(`DNS lookup failed for hostname '${hostname}'`);
|
|
415
|
+
}
|
|
416
|
+
const addresses = results.map(r => r.address).filter(Boolean);
|
|
417
|
+
if (addresses.length === 0) {
|
|
418
|
+
this.logger.warn?.('proxy_download blocked: DNS lookup returned no addresses', {
|
|
419
|
+
hostname,
|
|
420
|
+
how_to_fix: "If you need to allow internal hostnames, set allow_private_network=true and restrict with allowed_hosts.",
|
|
421
|
+
});
|
|
422
|
+
throw new ValidationError(`DNS lookup returned no addresses for hostname '${hostname}'`);
|
|
423
|
+
}
|
|
424
|
+
return addresses;
|
|
425
|
+
}
|
|
426
|
+
isAllowedHost(hostname, allowedHosts) {
|
|
427
|
+
const lower = hostname.toLowerCase();
|
|
428
|
+
return allowedHosts.some(patternRaw => {
|
|
429
|
+
const pattern = patternRaw.toLowerCase().trim();
|
|
430
|
+
if (!pattern)
|
|
431
|
+
return false;
|
|
432
|
+
if (pattern.startsWith('*.')) {
|
|
433
|
+
const suffix = pattern.slice(2);
|
|
434
|
+
if (!suffix)
|
|
435
|
+
return false;
|
|
436
|
+
return lower.endsWith(`.${suffix}`);
|
|
437
|
+
}
|
|
438
|
+
return lower === pattern;
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
isDisallowedIPv4(ip) {
|
|
442
|
+
const parts = ip.split('.').map(p => Number(p));
|
|
443
|
+
if (parts.length !== 4 || parts.some(p => !Number.isInteger(p) || p < 0 || p > 255))
|
|
444
|
+
return true;
|
|
445
|
+
const [a, b] = parts;
|
|
446
|
+
if (a === 127)
|
|
447
|
+
return true; // loopback
|
|
448
|
+
if (a === 10)
|
|
449
|
+
return true; // private
|
|
450
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
451
|
+
return true; // private
|
|
452
|
+
if (a === 192 && b === 168)
|
|
453
|
+
return true; // private
|
|
454
|
+
if (a === 169 && b === 254)
|
|
455
|
+
return true; // link-local
|
|
456
|
+
if (a === 0)
|
|
457
|
+
return true; // "this network"
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
isDisallowedIPv6(ip) {
|
|
461
|
+
const normalized = ip.toLowerCase();
|
|
462
|
+
if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1')
|
|
463
|
+
return true; // loopback
|
|
464
|
+
if (normalized === '::' || normalized === '0:0:0:0:0:0:0:0')
|
|
465
|
+
return true; // unspecified
|
|
466
|
+
if (normalized.startsWith('fe8') || normalized.startsWith('fe9') || normalized.startsWith('fea') || normalized.startsWith('feb')) {
|
|
467
|
+
return true; // link-local fe80::/10 (approx by prefix)
|
|
468
|
+
}
|
|
469
|
+
if (normalized.startsWith('fc') || normalized.startsWith('fd'))
|
|
470
|
+
return true; // unique local fc00::/7 (approx by prefix)
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
223
473
|
/**
|
|
224
474
|
* Handle inline data URLs (data:mime;base64,...)
|
|
225
475
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-executor.js","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"proxy-executor.js","sourceRoot":"","sources":["../../src/proxy-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen-support.d.ts","sourceRoot":"","sources":["../../../src/testing/listen-support.ts"],"names":[],"mappings":"AAsDA,eAAO,MAAM,UAAU,SAA8B,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,GAA2C,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { describe } from 'vitest';
|
|
3
|
+
async function detectListenSupport() {
|
|
4
|
+
return await new Promise(resolve => {
|
|
5
|
+
let finished = false;
|
|
6
|
+
const server = http.createServer((_, res) => {
|
|
7
|
+
res.statusCode = 200;
|
|
8
|
+
res.end('ok');
|
|
9
|
+
});
|
|
10
|
+
const done = (result) => {
|
|
11
|
+
if (finished)
|
|
12
|
+
return;
|
|
13
|
+
finished = true;
|
|
14
|
+
clearTimeout(timeoutId);
|
|
15
|
+
try {
|
|
16
|
+
server.close(() => resolve(result));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
resolve(result);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const timeoutId = setTimeout(() => done(false), 500);
|
|
23
|
+
server.once('error', () => done(false));
|
|
24
|
+
server.listen(0, '127.0.0.1', () => {
|
|
25
|
+
const address = server.address();
|
|
26
|
+
if (!address || typeof address !== 'object' || typeof address.port !== 'number') {
|
|
27
|
+
done(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const port = address.port;
|
|
31
|
+
const req = http.get({
|
|
32
|
+
hostname: '127.0.0.1',
|
|
33
|
+
port,
|
|
34
|
+
path: '/',
|
|
35
|
+
timeout: 500,
|
|
36
|
+
}, res => {
|
|
37
|
+
res.resume();
|
|
38
|
+
res.once('end', () => done(res.statusCode === 200));
|
|
39
|
+
});
|
|
40
|
+
req.once('error', () => done(false));
|
|
41
|
+
req.once('timeout', () => {
|
|
42
|
+
req.destroy();
|
|
43
|
+
done(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export const CAN_LISTEN = await detectListenSupport();
|
|
49
|
+
export const describeIfListen = CAN_LISTEN ? describe : describe.skip;
|
|
50
|
+
//# sourceMappingURL=listen-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen-support.js","sourceRoot":"","sources":["../../../src/testing/listen-support.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,KAAK,UAAU,mBAAmB;IAChC,OAAO,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACjC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YAC1C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE;YAC/B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAErD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAQ,OAAe,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACzF,IAAI,CAAC,KAAK,CAAC,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAI,OAAe,CAAC,IAAc,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB;gBACE,QAAQ,EAAE,WAAW;gBACrB,IAAI;gBACJ,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,GAAG;aACb,EACD,GAAG,CAAC,EAAE;gBACJ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC,CACF,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,mBAAmB,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAQ,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-youtrack-server.d.ts","sourceRoot":"","sources":["../../../src/testing/mock-youtrack-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,KAAK,CAAC;AAGzD,QAAA,MAAM,gBAAgB,yBAAyB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC1C;
|
|
1
|
+
{"version":3,"file":"mock-youtrack-server.d.ts","sourceRoot":"","sources":["../../../src/testing/mock-youtrack-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,KAAK,CAAC;AAGzD,QAAA,MAAM,gBAAgB,yBAAyB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC1C;AAiED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,MAAyB,EAClC,UAAU,CAAC,EAAE,eAAe,EAAE,GAC7B,cAAc,EAAE,CAoJlB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,MAAyB,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,qCAG1G;AAED,OAAO,EAAE,gBAAgB,IAAI,0BAA0B,EAAE,CAAC"}
|
|
@@ -16,6 +16,16 @@ const baseArticle = {
|
|
|
16
16
|
};
|
|
17
17
|
const baseTag = { id: 'tag-1', name: 'Bug', color: '#ff0000' };
|
|
18
18
|
const baseUser = { id: 'user-1', login: 'mock-user', fullName: 'Mock User', email: 'user@example.com' };
|
|
19
|
+
const baseProject = { id: 'PROJ', shortName: 'PROJ', name: 'Mock Project', description: 'Mock project description' };
|
|
20
|
+
const baseProjectCustomField = {
|
|
21
|
+
id: 'pcf-1',
|
|
22
|
+
$type: 'ProjectCustomField',
|
|
23
|
+
canBeEmpty: true,
|
|
24
|
+
emptyFieldText: '',
|
|
25
|
+
ordinal: 1,
|
|
26
|
+
isPublic: true,
|
|
27
|
+
field: { id: 'cf-1', name: 'Priority', fieldType: { id: 'ft-1', $type: 'FieldType' } },
|
|
28
|
+
};
|
|
19
29
|
function queryToRecord(searchParams) {
|
|
20
30
|
const entries = {};
|
|
21
31
|
for (const [key, value] of searchParams.entries()) {
|
|
@@ -86,6 +96,10 @@ export function createYoutrackHandlers(baseUrl = DEFAULT_BASE_URL, requestLog) {
|
|
|
86
96
|
})),
|
|
87
97
|
http.get(withBase('/tags'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseTag, requestLog)])),
|
|
88
98
|
http.get(withBase('/tags/:id'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { ...baseTag, id: params.id }, requestLog))),
|
|
99
|
+
http.get(withBase('/admin/projects'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseProject, requestLog)])),
|
|
100
|
+
http.get(withBase('/admin/projects/:id'), ({ request, params }) => HttpResponse.json({ ...createEchoResponse(request, { ...baseProject, id: params.id }, requestLog), customFields: [baseProjectCustomField] })),
|
|
101
|
+
http.get(withBase('/admin/projects/:id/customFields'), ({ request }) => HttpResponse.json([createEchoResponse(request, baseProjectCustomField, requestLog)])),
|
|
102
|
+
http.get(withBase('/admin/projects/:id/customFields/:projectCustomFieldId'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { ...baseProjectCustomField, id: params.projectCustomFieldId }, requestLog))),
|
|
89
103
|
http.get(withBase('/savedQueries'), ({ request }) => HttpResponse.json([createEchoResponse(request, { id: 'q-1' }, requestLog)])),
|
|
90
104
|
http.get(withBase('/agiles'), ({ request }) => HttpResponse.json([createEchoResponse(request, { id: 'agile-1' }, requestLog)])),
|
|
91
105
|
http.get(withBase('/agiles/:id'), ({ request, params }) => HttpResponse.json(createEchoResponse(request, { id: params.id, name: 'Agile Board' }, requestLog))),
|