@prauga/flexdoc-backend 2.9.0 → 2.9.9

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.
Files changed (42) hide show
  1. package/dist/framework-adapters.d.ts +13 -0
  2. package/dist/framework-adapters.js +42 -9
  3. package/dist/framework-adapters.js.map +1 -1
  4. package/dist/framework-adapters.test.js +8 -0
  5. package/dist/framework-adapters.test.js.map +1 -1
  6. package/dist/hono-adapter.d.ts +3 -0
  7. package/dist/hono-adapter.js +65 -7
  8. package/dist/hono-adapter.js.map +1 -1
  9. package/dist/hono-adapter.test.js +20 -6
  10. package/dist/hono-adapter.test.js.map +1 -1
  11. package/dist/host-execution-route.d.ts +29 -0
  12. package/dist/host-execution-route.js +212 -0
  13. package/dist/host-execution-route.js.map +1 -0
  14. package/dist/host-execution-route.test.d.ts +1 -0
  15. package/dist/host-execution-route.test.js +290 -0
  16. package/dist/host-execution-route.test.js.map +1 -0
  17. package/dist/host-execution.d.ts +168 -0
  18. package/dist/host-execution.js +768 -0
  19. package/dist/host-execution.js.map +1 -0
  20. package/dist/index.d.ts +3 -1
  21. package/dist/index.js +9 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/interfaces.d.ts +31 -0
  24. package/dist/page-cache.d.ts +7 -0
  25. package/dist/page-cache.js +35 -0
  26. package/dist/page-cache.js.map +1 -0
  27. package/dist/page-cache.test.d.ts +1 -0
  28. package/dist/page-cache.test.js +43 -0
  29. package/dist/page-cache.test.js.map +1 -0
  30. package/dist/renderer/flexdoc.standalone.css +1 -1
  31. package/dist/renderer/flexdoc.standalone.js +69 -53
  32. package/dist/setup.js +46 -9
  33. package/dist/setup.js.map +1 -1
  34. package/dist/setup.test.js +30 -1
  35. package/dist/setup.test.js.map +1 -1
  36. package/dist/template.d.ts +1 -0
  37. package/dist/template.js +11 -1
  38. package/dist/template.js.map +1 -1
  39. package/dist/template.test.js +25 -0
  40. package/dist/template.test.js.map +1 -1
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hostExecutionRequestOrigin = hostExecutionRequestOrigin;
4
+ exports.parseHostExecutionRequestBody = parseHostExecutionRequestBody;
5
+ exports.readNodeRequestBody = readNodeRequestBody;
6
+ exports.runHostExecutionRoute = runHostExecutionRoute;
7
+ exports.runHostCookiesRoute = runHostCookiesRoute;
8
+ const host_execution_1 = require("./host-execution");
9
+ const MAX_EXECUTION_REQUEST_BYTES = 32 * 1024 * 1024;
10
+ function headerValue(headers, name) {
11
+ const target = name.toLowerCase();
12
+ for (const [key, value] of Object.entries(headers || {})) {
13
+ if (key.toLowerCase() !== target)
14
+ continue;
15
+ return Array.isArray(value) ? value[0] : value;
16
+ }
17
+ return undefined;
18
+ }
19
+ function hostExecutionRequestOrigin(input) {
20
+ if (input.url) {
21
+ try {
22
+ const parsed = new URL(input.url);
23
+ if (parsed.protocol === 'http:' || parsed.protocol === 'https:')
24
+ return parsed.origin;
25
+ }
26
+ catch { }
27
+ }
28
+ const host = headerValue(input.headers, 'Host');
29
+ const protocol = String(input.protocol || '').replace(/:$/, '').toLowerCase();
30
+ if (!host || (protocol !== 'http' && protocol !== 'https'))
31
+ return undefined;
32
+ try {
33
+ return new URL(`${protocol}://${host}`).origin;
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ function asBuffer(value) {
40
+ if (Buffer.isBuffer(value))
41
+ return value;
42
+ if (value instanceof Uint8Array)
43
+ return Buffer.from(value);
44
+ if (typeof value === 'string')
45
+ return Buffer.from(value, 'utf8');
46
+ if (value === undefined || value === null)
47
+ return Buffer.alloc(0);
48
+ return Buffer.from(JSON.stringify(value), 'utf8');
49
+ }
50
+ function jsonObject(value) {
51
+ if (!value || typeof value !== 'object' || Array.isArray(value))
52
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution body must be a JSON object.');
53
+ return value;
54
+ }
55
+ function validateEnvelope(value) {
56
+ const object = jsonObject(value);
57
+ if (!object.request || typeof object.request !== 'object' || Array.isArray(object.request))
58
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution body requires a canonical request draft.');
59
+ return object;
60
+ }
61
+ function multipartBoundary(contentType) {
62
+ const match = /(?:^|;)\s*boundary=(?:"([^"]+)"|([^;\s]+))/i.exec(contentType);
63
+ const boundary = match?.[1] || match?.[2];
64
+ if (!boundary)
65
+ throw new host_execution_1.HostExecutionBadRequestError('Multipart host execution is missing a boundary.');
66
+ if (boundary.length > 200)
67
+ throw new host_execution_1.HostExecutionBadRequestError('Multipart boundary is too long.');
68
+ return boundary;
69
+ }
70
+ function dispositionValue(headers, key) {
71
+ const line = headers.split('\r\n').find((candidate) => candidate.toLowerCase().startsWith('content-disposition:'));
72
+ if (!line)
73
+ return undefined;
74
+ const match = new RegExp(`(?:^|;)\\s*${key}="([^"]*)"`, 'i').exec(line.slice(line.indexOf(':') + 1));
75
+ return match?.[1];
76
+ }
77
+ function partContentType(headers) {
78
+ const line = headers.split('\r\n').find((candidate) => candidate.toLowerCase().startsWith('content-type:'));
79
+ return line ? line.slice(line.indexOf(':') + 1).trim() : undefined;
80
+ }
81
+ function parseHostExecutionRequestBody(contentType, incoming) {
82
+ const mediaType = (contentType || '').split(';', 1)[0].trim().toLowerCase();
83
+ if (mediaType === 'application/json') {
84
+ if (incoming && typeof incoming === 'object' && !Buffer.isBuffer(incoming) && !(incoming instanceof Uint8Array))
85
+ return validateEnvelope(incoming);
86
+ const raw = asBuffer(incoming).toString('utf8').trim();
87
+ if (!raw)
88
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution request body is empty.');
89
+ try {
90
+ return validateEnvelope(JSON.parse(raw));
91
+ }
92
+ catch (error) {
93
+ if (error instanceof host_execution_1.HostExecutionBadRequestError)
94
+ throw error;
95
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution request body is not valid JSON.');
96
+ }
97
+ }
98
+ if (mediaType !== 'multipart/form-data')
99
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution requires application/json or multipart/form-data.');
100
+ const body = asBuffer(incoming);
101
+ const boundary = Buffer.from(`--${multipartBoundary(contentType || '')}`, 'utf8');
102
+ let cursor = body.indexOf(boundary);
103
+ let descriptor;
104
+ const files = new Map();
105
+ while (cursor >= 0) {
106
+ let start = cursor + boundary.length;
107
+ if (body.subarray(start, start + 2).toString('ascii') === '--')
108
+ break;
109
+ if (body.subarray(start, start + 2).toString('ascii') === '\r\n')
110
+ start += 2;
111
+ const next = body.indexOf(boundary, start);
112
+ if (next < 0)
113
+ break;
114
+ let end = next;
115
+ if (body.subarray(end - 2, end).toString('ascii') === '\r\n')
116
+ end -= 2;
117
+ const part = body.subarray(start, end);
118
+ const headerEnd = part.indexOf(Buffer.from('\r\n\r\n', 'ascii'));
119
+ if (headerEnd < 0)
120
+ throw new host_execution_1.HostExecutionBadRequestError('Malformed multipart host execution part.');
121
+ const headers = part.subarray(0, headerEnd).toString('utf8');
122
+ const data = part.subarray(headerEnd + 4);
123
+ const name = dispositionValue(headers, 'name');
124
+ if (name === 'descriptor') {
125
+ try {
126
+ descriptor = validateEnvelope(JSON.parse(data.toString('utf8')));
127
+ }
128
+ catch (error) {
129
+ if (error instanceof host_execution_1.HostExecutionBadRequestError)
130
+ throw error;
131
+ throw new host_execution_1.HostExecutionBadRequestError('Multipart host execution descriptor is not valid JSON.');
132
+ }
133
+ }
134
+ else {
135
+ const match = /^formData\[(\d+)\]$/.exec(name || '');
136
+ if (match)
137
+ files.set(Number(match[1]), {
138
+ name: dispositionValue(headers, 'filename') || 'upload.bin',
139
+ contentType: partContentType(headers),
140
+ data: Buffer.from(data),
141
+ });
142
+ }
143
+ cursor = next;
144
+ }
145
+ if (!descriptor)
146
+ throw new host_execution_1.HostExecutionBadRequestError('Multipart host execution requires a descriptor part.');
147
+ descriptor.formDataFiles = files;
148
+ return descriptor;
149
+ }
150
+ async function readNodeRequestBody(request) {
151
+ const chunks = [];
152
+ let size = 0;
153
+ for await (const chunk of request) {
154
+ const buffer = Buffer.from(chunk);
155
+ size += buffer.length;
156
+ if (size > MAX_EXECUTION_REQUEST_BYTES)
157
+ throw new host_execution_1.HostExecutionBadRequestError('Host execution request exceeded the 32 MiB safety limit.');
158
+ chunks.push(buffer);
159
+ }
160
+ return Buffer.concat(chunks);
161
+ }
162
+ function response(status, payload, setCookie) {
163
+ return {
164
+ status,
165
+ headers: {
166
+ 'Content-Type': 'application/json; charset=utf-8',
167
+ 'Cache-Control': 'no-store',
168
+ ...(setCookie ? { 'Set-Cookie': setCookie } : {}),
169
+ },
170
+ body: JSON.stringify(payload),
171
+ };
172
+ }
173
+ function errorStatus(error) {
174
+ if (error instanceof host_execution_1.HostExecutionForbiddenError)
175
+ return 403;
176
+ if (error instanceof host_execution_1.HostExecutionBadRequestError)
177
+ return 400;
178
+ if (error instanceof host_execution_1.HostExecutionUnsupportedError)
179
+ return 400;
180
+ return 502;
181
+ }
182
+ function errorMessage(error) {
183
+ return error instanceof Error ? error.message : 'API host execution failed.';
184
+ }
185
+ async function runHostExecutionRoute(input) {
186
+ if (headerValue(input.headers, 'X-FlexDoc-Execute') !== '1')
187
+ return response(403, { error: 'Missing X-FlexDoc-Execute header.' });
188
+ let session = { sessionId: '' };
189
+ try {
190
+ const envelope = parseHostExecutionRequestBody(headerValue(input.headers, 'Content-Type'), input.body);
191
+ if (envelope.cookieJar === 'session')
192
+ session = (0, host_execution_1.ensureHostExecutionSession)(input.state, headerValue(input.headers, 'Cookie'));
193
+ const result = await (0, host_execution_1.executeHostRequest)(input.state, envelope, {
194
+ spec: input.spec,
195
+ sessionId: session.sessionId,
196
+ docsOrigin: input.docsOrigin,
197
+ });
198
+ return response(200, result, session.setCookie);
199
+ }
200
+ catch (error) {
201
+ return response(errorStatus(error), { error: errorMessage(error) }, session.setCookie);
202
+ }
203
+ }
204
+ function runHostCookiesRoute(input) {
205
+ if (headerValue(input.headers, 'X-FlexDoc-Execute') !== '1')
206
+ return response(403, { error: 'Missing X-FlexDoc-Execute header.' });
207
+ const session = (0, host_execution_1.ensureHostExecutionSession)(input.state, headerValue(input.headers, 'Cookie'));
208
+ if (input.clear)
209
+ (0, host_execution_1.clearCookiesForSession)(input.state, session.sessionId);
210
+ return response(200, { cookies: (0, host_execution_1.publicCookiesForSession)(input.state, session.sessionId) }, session.setCookie);
211
+ }
212
+ //# sourceMappingURL=host-execution-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-execution-route.js","sourceRoot":"","sources":["../src/host-execution-route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -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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"}