@prauga/flexdoc-backend 2.9.0 → 2.9.5

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.
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const http = __importStar(require("http"));
37
+ const host_execution_1 = require("./host-execution");
38
+ const host_execution_route_1 = require("./host-execution-route");
39
+ function headers(contentType = 'application/json') {
40
+ return { 'content-type': contentType, 'x-flexdoc-execute': '1' };
41
+ }
42
+ function sessionCookie(result) {
43
+ return (result.headers['Set-Cookie'] || '').split(';', 1)[0];
44
+ }
45
+ describe('host execution HTTP protocol', () => {
46
+ it('parses multipart descriptor and indexed browser file parts', () => {
47
+ const boundary = 'flexdoc-test-boundary';
48
+ const descriptor = JSON.stringify({ request: { method: 'POST', url: 'https://api.example.test/upload', bodyMode: 'formdata', formData: [{ key: 'photo', type: 'file', enabled: true }] } });
49
+ const body = Buffer.concat([
50
+ Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="descriptor"\r\n\r\n${descriptor}\r\n`),
51
+ Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="formData[0]"; filename="photo.txt"\r\nContent-Type: text/plain\r\n\r\n`),
52
+ Buffer.from('hello-file'),
53
+ Buffer.from(`\r\n--${boundary}--\r\n`),
54
+ ]);
55
+ const parsed = (0, host_execution_route_1.parseHostExecutionRequestBody)(`multipart/form-data; boundary=${boundary}`, body);
56
+ expect(parsed.request.bodyMode).toBe('formdata');
57
+ expect(parsed.formDataFiles?.get(0)).toMatchObject({ name: 'photo.txt', contentType: 'text/plain' });
58
+ expect(parsed.formDataFiles?.get(0)?.data.toString()).toBe('hello-file');
59
+ });
60
+ it('requires the renderer custom header', async () => {
61
+ const state = (0, host_execution_1.createHostExecutionState)({ allowedOrigins: ['https://api.example.test'] });
62
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({ state, spec: {}, headers: { 'content-type': 'application/json' }, body: { request: { method: 'GET', url: 'https://api.example.test' } } });
63
+ expect(result.status).toBe(403);
64
+ });
65
+ it('resolves relative OpenAPI servers against the documentation request origin', async () => {
66
+ const server = http.createServer((_request, response) => response.end('same-origin'));
67
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
68
+ const address = server.address();
69
+ if (!address || typeof address === 'string')
70
+ throw new Error('test server address unavailable');
71
+ const origin = `http://127.0.0.1:${address.port}`;
72
+ try {
73
+ const state = (0, host_execution_1.createHostExecutionState)(true);
74
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({
75
+ state,
76
+ spec: { servers: [{ url: '/' }] },
77
+ headers: headers(),
78
+ body: { request: { method: 'GET', url: `${origin}/ping` } },
79
+ docsOrigin: origin,
80
+ });
81
+ expect(result.status).toBe(200);
82
+ expect(JSON.parse(result.body).body).toBe('same-origin');
83
+ expect([...(0, host_execution_1.allowedHostExecutionOrigins)(state, { servers: [{ url: 'https://api.example.test' }] }, origin)]).toEqual(['https://api.example.test']);
84
+ }
85
+ finally {
86
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
87
+ }
88
+ });
89
+ it('derives the docs origin without trusting an arbitrary renderer draft header', () => {
90
+ expect((0, host_execution_route_1.hostExecutionRequestOrigin)({ headers: { host: 'docs.example.test:8443' }, protocol: 'https' })).toBe('https://docs.example.test:8443');
91
+ expect((0, host_execution_route_1.hostExecutionRequestOrigin)({ headers: {}, url: 'https://docs.example.test/docs/__flexdoc/execute' })).toBe('https://docs.example.test');
92
+ expect((0, host_execution_route_1.hostExecutionRequestOrigin)({ headers: { host: 'docs.example.test' }, protocol: 'ftp' })).toBeUndefined();
93
+ });
94
+ it('rejects DNS answers that resolve to metadata or link-local addresses', () => {
95
+ expect(() => (0, host_execution_1.assertHostExecutionResolvedAddressAllowed)('169.254.169.254')).toThrow('DNS resolutions');
96
+ expect(() => (0, host_execution_1.assertHostExecutionResolvedAddressAllowed)('fe80::a9fe:a9fe')).toThrow('DNS resolutions');
97
+ expect(() => (0, host_execution_1.assertHostExecutionResolvedAddressAllowed)('::ffff:169.254.169.254')).toThrow('DNS resolutions');
98
+ expect(() => (0, host_execution_1.assertHostExecutionResolvedAddressAllowed)('10.0.0.10')).not.toThrow();
99
+ });
100
+ it('rejects public-suffix cookie domains while allowing registrable parent domains', () => {
101
+ expect((0, host_execution_1.isCookieDomainAllowed)('api.example.com', 'example.com')).toBe(true);
102
+ expect((0, host_execution_1.isCookieDomainAllowed)('foo.com', 'com')).toBe(false);
103
+ expect((0, host_execution_1.isCookieDomainAllowed)('foo.example.co.uk', 'co.uk')).toBe(false);
104
+ expect((0, host_execution_1.isCookieDomainAllowed)('bucket.s3.amazonaws.com', 's3.amazonaws.com')).toBe(false);
105
+ expect((0, host_execution_1.isCookieDomainAllowed)('api.example.com', 'other.com')).toBe(false);
106
+ expect((0, host_execution_1.isCookieDomainAllowed)('127.0.0.1', '127.0.0.1')).toBe(false);
107
+ });
108
+ it('rejects response cookies whose Domain does not match the response host', async () => {
109
+ const server = http.createServer((_request, response) => {
110
+ response.setHeader('Set-Cookie', 'sid=abc; Domain=example.com; Path=/');
111
+ response.end('ok');
112
+ });
113
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
114
+ const address = server.address();
115
+ if (!address || typeof address === 'string')
116
+ throw new Error('test server address unavailable');
117
+ const origin = `http://127.0.0.1:${address.port}`;
118
+ try {
119
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({
120
+ state: (0, host_execution_1.createHostExecutionState)({ allowedOrigins: [origin] }),
121
+ spec: {},
122
+ headers: headers(),
123
+ body: { request: { method: 'GET', url: origin }, cookieJar: 'session' },
124
+ });
125
+ expect(result.status).toBe(200);
126
+ expect(JSON.parse(result.body).cookies).toEqual([]);
127
+ }
128
+ finally {
129
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
130
+ }
131
+ });
132
+ it('rejects metadata and unlisted origins before network execution', async () => {
133
+ const metadataState = (0, host_execution_1.createHostExecutionState)({ allowedOrigins: ['http://169.254.169.254'] });
134
+ const metadata = await (0, host_execution_route_1.runHostExecutionRoute)({ state: metadataState, spec: {}, headers: headers(), body: { request: { method: 'GET', url: 'http://169.254.169.254/latest/meta-data' } } });
135
+ expect(metadata.status).toBe(403);
136
+ expect(metadata.body).toContain('metadata');
137
+ const state = (0, host_execution_1.createHostExecutionState)({ allowedOrigins: ['https://api.example.test'] });
138
+ const random = await (0, host_execution_route_1.runHostExecutionRoute)({ state, spec: {}, headers: headers(), body: { request: { method: 'GET', url: 'https://other.example.test' } } });
139
+ expect(random.status).toBe(403);
140
+ expect(random.body).toContain('not allowed');
141
+ });
142
+ it('executes an explicitly allowed origin and keeps a cookie jar isolated by signed docs session', async () => {
143
+ const server = http.createServer((request, response) => {
144
+ if (request.url === '/set') {
145
+ response.setHeader('Set-Cookie', 'sid=abc; Path=/; HttpOnly');
146
+ response.end('set');
147
+ return;
148
+ }
149
+ response.setHeader('Content-Type', 'application/json');
150
+ response.end(JSON.stringify({ cookie: request.headers.cookie || '' }));
151
+ });
152
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
153
+ const address = server.address();
154
+ if (!address || typeof address === 'string')
155
+ throw new Error('test server address unavailable');
156
+ const origin = `http://127.0.0.1:${address.port}`;
157
+ const state = (0, host_execution_1.createHostExecutionState)({ allowedOrigins: [origin] });
158
+ try {
159
+ const first = await (0, host_execution_route_1.runHostExecutionRoute)({
160
+ state,
161
+ spec: {},
162
+ headers: headers(),
163
+ body: { request: { method: 'GET', url: `${origin}/set` }, cookieJar: 'session' },
164
+ });
165
+ expect(first.status).toBe(200);
166
+ const firstSnapshot = JSON.parse(first.body);
167
+ expect(firstSnapshot.status).toBe(200);
168
+ expect(firstSnapshot.cookies).toEqual(expect.arrayContaining([expect.objectContaining({ name: 'sid', value: 'abc', httpOnly: true })]));
169
+ const cookie = sessionCookie(first);
170
+ expect(cookie).toContain('__flexdoc_session=');
171
+ const second = await (0, host_execution_route_1.runHostExecutionRoute)({
172
+ state,
173
+ spec: {},
174
+ headers: { ...headers(), cookie },
175
+ body: { request: { method: 'GET', url: `${origin}/echo` }, cookieJar: 'session' },
176
+ });
177
+ expect(second.status).toBe(200);
178
+ expect(JSON.parse(JSON.parse(second.body).body)).toEqual({ cookie: 'sid=abc' });
179
+ const isolated = await (0, host_execution_route_1.runHostExecutionRoute)({
180
+ state,
181
+ spec: {},
182
+ headers: headers(),
183
+ body: { request: { method: 'GET', url: `${origin}/echo` }, cookieJar: 'session' },
184
+ });
185
+ expect(JSON.parse(JSON.parse(isolated.body).body)).toEqual({ cookie: '' });
186
+ }
187
+ finally {
188
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
189
+ }
190
+ });
191
+ it('decodes binary bodyBase64 on the host path', async () => {
192
+ const server = http.createServer((request, response) => {
193
+ const chunks = [];
194
+ request.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
195
+ request.on('end', () => response.end(Buffer.concat(chunks).toString('hex')));
196
+ });
197
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
198
+ const address = server.address();
199
+ if (!address || typeof address === 'string')
200
+ throw new Error('test server address unavailable');
201
+ const origin = `http://127.0.0.1:${address.port}`;
202
+ try {
203
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({
204
+ state: (0, host_execution_1.createHostExecutionState)({ allowedOrigins: [origin] }),
205
+ spec: {},
206
+ headers: headers(),
207
+ body: { request: { method: 'POST', url: origin, bodyMode: 'binary', binary: { fileName: 'blob.bin', contentType: 'application/octet-stream' } }, bodyBase64: Buffer.from([0, 1, 2, 255]).toString('base64') },
208
+ });
209
+ expect(result.status).toBe(200);
210
+ expect(JSON.parse(result.body).body).toBe('000102ff');
211
+ }
212
+ finally {
213
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
214
+ }
215
+ });
216
+ it('keeps host execution off unless the docs host explicitly opts in', () => {
217
+ expect((0, host_execution_1.createHostExecutionState)(undefined).enabled).toBe(false);
218
+ expect((0, host_execution_1.createHostExecutionState)(false).enabled).toBe(false);
219
+ expect((0, host_execution_1.createHostExecutionState)(true).enabled).toBe(true);
220
+ expect((0, host_execution_1.createHostExecutionState)({}).enabled).toBe(true);
221
+ expect((0, host_execution_1.createHostExecutionState)({ enabled: false }).enabled).toBe(false);
222
+ });
223
+ it('does not allocate a cookie session for ordinary host execution', async () => {
224
+ const server = http.createServer((_request, response) => response.end('ok'));
225
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
226
+ const address = server.address();
227
+ if (!address || typeof address === 'string')
228
+ throw new Error('test server address unavailable');
229
+ const origin = `http://127.0.0.1:${address.port}`;
230
+ const state = (0, host_execution_1.createHostExecutionState)({ allowedOrigins: [origin] });
231
+ try {
232
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({
233
+ state,
234
+ spec: {},
235
+ headers: headers(),
236
+ body: { request: { method: 'GET', url: origin } },
237
+ });
238
+ expect(result.status).toBe(200);
239
+ expect(result.headers['Set-Cookie']).toBeUndefined();
240
+ expect(state.jars.size).toBe(0);
241
+ }
242
+ finally {
243
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
244
+ }
245
+ });
246
+ it('bounds signed cookie-jar sessions', () => {
247
+ const state = (0, host_execution_1.createHostExecutionState)(true);
248
+ for (let index = 0; index < 1050; index += 1)
249
+ (0, host_execution_1.ensureHostExecutionSession)(state);
250
+ expect(state.jars.size).toBeLessThanOrEqual(1000);
251
+ });
252
+ it('rejects cross-origin redirects even when both origins are allowlisted', async () => {
253
+ let redirectedAuthorization;
254
+ const target = http.createServer((request, response) => {
255
+ redirectedAuthorization = request.headers.authorization;
256
+ response.end('unexpected');
257
+ });
258
+ await new Promise((resolve) => target.listen(0, '127.0.0.1', resolve));
259
+ const targetAddress = target.address();
260
+ if (!targetAddress || typeof targetAddress === 'string')
261
+ throw new Error('target server address unavailable');
262
+ const targetOrigin = `http://127.0.0.1:${targetAddress.port}`;
263
+ const source = http.createServer((_request, response) => {
264
+ response.statusCode = 302;
265
+ response.setHeader('Location', `${targetOrigin}/redirected`);
266
+ response.end();
267
+ });
268
+ await new Promise((resolve) => source.listen(0, '127.0.0.1', resolve));
269
+ const sourceAddress = source.address();
270
+ if (!sourceAddress || typeof sourceAddress === 'string')
271
+ throw new Error('source server address unavailable');
272
+ const sourceOrigin = `http://127.0.0.1:${sourceAddress.port}`;
273
+ try {
274
+ const result = await (0, host_execution_route_1.runHostExecutionRoute)({
275
+ state: (0, host_execution_1.createHostExecutionState)({ allowedOrigins: [sourceOrigin, targetOrigin] }),
276
+ spec: {},
277
+ headers: headers(),
278
+ body: { request: { method: 'GET', url: `${sourceOrigin}/start`, auth: { type: 'bearer', token: 'secret-token' } } },
279
+ });
280
+ expect(result.status).toBe(403);
281
+ expect(result.body).toContain('cross-origin redirects');
282
+ expect(redirectedAuthorization).toBeUndefined();
283
+ }
284
+ finally {
285
+ await new Promise((resolve, reject) => source.close((error) => error ? reject(error) : resolve()));
286
+ await new Promise((resolve, reject) => target.close((error) => error ? reject(error) : resolve()));
287
+ }
288
+ });
289
+ });
290
+ //# sourceMappingURL=host-execution-route.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-execution-route.test.js","sourceRoot":"","sources":["../src/host-execution-route.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import type { FlexDocHostExecutionCapability, FlexDocHostExecutionOptions, FlexDocHostExecutionPublicOptions } from './interfaces';
2
+ type HeaderEntry = [string, string];
3
+ type HostAuth = {
4
+ type?: 'none' | 'inherit';
5
+ } | {
6
+ type: 'bearer';
7
+ token?: string;
8
+ } | {
9
+ type: 'oauth2';
10
+ accessToken?: string;
11
+ } | {
12
+ type: 'basic';
13
+ username?: string;
14
+ password?: string;
15
+ } | {
16
+ type: 'apiKey';
17
+ key?: string;
18
+ value?: string;
19
+ in?: 'header' | 'query' | 'cookie';
20
+ } | {
21
+ type: 'digest';
22
+ username?: string;
23
+ password?: string;
24
+ } | {
25
+ type: 'hawk';
26
+ id?: string;
27
+ key?: string;
28
+ algorithm?: 'sha1' | 'sha256';
29
+ ext?: string;
30
+ } | {
31
+ type: 'ntlm';
32
+ username?: string;
33
+ password?: string;
34
+ domain?: string;
35
+ workstation?: string;
36
+ } | {
37
+ type: 'oauth1';
38
+ consumerKey?: string;
39
+ consumerSecret?: string;
40
+ token?: string;
41
+ tokenSecret?: string;
42
+ signatureMethod?: 'HMAC-SHA1' | 'HMAC-SHA256' | 'PLAINTEXT';
43
+ realm?: string;
44
+ } | {
45
+ type: 'awsv4';
46
+ accessKey?: string;
47
+ secretKey?: string;
48
+ sessionToken?: string;
49
+ region?: string;
50
+ service?: string;
51
+ };
52
+ export interface HostExecutionRequestDraft {
53
+ method?: string;
54
+ url?: string;
55
+ query?: Array<{
56
+ key?: string;
57
+ value?: string;
58
+ enabled?: boolean;
59
+ }>;
60
+ headers?: Array<{
61
+ key?: string;
62
+ value?: string;
63
+ enabled?: boolean;
64
+ }>;
65
+ body?: string;
66
+ contentType?: string;
67
+ bodyMode?: 'none' | 'raw' | 'json' | 'urlencoded' | 'formdata' | 'binary' | 'graphql';
68
+ urlencoded?: Array<{
69
+ key?: string;
70
+ value?: string;
71
+ enabled?: boolean;
72
+ }>;
73
+ formData?: Array<{
74
+ key?: string;
75
+ value?: string;
76
+ enabled?: boolean;
77
+ type?: 'text' | 'file';
78
+ fileName?: string;
79
+ contentType?: string;
80
+ }>;
81
+ binary?: {
82
+ fileName?: string;
83
+ contentType?: string;
84
+ };
85
+ graphql?: {
86
+ query?: string;
87
+ variables?: string;
88
+ };
89
+ auth?: HostAuth;
90
+ }
91
+ export interface HostExecutionEnvelope {
92
+ request: HostExecutionRequestDraft;
93
+ certificateId?: string;
94
+ cookieJar?: 'session';
95
+ timeoutMs?: number;
96
+ bodyBase64?: string;
97
+ }
98
+ export interface HostExecutionUploadedFile {
99
+ name: string;
100
+ contentType?: string;
101
+ data: Buffer;
102
+ }
103
+ export interface ParsedHostExecutionEnvelope extends HostExecutionEnvelope {
104
+ formDataFiles?: Map<number, HostExecutionUploadedFile>;
105
+ }
106
+ export interface HostExecutionResponse {
107
+ status: number;
108
+ statusText: string;
109
+ headers: HeaderEntry[];
110
+ body: string;
111
+ responseTime: number;
112
+ cookies?: Array<{
113
+ name: string;
114
+ value: string;
115
+ domain?: string;
116
+ path?: string;
117
+ httpOnly?: boolean;
118
+ }>;
119
+ error?: string;
120
+ }
121
+ interface CookieRecord {
122
+ name: string;
123
+ value: string;
124
+ domain: string;
125
+ path: string;
126
+ hostOnly: boolean;
127
+ secure: boolean;
128
+ httpOnly: boolean;
129
+ expiresAt?: number;
130
+ }
131
+ export declare class HostExecutionForbiddenError extends Error {
132
+ }
133
+ export declare class HostExecutionUnsupportedError extends Error {
134
+ }
135
+ export declare class HostExecutionBadRequestError extends Error {
136
+ }
137
+ export interface HostExecutionState {
138
+ enabled: boolean;
139
+ options: FlexDocHostExecutionOptions;
140
+ capabilities: FlexDocHostExecutionCapability[];
141
+ certificates: Map<string, {
142
+ id: string;
143
+ name: string;
144
+ cert: string;
145
+ key: string;
146
+ passphrase?: string;
147
+ }>;
148
+ sessionSecret: Buffer;
149
+ jars: Map<string, CookieRecord[]>;
150
+ }
151
+ export declare function createHostExecutionState(value: boolean | FlexDocHostExecutionOptions | undefined): HostExecutionState;
152
+ export declare function publicHostExecutionOptions(state: HostExecutionState, rendererBasePath: string): FlexDocHostExecutionPublicOptions | undefined;
153
+ export declare function ensureHostExecutionSession(state: HostExecutionState, cookieHeader?: string): {
154
+ sessionId: string;
155
+ setCookie?: string;
156
+ };
157
+ export declare function isCookieDomainAllowed(responseHostname: string, candidateDomain: string): boolean;
158
+ export declare function publicCookiesForSession(state: HostExecutionState, sessionId: string): HostExecutionResponse['cookies'];
159
+ export declare function clearCookiesForSession(state: HostExecutionState, sessionId: string): void;
160
+ export declare function allowedHostExecutionOrigins(state: HostExecutionState, spec: any, docsOrigin?: string): Set<string>;
161
+ export declare function assertHostExecutionUrlAllowed(url: URL, allowedOrigins: Set<string>): void;
162
+ export declare function assertHostExecutionResolvedAddressAllowed(address: string): void;
163
+ export declare function executeHostRequest(state: HostExecutionState, envelope: ParsedHostExecutionEnvelope, context: {
164
+ spec: any;
165
+ sessionId: string;
166
+ docsOrigin?: string;
167
+ }): Promise<HostExecutionResponse>;
168
+ export {};