@newmo/graphql-fake-server 0.21.0 → 0.23.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 +161 -35
- package/dist/esm/server.js.map +1 -1
- package/package.json +3 -3
- package/src/config.ts +21 -0
- package/src/server.ts +239 -67
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;AA6IF,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;AA0tB/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,31 @@ const startStandaloneServerWithCORS = async (server, options, allowedCORSOrigins
|
|
|
50
114
|
},
|
|
51
115
|
methods: ["POST", "GET", "OPTIONS"],
|
|
52
116
|
credentials: false,
|
|
53
|
-
}
|
|
117
|
+
};
|
|
118
|
+
// Error handling middleware
|
|
119
|
+
app.use((err, req, res, _next) => {
|
|
120
|
+
logger.error("[ApolloServer] Request error:", {
|
|
121
|
+
error: err instanceof Error ? err.message : err,
|
|
122
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
123
|
+
method: req.method,
|
|
124
|
+
url: req.url,
|
|
125
|
+
headers: req.headers,
|
|
126
|
+
});
|
|
127
|
+
// Check for specific network errors
|
|
128
|
+
const errorCode = err?.code;
|
|
129
|
+
if (errorCode === "ECONNRESET") {
|
|
130
|
+
logger.warn("[ApolloServer] Connection reset by client");
|
|
131
|
+
}
|
|
132
|
+
else if (errorCode === "EPIPE") {
|
|
133
|
+
logger.warn("[ApolloServer] Broken pipe error");
|
|
134
|
+
}
|
|
135
|
+
res.status(500).json({ error: "Internal server error" });
|
|
136
|
+
});
|
|
137
|
+
// Apply middleware stack
|
|
138
|
+
app.use("/", corsExpress(corsOptions), express.json({ limit: "50mb" }),
|
|
54
139
|
// @ts-expect-error -- express 5 types are not compatible with apollo-server
|
|
55
140
|
expressMiddleware(server, options));
|
|
56
141
|
// Start the server
|
|
57
|
-
const port = options.listen.port ?? 4000;
|
|
58
142
|
await new Promise((resolve) => httpServer.listen({ port }, resolve));
|
|
59
143
|
return {
|
|
60
144
|
url: `http://${ENV_HOSTNAME}:${port}`,
|
|
@@ -222,13 +306,6 @@ class LRUMap {
|
|
|
222
306
|
const createMapKey = ({ sequenceId, operationName, }) => {
|
|
223
307
|
return `${sequenceId}.${operationName}`;
|
|
224
308
|
};
|
|
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
309
|
/**
|
|
233
310
|
* Check if the origin is a local address
|
|
234
311
|
* @param origin
|
|
@@ -239,19 +316,40 @@ const isLocalRequest = (origin) => {
|
|
|
239
316
|
try {
|
|
240
317
|
const url = new URL(origin);
|
|
241
318
|
const hostname = url.hostname;
|
|
242
|
-
//
|
|
243
|
-
if (
|
|
319
|
+
// Check if it's a default localhost address
|
|
320
|
+
if (DEFAULT_LOCALHOST_HOSTNAMES.includes(hostname)) {
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
// Check ENV_HOSTNAME
|
|
324
|
+
if (hostname === ENV_HOSTNAME) {
|
|
244
325
|
return true;
|
|
245
326
|
}
|
|
246
|
-
|
|
327
|
+
// Check if it's a private IP range
|
|
328
|
+
return PRIVATE_IP_RANGES.some((range) => range.test(hostname));
|
|
247
329
|
}
|
|
248
330
|
catch {
|
|
249
331
|
return false;
|
|
250
332
|
}
|
|
251
333
|
};
|
|
252
|
-
const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, allowedCORSOrigins, }) => {
|
|
334
|
+
const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, allowedCORSOrigins, allowedHosts = "auto", }) => {
|
|
253
335
|
const logger = createLogger(logLevel);
|
|
254
336
|
const app = new Hono();
|
|
337
|
+
// Security configuration
|
|
338
|
+
const validHosts = generateAllowedHosts({
|
|
339
|
+
serverPort: ports.fakeServer,
|
|
340
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
341
|
+
allowedHosts: allowedHosts,
|
|
342
|
+
});
|
|
343
|
+
// Security middleware: Host header validation (must be before CORS)
|
|
344
|
+
app.use("*", async (c, next) => {
|
|
345
|
+
const hostHeader = c.req.header("host");
|
|
346
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
347
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
348
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
349
|
+
return c.text("Bad Request: Invalid Host header", 400);
|
|
350
|
+
}
|
|
351
|
+
return await next();
|
|
352
|
+
});
|
|
255
353
|
// pass through to apollo server
|
|
256
354
|
const passToApollo = async (c) => {
|
|
257
355
|
logger.debug("passToApollo: starting");
|
|
@@ -298,6 +396,14 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
298
396
|
status: proxyResponse.status,
|
|
299
397
|
headers: Object.fromEntries(proxyResponse.headers),
|
|
300
398
|
});
|
|
399
|
+
// Log warning for unsuccessful responses
|
|
400
|
+
if (proxyResponse.status >= 500) {
|
|
401
|
+
logger.warn("[passToApollo] Server error from Apollo:", {
|
|
402
|
+
sequenceId,
|
|
403
|
+
operationName,
|
|
404
|
+
status: proxyResponse.status,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
301
407
|
// log response with pipe
|
|
302
408
|
if (proxyResponse.status === 101)
|
|
303
409
|
return proxyResponse;
|
|
@@ -360,6 +466,7 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
360
466
|
logger.debug("/fake");
|
|
361
467
|
const sequenceId = c.req.header("sequence-id");
|
|
362
468
|
if (!sequenceId) {
|
|
469
|
+
logger.warn("[/fake] Missing sequence-id header");
|
|
363
470
|
return Response.json({
|
|
364
471
|
ok: false,
|
|
365
472
|
errors: ["sequence-id is required"],
|
|
@@ -367,7 +474,22 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
367
474
|
status: 400,
|
|
368
475
|
});
|
|
369
476
|
}
|
|
370
|
-
|
|
477
|
+
let body;
|
|
478
|
+
try {
|
|
479
|
+
body = await c.req.json();
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
logger.error("[/fake] Failed to parse request body:", {
|
|
483
|
+
sequenceId,
|
|
484
|
+
error: error instanceof Error ? error.message : error,
|
|
485
|
+
});
|
|
486
|
+
return Response.json({
|
|
487
|
+
ok: false,
|
|
488
|
+
errors: ["Invalid JSON in request body"],
|
|
489
|
+
}, {
|
|
490
|
+
status: 400,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
371
493
|
logger.debug("/fake: got fake body", {
|
|
372
494
|
sequenceId,
|
|
373
495
|
body,
|
|
@@ -409,10 +531,21 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
409
531
|
return scoreB - scoreA;
|
|
410
532
|
});
|
|
411
533
|
conditionalFakeResponseMap.set(baseKey, existingConditionalFakes);
|
|
534
|
+
logger.info("[/fake] Registered conditional fake response:", {
|
|
535
|
+
sequenceId,
|
|
536
|
+
operationName,
|
|
537
|
+
conditionType: validationResult.data.requestCondition.type,
|
|
538
|
+
totalConditions: existingConditionalFakes.length,
|
|
539
|
+
});
|
|
412
540
|
}
|
|
413
541
|
else {
|
|
414
542
|
// Without condition or with "always" condition, use traditional approach
|
|
415
543
|
sequenceFakeResponseLruMap.set(baseKey, validationResult.data);
|
|
544
|
+
logger.info("[/fake] Registered fake response:", {
|
|
545
|
+
sequenceId,
|
|
546
|
+
operationName,
|
|
547
|
+
type: validationResult.data.type,
|
|
548
|
+
});
|
|
416
549
|
}
|
|
417
550
|
return Response.json({ ok: true }, {
|
|
418
551
|
status: 200,
|
|
@@ -611,19 +744,8 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
611
744
|
},
|
|
612
745
|
});
|
|
613
746
|
};
|
|
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({
|
|
747
|
+
// CORS configuration for GraphQL endpoints
|
|
748
|
+
const corsOptions = {
|
|
627
749
|
origin: (origin) => {
|
|
628
750
|
if (isLocalRequest(origin)) {
|
|
629
751
|
return origin;
|
|
@@ -633,14 +755,15 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
|
|
|
633
755
|
}
|
|
634
756
|
return null;
|
|
635
757
|
},
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
app.use("/
|
|
758
|
+
};
|
|
759
|
+
// Apply CORS and route handlers to GraphQL endpoints
|
|
760
|
+
app.use("/graphql", cors(corsOptions), fakeGraphQLQuery);
|
|
761
|
+
app.use("/query", cors(corsOptions), fakeGraphQLQuery);
|
|
639
762
|
app.all("*", (c) => passToApollo(c));
|
|
640
763
|
return app;
|
|
641
764
|
};
|
|
642
765
|
export const createFakeServer = async (options) => {
|
|
643
|
-
const { logLevel, maxFieldRecursionDepth, maxQueryDepth, maxRegisteredSequences, ports, schemaFilePath, defaultValues, allowedCORSOrigins, } = options;
|
|
766
|
+
const { logLevel, maxFieldRecursionDepth, maxQueryDepth, maxRegisteredSequences, ports, schemaFilePath, defaultValues, allowedCORSOrigins, allowedHosts = "auto", } = options;
|
|
644
767
|
const logger = createLogger(logLevel);
|
|
645
768
|
const schema = buildSchema(await fs.readFile(schemaFilePath, "utf-8"));
|
|
646
769
|
const mockResult = await createMock({
|
|
@@ -665,6 +788,7 @@ export const createFakeServer = async (options) => {
|
|
|
665
788
|
maxRegisteredSequences,
|
|
666
789
|
logLevel: logLevel ?? "info",
|
|
667
790
|
allowedCORSOrigins,
|
|
791
|
+
allowedHosts,
|
|
668
792
|
});
|
|
669
793
|
};
|
|
670
794
|
export const createFakeServerInternal = async (options) => {
|
|
@@ -674,6 +798,7 @@ export const createFakeServerInternal = async (options) => {
|
|
|
674
798
|
ports: options.ports,
|
|
675
799
|
maxRegisteredSequences: options.maxRegisteredSequences,
|
|
676
800
|
allowedCORSOrigins: options.allowedCORSOrigins,
|
|
801
|
+
allowedHosts: options.allowedHosts,
|
|
677
802
|
});
|
|
678
803
|
let routerServer = null;
|
|
679
804
|
return {
|
|
@@ -681,7 +806,8 @@ export const createFakeServerInternal = async (options) => {
|
|
|
681
806
|
// Replace startStandaloneServer with our custom implementation
|
|
682
807
|
await startStandaloneServerWithCORS(apolloServer, {
|
|
683
808
|
listen: { port: options.ports.apolloServer },
|
|
684
|
-
|
|
809
|
+
logLevel: options.logLevel,
|
|
810
|
+
}, options.allowedCORSOrigins, options.allowedHosts);
|
|
685
811
|
routerServer = serve({
|
|
686
812
|
fetch: routingServer.fetch,
|
|
687
813
|
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.23.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.23.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": "9f78beca5016a585f3de1ca2cc0a3ccb24fd743e"
|
|
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,91 @@ 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
|
+
// Error handling middleware
|
|
178
|
+
app.use(
|
|
179
|
+
(
|
|
180
|
+
err: unknown,
|
|
181
|
+
req: express.Request,
|
|
182
|
+
res: express.Response,
|
|
183
|
+
_next: express.NextFunction,
|
|
184
|
+
) => {
|
|
185
|
+
logger.error("[ApolloServer] Request error:", {
|
|
186
|
+
error: err instanceof Error ? err.message : err,
|
|
187
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
188
|
+
method: req.method,
|
|
189
|
+
url: req.url,
|
|
190
|
+
headers: req.headers,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Check for specific network errors
|
|
194
|
+
const errorCode = (err as any)?.code;
|
|
195
|
+
if (errorCode === "ECONNRESET") {
|
|
196
|
+
logger.warn("[ApolloServer] Connection reset by client");
|
|
197
|
+
} else if (errorCode === "EPIPE") {
|
|
198
|
+
logger.warn("[ApolloServer] Broken pipe error");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
res.status(500).json({ error: "Internal server error" });
|
|
202
|
+
},
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
// Apply middleware stack
|
|
66
206
|
app.use(
|
|
67
207
|
"/",
|
|
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
|
-
}),
|
|
208
|
+
corsExpress(corsOptions),
|
|
89
209
|
express.json({ limit: "50mb" }),
|
|
90
210
|
// @ts-expect-error -- express 5 types are not compatible with apollo-server
|
|
91
211
|
expressMiddleware(server, options),
|
|
92
212
|
);
|
|
93
213
|
|
|
94
214
|
// Start the server
|
|
95
|
-
const port = options.listen.port ?? 4000;
|
|
96
215
|
await new Promise<void>((resolve) => httpServer.listen({ port }, resolve));
|
|
97
|
-
|
|
98
216
|
return {
|
|
99
217
|
url: `http://${ENV_HOSTNAME}:${port}`,
|
|
100
218
|
httpServer,
|
|
@@ -344,27 +462,28 @@ const createMapKey = ({
|
|
|
344
462
|
return `${sequenceId}.${operationName}`;
|
|
345
463
|
};
|
|
346
464
|
|
|
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
465
|
/**
|
|
355
466
|
* Check if the origin is a local address
|
|
356
467
|
* @param origin
|
|
357
468
|
*/
|
|
358
|
-
const isLocalRequest = (origin: string | null): boolean => {
|
|
469
|
+
const isLocalRequest = (origin: string | null | undefined): boolean => {
|
|
359
470
|
if (!origin) return false;
|
|
360
471
|
try {
|
|
361
472
|
const url = new URL(origin);
|
|
362
473
|
const hostname = url.hostname;
|
|
363
|
-
|
|
364
|
-
|
|
474
|
+
|
|
475
|
+
// Check if it's a default localhost address
|
|
476
|
+
if (DEFAULT_LOCALHOST_HOSTNAMES.includes(hostname)) {
|
|
365
477
|
return true;
|
|
366
478
|
}
|
|
367
|
-
|
|
479
|
+
|
|
480
|
+
// Check ENV_HOSTNAME
|
|
481
|
+
if (hostname === ENV_HOSTNAME) {
|
|
482
|
+
return true;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Check if it's a private IP range
|
|
486
|
+
return PRIVATE_IP_RANGES.some((range) => range.test(hostname));
|
|
368
487
|
} catch {
|
|
369
488
|
return false;
|
|
370
489
|
}
|
|
@@ -375,6 +494,7 @@ const createRoutingServer = async ({
|
|
|
375
494
|
ports,
|
|
376
495
|
maxRegisteredSequences,
|
|
377
496
|
allowedCORSOrigins,
|
|
497
|
+
allowedHosts = "auto",
|
|
378
498
|
}: {
|
|
379
499
|
logLevel: LogLevel;
|
|
380
500
|
maxRegisteredSequences: number;
|
|
@@ -383,9 +503,31 @@ const createRoutingServer = async ({
|
|
|
383
503
|
apolloServer: number;
|
|
384
504
|
};
|
|
385
505
|
allowedCORSOrigins: string[];
|
|
506
|
+
allowedHosts?: string[] | "auto";
|
|
386
507
|
}) => {
|
|
387
508
|
const logger = createLogger(logLevel);
|
|
388
509
|
const app = new Hono();
|
|
510
|
+
|
|
511
|
+
// Security configuration
|
|
512
|
+
const validHosts = generateAllowedHosts({
|
|
513
|
+
serverPort: ports.fakeServer,
|
|
514
|
+
allowedCORSOrigins: allowedCORSOrigins,
|
|
515
|
+
allowedHosts: allowedHosts,
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
// Security middleware: Host header validation (must be before CORS)
|
|
519
|
+
app.use("*", async (c, next) => {
|
|
520
|
+
const hostHeader = c.req.header("host");
|
|
521
|
+
|
|
522
|
+
if (!hostHeader || !validHosts.has(hostHeader)) {
|
|
523
|
+
logger.warn(`Rejected request with invalid Host header: ${hostHeader}`);
|
|
524
|
+
logger.debug(`Allowed hosts: ${Array.from(validHosts).join(", ")}`);
|
|
525
|
+
return c.text("Bad Request: Invalid Host header", 400);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
return await next();
|
|
529
|
+
});
|
|
530
|
+
|
|
389
531
|
// pass through to apollo server
|
|
390
532
|
const passToApollo = async (c: Context) => {
|
|
391
533
|
logger.debug("passToApollo: starting");
|
|
@@ -439,6 +581,15 @@ const createRoutingServer = async ({
|
|
|
439
581
|
headers: Object.fromEntries(proxyResponse.headers),
|
|
440
582
|
});
|
|
441
583
|
|
|
584
|
+
// Log warning for unsuccessful responses
|
|
585
|
+
if (proxyResponse.status >= 500) {
|
|
586
|
+
logger.warn("[passToApollo] Server error from Apollo:", {
|
|
587
|
+
sequenceId,
|
|
588
|
+
operationName,
|
|
589
|
+
status: proxyResponse.status,
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
|
|
442
593
|
// log response with pipe
|
|
443
594
|
if (proxyResponse.status === 101) return proxyResponse;
|
|
444
595
|
|
|
@@ -504,6 +655,7 @@ const createRoutingServer = async ({
|
|
|
504
655
|
logger.debug("/fake");
|
|
505
656
|
const sequenceId = c.req.header("sequence-id");
|
|
506
657
|
if (!sequenceId) {
|
|
658
|
+
logger.warn("[/fake] Missing sequence-id header");
|
|
507
659
|
return Response.json(
|
|
508
660
|
{
|
|
509
661
|
ok: false,
|
|
@@ -514,7 +666,25 @@ const createRoutingServer = async ({
|
|
|
514
666
|
},
|
|
515
667
|
);
|
|
516
668
|
}
|
|
517
|
-
|
|
669
|
+
|
|
670
|
+
let body: unknown;
|
|
671
|
+
try {
|
|
672
|
+
body = await c.req.json();
|
|
673
|
+
} catch (error) {
|
|
674
|
+
logger.error("[/fake] Failed to parse request body:", {
|
|
675
|
+
sequenceId,
|
|
676
|
+
error: error instanceof Error ? error.message : error,
|
|
677
|
+
});
|
|
678
|
+
return Response.json(
|
|
679
|
+
{
|
|
680
|
+
ok: false,
|
|
681
|
+
errors: ["Invalid JSON in request body"],
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
status: 400,
|
|
685
|
+
},
|
|
686
|
+
);
|
|
687
|
+
}
|
|
518
688
|
logger.debug("/fake: got fake body", {
|
|
519
689
|
sequenceId,
|
|
520
690
|
body,
|
|
@@ -568,9 +738,20 @@ const createRoutingServer = async ({
|
|
|
568
738
|
});
|
|
569
739
|
|
|
570
740
|
conditionalFakeResponseMap.set(baseKey, existingConditionalFakes);
|
|
741
|
+
logger.info("[/fake] Registered conditional fake response:", {
|
|
742
|
+
sequenceId,
|
|
743
|
+
operationName,
|
|
744
|
+
conditionType: validationResult.data.requestCondition.type,
|
|
745
|
+
totalConditions: existingConditionalFakes.length,
|
|
746
|
+
});
|
|
571
747
|
} else {
|
|
572
748
|
// Without condition or with "always" condition, use traditional approach
|
|
573
749
|
sequenceFakeResponseLruMap.set(baseKey, validationResult.data);
|
|
750
|
+
logger.info("[/fake] Registered fake response:", {
|
|
751
|
+
sequenceId,
|
|
752
|
+
operationName,
|
|
753
|
+
type: validationResult.data.type,
|
|
754
|
+
});
|
|
574
755
|
}
|
|
575
756
|
return Response.json(
|
|
576
757
|
{ ok: true },
|
|
@@ -817,37 +998,22 @@ const createRoutingServer = async ({
|
|
|
817
998
|
},
|
|
818
999
|
});
|
|
819
1000
|
};
|
|
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);
|
|
1001
|
+
// CORS configuration for GraphQL endpoints
|
|
1002
|
+
const corsOptions = {
|
|
1003
|
+
origin: (origin: string | undefined) => {
|
|
1004
|
+
if (isLocalRequest(origin)) {
|
|
1005
|
+
return origin;
|
|
1006
|
+
}
|
|
1007
|
+
if (origin && allowedCORSOrigins.includes(origin)) {
|
|
1008
|
+
return origin;
|
|
1009
|
+
}
|
|
1010
|
+
return null;
|
|
1011
|
+
},
|
|
1012
|
+
};
|
|
1013
|
+
|
|
1014
|
+
// Apply CORS and route handlers to GraphQL endpoints
|
|
1015
|
+
app.use("/graphql", cors(corsOptions), fakeGraphQLQuery);
|
|
1016
|
+
app.use("/query", cors(corsOptions), fakeGraphQLQuery);
|
|
851
1017
|
app.all("*", (c) => passToApollo(c));
|
|
852
1018
|
return app;
|
|
853
1019
|
};
|
|
@@ -861,6 +1027,7 @@ export const createFakeServer = async (options: CreateFakeServerOptions) => {
|
|
|
861
1027
|
schemaFilePath,
|
|
862
1028
|
defaultValues,
|
|
863
1029
|
allowedCORSOrigins,
|
|
1030
|
+
allowedHosts = "auto",
|
|
864
1031
|
} = options;
|
|
865
1032
|
const logger = createLogger(logLevel);
|
|
866
1033
|
const schema = buildSchema(await fs.readFile(schemaFilePath, "utf-8"));
|
|
@@ -886,6 +1053,7 @@ export const createFakeServer = async (options: CreateFakeServerOptions) => {
|
|
|
886
1053
|
maxRegisteredSequences,
|
|
887
1054
|
logLevel: logLevel ?? "info",
|
|
888
1055
|
allowedCORSOrigins,
|
|
1056
|
+
allowedHosts,
|
|
889
1057
|
});
|
|
890
1058
|
};
|
|
891
1059
|
|
|
@@ -896,6 +1064,7 @@ export const createFakeServerInternal = async (options: FakeServerInternal) => {
|
|
|
896
1064
|
ports: options.ports,
|
|
897
1065
|
maxRegisteredSequences: options.maxRegisteredSequences,
|
|
898
1066
|
allowedCORSOrigins: options.allowedCORSOrigins,
|
|
1067
|
+
allowedHosts: options.allowedHosts,
|
|
899
1068
|
});
|
|
900
1069
|
let routerServer: ReturnType<typeof serve> | null = null;
|
|
901
1070
|
return {
|
|
@@ -905,13 +1074,16 @@ export const createFakeServerInternal = async (options: FakeServerInternal) => {
|
|
|
905
1074
|
apolloServer,
|
|
906
1075
|
{
|
|
907
1076
|
listen: { port: options.ports.apolloServer },
|
|
1077
|
+
logLevel: options.logLevel,
|
|
908
1078
|
},
|
|
909
1079
|
options.allowedCORSOrigins,
|
|
1080
|
+
options.allowedHosts,
|
|
910
1081
|
);
|
|
911
1082
|
routerServer = serve({
|
|
912
1083
|
fetch: routingServer.fetch,
|
|
913
1084
|
port: options.ports.fakeServer,
|
|
914
1085
|
});
|
|
1086
|
+
|
|
915
1087
|
return {
|
|
916
1088
|
urls: {
|
|
917
1089
|
fakeServer: `http://${ENV_HOSTNAME}:${options.ports.fakeServer}`,
|