@js-recon/js-recon 1.4.1-beta.1 → 1.4.1-beta.2

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 (75) hide show
  1. package/.claude-sync/capture-new.sh +61 -0
  2. package/.claude-sync/capture-scan.sh +55 -0
  3. package/.claude-sync/hooks/post-checkout +16 -0
  4. package/.claude-sync/hooks/pre-commit +3 -0
  5. package/.claude-sync/setup.sh +17 -0
  6. package/.claude-sync/sync.sh +64 -0
  7. package/.claude-sync/watch.sh +17 -0
  8. package/.github/workflows/build-and-prettify.yaml +40 -0
  9. package/.github/workflows/promote-js-recon.yml +129 -8
  10. package/.vscode/tasks.json +42 -0
  11. package/CHANGELOG.md +17 -0
  12. package/Dockerfile.w-rules +13 -0
  13. package/README.md +1 -1
  14. package/build/analyze/helpers/initRules.js +27 -5
  15. package/build/analyze/helpers/initRules.js.map +1 -1
  16. package/build/analyze/index.js +3 -2
  17. package/build/analyze/index.js.map +1 -1
  18. package/build/completion/index.js +17 -11
  19. package/build/completion/index.js.map +1 -1
  20. package/build/globalConfig.js +1 -1
  21. package/build/index.js +55 -23
  22. package/build/index.js.map +1 -1
  23. package/build/lazyLoad/generic/generic_jsMimeTypes.js +19 -0
  24. package/build/lazyLoad/generic/generic_jsMimeTypes.js.map +1 -0
  25. package/build/lazyLoad/index.js +1 -0
  26. package/build/lazyLoad/index.js.map +1 -1
  27. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +8 -2
  28. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  29. package/build/lazyLoad/techDetect/checkInterceptedEvidence.js +18 -0
  30. package/build/lazyLoad/techDetect/checkInterceptedEvidence.js.map +1 -0
  31. package/build/lazyLoad/techDetect/index.js +58 -13
  32. package/build/lazyLoad/techDetect/index.js.map +1 -1
  33. package/build/mcp/mcpServer.js +1 -2
  34. package/build/mcp/mcpServer.js.map +1 -1
  35. package/build/mcp/tools.js +1 -2
  36. package/build/mcp/tools.js.map +1 -1
  37. package/build/proxy/awsConfig.js +45 -0
  38. package/build/proxy/awsConfig.js.map +1 -0
  39. package/build/proxy/checkFeasibility.js.map +1 -0
  40. package/build/proxy/checkFireWallBlocking.js.map +1 -0
  41. package/build/proxy/configFile.js +31 -0
  42. package/build/proxy/configFile.js.map +1 -0
  43. package/build/{api_gateway → proxy}/genReq.js +4 -5
  44. package/build/proxy/genReq.js.map +1 -0
  45. package/build/proxy/genericProxy.js +21 -0
  46. package/build/proxy/genericProxy.js.map +1 -0
  47. package/build/proxy/index.js +421 -0
  48. package/build/proxy/index.js.map +1 -0
  49. package/build/proxy/oxylabsProxy.js +34 -0
  50. package/build/proxy/oxylabsProxy.js.map +1 -0
  51. package/build/proxy/resolveProxyConfig.js +38 -0
  52. package/build/proxy/resolveProxyConfig.js.map +1 -0
  53. package/build/report/utility/initGlobalReportDb.js +111 -0
  54. package/build/report/utility/initGlobalReportDb.js.map +1 -0
  55. package/build/report/utility/mergeDomainIntoGlobalDb.js +39 -0
  56. package/build/report/utility/mergeDomainIntoGlobalDb.js.map +1 -0
  57. package/build/run/index.js +110 -74
  58. package/build/run/index.js.map +1 -1
  59. package/build/run/interruptHandler.js +17 -1
  60. package/build/run/interruptHandler.js.map +1 -1
  61. package/build/utility/configureProxy.js +60 -0
  62. package/build/utility/configureProxy.js.map +1 -0
  63. package/build/utility/globals.js +108 -13
  64. package/build/utility/globals.js.map +1 -1
  65. package/build/utility/makeReq.js +103 -10
  66. package/build/utility/makeReq.js.map +1 -1
  67. package/package.json +5 -1
  68. package/CLAUDE.md +0 -641
  69. package/build/api_gateway/checkFeasibility.js.map +0 -1
  70. package/build/api_gateway/checkFireWallBlocking.js.map +0 -1
  71. package/build/api_gateway/genReq.js.map +0 -1
  72. package/build/api_gateway/index.js +0 -291
  73. package/build/api_gateway/index.js.map +0 -1
  74. /package/build/{api_gateway → proxy}/checkFeasibility.js +0 -0
  75. /package/build/{api_gateway → proxy}/checkFireWallBlocking.js +0 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Parses a socks5://[user:pass@]host:port or http(s)://[user:pass@]host:port proxy URL.
3
+ */
4
+ export const parseProxyUrl = (url) => {
5
+ const parsed = new URL(url);
6
+ const protocol = parsed.protocol.replace(":", "");
7
+ if (protocol !== "socks5" && protocol !== "http" && protocol !== "https") {
8
+ throw new Error(`Unsupported proxy protocol: ${protocol}. Expected socks5, http, or https.`);
9
+ }
10
+ if (!parsed.hostname || !parsed.port) {
11
+ throw new Error(`Invalid proxy URL: ${url}. Expected format: ${protocol}://[user:pass@]host:port`);
12
+ }
13
+ return {
14
+ protocol,
15
+ host: parsed.hostname,
16
+ port: Number(parsed.port),
17
+ username: parsed.username ? decodeURIComponent(parsed.username) : undefined,
18
+ password: parsed.password ? decodeURIComponent(parsed.password) : undefined,
19
+ };
20
+ };
21
+ //# sourceMappingURL=genericProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genericProxy.js","sourceRoot":"","sources":["../../src/proxy/genericProxy.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAkB,EAAE;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,oCAAoC,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,sBAAsB,QAAQ,0BAA0B,CAAC,CAAC;IACvG,CAAC;IACD,OAAO;QACH,QAAQ;QACR,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3E,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9E,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,421 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import inquirer from "inquirer";
12
+ import { APIGatewayClient, CreateRestApiCommand, DeleteRestApiCommand } from "@aws-sdk/client-api-gateway";
13
+ import checkFeasibility from "./checkFeasibility.js";
14
+ import { readAwsGatewayMap, writeAwsGatewayMap } from "./awsConfig.js";
15
+ import { setActiveProxyMethod, writeMethodConfig } from "./configFile.js";
16
+ import { parseProxyUrl } from "./genericProxy.js";
17
+ import { composeOxylabsUsername } from "./oxylabsProxy.js";
18
+ const VALID_PROXY_METHODS = ["aws", "socks", "http", "oxylabs"];
19
+ // read the docs for all the methods for api gateway at https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/
20
+ // for the rate limits, refer to https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
21
+ /**
22
+ * Selects a random AWS region from the available API Gateway regions.
23
+ *
24
+ * @returns A randomly selected AWS region identifier
25
+ */
26
+ const randomRegion = () => {
27
+ const apiGatewayRegions = [
28
+ "us-east-2", // US East (Ohio)
29
+ "us-east-1", // US East (N. Virginia)
30
+ "us-west-1", // US West (N. California)
31
+ "us-west-2", // US West (Oregon)
32
+ "af-south-1", // Africa (Cape Town)
33
+ "ap-east-1", // Asia Pacific (Hong Kong)
34
+ "ap-south-2", // Asia Pacific (Hyderabad)
35
+ "ap-southeast-3", // Asia Pacific (Jakarta)
36
+ "ap-southeast-5", // Asia Pacific (Malaysia)
37
+ "ap-southeast-4", // Asia Pacific (Melbourne)
38
+ "ap-south-1", // Asia Pacific (Mumbai)
39
+ "ap-northeast-3", // Asia Pacific (Osaka)
40
+ "ap-northeast-2", // Asia Pacific (Seoul)
41
+ "ap-southeast-1", // Asia Pacific (Singapore)
42
+ "ap-southeast-2", // Asia Pacific (Sydney)
43
+ "ap-east-2", // Asia Pacific (Taipei)
44
+ "ap-southeast-7", // Asia Pacific (Thailand)
45
+ "ap-northeast-1", // Asia Pacific (Tokyo)
46
+ "ca-central-1", // Canada (Central)
47
+ "ca-west-1", // Canada West (Calgary)
48
+ "eu-central-1", // Europe (Frankfurt)
49
+ "eu-west-1", // Europe (Ireland)
50
+ "eu-west-2", // Europe (London)
51
+ "eu-south-1", // Europe (Milan)
52
+ "eu-west-3", // Europe (Paris)
53
+ "eu-south-2", // Europe (Spain)
54
+ "eu-north-1", // Europe (Stockholm)
55
+ "eu-central-2", // Europe (Zurich)
56
+ "il-central-1", // Israel (Tel Aviv)
57
+ "mx-central-1", // Mexico (Central)
58
+ "me-south-1", // Middle East (Bahrain)
59
+ "me-central-1", // Middle East (UAE)
60
+ "sa-east-1", // South America (São Paulo)
61
+ ];
62
+ return apiGatewayRegions[Math.floor(Math.random() * apiGatewayRegions.length)];
63
+ };
64
+ let aws_access_key;
65
+ let aws_secret_key;
66
+ let region;
67
+ let configFile = "";
68
+ /**
69
+ * Utility function to pause execution for a specified duration.
70
+ *
71
+ * @param ms - Number of milliseconds to sleep
72
+ * @returns Promise that resolves after the specified delay
73
+ */
74
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
75
+ /**
76
+ * Create a new API Gateway.
77
+ *
78
+ * @async
79
+ * @returns {Promise<void>}
80
+ */
81
+ const createGateway = () => __awaiter(void 0, void 0, void 0, function* () {
82
+ console.log(chalk.cyan("[i] Creating API Gateway"));
83
+ const client = new APIGatewayClient({
84
+ region,
85
+ credentials: {
86
+ accessKeyId: aws_access_key,
87
+ secretAccessKey: aws_secret_key,
88
+ },
89
+ });
90
+ const apigw_created_at = Date.now();
91
+ const apigw_name = `js_recon-${apigw_created_at}-${Math.floor(Math.random() * 1000)}`;
92
+ const command = new CreateRestApiCommand({
93
+ name: apigw_name,
94
+ description: `API Gateway for JS Recon created at ${new Intl.DateTimeFormat("en-US", {
95
+ year: "numeric",
96
+ month: "long",
97
+ day: "2-digit",
98
+ hour: "2-digit",
99
+ minute: "2-digit",
100
+ second: "2-digit",
101
+ timeZoneName: "short",
102
+ }).format(apigw_created_at)}`,
103
+ endpointConfiguration: {
104
+ ipAddressType: "dualstack",
105
+ types: ["REGIONAL"],
106
+ },
107
+ });
108
+ const response = yield client.send(command);
109
+ yield sleep(3000);
110
+ console.log(chalk.green(`[✓] Created API Gateway`));
111
+ console.log(chalk.bgGreen("ID:"), chalk.green(response.id));
112
+ console.log(chalk.bgGreen("Name:"), chalk.green(apigw_name));
113
+ console.log(chalk.bgGreen("Region:"), chalk.green(region));
114
+ // load the existing aws gateway map, if any
115
+ const config = readAwsGatewayMap(configFile);
116
+ config[apigw_name] = {
117
+ id: response.id,
118
+ name: apigw_name,
119
+ description: response.description,
120
+ created_at: apigw_created_at,
121
+ region: region,
122
+ access_key: aws_access_key,
123
+ secret_key: aws_secret_key,
124
+ };
125
+ writeAwsGatewayMap(configFile, config);
126
+ console.log(chalk.green(`[✓] Config saved to ${configFile}`));
127
+ });
128
+ /**
129
+ * Destroy an API Gateway.
130
+ *
131
+ * @async
132
+ * @param {string} id - The ID of the API Gateway to destroy.
133
+ * @returns {Promise<void>}
134
+ */
135
+ const destroyGateway = (id) => __awaiter(void 0, void 0, void 0, function* () {
136
+ console.log(chalk.cyan("[i] Destroying API Gateway"));
137
+ if (!id) {
138
+ console.error(chalk.red("[!] Please provide an API Gateway ID"));
139
+ return;
140
+ }
141
+ // read the aws gateway map
142
+ let config = readAwsGatewayMap(configFile);
143
+ // get the name of the api gateway
144
+ let name = Object.keys(config).find((key) => config[key].id === id);
145
+ console.log(chalk.bgGreen("Name:"), chalk.green(name));
146
+ console.log(chalk.bgGreen("ID:"), chalk.green(id));
147
+ console.log(chalk.bgGreen("Region:"), chalk.green(config[name].region));
148
+ region = config[name].region;
149
+ const client = new APIGatewayClient({
150
+ region,
151
+ credentials: {
152
+ accessKeyId: aws_access_key,
153
+ secretAccessKey: aws_secret_key,
154
+ },
155
+ });
156
+ const command = new DeleteRestApiCommand({
157
+ restApiId: id,
158
+ });
159
+ yield client.send(command);
160
+ // remove from the config file
161
+ delete config[name];
162
+ writeAwsGatewayMap(configFile, config);
163
+ yield sleep(30000);
164
+ console.log(chalk.green(`[✓] Destroyed API Gateway: ${id}`));
165
+ });
166
+ /**
167
+ * Destroy all API Gateways.
168
+ *
169
+ * @async
170
+ * @returns {Promise<void>}
171
+ */
172
+ const destroyAllGateways = () => __awaiter(void 0, void 0, void 0, function* () {
173
+ console.log(chalk.cyan("[i] Destroying all API Gateways"));
174
+ // read the aws gateway map
175
+ let config = readAwsGatewayMap(configFile);
176
+ // destroy all the gateways
177
+ for (const [key, value] of Object.entries(config)) {
178
+ const client = new APIGatewayClient({
179
+ region: value.region,
180
+ credentials: {
181
+ accessKeyId: aws_access_key,
182
+ secretAccessKey: aws_secret_key,
183
+ },
184
+ });
185
+ console.log(chalk.cyan(`[i] Destroying API Gateway: ${key} : ${value.id} : ${value.region}`));
186
+ const command = new DeleteRestApiCommand({
187
+ restApiId: value.id,
188
+ });
189
+ yield sleep(30000);
190
+ yield client.send(command);
191
+ console.log(chalk.green(`[✓] Destroyed API Gateway: ${key} : ${value.id} : ${value.region}`));
192
+ }
193
+ // nullify the aws gateway map
194
+ writeAwsGatewayMap(configFile, {});
195
+ console.log(chalk.green("[✓] Destroyed all API Gateways"));
196
+ });
197
+ /**
198
+ * List all API Gateways.
199
+ *
200
+ * @async
201
+ * @returns {Promise<void>}
202
+ */
203
+ const listGateways = () => __awaiter(void 0, void 0, void 0, function* () {
204
+ console.log(chalk.cyan("[i] Listing all API Gateways"));
205
+ // read the aws gateway map
206
+ const config = readAwsGatewayMap(configFile);
207
+ // if list is empty
208
+ if (Object.keys(config).length === 0) {
209
+ console.error(chalk.red("[!] No API Gateways found"));
210
+ return;
211
+ }
212
+ console.log(chalk.green("[✓] List of API Gateways"));
213
+ for (const [key, value] of Object.entries(config)) {
214
+ console.log(chalk.bgGreen("Name:"), chalk.green(key));
215
+ console.log(chalk.bgGreen("ID:"), chalk.green(value.id));
216
+ console.log(chalk.bgGreen("Region:"), chalk.green(value.region));
217
+ console.log("\n");
218
+ }
219
+ });
220
+ /** Masks a credential for secure display by showing only the first and last 4 characters. */
221
+ const keyMask = (key) => {
222
+ if (key.length < 6)
223
+ return key;
224
+ return key.slice(0, 4) + "..." + key.slice(-4);
225
+ };
226
+ /** Resolves the proxy method to configure: the `--proxy-method` flag if given, otherwise an interactive prompt. */
227
+ const promptProxyMethod = (methodInput) => __awaiter(void 0, void 0, void 0, function* () {
228
+ if (methodInput) {
229
+ if (!VALID_PROXY_METHODS.includes(methodInput)) {
230
+ throw new Error(`Invalid proxy method: ${methodInput}. Expected one of: ${VALID_PROXY_METHODS.join(", ")}`);
231
+ }
232
+ return methodInput;
233
+ }
234
+ const { method } = yield inquirer.prompt([
235
+ {
236
+ type: "list",
237
+ name: "method",
238
+ message: "Select proxy method to configure",
239
+ choices: [
240
+ { name: "aws - AWS API Gateway IP rotation", value: "aws" },
241
+ { name: "socks - Generic SOCKS5 proxy", value: "socks" },
242
+ { name: "http - Generic HTTP proxy", value: "http" },
243
+ { name: "oxylabs - Oxylabs datacenter proxy", value: "oxylabs" },
244
+ ],
245
+ },
246
+ ]);
247
+ return method;
248
+ });
249
+ /** Resolves the socks/http proxy URL: the `--proxy` flag if given (validated), otherwise an interactive prompt. */
250
+ const promptProxyUrl = (method, urlInput) => __awaiter(void 0, void 0, void 0, function* () {
251
+ if (urlInput) {
252
+ parseProxyUrl(urlInput);
253
+ return urlInput;
254
+ }
255
+ const example = method === "socks" ? "socks5://user:pass@host:1080" : "http://user:pass@host:8080";
256
+ const { url } = yield inquirer.prompt([
257
+ {
258
+ type: "input",
259
+ name: "url",
260
+ message: `${method === "socks" ? "SOCKS5" : "HTTP"} proxy URL (e.g. ${example})`,
261
+ validate: (value) => {
262
+ try {
263
+ parseProxyUrl(value);
264
+ return true;
265
+ }
266
+ catch (err) {
267
+ return err.message;
268
+ }
269
+ },
270
+ },
271
+ ]);
272
+ return url;
273
+ });
274
+ /** Resolves the oxylabs config field-by-field: CLI flags where given, otherwise interactive prompts. */
275
+ const promptOxylabsConfig = (opts) => __awaiter(void 0, void 0, void 0, function* () {
276
+ const answers = yield inquirer.prompt([
277
+ {
278
+ type: "input",
279
+ name: "username",
280
+ message: "Oxylabs username",
281
+ when: !opts.oxylabsUsername,
282
+ validate: (value) => !!value || "Username is required",
283
+ },
284
+ {
285
+ type: "password",
286
+ name: "password",
287
+ mask: "*",
288
+ message: "Oxylabs password",
289
+ when: !opts.oxylabsPassword,
290
+ validate: (value) => !!value || "Password is required",
291
+ },
292
+ {
293
+ type: "input",
294
+ name: "country",
295
+ message: "Country code (optional, e.g. US)",
296
+ when: opts.oxylabsCountry === undefined,
297
+ },
298
+ {
299
+ type: "input",
300
+ name: "city",
301
+ message: "City (optional, requires country)",
302
+ when: (currentAnswers) => opts.oxylabsCity === undefined && !!(opts.oxylabsCountry || currentAnswers.country),
303
+ },
304
+ {
305
+ type: "input",
306
+ name: "sessionId",
307
+ message: "Sticky session id (optional)",
308
+ when: opts.oxylabsSessionId === undefined,
309
+ },
310
+ ]);
311
+ const cfg = {
312
+ username: opts.oxylabsUsername || answers.username,
313
+ password: opts.oxylabsPassword || answers.password,
314
+ country: opts.oxylabsCountry || answers.country || undefined,
315
+ city: opts.oxylabsCity || answers.city || undefined,
316
+ sessionId: opts.oxylabsSessionId || answers.sessionId || undefined,
317
+ };
318
+ composeOxylabsUsername(cfg); // throws if city was given without country
319
+ return cfg;
320
+ });
321
+ /** Resolves AWS credentials/region for the interactive `--init` flow: flags/env first, prompts for whatever's missing. */
322
+ const resolveAwsCredentialsInteractive = (opts) => __awaiter(void 0, void 0, void 0, function* () {
323
+ aws_access_key = opts.awsAccessKey || process.env.AWS_ACCESS_KEY_ID || undefined;
324
+ aws_secret_key = opts.awsSecretKey || process.env.AWS_SECRET_ACCESS_KEY || undefined;
325
+ region = opts.region || undefined;
326
+ const answers = yield inquirer.prompt([
327
+ {
328
+ type: "input",
329
+ name: "accessKey",
330
+ message: "AWS access key",
331
+ when: !aws_access_key,
332
+ validate: (value) => !!value || "Required",
333
+ },
334
+ {
335
+ type: "password",
336
+ name: "secretKey",
337
+ mask: "*",
338
+ message: "AWS secret key",
339
+ when: !aws_secret_key,
340
+ validate: (value) => !!value || "Required",
341
+ },
342
+ {
343
+ type: "input",
344
+ name: "region",
345
+ message: "AWS region (leave blank for random)",
346
+ when: !region,
347
+ },
348
+ ]);
349
+ aws_access_key = aws_access_key || answers.accessKey;
350
+ aws_secret_key = aws_secret_key || answers.secretKey;
351
+ region = region || answers.region || randomRegion();
352
+ });
353
+ /**
354
+ * Main entry point for the `proxy` module.
355
+ *
356
+ * `-i/--init` runs the interactive config wizard covering all 4 methods (aws/socks/http/oxylabs),
357
+ * writing the result to `.proxy_config.json`. `-d/--destroy`, `--destroy-all`, and `-l/--list`
358
+ * remain AWS-only lifecycle actions, unchanged from the original api-gateway module.
359
+ *
360
+ * @async
361
+ * @param opts - Resolved CLI options for the `proxy` command.
362
+ * @returns {Promise<void>}
363
+ */
364
+ const proxy = (opts) => __awaiter(void 0, void 0, void 0, function* () {
365
+ configFile = opts.config || ".proxy_config.json";
366
+ // if feasibility is true, check feasibility
367
+ if (opts.feasibility) {
368
+ if (!opts.feasibilityUrl) {
369
+ console.error(chalk.red("[!] Please provide a URL to check feasibility of"));
370
+ return;
371
+ }
372
+ yield checkFeasibility(opts.feasibilityUrl);
373
+ return;
374
+ }
375
+ if (opts.init) {
376
+ const method = yield promptProxyMethod(opts.proxyMethod);
377
+ if (method === "aws") {
378
+ console.log(chalk.cyan("[i] Configuring 'Proxy' module (aws method)"));
379
+ yield resolveAwsCredentialsInteractive(opts);
380
+ console.log(chalk.cyan(`[i] Using region: ${region}`));
381
+ console.log(chalk.cyan(`[i] Using access key: ${keyMask(aws_access_key)}`));
382
+ yield createGateway();
383
+ setActiveProxyMethod(configFile, "aws");
384
+ return;
385
+ }
386
+ if (method === "socks" || method === "http") {
387
+ const url = yield promptProxyUrl(method, opts.proxyUrl);
388
+ writeMethodConfig(configFile, method, { url });
389
+ console.log(chalk.green(`[✓] Saved ${method} proxy config to ${configFile}`));
390
+ return;
391
+ }
392
+ // method === "oxylabs"
393
+ const oxylabsConfig = yield promptOxylabsConfig(opts);
394
+ writeMethodConfig(configFile, "oxylabs", oxylabsConfig);
395
+ console.log(chalk.green(`[✓] Saved oxylabs proxy config to ${configFile}`));
396
+ return;
397
+ }
398
+ // destroy / destroy-all / list remain AWS-only, non-interactive
399
+ if (opts.destroy || opts.destroyAll || opts.list) {
400
+ aws_access_key = opts.awsAccessKey || process.env.AWS_ACCESS_KEY_ID || undefined;
401
+ aws_secret_key = opts.awsSecretKey || process.env.AWS_SECRET_ACCESS_KEY || undefined;
402
+ region = opts.region || randomRegion();
403
+ if (!aws_access_key || !aws_secret_key) {
404
+ console.error(chalk.red("[!] AWS Access Key or Secret Key not found. Run with -h to see help"));
405
+ process.exit(1);
406
+ }
407
+ if (opts.destroy) {
408
+ yield destroyGateway(opts.destroy);
409
+ }
410
+ else if (opts.destroyAll) {
411
+ yield destroyAllGateways();
412
+ }
413
+ else {
414
+ yield listGateways();
415
+ }
416
+ return;
417
+ }
418
+ console.error(chalk.red("[!] Please provide a valid action (-i/--init, -d/--destroy, --destroy-all, or -l/--list)"));
419
+ });
420
+ export default proxy;
421
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Composes the Oxylabs datacenter-proxy username: auth is entirely encoded here, no separate API.
3
+ * user-USERNAME[-country-XX]
4
+ *
5
+ * Verified against a live Oxylabs datacenter account (dc.oxylabs.io:8000) — the previous
6
+ * `customer-USERNAME-cc-XX` residential-style scheme returns a 407 Proxy Authentication Required
7
+ * against real datacenter credentials; this is the confirmed-working format per
8
+ * https://developers.oxylabs.io/products/proxies/datacenter-proxies/select-country.
9
+ *
10
+ * `city` and `sessionId` are not supported here: Oxylabs' datacenter tier has no documented
11
+ * username-level city targeting, and sticky sessions are selected by port number, not by a
12
+ * username suffix — silently encoding either into the username would produce a wrong username
13
+ * that fails auth, so both are rejected explicitly instead.
14
+ */
15
+ export const composeOxylabsUsername = (cfg) => {
16
+ if (cfg.city) {
17
+ throw new Error("Oxylabs config: `city` is not supported (no documented username-level city targeting for datacenter proxies). Omit `city`.");
18
+ }
19
+ if (cfg.sessionId) {
20
+ throw new Error("Oxylabs config: `sessionId` is not supported via username for datacenter proxies (sticky sessions are selected by port, not username). Omit `sessionId`.");
21
+ }
22
+ let username = `user-${cfg.username}`;
23
+ if (cfg.country) {
24
+ username += `-country-${cfg.country}`;
25
+ }
26
+ return username;
27
+ };
28
+ const OXYLABS_ENTRY_ENDPOINT = "dc.oxylabs.io:8000";
29
+ /** Composes the full Oxylabs datacenter proxy URL. */
30
+ export const buildOxylabsProxyUrl = (cfg) => {
31
+ const username = composeOxylabsUsername(cfg);
32
+ return `http://${encodeURIComponent(username)}:${encodeURIComponent(cfg.password)}@${OXYLABS_ENTRY_ENDPOINT}`;
33
+ };
34
+ //# sourceMappingURL=oxylabsProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxylabsProxy.js","sourceRoot":"","sources":["../../src/proxy/oxylabsProxy.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAkB,EAAU,EAAE;IACjE,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACX,4HAA4H,CAC/H,CAAC;IACN,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACX,0JAA0J,CAC7J,CAAC;IACN,CAAC;IAED,IAAI,QAAQ,GAAG,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;IACtC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,QAAQ,IAAI,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,sDAAsD;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAkB,EAAU,EAAE;IAC/D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,UAAU,kBAAkB,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE,CAAC;AAClH,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ const isValidMethod = (value) => {
2
+ return value === "aws" || value === "socks" || value === "http" || value === "oxylabs";
3
+ };
4
+ export const resolveProxyConfig = (input) => {
5
+ var _a;
6
+ const { cli, env, ignoreEnv, configFileParsed } = input;
7
+ const envMethod = ignoreEnv ? undefined : env.JS_RECON_PROXY_METHOD;
8
+ const rawMethod = cli.proxyMethod || envMethod || configFileParsed.method;
9
+ const method = isValidMethod(rawMethod) ? rawMethod : null;
10
+ if (method === null) {
11
+ return { method: null };
12
+ }
13
+ if (method === "socks" || method === "http") {
14
+ const envUrl = ignoreEnv ? undefined : env.JS_RECON_PROXY_URL;
15
+ const url = cli.proxyUrl || envUrl || ((_a = configFileParsed[method]) === null || _a === void 0 ? void 0 : _a.url);
16
+ return { method, url };
17
+ }
18
+ if (method === "oxylabs") {
19
+ const envUsername = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_USERNAME;
20
+ const envPassword = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_PASSWORD;
21
+ const envCountry = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_COUNTRY;
22
+ const envCity = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_CITY;
23
+ const envSessionId = ignoreEnv ? undefined : env.JS_RECON_OXYLABS_SESSION_ID;
24
+ const fileOxylabs = configFileParsed.oxylabs || {};
25
+ const username = cli.oxylabsUsername || envUsername || fileOxylabs.username;
26
+ const password = cli.oxylabsPassword || envPassword || fileOxylabs.password;
27
+ const country = cli.oxylabsCountry || envCountry || fileOxylabs.country;
28
+ const city = cli.oxylabsCity || envCity || fileOxylabs.city;
29
+ const sessionId = cli.oxylabsSessionId || envSessionId || fileOxylabs.sessionId;
30
+ if (!username || !password) {
31
+ return { method: null };
32
+ }
33
+ return { method, oxylabs: { username, password, country, city, sessionId } };
34
+ }
35
+ // method === "aws"
36
+ return { method, awsGatewayMap: configFileParsed.aws || {} };
37
+ };
38
+ //# sourceMappingURL=resolveProxyConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveProxyConfig.js","sourceRoot":"","sources":["../../src/proxy/resolveProxyConfig.ts"],"names":[],"mappings":"AA4CA,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE;IAC3D,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAA8B,EAAuB,EAAE;;IACtF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAExD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACpE,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,IAAI,SAAS,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAC1E,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,MAAM,KAAI,MAAA,gBAAgB,CAAC,MAAM,CAAC,0CAAE,GAAG,CAAA,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC1E,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC1E,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC;QACxE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAClE,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC;QAC7E,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC;QAEnD,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC;QAC5E,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC;QAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,IAAI,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC;QACxE,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,IAAI,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC;QAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,IAAI,YAAY,IAAI,WAAW,CAAC,SAAS,CAAC;QAEhF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACjF,CAAC;IAED,mBAAmB;IACnB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;AACjE,CAAC,CAAC"}
@@ -0,0 +1,111 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import Database from "better-sqlite3";
11
+ /**
12
+ * Creates the mapped table in the global database. Adds a `domain` column and a
13
+ * `globalId` surrogate key since the original `id` (chunk module id) is only
14
+ * unique within a single domain's bundle, not across domains.
15
+ *
16
+ * @param db - The database to create the table in
17
+ */
18
+ const createMappedTable = (db) => {
19
+ db.prepare(`
20
+ CREATE TABLE IF NOT EXISTS mapped (
21
+ globalId INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ domain TEXT,
23
+ id TEXT,
24
+ description TEXT,
25
+ loadedOn TEXT,
26
+ containsFetch BOOLEAN,
27
+ isAxiosClient BOOLEAN,
28
+ exports TEXT,
29
+ callStack TEXT,
30
+ code TEXT,
31
+ imports TEXT,
32
+ file TEXT
33
+ )
34
+ `).run();
35
+ };
36
+ /**
37
+ * Creates the mapped OpenAPI table in the global database. The primary key is
38
+ * widened to include `domain` since the same path/method can exist on
39
+ * different domains.
40
+ *
41
+ * @param db - The database to create the table in
42
+ */
43
+ const createMappedOpenapiTable = (db) => {
44
+ db.prepare(`
45
+ CREATE TABLE IF NOT EXISTS mapped_openapi (
46
+ domain TEXT,
47
+ path TEXT,
48
+ method TEXT,
49
+ summary TEXT,
50
+ parameters TEXT,
51
+ requestBody TEXT,
52
+ tags TEXT,
53
+ PRIMARY KEY (domain, path, method)
54
+ )
55
+ `).run();
56
+ };
57
+ /**
58
+ * Creates the endpoints table in the global database. The primary key is
59
+ * widened to include `domain` since the same URL can exist on different
60
+ * domains.
61
+ *
62
+ * @param db - The database to create the table in
63
+ */
64
+ const createEndpointsTable = (db) => {
65
+ db.prepare(`
66
+ CREATE TABLE IF NOT EXISTS endpoints (
67
+ domain TEXT,
68
+ url TEXT,
69
+ PRIMARY KEY (domain, url)
70
+ )
71
+ `).run();
72
+ };
73
+ /**
74
+ * Creates the analysis findings table in the global database. Adds a `domain`
75
+ * column and a `globalId` surrogate key.
76
+ *
77
+ * @param db - The database to create the table in
78
+ */
79
+ const createAnalysisFindingsTable = (db) => {
80
+ db.prepare(`
81
+ CREATE TABLE IF NOT EXISTS analysis_findings (
82
+ globalId INTEGER PRIMARY KEY AUTOINCREMENT,
83
+ domain TEXT,
84
+ ruleId TEXT,
85
+ ruleName TEXT,
86
+ ruleType TEXT,
87
+ ruleDescription TEXT,
88
+ ruleAuthor TEXT,
89
+ ruleTech TEXT,
90
+ severity TEXT,
91
+ message TEXT,
92
+ findingLocation TEXT
93
+ )
94
+ `).run();
95
+ };
96
+ /**
97
+ * Initializes the global report database used to aggregate the per-domain
98
+ * `js-recon.db` files produced during a batch (`-u <file>`) run.
99
+ *
100
+ * @param sqliteDbPath - The path to the global SQLite database file
101
+ */
102
+ const initGlobalReportDb = (sqliteDbPath) => __awaiter(void 0, void 0, void 0, function* () {
103
+ const db = new Database(sqliteDbPath);
104
+ createMappedTable(db);
105
+ createMappedOpenapiTable(db);
106
+ createEndpointsTable(db);
107
+ createAnalysisFindingsTable(db);
108
+ db.close();
109
+ });
110
+ export default initGlobalReportDb;
111
+ //# sourceMappingURL=initGlobalReportDb.js.map