@newmo/graphql-fake-server 0.21.0 → 0.22.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/README.md +41 -0
- package/dist/esm/cli.js +0 -0
- package/dist/esm/config.d.ts +8 -0
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +13 -0
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/createMock.d.ts +0 -0
- package/dist/esm/createMock.d.ts.map +0 -0
- package/dist/esm/createMock.js +39 -0
- package/dist/esm/createMock.js.map +0 -0
- package/dist/esm/server.d.ts +10 -0
- package/dist/esm/server.d.ts.map +1 -1
- package/dist/esm/server.js +106 -34
- package/dist/esm/server.js.map +1 -1
- package/package.json +3 -3
- package/src/config.ts +21 -0
- package/src/server.ts +171 -66
package/README.md
CHANGED
|
@@ -179,6 +179,15 @@ export default {
|
|
|
179
179
|
* @example ["https://example.com", "https://app.example.com"]
|
|
180
180
|
*/
|
|
181
181
|
allowedCORSOrigins: undefined,
|
|
182
|
+
/**
|
|
183
|
+
* @type {string[] | "auto" | undefined}
|
|
184
|
+
* Allowed Host headers for the fake server to prevent DNS rebinding attacks
|
|
185
|
+
* - "auto" (default): Automatically generates allowed hosts from CORS origins and localhost addresses
|
|
186
|
+
* - string[]: Explicit list of allowed Host headers
|
|
187
|
+
* - undefined: Same as "auto"
|
|
188
|
+
* @example ["localhost:4000", "myapp.local:4000"]
|
|
189
|
+
*/
|
|
190
|
+
allowedHosts: undefined,
|
|
182
191
|
};
|
|
183
192
|
```
|
|
184
193
|
|
|
@@ -201,9 +210,41 @@ type RequiredFakeServerConfig = {
|
|
|
201
210
|
* @example ["https://example.com", "https://app.example.com"]
|
|
202
211
|
*/
|
|
203
212
|
allowedCORSOrigins?: string[] | undefined;
|
|
213
|
+
/**
|
|
214
|
+
* Allowed Host headers for the fake server to prevent DNS rebinding attacks
|
|
215
|
+
* - "auto" (default): Automatically generates allowed hosts from CORS origins and localhost addresses
|
|
216
|
+
* - string[]: Explicit list of allowed Host headers
|
|
217
|
+
* @example ["localhost:4000", "myapp.local:4000"]
|
|
218
|
+
*/
|
|
219
|
+
allowedHosts?: string[] | "auto" | undefined;
|
|
204
220
|
};
|
|
205
221
|
```
|
|
206
222
|
|
|
223
|
+
## Security
|
|
224
|
+
|
|
225
|
+
GraphQL Fake Server implements security features to prevent DNS rebinding and cross-origin attacks:
|
|
226
|
+
|
|
227
|
+
### Host Header Validation
|
|
228
|
+
|
|
229
|
+
- **Purpose**: Prevents DNS rebinding attacks
|
|
230
|
+
- **Default**: `"auto"` - automatically generates allowed hosts from CORS origins and localhost addresses
|
|
231
|
+
- **Configuration**: `allowedHosts` option accepts `"auto"`, `string[]`, or `undefined`
|
|
232
|
+
|
|
233
|
+
### CORS Configuration
|
|
234
|
+
|
|
235
|
+
- **Purpose**: Controls cross-origin requests
|
|
236
|
+
- **Default**: Allows only localhost and internal network connections
|
|
237
|
+
- **Configuration**: `allowedCORSOrigins` option accepts `string[]` or `undefined`
|
|
238
|
+
|
|
239
|
+
### Auto-generation Feature
|
|
240
|
+
|
|
241
|
+
When `allowedHosts` is `"auto"` (default), the server automatically:
|
|
242
|
+
- Extracts hostnames from configured CORS origins
|
|
243
|
+
- Adds standard localhost addresses (localhost, 127.0.0.1, [::1], 0.0.0.0)
|
|
244
|
+
- Allows both original and server ports for each hostname
|
|
245
|
+
|
|
246
|
+
This integration ensures consistent security policies and reduces configuration errors.
|
|
247
|
+
|
|
207
248
|
## Tests
|
|
208
249
|
|
|
209
250
|
```sh
|
package/dist/esm/cli.js
CHANGED
|
File without changes
|
package/dist/esm/config.d.ts
CHANGED
|
@@ -56,6 +56,13 @@ export type FakeServerConfig = {
|
|
|
56
56
|
* This option allows you to specify additional origins to accept.
|
|
57
57
|
*/
|
|
58
58
|
allowedCORSOrigins?: string[] | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Allowed Host headers for the fake server to prevent DNS rebinding attacks.
|
|
61
|
+
* - "auto" (default): Automatically generates allowed hosts from CORS origins and localhost addresses
|
|
62
|
+
* - string[]: Explicit list of allowed Host headers (e.g., ["localhost:4000", "myapp.local:4000"])
|
|
63
|
+
* @default "auto"
|
|
64
|
+
*/
|
|
65
|
+
allowedHosts?: string[] | "auto" | undefined;
|
|
59
66
|
};
|
|
60
67
|
export type RequiredFakeServerConfig = {
|
|
61
68
|
schemaFilePath: string;
|
|
@@ -69,6 +76,7 @@ export type RequiredFakeServerConfig = {
|
|
|
69
76
|
defaultValues: RawConfig["defaultValues"];
|
|
70
77
|
logLevel: LogLevel;
|
|
71
78
|
allowedCORSOrigins: string[];
|
|
79
|
+
allowedHosts: string[] | "auto";
|
|
72
80
|
};
|
|
73
81
|
export declare const normalizeFakeServerConfig: (config: FakeServerConfig) => RequiredFakeServerConfig;
|
|
74
82
|
export declare const validateFakeServerConfig: (config: FakeServerConfig) => FakeServerConfig;
|
package/dist/esm/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EACA;QACI;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC;;;;WAIG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,GACD,SAAS,CAAC;IAChB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EACA;QACI;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC;;;;WAIG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,GACD,SAAS,CAAC;IAChB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;CAChD,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,QAAQ,gBAAgB,KAAG,wBAepE,CAAC;AACF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,gBAAgB,KAAG,gBA2DnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GACnB,KAAK,MAAM,EACX,YAAY,MAAM,KACnB,OAAO,CAAC,wBAAwB,CAMlC,CAAC;AACF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GAAI,+BAGzC;IACC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC,KAAG,wBAYH,CAAC"}
|
package/dist/esm/config.js
CHANGED
|
@@ -13,6 +13,7 @@ export const normalizeFakeServerConfig = (config) => {
|
|
|
13
13
|
defaultValues: config.defaultValues ?? {},
|
|
14
14
|
logLevel: config.logLevel ?? "info",
|
|
15
15
|
allowedCORSOrigins: config.allowedCORSOrigins ?? [],
|
|
16
|
+
allowedHosts: config.allowedHosts ?? "auto",
|
|
16
17
|
};
|
|
17
18
|
};
|
|
18
19
|
export const validateFakeServerConfig = (config) => {
|
|
@@ -61,6 +62,18 @@ export const validateFakeServerConfig = (config) => {
|
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
}
|
|
65
|
+
if (config.allowedHosts) {
|
|
66
|
+
if (config.allowedHosts !== "auto" && !Array.isArray(config.allowedHosts)) {
|
|
67
|
+
throw new Error("The allowedHosts must be 'auto' or an array of strings.");
|
|
68
|
+
}
|
|
69
|
+
if (Array.isArray(config.allowedHosts)) {
|
|
70
|
+
for (const host of config.allowedHosts) {
|
|
71
|
+
if (typeof host !== "string") {
|
|
72
|
+
throw new Error("Each allowedHost must be a string.");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
64
77
|
return config;
|
|
65
78
|
};
|
|
66
79
|
/**
|
package/dist/esm/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import vm from "node:vm";
|
|
2
|
+
import { generateCode, getTypeInfos, normalizeConfig } from "@newmo/graphql-fake-core";
|
|
3
|
+
import { createLogger } from "./logger.js";
|
|
4
|
+
const cloneAsJSON = (obj) => {
|
|
5
|
+
return JSON.parse(JSON.stringify(obj));
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Create mock object from schema
|
|
9
|
+
* It supports @example directive
|
|
10
|
+
* @param options
|
|
11
|
+
*/
|
|
12
|
+
export const createMock = async (options) => {
|
|
13
|
+
const logger = createLogger(options.logLevel);
|
|
14
|
+
try {
|
|
15
|
+
const normalizedConfig = normalizeConfig({
|
|
16
|
+
maxFieldRecursionDepth: options.maxFieldRecursionDepth ?? 3,
|
|
17
|
+
});
|
|
18
|
+
const typeInfos = getTypeInfos(normalizedConfig, options.schema);
|
|
19
|
+
const code = generateCode({
|
|
20
|
+
...normalizedConfig,
|
|
21
|
+
outputType: "commonjs",
|
|
22
|
+
}, typeInfos);
|
|
23
|
+
logger.debug("Generated code:");
|
|
24
|
+
logger.debug(code);
|
|
25
|
+
// execute code in vm and get all exports
|
|
26
|
+
const exports = {};
|
|
27
|
+
vm.runInNewContext(code, { exports });
|
|
28
|
+
// Apollo Server does not support Function type in mock object
|
|
29
|
+
const plainObject = cloneAsJSON(exports);
|
|
30
|
+
logger.debug("Exports:");
|
|
31
|
+
logger.debug(JSON.stringify(plainObject, null, 2));
|
|
32
|
+
return plainObject;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error(error);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=createMock.js.map
|
|
File without changes
|
package/dist/esm/server.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { type LogLevel } from "./logger.js";
|
|
|
5
5
|
export type CreateFakeServerOptions = RequiredFakeServerConfig & {
|
|
6
6
|
logLevel?: LogLevel;
|
|
7
7
|
allowedCORSOrigins: string[];
|
|
8
|
+
allowedHosts?: string[] | "auto";
|
|
8
9
|
};
|
|
9
10
|
type FakeServerInternal = {
|
|
10
11
|
mockObject: MockObject;
|
|
@@ -18,7 +19,16 @@ type FakeServerInternal = {
|
|
|
18
19
|
maxRegisteredSequences: number;
|
|
19
20
|
logLevel: LogLevel;
|
|
20
21
|
allowedCORSOrigins: string[];
|
|
22
|
+
allowedHosts: string[] | "auto";
|
|
21
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Generate allowed hosts based on server port and CORS origins
|
|
26
|
+
*/
|
|
27
|
+
export declare const generateAllowedHosts: ({ serverPort, allowedCORSOrigins, allowedHosts, }: {
|
|
28
|
+
serverPort: number;
|
|
29
|
+
allowedCORSOrigins?: string[];
|
|
30
|
+
allowedHosts?: string[] | "auto";
|
|
31
|
+
}) => Set<string>;
|
|
22
32
|
export type ConditionRule = {
|
|
23
33
|
type: "always";
|
|
24
34
|
} | {
|
package/dist/esm/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe1D,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,GAAG;IAC7D,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CACnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,mDAIlC;IACC,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CACpC,KAAG,GAAG,CAAC,MAAM,CAqCb,CAAC;AAiHF,MAAM,MAAM,aAAa,GACnB;IACI,IAAI,EAAE,QAAQ,CAAC;CAClB,GACD;IACI,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAGR,MAAM,MAAM,YAAY,GAAG;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;IACF,QAAQ,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC;KACjB,CAAC;CACL,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAElC,gBAAgB,EAAE,aAAa,CAAC;CACnC,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9B,gBAAgB,EAAE,aAAa,CAAC;CACnC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;AAmrB/F,eAAO,MAAM,gBAAgB,GAAU,SAAS,uBAAuB;;;;;;;;EAsCtE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,SAAS,kBAAkB;;;;;;;;EAuCzE,CAAC"}
|
package/dist/esm/server.js
CHANGED
|
@@ -19,20 +19,84 @@ import { proxy } from "hono/proxy";
|
|
|
19
19
|
import { createLogger } from "./logger.js";
|
|
20
20
|
// @ts-expect-error -- biome error
|
|
21
21
|
const ENV_HOSTNAME = process.env.HOSTNAME || "0.0.0.0";
|
|
22
|
+
// Default localhost addresses
|
|
23
|
+
const DEFAULT_LOCALHOST_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0"];
|
|
24
|
+
// Private IP ranges (RFC 1918)
|
|
25
|
+
const PRIVATE_IP_RANGES = [
|
|
26
|
+
/^192\.168\.\d{1,3}\.\d{1,3}$/, // 192.168.0.0/16
|
|
27
|
+
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // 10.0.0.0/8
|
|
28
|
+
/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/, // 172.16.0.0/12
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Generate allowed hosts based on server port and CORS origins
|
|
32
|
+
*/
|
|
33
|
+
export const generateAllowedHosts = ({ serverPort, allowedCORSOrigins = [], allowedHosts = "auto", }) => {
|
|
34
|
+
if (allowedHosts !== "auto") {
|
|
35
|
+
// Use explicitly specified hosts
|
|
36
|
+
return new Set(allowedHosts);
|
|
37
|
+
}
|
|
38
|
+
// "auto" mode: generate from default localhost addresses and CORS origins
|
|
39
|
+
const hosts = new Set();
|
|
40
|
+
// Add default localhost addresses with server port
|
|
41
|
+
DEFAULT_LOCALHOST_HOSTNAMES.forEach((hostname) => {
|
|
42
|
+
hosts.add(`${hostname}:${serverPort}`);
|
|
43
|
+
});
|
|
44
|
+
// Add ENV_HOSTNAME if it's different from default
|
|
45
|
+
if (ENV_HOSTNAME && !DEFAULT_LOCALHOST_HOSTNAMES.includes(ENV_HOSTNAME)) {
|
|
46
|
+
hosts.add(`${ENV_HOSTNAME}:${serverPort}`);
|
|
47
|
+
}
|
|
48
|
+
// Extract hosts from CORS origins
|
|
49
|
+
allowedCORSOrigins.forEach((origin) => {
|
|
50
|
+
try {
|
|
51
|
+
const url = new URL(origin);
|
|
52
|
+
// Add original host:port from CORS origin
|
|
53
|
+
hosts.add(url.host);
|
|
54
|
+
// Also add same hostname with server port
|
|
55
|
+
// (for cases where frontend and backend use different ports)
|
|
56
|
+
if (url.port !== String(serverPort)) {
|
|
57
|
+
hosts.add(`${url.hostname}:${serverPort}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (_e) {
|
|
61
|
+
// Invalid URL, skip
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return hosts;
|
|
65
|
+
};
|
|
22
66
|
/**
|
|
23
67
|
* Custom startStandaloneServer with CORS configuration
|
|
24
68
|
* This restricts CORS to only allow localhost, internal network connections, and specified allowed origins
|
|
25
69
|
*/
|
|
26
|
-
const startStandaloneServerWithCORS = async (server, options, allowedCORSOrigins = []) => {
|
|
70
|
+
const startStandaloneServerWithCORS = async (server, options, allowedCORSOrigins = [], allowedHosts = "auto") => {
|
|
27
71
|
// Create Express app with custom CORS configuration
|
|
28
72
|
const app = express();
|
|
29
73
|
const httpServer = http.createServer(app);
|
|
74
|
+
const logger = createLogger(options.logLevel || "info");
|
|
30
75
|
// Add drain plugin for graceful shutdown
|
|
31
76
|
server.addPlugin(ApolloServerPluginDrainHttpServer({ httpServer }));
|
|
32
77
|
// Ensure server is started
|
|
33
78
|
await server.start();
|
|
34
|
-
//
|
|
35
|
-
|
|
79
|
+
// Generate allowed hosts
|
|
80
|
+
const port = options.listen.port ?? 4000;
|
|
81
|
+
const validHosts = generateAllowedHosts({
|
|
82
|
+
serverPort: port,
|
|
83
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
84
|
+
allowedHosts: allowedHosts,
|
|
85
|
+
});
|
|
86
|
+
// Security middleware: Host header validation and CORS
|
|
87
|
+
// 1. Host header validation (DNS rebinding protection)
|
|
88
|
+
app.use((req, res, next) => {
|
|
89
|
+
const hostHeader = req.headers.host;
|
|
90
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
91
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
92
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
93
|
+
res.status(400).send("Bad Request: Invalid Host header");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
next();
|
|
97
|
+
});
|
|
98
|
+
// 2. CORS configuration (origin validation)
|
|
99
|
+
const corsOptions = {
|
|
36
100
|
origin: (origin, callback) => {
|
|
37
101
|
// Allow requests with no origin (like mobile apps, curl, etc)
|
|
38
102
|
if (!origin)
|
|
@@ -50,11 +114,12 @@ const startStandaloneServerWithCORS = async (server, options, allowedCORSOrigins
|
|
|
50
114
|
},
|
|
51
115
|
methods: ["POST", "GET", "OPTIONS"],
|
|
52
116
|
credentials: false,
|
|
53
|
-
}
|
|
117
|
+
};
|
|
118
|
+
// Apply middleware stack
|
|
119
|
+
app.use("/", corsExpress(corsOptions), express.json({ limit: "50mb" }),
|
|
54
120
|
// @ts-expect-error -- express 5 types are not compatible with apollo-server
|
|
55
121
|
expressMiddleware(server, options));
|
|
56
122
|
// Start the server
|
|
57
|
-
const port = options.listen.port ?? 4000;
|
|
58
123
|
await new Promise((resolve) => httpServer.listen({ port }, resolve));
|
|
59
124
|
return {
|
|
60
125
|
url: `http://${ENV_HOSTNAME}:${port}`,
|
|
@@ -222,13 +287,6 @@ class LRUMap {
|
|
|
222
287
|
const createMapKey = ({ sequenceId, operationName, }) => {
|
|
223
288
|
return `${sequenceId}.${operationName}`;
|
|
224
289
|
};
|
|
225
|
-
// Private IP address ranges defined in RFC 1918
|
|
226
|
-
// See: https://www.rfc-editor.org/rfc/rfc1918
|
|
227
|
-
const privateIPRanges = [
|
|
228
|
-
/^192\.168\.\d{1,3}\.\d{1,3}$/, // 192.168.0.0/16
|
|
229
|
-
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // 10.0.0.0/8
|
|
230
|
-
/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/, // 172.16.0.0/12
|
|
231
|
-
];
|
|
232
290
|
/**
|
|
233
291
|
* Check if the origin is a local address
|
|
234
292
|
* @param origin
|
|
@@ -239,19 +297,40 @@ const isLocalRequest = (origin) => {
|
|
|
239
297
|
try {
|
|
240
298
|
const url = new URL(origin);
|
|
241
299
|
const hostname = url.hostname;
|
|
242
|
-
//
|
|
243
|
-
if (
|
|
300
|
+
// Check if it's a default localhost address
|
|
301
|
+
if (DEFAULT_LOCALHOST_HOSTNAMES.includes(hostname)) {
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
// Check ENV_HOSTNAME
|
|
305
|
+
if (hostname === ENV_HOSTNAME) {
|
|
244
306
|
return true;
|
|
245
307
|
}
|
|
246
|
-
|
|
308
|
+
// Check if it's a private IP range
|
|
309
|
+
return PRIVATE_IP_RANGES.some((range) => range.test(hostname));
|
|
247
310
|
}
|
|
248
311
|
catch {
|
|
249
312
|
return false;
|
|
250
313
|
}
|
|
251
314
|
};
|
|
252
|
-
const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, allowedCORSOrigins, }) => {
|
|
315
|
+
const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, allowedCORSOrigins, allowedHosts = "auto", }) => {
|
|
253
316
|
const logger = createLogger(logLevel);
|
|
254
317
|
const app = new Hono();
|
|
318
|
+
// Security configuration
|
|
319
|
+
const validHosts = generateAllowedHosts({
|
|
320
|
+
serverPort: ports.fakeServer,
|
|
321
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
322
|
+
allowedHosts: allowedHosts,
|
|
323
|
+
});
|
|
324
|
+
// Security middleware: Host header validation (must be before CORS)
|
|
325
|
+
app.use("*", async (c, next) => {
|
|
326
|
+
const hostHeader = c.req.header("host");
|
|
327
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
328
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
329
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
330
|
+
return c.text("Bad Request: Invalid Host header", 400);
|
|
331
|
+
}
|
|
332
|
+
return await next();
|
|
333
|
+
});
|
|
255
334
|
// pass through to apollo server
|
|
256
335
|
const passToApollo = async (c) => {
|
|
257
336
|
logger.debug("passToApollo: starting");
|
|
@@ -611,19 +690,8 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
611
690
|
},
|
|
612
691
|
});
|
|
613
692
|
};
|
|
614
|
-
//
|
|
615
|
-
|
|
616
|
-
origin: (origin) => {
|
|
617
|
-
if (isLocalRequest(origin)) {
|
|
618
|
-
return origin;
|
|
619
|
-
}
|
|
620
|
-
if (origin && allowedCORSOrigins.includes(origin)) {
|
|
621
|
-
return origin;
|
|
622
|
-
}
|
|
623
|
-
return null;
|
|
624
|
-
},
|
|
625
|
-
}));
|
|
626
|
-
app.use("/query", cors({
|
|
693
|
+
// CORS configuration for GraphQL endpoints
|
|
694
|
+
const corsOptions = {
|
|
627
695
|
origin: (origin) => {
|
|
628
696
|
if (isLocalRequest(origin)) {
|
|
629
697
|
return origin;
|
|
@@ -633,14 +701,15 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
633
701
|
}
|
|
634
702
|
return null;
|
|
635
703
|
},
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
app.use("/
|
|
704
|
+
};
|
|
705
|
+
// Apply CORS and route handlers to GraphQL endpoints
|
|
706
|
+
app.use("/graphql", cors(corsOptions), fakeGraphQLQuery);
|
|
707
|
+
app.use("/query", cors(corsOptions), fakeGraphQLQuery);
|
|
639
708
|
app.all("*", (c) => passToApollo(c));
|
|
640
709
|
return app;
|
|
641
710
|
};
|
|
642
711
|
export const createFakeServer = async (options) => {
|
|
643
|
-
const { logLevel, maxFieldRecursionDepth, maxQueryDepth, maxRegisteredSequences, ports, schemaFilePath, defaultValues, allowedCORSOrigins, } = options;
|
|
712
|
+
const { logLevel, maxFieldRecursionDepth, maxQueryDepth, maxRegisteredSequences, ports, schemaFilePath, defaultValues, allowedCORSOrigins, allowedHosts = "auto", } = options;
|
|
644
713
|
const logger = createLogger(logLevel);
|
|
645
714
|
const schema = buildSchema(await fs.readFile(schemaFilePath, "utf-8"));
|
|
646
715
|
const mockResult = await createMock({
|
|
@@ -665,6 +734,7 @@ export const createFakeServer = async (options) => {
|
|
|
665
734
|
maxRegisteredSequences,
|
|
666
735
|
logLevel: logLevel ?? "info",
|
|
667
736
|
allowedCORSOrigins,
|
|
737
|
+
allowedHosts,
|
|
668
738
|
});
|
|
669
739
|
};
|
|
670
740
|
export const createFakeServerInternal = async (options) => {
|
|
@@ -674,6 +744,7 @@ export const createFakeServerInternal = async (options) => {
|
|
|
674
744
|
ports: options.ports,
|
|
675
745
|
maxRegisteredSequences: options.maxRegisteredSequences,
|
|
676
746
|
allowedCORSOrigins: options.allowedCORSOrigins,
|
|
747
|
+
allowedHosts: options.allowedHosts,
|
|
677
748
|
});
|
|
678
749
|
let routerServer = null;
|
|
679
750
|
return {
|
|
@@ -681,7 +752,8 @@ export const createFakeServerInternal = async (options) => {
|
|
|
681
752
|
// Replace startStandaloneServer with our custom implementation
|
|
682
753
|
await startStandaloneServerWithCORS(apolloServer, {
|
|
683
754
|
listen: { port: options.ports.apolloServer },
|
|
684
|
-
|
|
755
|
+
logLevel: options.logLevel,
|
|
756
|
+
}, options.allowedCORSOrigins, options.allowedHosts);
|
|
685
757
|
routerServer = serve({
|
|
686
758
|
fetch: routingServer.fetch,
|
|
687
759
|
port: options.ports.fakeServer,
|
package/dist/esm/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newmo/graphql-fake-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "GraphQL fake server for testing",
|
|
6
6
|
"keywords": [
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@graphql-tools/mock": "^9.0.23",
|
|
53
53
|
"@graphql-tools/schema": "^10.0.23",
|
|
54
54
|
"@hono/node-server": "^1.14.4",
|
|
55
|
-
"@newmo/graphql-fake-core": "0.
|
|
55
|
+
"@newmo/graphql-fake-core": "0.22.0",
|
|
56
56
|
"cors": "^2.8.5",
|
|
57
57
|
"express": "^5.1.0",
|
|
58
58
|
"graphql-depth-limit": "^1.1.0",
|
|
@@ -80,5 +80,5 @@
|
|
|
80
80
|
"access": "public",
|
|
81
81
|
"registry": "https://registry.npmjs.org/"
|
|
82
82
|
},
|
|
83
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "345acb9af4854850a12c1418e057c7fadd7a00be"
|
|
84
84
|
}
|
package/src/config.ts
CHANGED
|
@@ -61,6 +61,13 @@ export type FakeServerConfig = {
|
|
|
61
61
|
* This option allows you to specify additional origins to accept.
|
|
62
62
|
*/
|
|
63
63
|
allowedCORSOrigins?: string[] | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Allowed Host headers for the fake server to prevent DNS rebinding attacks.
|
|
66
|
+
* - "auto" (default): Automatically generates allowed hosts from CORS origins and localhost addresses
|
|
67
|
+
* - string[]: Explicit list of allowed Host headers (e.g., ["localhost:4000", "myapp.local:4000"])
|
|
68
|
+
* @default "auto"
|
|
69
|
+
*/
|
|
70
|
+
allowedHosts?: string[] | "auto" | undefined;
|
|
64
71
|
};
|
|
65
72
|
export type RequiredFakeServerConfig = {
|
|
66
73
|
schemaFilePath: string;
|
|
@@ -74,6 +81,7 @@ export type RequiredFakeServerConfig = {
|
|
|
74
81
|
defaultValues: RawConfig["defaultValues"];
|
|
75
82
|
logLevel: LogLevel;
|
|
76
83
|
allowedCORSOrigins: string[];
|
|
84
|
+
allowedHosts: string[] | "auto";
|
|
77
85
|
};
|
|
78
86
|
|
|
79
87
|
export const normalizeFakeServerConfig = (config: FakeServerConfig): RequiredFakeServerConfig => {
|
|
@@ -89,6 +97,7 @@ export const normalizeFakeServerConfig = (config: FakeServerConfig): RequiredFak
|
|
|
89
97
|
defaultValues: config.defaultValues ?? {},
|
|
90
98
|
logLevel: config.logLevel ?? "info",
|
|
91
99
|
allowedCORSOrigins: config.allowedCORSOrigins ?? [],
|
|
100
|
+
allowedHosts: config.allowedHosts ?? "auto",
|
|
92
101
|
};
|
|
93
102
|
};
|
|
94
103
|
export const validateFakeServerConfig = (config: FakeServerConfig): FakeServerConfig => {
|
|
@@ -137,6 +146,18 @@ export const validateFakeServerConfig = (config: FakeServerConfig): FakeServerCo
|
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
}
|
|
149
|
+
if (config.allowedHosts) {
|
|
150
|
+
if (config.allowedHosts !== "auto" && !Array.isArray(config.allowedHosts)) {
|
|
151
|
+
throw new Error("The allowedHosts must be 'auto' or an array of strings.");
|
|
152
|
+
}
|
|
153
|
+
if (Array.isArray(config.allowedHosts)) {
|
|
154
|
+
for (const host of config.allowedHosts) {
|
|
155
|
+
if (typeof host !== "string") {
|
|
156
|
+
throw new Error("Each allowedHost must be a string.");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
140
161
|
return config;
|
|
141
162
|
};
|
|
142
163
|
|
package/src/server.ts
CHANGED
|
@@ -22,9 +22,21 @@ import { createLogger, type LogLevel } from "./logger.js";
|
|
|
22
22
|
|
|
23
23
|
// @ts-expect-error -- biome error
|
|
24
24
|
const ENV_HOSTNAME = process.env.HOSTNAME || "0.0.0.0";
|
|
25
|
+
|
|
26
|
+
// Default localhost addresses
|
|
27
|
+
const DEFAULT_LOCALHOST_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0"];
|
|
28
|
+
|
|
29
|
+
// Private IP ranges (RFC 1918)
|
|
30
|
+
const PRIVATE_IP_RANGES = [
|
|
31
|
+
/^192\.168\.\d{1,3}\.\d{1,3}$/, // 192.168.0.0/16
|
|
32
|
+
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // 10.0.0.0/8
|
|
33
|
+
/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/, // 172.16.0.0/12
|
|
34
|
+
];
|
|
35
|
+
|
|
25
36
|
export type CreateFakeServerOptions = RequiredFakeServerConfig & {
|
|
26
37
|
logLevel?: LogLevel;
|
|
27
38
|
allowedCORSOrigins: string[];
|
|
39
|
+
allowedHosts?: string[] | "auto";
|
|
28
40
|
};
|
|
29
41
|
|
|
30
42
|
type FakeServerInternal = {
|
|
@@ -39,6 +51,57 @@ type FakeServerInternal = {
|
|
|
39
51
|
maxRegisteredSequences: number;
|
|
40
52
|
logLevel: LogLevel;
|
|
41
53
|
allowedCORSOrigins: string[];
|
|
54
|
+
allowedHosts: string[] | "auto";
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Generate allowed hosts based on server port and CORS origins
|
|
59
|
+
*/
|
|
60
|
+
export const generateAllowedHosts = ({
|
|
61
|
+
serverPort,
|
|
62
|
+
allowedCORSOrigins = [],
|
|
63
|
+
allowedHosts = "auto",
|
|
64
|
+
}: {
|
|
65
|
+
serverPort: number;
|
|
66
|
+
allowedCORSOrigins?: string[];
|
|
67
|
+
allowedHosts?: string[] | "auto";
|
|
68
|
+
}): Set<string> => {
|
|
69
|
+
if (allowedHosts !== "auto") {
|
|
70
|
+
// Use explicitly specified hosts
|
|
71
|
+
return new Set(allowedHosts);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// "auto" mode: generate from default localhost addresses and CORS origins
|
|
75
|
+
const hosts = new Set<string>();
|
|
76
|
+
|
|
77
|
+
// Add default localhost addresses with server port
|
|
78
|
+
DEFAULT_LOCALHOST_HOSTNAMES.forEach((hostname) => {
|
|
79
|
+
hosts.add(`${hostname}:${serverPort}`);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Add ENV_HOSTNAME if it's different from default
|
|
83
|
+
if (ENV_HOSTNAME && !DEFAULT_LOCALHOST_HOSTNAMES.includes(ENV_HOSTNAME)) {
|
|
84
|
+
hosts.add(`${ENV_HOSTNAME}:${serverPort}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Extract hosts from CORS origins
|
|
88
|
+
allowedCORSOrigins.forEach((origin) => {
|
|
89
|
+
try {
|
|
90
|
+
const url = new URL(origin);
|
|
91
|
+
// Add original host:port from CORS origin
|
|
92
|
+
hosts.add(url.host);
|
|
93
|
+
|
|
94
|
+
// Also add same hostname with server port
|
|
95
|
+
// (for cases where frontend and backend use different ports)
|
|
96
|
+
if (url.port !== String(serverPort)) {
|
|
97
|
+
hosts.add(`${url.hostname}:${serverPort}`);
|
|
98
|
+
}
|
|
99
|
+
} catch (_e) {
|
|
100
|
+
// Invalid URL, skip
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return hosts;
|
|
42
105
|
};
|
|
43
106
|
|
|
44
107
|
/**
|
|
@@ -49,12 +112,15 @@ const startStandaloneServerWithCORS = async (
|
|
|
49
112
|
server: ApolloServer,
|
|
50
113
|
options: {
|
|
51
114
|
listen: { port: number };
|
|
115
|
+
logLevel?: LogLevel;
|
|
52
116
|
},
|
|
53
117
|
allowedCORSOrigins: string[] = [],
|
|
118
|
+
allowedHosts: string[] | "auto" = "auto",
|
|
54
119
|
) => {
|
|
55
120
|
// Create Express app with custom CORS configuration
|
|
56
121
|
const app = express();
|
|
57
122
|
const httpServer = http.createServer(app);
|
|
123
|
+
const logger = createLogger(options.logLevel || "info");
|
|
58
124
|
|
|
59
125
|
// Add drain plugin for graceful shutdown
|
|
60
126
|
server.addPlugin(ApolloServerPluginDrainHttpServer({ httpServer }));
|
|
@@ -62,39 +128,63 @@ const startStandaloneServerWithCORS = async (
|
|
|
62
128
|
// Ensure server is started
|
|
63
129
|
await server.start();
|
|
64
130
|
|
|
65
|
-
//
|
|
131
|
+
// Generate allowed hosts
|
|
132
|
+
const port = options.listen.port ?? 4000;
|
|
133
|
+
const validHosts = generateAllowedHosts({
|
|
134
|
+
serverPort: port,
|
|
135
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
136
|
+
allowedHosts: allowedHosts,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Security middleware: Host header validation and CORS
|
|
140
|
+
// 1. Host header validation (DNS rebinding protection)
|
|
141
|
+
app.use((req, res, next) => {
|
|
142
|
+
const hostHeader = req.headers.host;
|
|
143
|
+
|
|
144
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
145
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
146
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
147
|
+
res.status(400).send("Bad Request: Invalid Host header");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
next();
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// 2. CORS configuration (origin validation)
|
|
155
|
+
const corsOptions: corsExpress.CorsOptions = {
|
|
156
|
+
origin: (origin, callback) => {
|
|
157
|
+
// Allow requests with no origin (like mobile apps, curl, etc)
|
|
158
|
+
if (!origin) return callback(null, true);
|
|
159
|
+
|
|
160
|
+
// Allow localhost, loopback addresses, and explicitly allowed origins
|
|
161
|
+
if (isLocalRequest(origin)) {
|
|
162
|
+
return callback(null, true);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Allow explicitly allowed origins from configuration
|
|
166
|
+
if (allowedCORSOrigins.includes(origin)) {
|
|
167
|
+
return callback(null, true);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Deny all other origins
|
|
171
|
+
return callback(new Error("Not allowed by CORS"), false);
|
|
172
|
+
},
|
|
173
|
+
methods: ["POST", "GET", "OPTIONS"],
|
|
174
|
+
credentials: false,
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// Apply middleware stack
|
|
66
178
|
app.use(
|
|
67
179
|
"/",
|
|
68
|
-
corsExpress(
|
|
69
|
-
origin: (origin, callback) => {
|
|
70
|
-
// Allow requests with no origin (like mobile apps, curl, etc)
|
|
71
|
-
if (!origin) return callback(null, true);
|
|
72
|
-
|
|
73
|
-
// Allow localhost, loopback addresses, and explicitly allowed origins
|
|
74
|
-
if (isLocalRequest(origin)) {
|
|
75
|
-
return callback(null, true);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Allow explicitly allowed origins from configuration
|
|
79
|
-
if (allowedCORSOrigins.includes(origin)) {
|
|
80
|
-
return callback(null, true);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Deny all other origins
|
|
84
|
-
return callback(new Error("Not allowed by CORS"), false);
|
|
85
|
-
},
|
|
86
|
-
methods: ["POST", "GET", "OPTIONS"],
|
|
87
|
-
credentials: false,
|
|
88
|
-
}),
|
|
180
|
+
corsExpress(corsOptions),
|
|
89
181
|
express.json({ limit: "50mb" }),
|
|
90
182
|
// @ts-expect-error -- express 5 types are not compatible with apollo-server
|
|
91
183
|
expressMiddleware(server, options),
|
|
92
184
|
);
|
|
93
185
|
|
|
94
186
|
// Start the server
|
|
95
|
-
const port = options.listen.port ?? 4000;
|
|
96
187
|
await new Promise<void>((resolve) => httpServer.listen({ port }, resolve));
|
|
97
|
-
|
|
98
188
|
return {
|
|
99
189
|
url: `http://${ENV_HOSTNAME}:${port}`,
|
|
100
190
|
httpServer,
|
|
@@ -344,27 +434,28 @@ const createMapKey = ({
|
|
|
344
434
|
return `${sequenceId}.${operationName}`;
|
|
345
435
|
};
|
|
346
436
|
|
|
347
|
-
// Private IP address ranges defined in RFC 1918
|
|
348
|
-
// See: https://www.rfc-editor.org/rfc/rfc1918
|
|
349
|
-
const privateIPRanges = [
|
|
350
|
-
/^192\.168\.\d{1,3}\.\d{1,3}$/, // 192.168.0.0/16
|
|
351
|
-
/^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, // 10.0.0.0/8
|
|
352
|
-
/^172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}$/, // 172.16.0.0/12
|
|
353
|
-
];
|
|
354
437
|
/**
|
|
355
438
|
* Check if the origin is a local address
|
|
356
439
|
* @param origin
|
|
357
440
|
*/
|
|
358
|
-
const isLocalRequest = (origin: string | null): boolean => {
|
|
441
|
+
const isLocalRequest = (origin: string | null | undefined): boolean => {
|
|
359
442
|
if (!origin) return false;
|
|
360
443
|
try {
|
|
361
444
|
const url = new URL(origin);
|
|
362
445
|
const hostname = url.hostname;
|
|
363
|
-
|
|
364
|
-
|
|
446
|
+
|
|
447
|
+
// Check if it's a default localhost address
|
|
448
|
+
if (DEFAULT_LOCALHOST_HOSTNAMES.includes(hostname)) {
|
|
365
449
|
return true;
|
|
366
450
|
}
|
|
367
|
-
|
|
451
|
+
|
|
452
|
+
// Check ENV_HOSTNAME
|
|
453
|
+
if (hostname === ENV_HOSTNAME) {
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Check if it's a private IP range
|
|
458
|
+
return PRIVATE_IP_RANGES.some((range) => range.test(hostname));
|
|
368
459
|
} catch {
|
|
369
460
|
return false;
|
|
370
461
|
}
|
|
@@ -375,6 +466,7 @@ const createRoutingServer = async ({
|
|
|
375
466
|
ports,
|
|
376
467
|
maxRegisteredSequences,
|
|
377
468
|
allowedCORSOrigins,
|
|
469
|
+
allowedHosts = "auto",
|
|
378
470
|
}: {
|
|
379
471
|
logLevel: LogLevel;
|
|
380
472
|
maxRegisteredSequences: number;
|
|
@@ -383,9 +475,31 @@ const createRoutingServer = async ({
|
|
|
383
475
|
apolloServer: number;
|
|
384
476
|
};
|
|
385
477
|
allowedCORSOrigins: string[];
|
|
478
|
+
allowedHosts?: string[] | "auto";
|
|
386
479
|
}) => {
|
|
387
480
|
const logger = createLogger(logLevel);
|
|
388
481
|
const app = new Hono();
|
|
482
|
+
|
|
483
|
+
// Security configuration
|
|
484
|
+
const validHosts = generateAllowedHosts({
|
|
485
|
+
serverPort: ports.fakeServer,
|
|
486
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
487
|
+
allowedHosts: allowedHosts,
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
// Security middleware: Host header validation (must be before CORS)
|
|
491
|
+
app.use("*", async (c, next) => {
|
|
492
|
+
const hostHeader = c.req.header("host");
|
|
493
|
+
|
|
494
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
495
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
496
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
497
|
+
return c.text("Bad Request: Invalid Host header", 400);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return await next();
|
|
501
|
+
});
|
|
502
|
+
|
|
389
503
|
// pass through to apollo server
|
|
390
504
|
const passToApollo = async (c: Context) => {
|
|
391
505
|
logger.debug("passToApollo: starting");
|
|
@@ -817,37 +931,22 @@ const createRoutingServer = async ({
|
|
|
817
931
|
},
|
|
818
932
|
});
|
|
819
933
|
};
|
|
820
|
-
//
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
);
|
|
835
|
-
app.use(
|
|
836
|
-
"/query",
|
|
837
|
-
cors({
|
|
838
|
-
origin: (origin) => {
|
|
839
|
-
if (isLocalRequest(origin)) {
|
|
840
|
-
return origin;
|
|
841
|
-
}
|
|
842
|
-
if (origin && allowedCORSOrigins.includes(origin)) {
|
|
843
|
-
return origin;
|
|
844
|
-
}
|
|
845
|
-
return null;
|
|
846
|
-
},
|
|
847
|
-
}),
|
|
848
|
-
);
|
|
849
|
-
app.use("/graphql", fakeGraphQLQuery);
|
|
850
|
-
app.use("/query", fakeGraphQLQuery);
|
|
934
|
+
// CORS configuration for GraphQL endpoints
|
|
935
|
+
const corsOptions = {
|
|
936
|
+
origin: (origin: string | undefined) => {
|
|
937
|
+
if (isLocalRequest(origin)) {
|
|
938
|
+
return origin;
|
|
939
|
+
}
|
|
940
|
+
if (origin && allowedCORSOrigins.includes(origin)) {
|
|
941
|
+
return origin;
|
|
942
|
+
}
|
|
943
|
+
return null;
|
|
944
|
+
},
|
|
945
|
+
};
|
|
946
|
+
|
|
947
|
+
// Apply CORS and route handlers to GraphQL endpoints
|
|
948
|
+
app.use("/graphql", cors(corsOptions), fakeGraphQLQuery);
|
|
949
|
+
app.use("/query", cors(corsOptions), fakeGraphQLQuery);
|
|
851
950
|
app.all("*", (c) => passToApollo(c));
|
|
852
951
|
return app;
|
|
853
952
|
};
|
|
@@ -861,6 +960,7 @@ export const createFakeServer = async (options: CreateFakeServerOptions) => {
|
|
|
861
960
|
schemaFilePath,
|
|
862
961
|
defaultValues,
|
|
863
962
|
allowedCORSOrigins,
|
|
963
|
+
allowedHosts = "auto",
|
|
864
964
|
} = options;
|
|
865
965
|
const logger = createLogger(logLevel);
|
|
866
966
|
const schema = buildSchema(await fs.readFile(schemaFilePath, "utf-8"));
|
|
@@ -886,6 +986,7 @@ export const createFakeServer = async (options: CreateFakeServerOptions) => {
|
|
|
886
986
|
maxRegisteredSequences,
|
|
887
987
|
logLevel: logLevel ?? "info",
|
|
888
988
|
allowedCORSOrigins,
|
|
989
|
+
allowedHosts,
|
|
889
990
|
});
|
|
890
991
|
};
|
|
891
992
|
|
|
@@ -896,6 +997,7 @@ export const createFakeServerInternal = async (options: FakeServerInternal) => {
|
|
|
896
997
|
ports: options.ports,
|
|
897
998
|
maxRegisteredSequences: options.maxRegisteredSequences,
|
|
898
999
|
allowedCORSOrigins: options.allowedCORSOrigins,
|
|
1000
|
+
allowedHosts: options.allowedHosts,
|
|
899
1001
|
});
|
|
900
1002
|
let routerServer: ReturnType<typeof serve> | null = null;
|
|
901
1003
|
return {
|
|
@@ -905,13 +1007,16 @@ export const createFakeServerInternal = async (options: FakeServerInternal) => {
|
|
|
905
1007
|
apolloServer,
|
|
906
1008
|
{
|
|
907
1009
|
listen: { port: options.ports.apolloServer },
|
|
1010
|
+
logLevel: options.logLevel,
|
|
908
1011
|
},
|
|
909
1012
|
options.allowedCORSOrigins,
|
|
1013
|
+
options.allowedHosts,
|
|
910
1014
|
);
|
|
911
1015
|
routerServer = serve({
|
|
912
1016
|
fetch: routingServer.fetch,
|
|
913
1017
|
port: options.ports.fakeServer,
|
|
914
1018
|
});
|
|
1019
|
+
|
|
915
1020
|
return {
|
|
916
1021
|
urls: {
|
|
917
1022
|
fakeServer: `http://${ENV_HOSTNAME}:${options.ports.fakeServer}`,
|