@brightsec/cli 13.9.0-next.5 → 13.9.0-next.6

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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gqB,QAAQ,e,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,M,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,0B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,yC,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,yC,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,O,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,0B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,uB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,2B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,gB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,qB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,e,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,gB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,uB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,O,oj5ICCrBC,EAA2B,CAAC,EAGhC,SAASC,oBAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBj8B,IAAjBk8B,EACH,OAAOA,EAAapqB,QAGrB,IAAInH,EAASoxB,EAAyBE,GAAY,CAGjDnqB,QAAS,CAAC,GAOX,OAHAqqB,EAAoBF,GAAUv0B,KAAKiD,EAAOmH,QAASnH,EAAQA,EAAOmH,QAASkqB,qBAGpErxB,EAAOmH,OACf,C,4GCtBArR,QAAQ0G,IAAIi1B,mBAAqBrS,OAAO,MACxCtpB,QAAQ0G,IAAIk1B,aAAe,GACD,QAAxB,EAAA57B,QAAQ0G,IAAIk1B,oBAAY,QAAI,kCACE3+B,OAChC,0BACA,kCAWA,4BACA,+CACA,0BACA,4BACA,4BACA,4BACA,4BACA,4BAEA,UAAU4C,QAAQ,EAAAqM,YAAYE,MAAM,CAClCC,SAAU,CACR,IAAI,EAAAtG,YACJ,IAAI,EAAAsF,eACJ,IAAI,EAAApI,kBACJ,IAAI,EAAAkG,QACJ,IAAI,EAAAnF,WACJ,IAAI,EAAA6G,SACJ,IAAI,EAAAzG,aACJ,IAAI,EAAAwG,cACJ,IAAI,EAAAjH,eACJ,IAAI,EAAApB,uBACJ,IAAI,EAAAO,2BACJ,IAAI,EAAAgI,cACJ,IAAI,EAAApN,UACJ,IAAI,EAAAiE,eACJ,IAAI,EAAApB,yBAELtC,I","sources":["webpack://@brightsec/cli/./src/Archive/Archives.ts","webpack://@brightsec/cli/./src/Archive/Parsers/BaseParser.ts","webpack://@brightsec/cli/./src/Archive/Parsers/DefaultParserFactory.ts","webpack://@brightsec/cli/./src/Archive/Parsers/OasParser.ts","webpack://@brightsec/cli/./src/Archive/Parsers/ParserFactory.ts","webpack://@brightsec/cli/./src/Archive/Parsers/index.ts","webpack://@brightsec/cli/./src/Archive/RestArchives.ts","webpack://@brightsec/cli/./src/Archive/Validators/HarValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/OasValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/PostmanValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/index.ts","webpack://@brightsec/cli/./src/Archive/index.ts","webpack://@brightsec/cli/./src/Commands/Configure.ts","webpack://@brightsec/cli/./src/Commands/EntryPointsUpdateHost.ts","webpack://@brightsec/cli/./src/Commands/GetEntryPoints.ts","webpack://@brightsec/cli/./src/Commands/PollingDiscoveryStatus.ts","webpack://@brightsec/cli/./src/Commands/PollingHostUpdateJobStatus.ts","webpack://@brightsec/cli/./src/Commands/PollingScanStatus.ts","webpack://@brightsec/cli/./src/Commands/RerunDiscovery.ts","webpack://@brightsec/cli/./src/Commands/RetestScan.ts","webpack://@brightsec/cli/./src/Commands/RunDiscovery.ts","webpack://@brightsec/cli/./src/Commands/RunRepeater.ts","webpack://@brightsec/cli/./src/Commands/RunScan.ts","webpack://@brightsec/cli/./src/Commands/StopDiscovery.ts","webpack://@brightsec/cli/./src/Commands/StopScan.ts","webpack://@brightsec/cli/./src/Commands/UploadArchive.ts","webpack://@brightsec/cli/./src/Commands/VersionCommand.ts","webpack://@brightsec/cli/./src/Commands/index.ts","webpack://@brightsec/cli/./src/Config/CliBuilder.ts","webpack://@brightsec/cli/./src/Config/CliInfo.ts","webpack://@brightsec/cli/./src/Config/ConfigReader.ts","webpack://@brightsec/cli/./src/Config/DefaultConfigReader.ts","webpack://@brightsec/cli/./src/Config/SystemConfigManager.ts","webpack://@brightsec/cli/./src/Config/index.ts","webpack://@brightsec/cli/./src/Discovery/DefaultDiscoveryPollingFactory.ts","webpack://@brightsec/cli/./src/Discovery/Discoveries.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryPolling.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryPollingFactory.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryView.ts","webpack://@brightsec/cli/./src/Discovery/RestDiscoveries.ts","webpack://@brightsec/cli/./src/Discovery/index.ts","webpack://@brightsec/cli/./src/EntryPoint/DefaultHostUpdateJobStatusPollingFactory.ts","webpack://@brightsec/cli/./src/EntryPoint/EntryPoints.ts","webpack://@brightsec/cli/./src/EntryPoint/HostUpdateJobStatusPolling.ts","webpack://@brightsec/cli/./src/EntryPoint/HostUpdateJobStatusPollingFactory.ts","webpack://@brightsec/cli/./src/EntryPoint/RestEntryPoints.ts","webpack://@brightsec/cli/./src/EntryPoint/index.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRepeaterCommandHub.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRepeaterServer.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRuntimeDetector.ts","webpack://@brightsec/cli/./src/Repeater/NetworkTestType.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterCommandHub.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterLauncher.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterServer.ts","webpack://@brightsec/cli/./src/Repeater/RuntimeDetector.ts","webpack://@brightsec/cli/./src/Repeater/ServerRepeaterLauncher.ts","webpack://@brightsec/cli/./src/Repeater/index.ts","webpack://@brightsec/cli/./src/RequestExecutor/Certificates.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesCache.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesLoader.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesResolver.ts","webpack://@brightsec/cli/./src/RequestExecutor/DefaultCertificatesCache.ts","webpack://@brightsec/cli/./src/RequestExecutor/DefaultCertificatesResolver.ts","webpack://@brightsec/cli/./src/RequestExecutor/HttpRequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/Protocol.ts","webpack://@brightsec/cli/./src/RequestExecutor/Request.ts","webpack://@brightsec/cli/./src/RequestExecutor/RequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/RequestExecutorOptions.ts","webpack://@brightsec/cli/./src/RequestExecutor/Response.ts","webpack://@brightsec/cli/./src/RequestExecutor/WsRequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/index.ts","webpack://@brightsec/cli/./src/Scan/BasePolling.ts","webpack://@brightsec/cli/./src/Scan/Breakpoint.ts","webpack://@brightsec/cli/./src/Scan/BreakpointFactory.ts","webpack://@brightsec/cli/./src/Scan/BreakpointType.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/BreakpointException.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/OnSeverity.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/index.ts","webpack://@brightsec/cli/./src/Scan/DefaultBreakpointFactory.ts","webpack://@brightsec/cli/./src/Scan/DefaultPollingFactory.ts","webpack://@brightsec/cli/./src/Scan/PollingFactory.ts","webpack://@brightsec/cli/./src/Scan/RestScans.ts","webpack://@brightsec/cli/./src/Scan/Scans.ts","webpack://@brightsec/cli/./src/Scan/Severity.ts","webpack://@brightsec/cli/./src/Scan/index.ts","webpack://@brightsec/cli/./src/Scripts/DefaultVirtualScripts.ts","webpack://@brightsec/cli/./src/Scripts/FSScriptLoader.ts","webpack://@brightsec/cli/./src/Scripts/ScriptLoader.ts","webpack://@brightsec/cli/./src/Scripts/VirtualScript.ts","webpack://@brightsec/cli/./src/Scripts/VirtualScripts.ts","webpack://@brightsec/cli/./src/Scripts/index.ts","webpack://@brightsec/cli/./src/StartupScripts/DefaultStartupManager.ts","webpack://@brightsec/cli/./src/StartupScripts/StartupManager.ts","webpack://@brightsec/cli/./src/StartupScripts/index.ts","webpack://@brightsec/cli/./src/Utils/Backoff.ts","webpack://@brightsec/cli/./src/Utils/DefaultProxyFactory.ts","webpack://@brightsec/cli/./src/Utils/ErrorMessageFactory.ts","webpack://@brightsec/cli/./src/Utils/Helpers.ts","webpack://@brightsec/cli/./src/Utils/Logger.ts","webpack://@brightsec/cli/./src/Utils/NormalizeZlibDeflateTransformStream.ts","webpack://@brightsec/cli/./src/Utils/PatchedHttpsProxyAgent.ts","webpack://@brightsec/cli/./src/Utils/ProxyFactory.ts","webpack://@brightsec/cli/./src/Utils/Traceroute.ts","webpack://@brightsec/cli/./src/Utils/index.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/AuthConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/Connectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/ConnectivityAnalyzer.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/DefaultConnectivityAnalyzer.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/HTTPConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/TracerouteConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/index.ts","webpack://@brightsec/cli/./src/Wizard/Credentials.ts","webpack://@brightsec/cli/./src/Wizard/FSTokens.ts","webpack://@brightsec/cli/./src/Wizard/Options.ts","webpack://@brightsec/cli/./src/Wizard/Platform.ts","webpack://@brightsec/cli/./src/Wizard/Readline/ReadlinePlatform.ts","webpack://@brightsec/cli/./src/Wizard/Readline/index.ts","webpack://@brightsec/cli/./src/Wizard/TestType.ts","webpack://@brightsec/cli/./src/Wizard/Tokens.ts","webpack://@brightsec/cli/./src/Wizard/index.ts","webpack://@brightsec/cli/./src/container.ts","webpack://@brightsec/cli/external commonjs \"@neuralegion/os-service\"","webpack://@brightsec/cli/external commonjs \"@neuralegion/raw-socket\"","webpack://@brightsec/cli/external commonjs \"@sentry/node\"","webpack://@brightsec/cli/external commonjs \"ajv\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/compile/formats\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/refs/json-schema-draft-04.json\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/refs/json-schema-draft-07.json\"","webpack://@brightsec/cli/external commonjs \"arch\"","webpack://@brightsec/cli/external commonjs \"axios\"","webpack://@brightsec/cli/external commonjs \"better-ajv-errors\"","webpack://@brightsec/cli/external commonjs \"chalk\"","webpack://@brightsec/cli/external commonjs \"ci-info\"","webpack://@brightsec/cli/external commonjs \"fast-content-type-parse\"","webpack://@brightsec/cli/external commonjs \"find-up\"","webpack://@brightsec/cli/external commonjs \"form-data\"","webpack://@brightsec/cli/external commonjs \"http-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"https-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"iconv-lite\"","webpack://@brightsec/cli/external commonjs \"js-yaml\"","webpack://@brightsec/cli/external commonjs \"ms\"","webpack://@brightsec/cli/external commonjs \"reflect-metadata\"","webpack://@brightsec/cli/external commonjs \"rotating-file-stream\"","webpack://@brightsec/cli/external commonjs \"semver\"","webpack://@brightsec/cli/external commonjs \"socket.io-client\"","webpack://@brightsec/cli/external commonjs \"socket.io-msgpack-parser\"","webpack://@brightsec/cli/external commonjs \"socks-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"tslib\"","webpack://@brightsec/cli/external commonjs \"tsyringe\"","webpack://@brightsec/cli/external commonjs \"win-ca\"","webpack://@brightsec/cli/external commonjs \"ws\"","webpack://@brightsec/cli/external commonjs \"yargs\"","webpack://@brightsec/cli/external node-commonjs \"assert\"","webpack://@brightsec/cli/external node-commonjs \"child_process\"","webpack://@brightsec/cli/external node-commonjs \"fs\"","webpack://@brightsec/cli/external node-commonjs \"node:assert\"","webpack://@brightsec/cli/external node-commonjs \"node:child_process\"","webpack://@brightsec/cli/external node-commonjs \"node:dgram\"","webpack://@brightsec/cli/external node-commonjs \"node:dns/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:events\"","webpack://@brightsec/cli/external node-commonjs \"node:fs\"","webpack://@brightsec/cli/external node-commonjs \"node:fs/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:http\"","webpack://@brightsec/cli/external node-commonjs \"node:https\"","webpack://@brightsec/cli/external node-commonjs \"node:module\"","webpack://@brightsec/cli/external node-commonjs \"node:net\"","webpack://@brightsec/cli/external node-commonjs \"node:os\"","webpack://@brightsec/cli/external node-commonjs \"node:path\"","webpack://@brightsec/cli/external node-commonjs \"node:process\"","webpack://@brightsec/cli/external node-commonjs \"node:readline\"","webpack://@brightsec/cli/external node-commonjs \"node:stream\"","webpack://@brightsec/cli/external node-commonjs \"node:timers/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:tls\"","webpack://@brightsec/cli/external node-commonjs \"node:url\"","webpack://@brightsec/cli/external node-commonjs \"node:util\"","webpack://@brightsec/cli/external node-commonjs \"node:vm\"","webpack://@brightsec/cli/external node-commonjs \"node:zlib\"","webpack://@brightsec/cli/external node-commonjs \"path\"","webpack://@brightsec/cli/webpack/bootstrap","webpack://@brightsec/cli/./src/index.ts"],"sourcesContent":["export interface Spec {\n content: string | Buffer;\n filename: string;\n type: SpecType;\n contentType?: string;\n discard?: boolean;\n projectId?: string;\n headers?: Record<string, string>;\n variables?: Record<string, string>;\n}\n\nexport enum SpecType {\n HAR = 'HAR',\n OPENAPI = 'OpenAPI',\n POSTMAN = 'Postman'\n}\n\nexport interface Archives {\n upload(spec: Spec): Promise<string>;\n}\n\nexport const Archives: unique symbol = Symbol('Archives');\n","import { Validator } from '../Validators';\nimport { File, Parser } from './Parser';\nimport { access, constants, readFile, stat } from 'node:fs/promises';\nimport { ok } from 'assert';\nimport { basename, extname } from 'path';\n\nexport class BaseParser<T> implements Parser {\n private readonly FILE_SIZE_LIMIT = 500 * 1024 ** 2;\n\n constructor(protected readonly validator: Validator<T>) {}\n\n public async parse(path: string): Promise<File> {\n await this.access(path);\n\n const fileStat = await stat(path);\n\n if (fileStat.size > this.FILE_SIZE_LIMIT) {\n throw new Error('There is not enough storage space to save this file');\n }\n\n const content: string = await readFile(path, 'utf8');\n const ext: string = extname(path);\n\n let data: T | undefined;\n\n try {\n data = await this.deserialize(content, {\n ext\n });\n } catch (e) {\n throw new Error(`File is invalid. ${e.message}`);\n }\n\n await this.validator.validate(data);\n\n return {\n content,\n filename: basename(path),\n contentType: this.contentType(ext)\n };\n }\n\n protected deserialize(file: string, _meta?: { ext: string }): Promise<T> | T {\n return JSON.parse(file) as T;\n }\n\n private contentType(ext: string): string {\n switch (ext) {\n case '.yml':\n case '.yaml':\n return 'application/yaml';\n case '.json':\n default:\n return 'application/json';\n }\n }\n\n private async access(path: string): Promise<never | void> {\n ok(path, `The path is invalid.`);\n\n try {\n await access(path, constants.F_OK);\n } catch (e) {\n throw new Error(`${basename(path)} file doesn't found.`);\n }\n }\n}\n","import { SpecType } from '../Archives';\nimport { HarValidator, OasValidator, PostmanValidator } from '../Validators';\nimport { ParserFactory } from './ParserFactory';\nimport { BaseParser } from './BaseParser';\nimport { OasParser } from './OasParser';\nimport { Parser } from './Parser';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultParserFactory implements ParserFactory {\n constructor(\n private readonly harValidator: HarValidator,\n private readonly oasValidator: OasValidator,\n private readonly postmanValidator: PostmanValidator\n ) {}\n\n public create(spec: SpecType): Parser | never {\n switch (spec) {\n case SpecType.HAR:\n return new BaseParser(this.harValidator);\n case SpecType.OPENAPI:\n return new OasParser(this.oasValidator);\n case SpecType.POSTMAN:\n return new BaseParser(this.postmanValidator);\n default:\n throw new Error('Incorrect a specification type');\n }\n }\n}\n","import { Validator } from '../Validators';\nimport { BaseParser } from './BaseParser';\n\nexport class OasParser extends BaseParser<any> {\n constructor(validator: Validator<any>) {\n super(validator);\n }\n\n protected async deserialize(\n file: string,\n meta: { ext: string }\n ): Promise<any> {\n if (meta.ext === '.yml' || meta.ext === '.yaml') {\n return (await import('js-yaml')).load(file);\n } else {\n return JSON.parse(file);\n }\n }\n}\n","import { Parser } from './Parser';\nimport { SpecType } from '../Archives';\n\nexport interface ParserFactory {\n create(spec: SpecType): Parser;\n}\n\nexport const ParserFactory: unique symbol = Symbol('ParserFactory');\n","export * from './OasParser';\nexport * from './BaseParser';\nexport * from './Parser';\nexport * from './DefaultParserFactory';\nexport * from './ParserFactory';\n","import { Archives, Spec, SpecType } from './Archives';\nimport { ProxyFactory } from '../Utils';\nimport { inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport FormData from 'form-data';\nimport { ok } from 'node:assert';\nimport https from 'node:https';\nimport http from 'node:http';\n\nexport interface RestArchivesOptions {\n insecure?: boolean;\n timeout?: number;\n baseURL: string;\n apiKey: string;\n proxyURL?: string;\n}\n\nexport const RestArchivesOptions: unique symbol = Symbol('RestArchivesOptions');\n\n@injectable()\nexport class RestArchives implements Archives {\n private readonly client: Axios;\n private readonly ALLOWED_SPECS: readonly SpecType[] = [\n SpecType.OPENAPI,\n SpecType.POSTMAN,\n SpecType.HAR\n ];\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestArchivesOptions)\n {\n baseURL,\n apiKey,\n proxyURL,\n insecure,\n timeout = 10000\n }: RestArchivesOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async upload(spec: Spec): Promise<string> {\n ok(\n this.ALLOWED_SPECS.includes(spec.type),\n `Invalid specification type. Allowed: ${this.ALLOWED_SPECS}`\n );\n\n const { discard, headers, variables, projectId } = spec;\n const file = this.castToFile(spec);\n\n const formData = new FormData();\n formData.append('file', file.value, file.options);\n formData.append('projectId', projectId);\n formData.append('headers', JSON.stringify(headers ?? {}));\n formData.append('variables', JSON.stringify(variables ?? {}));\n const res = await this.client.post<{ id: string }>(\n '/api/v1/files',\n formData,\n {\n params: { discard }\n }\n );\n\n return res.data.id;\n }\n\n private castToFile({\n filename,\n content,\n contentType = 'application/json'\n }: Spec): {\n options: { filename: string; contentType: string };\n value: Buffer;\n } {\n return {\n options: {\n filename,\n contentType\n },\n value: Buffer.from(content)\n };\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport schema from './schemas/har/schema.json';\nimport { Entry, Har } from 'har-format';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport betterAjvErrors from 'better-ajv-errors';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class HarValidator implements Validator<Har> {\n private readonly ajv: Ajv.Ajv;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n async: true,\n jsonPointers: true,\n extendRefs: true\n });\n this.ajv.addSchema(schema);\n }\n\n public async validate(data: Har): Promise<void | never> {\n const validate: ValidateFunction = this.ajv.getSchema('har');\n\n if (!(await validate(data))) {\n logger.error(\n betterAjvErrors(validate.schema, data, validate.errors, {\n indent: 2\n }) as any\n );\n throw new Error(`The HAR file is corrupted.`);\n }\n\n if (!this.entriesAreValid(data.log.entries)) {\n throw new Error(`HAR is empty or contains none of request.`);\n }\n }\n\n private entriesAreValid(entries: Entry[]): boolean {\n if (!entries) {\n return false;\n }\n\n const urls: string[] = entries\n .map(this.parseEntry, this)\n .filter((item: string) => !!item);\n\n const targets: string[] = [...new Set(urls)];\n\n return targets.length !== 0;\n }\n\n private parseEntry(entry: Entry): string | undefined {\n const { host, protocol } = new URL(entry.request.url);\n\n if (!host || !protocol) {\n return;\n }\n\n if (protocol === 'chrome-extension:') {\n return;\n }\n\n return entry.request.url;\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport schemaV2 from './schemas/openapi/v2.0/schema.json';\nimport schemaV3 from './schemas/openapi/v3.0/schema.json';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport semver from 'semver';\nimport betterAjvErrors from 'better-ajv-errors';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport ajvFormats from 'ajv/lib/compile/formats';\nimport draft4 from 'ajv/lib/refs/json-schema-draft-04.json';\nimport { injectable } from 'tsyringe';\nimport { ok } from 'node:assert';\n\n@injectable()\nexport class OasValidator implements Validator<any> {\n private readonly ajv: Ajv.Ajv;\n private readonly MIN_ALLOWED_VERSION = '2.0.0';\n private readonly VERSION_SCHEMA_MAP = new Map([\n [2, 'http://swagger.io/v2/schema.json#'],\n [3, 'https://spec.openapis.org/oas/3.0/schema/2019-04-02']\n ]);\n private readonly SCHEMAS: readonly unknown[] = [schemaV2, schemaV3];\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n $data: true,\n jsonPointers: true,\n extendRefs: true,\n async: true,\n schemaId: 'auto'\n });\n this.ajv.addFormat('uriref', ajvFormats.full['uri-reference']);\n this.ajv.addMetaSchema(draft4);\n (this.ajv as any)._refs['http://json-schema.org/schema'] =\n 'http://json-schema.org/draft-04/schema'; // optional, using unversioned URI is out of spec\n this.SCHEMAS.forEach((x: any) => this.ajv.addSchema(x));\n }\n\n public async validate(spec: any): Promise<void | never> {\n const version = this.getVersion(spec);\n\n const schemaNotFound =\n 'Cannot determine version of schema. Schema ID is missed.';\n const major = semver.major(version);\n const schemaId = this.VERSION_SCHEMA_MAP.get(major);\n\n ok(schemaId, schemaNotFound);\n\n this.validateVersion(spec);\n\n const validate: ValidateFunction = this.ajv.getSchema(schemaId);\n\n if (!(await validate(spec))) {\n logger.error(\n betterAjvErrors(validate.schema, spec, validate.errors, {\n indent: 2\n }) as any\n );\n throw new Error(`The OAS file is corrupted.`);\n }\n }\n\n private validateVersion(spec: any): void | never {\n const version = this.getVersion(spec);\n\n if (!semver.gte(version, this.MIN_ALLOWED_VERSION)) {\n throw new Error(\n 'Swagger v1 are not supported. If you are using an older format, convert it to v2 and try again.'\n );\n }\n }\n\n private getVersion(spec: any): string {\n let version = (spec.openapi || spec.swagger || '').trim();\n\n ok(version, 'Cannot determine version of specification.');\n\n if (\n !semver.valid(version) &&\n this.MIN_ALLOWED_VERSION.startsWith(version)\n ) {\n version = this.MIN_ALLOWED_VERSION;\n }\n\n return version;\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport collectionV2Draft7 from './schemas/postman/draft-07/v2.0.0/collection.json';\nimport collectionV2Draft4 from './schemas/postman/draft-04/v2.0.0/collection.json';\nimport collectionDraft7 from './schemas/postman/draft-07/v2.1.0/collection.json';\nimport collectionDraft4 from './schemas/postman/draft-04/v2.1.0/collection.json';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport betterAjvErrors from 'better-ajv-errors';\nimport schemaDraft04 from 'ajv/lib/refs/json-schema-draft-04.json';\nimport schemaDraft07 from 'ajv/lib/refs/json-schema-draft-07.json';\nimport { injectable } from 'tsyringe';\nimport { ok } from 'node:assert';\nimport { parse } from 'node:path';\n\n@injectable()\nexport class PostmanValidator implements Validator<any> {\n private readonly ajv: Ajv.Ajv;\n private readonly ALLOWED_SCHEMAS: readonly string[] = [\n 'https://schema.getpostman.com/json/draft-07/collection/v2.0.0/',\n 'https://schema.getpostman.com/json/draft-07/collection/v2.1.0/',\n 'https://schema.getpostman.com/json/collection/v2.0.0/',\n 'https://schema.getpostman.com/json/collection/v2.1.0/'\n ];\n private readonly META_SCHEMAS: readonly unknown[] = [\n schemaDraft04,\n schemaDraft07\n ];\n private readonly SCHEMAS: readonly unknown[] = [\n collectionV2Draft7,\n collectionV2Draft4,\n collectionDraft7,\n collectionDraft4\n ];\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n async: true,\n meta: false,\n schemaId: 'auto'\n });\n []\n .concat(this.META_SCHEMAS, this.SCHEMAS)\n .forEach((x: unknown) => this.ajv.addMetaSchema(x as any));\n (this.ajv as any)._refs['http://json-schema.org/schema'] =\n 'http://json-schema.org/draft-04/schema'; // optional, using unversioned URI is out of spec\n }\n\n public async validate(collection: any): Promise<void | never> {\n ok(collection, 'Postman collection is not provided.');\n ok(collection.info, '\"info\" section is missed in the collection.');\n\n const schemaId: string = collection.info.schema\n ? parse(collection.info.schema).dir + '/'\n : '';\n\n if (!this.ALLOWED_SCHEMAS.includes(schemaId.trim())) {\n throw new Error(\n 'Postman v1 collections are not supported. If you are using an older format, convert it to v2 and try again.'\n );\n }\n const validate: ValidateFunction | undefined = this.ajv.getSchema(schemaId);\n\n if (!validate) {\n throw new Error(\n 'Cannot determine version of schema. Schema ID is missed.'\n );\n }\n\n if (!(await validate(collection))) {\n logger.error(\n betterAjvErrors(validate.schema, collection, validate.errors, {\n indent: 2\n }) as any\n );\n\n throw new Error(`The Postman Collection file is corrupted.`);\n }\n }\n}\n","export * from './HarValidator';\nexport * from './OasValidator';\nexport * from './PostmanValidator';\nexport * from './Validator';\n","export * from './Archives';\nexport * from './RestArchives';\nexport { Parser, ParserFactory, DefaultParserFactory } from './Parsers';\nexport { Validator } from './Validators';\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport { ConnectivityUrls, Platform, TestType, Options } from '../Wizard';\nimport container from '../container';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class Configure implements CommandModule {\n public readonly command = 'configure [options]';\n public readonly describe = 'Start a configuration wizard';\n\n private static getMapEntryOrThrow(\n type: TestType,\n input: string\n ): [TestType, URL] {\n try {\n return [type, new URL(input)];\n } catch (err) {\n throw new Error(`Invalid value for ${type} testing endpoint`);\n }\n }\n\n public builder(argv: Argv): Argv {\n return argv\n .option(TestType.HTTP, {\n hidden: true,\n requiresArg: true,\n describe: `Bright application base URL`\n })\n .option(TestType.AUTH, {\n hidden: true,\n requiresArg: true,\n describe: `Bright event message authentication endpoint`\n })\n .option('ping', {\n boolean: true,\n describe: `Start network tests.`\n })\n .option('traceroute', {\n boolean: true,\n describe: `Start treceroute to a local recource.`\n })\n .option('max-ttl', {\n number: true,\n requiresArg: true,\n describe: `Set the max time-to-live (max number of hops) used in outgoing probe packets.`,\n default: 64\n })\n .option('probes', {\n alias: 'p',\n number: true,\n requiresArg: true,\n describe: `Set the number of probes per 'ttl'.`,\n default: 3\n })\n .group(['max-ttl', 'probes'], 'Traceroute Options')\n .conflicts('ping', 'traceroute')\n .middleware((args: Arguments) => {\n container\n .register<Options>(Options, {\n useValue: {\n traceroute: {\n maxTTL: !isNaN(+args.maxTtl) ? +args.maxTtl : undefined,\n probes: !isNaN(+args.probes) ? +args.probes : undefined\n }\n }\n })\n .register(ConnectivityUrls, {\n useValue: new Map([\n Configure.getMapEntryOrThrow(\n TestType.HTTP,\n (args[TestType.HTTP] ?? args.api) as string\n ),\n Configure.getMapEntryOrThrow(\n TestType.AUTH,\n (args[TestType.AUTH] ?? args.api) as string\n )\n ])\n });\n });\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const app = container.resolve<Platform>(Platform);\n\n const stop = async () => {\n await app.stop();\n process.exit(0);\n };\n\n process.on('SIGTERM', stop).on('SIGINT', stop).on('SIGHUP', stop);\n await app.start({ ping: !!args.ping, traceroute: !!args.traceroute });\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'configure' })\n );\n process.exit(1);\n }\n }\n}\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport {\n EntryPoints,\n RestProjectsOptions,\n UpdateHostOptions\n} from '../EntryPoint';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class EntryPointsUpdateHost implements CommandModule {\n public readonly command = 'entrypoints:update-host [options]';\n public readonly describe = 'Bulk update target entry points host.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('old-hostname', {\n alias: 'o',\n describe: 'Old hostname of entrypoints.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('new-hostname', {\n alias: 'n',\n describe: 'New hostname of entrypoints.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('entrypoint-ids', {\n alias: 'e',\n describe: 'IDs of entrypoints to update.',\n string: true,\n requiresArg: true,\n array: true\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const entryPointsManager: EntryPoints = container.resolve(EntryPoints);\n\n const projectId = args.project as string;\n\n const { taskId } = await entryPointsManager.updateHost({\n projectId,\n entryPointIds: args.entrypointIds as undefined | string[],\n newHostname: args.newHostname as string,\n oldHostname: args.oldHostname as string\n } as UpdateHostOptions);\n\n // eslint-disable-next-line no-console\n console.log(taskId);\n\n process.exitCode = 0;\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host'\n })\n );\n process.exitCode = 1;\n }\n }\n}\n","import { EntryPoint, EntryPoints, RestProjectsOptions } from '../EntryPoint';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class GetEntryPoints implements CommandModule {\n public readonly command = 'entrypoints:list [options]';\n public readonly describe = 'get all entrypoints of the project.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n requiresArg: true,\n demandOption: true\n })\n .option('verbose', {\n describe: 'Enable verbose mode',\n boolean: true,\n default: false\n })\n .option('limit', {\n describe: 'Limit the number of entrypoints',\n default: 10\n })\n .option('pretty', {\n describe: 'Pretty print the output',\n boolean: true,\n default: false\n })\n .option('connectivity', {\n describe: 'Filter by connectivity',\n array: true,\n choices: [\n 'ok',\n 'unreachable',\n 'problem',\n 'skipped',\n 'unauthorized',\n 'unavailable'\n ]\n })\n .option('status', {\n describe: 'Filter by status',\n array: true,\n choices: ['new', 'changed', 'tested', 'vulnerable']\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n const entryPointsManager: EntryPoints = container.resolve(EntryPoints);\n\n try {\n const entryPoints: EntryPoint[] = await entryPointsManager.entrypoints({\n projectId: args.project as string,\n limit: args.limit as number,\n connectivity: args.connectivity as string[],\n status: args.status as string[]\n });\n\n const ep = args.verbose\n ? entryPoints\n : entryPoints.map((entryPoint) => ({\n id: entryPoint.id,\n method: entryPoint.method,\n url: entryPoint.url\n }));\n\n // eslint-disable-next-line no-console\n console.log(\n args.pretty ? JSON.stringify(ep, null, 2) : JSON.stringify(ep)\n );\n\n process.exitCode = 0;\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:list'\n })\n );\n process.exitCode = 1;\n }\n }\n}\n","import { RestDiscoveryOptions } from 'src/Discovery';\nimport { DiscoveryPollingFactory } from 'src/Discovery/DiscoveryPollingFactory';\nimport { ErrorMessageFactory, logger } from 'src/Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class PollingDiscoveryStatus implements CommandModule {\n public readonly command = 'discovery:polling [options] <discoveryId>';\n public readonly describe =\n 'Allows to configure a polling of discovery status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'The sampling interval between status checks. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a discovery status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery.',\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory = container.resolve<DiscoveryPollingFactory>(\n DiscoveryPollingFactory\n );\n const polling = pollingFactory.create({\n discoveryId: args.discoveryId as string,\n projectId: args.project as string,\n timeout: args.timeout as number,\n interval: args.interval as number\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport { HostUpdateJobStatusPollingFactory } from '../EntryPoint/HostUpdateJobStatusPollingFactory';\nimport { RestProjectsOptions } from '../EntryPoint';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class PollingHostUpdateJobStatus implements CommandModule {\n public readonly command = 'entrypoints:update-host-polling [options] <jobId>';\n public readonly describe =\n 'Allows to configure a polling of host update job status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a host update job status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a host update job status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .positional('jobId', {\n describe: 'ID of an existing update host job which you want to check.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory =\n container.resolve<HostUpdateJobStatusPollingFactory>(\n HostUpdateJobStatusPollingFactory\n );\n const polling = pollingFactory.create({\n timeout: args.timeout as number,\n interval: args.interval as number,\n jobId: args.jobId as string,\n projectId: args.project as string\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host-polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import {\n BreakpointException,\n BreakpointType,\n PollingFactory,\n RestScansOptions\n} from '../Scan';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class PollingScanStatus implements CommandModule {\n public readonly command = 'scan:polling [options] <scanId>';\n public readonly describe = 'Allows to configure a polling of scan status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a scan status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a scan status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .option('breakpoint', {\n alias: 'b',\n choices: Helpers.toArray(BreakpointType),\n string: true,\n describe:\n 'A conditional breakpoint that allows to finish the process with exit code 50 only after fulfilling the predefined condition.',\n requiresArg: true,\n default: BreakpointType.ANY\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to check.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory = container.resolve<PollingFactory>(PollingFactory);\n const polling = pollingFactory.create({\n scanId: args.scanId as string,\n timeout: args.timeout as number,\n interval: args.interval as number,\n breakpoint: args.breakpoint as BreakpointType\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n if (error instanceof BreakpointException) {\n logger.error(`The breakpoint has been hit during polling.`);\n logger.error(`Breakpoint: ${error.message}`);\n process.exit(50);\n }\n\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'scan:polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, RestDiscoveryOptions } from 'src/Discovery';\nimport { ErrorMessageFactory, logger } from 'src/Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class RerunDiscovery implements CommandModule {\n public readonly command = 'discovery:rerun [options] <discoveryId>';\n public readonly describe =\n 'Request to start a new discovery using the same configuration as an existing discovery, by discovery ID.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery which you want to re-run.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: any): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n const projectId = args.project as string;\n const discoveryId = args.discoveryId as string;\n const newDiscoveryId = await discoveryManager.rerun(\n projectId,\n discoveryId\n );\n\n // eslint-disable-next-line no-console\n console.log(newDiscoveryId);\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:rerun'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { RestScansOptions, Scans } from '../Scan';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class RetestScan implements CommandModule {\n public readonly command = 'scan:retest [options] <scanId>';\n public readonly describe =\n 'Request to start a new scan using the same configuration as an existing scan, by scan ID.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to re-run.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n const scanId: string = await scanManager.retest(args.scanId as string);\n\n // eslint-disable-next-line no-console\n console.log(scanId);\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'scan:retest'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, DiscoveryConfig } from '../Discovery';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { RestDiscoveryOptions } from '../Discovery/RestDiscoveries';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class RunDiscovery implements CommandModule {\n public readonly command = 'discovery:run [options]';\n public readonly describe =\n 'Start a new discovery for the received configuration.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('name', {\n alias: 'n',\n describe: 'Name of the discovery.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('auth', {\n alias: 'o',\n describe: 'Auth object ID.',\n string: true,\n requiresArg: true\n })\n .option('repeater', {\n alias: 'agent',\n requiresArg: true,\n array: true,\n describe: 'ID of any repeaters connected with the discovery.'\n })\n .option('archive', {\n alias: 'a',\n normalize: true,\n requiresArg: true,\n describe:\n \"A collection of your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension'\n })\n .option('crawler', {\n alias: 'c',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific urls that should be included into crawler.'\n })\n .conflicts('archive', 'crawler')\n .check((args) => {\n if (args.archive && args.crawler) {\n throw new Error(\n 'Arguments --archive and --crawler are mutually exclusive'\n );\n }\n\n if (!args.archive && !args.crawler) {\n throw new Error('Either --archive or --crawler must be specified');\n }\n\n return true;\n })\n .option('host-filter', {\n alias: 'F',\n requiresArg: true,\n array: true,\n describe: 'A list of specific hosts that should be included into scan.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.'\n })\n .option('smart', {\n boolean: true,\n describe:\n 'Use automatic smart decisions such as: parameter skipping, detection phases, etc. to minimize scan time.'\n })\n .option('crawl-parent-subdomains', {\n boolean: true,\n describe: 'Crawl parent path folders and subdomains',\n default: false\n })\n .option('concurrency', {\n number: true,\n default: 10,\n describe:\n 'Number of maximum concurrent requests allowed to be sent to the target, can range between 1 to 50 (default: 10).',\n requiresArg: true\n })\n .option('interactions-depth', {\n number: true,\n default: 3,\n describe:\n 'Number of maximum interactions with nested objects, can range between 1 to 5 (default: 3).',\n requiresArg: true\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n\n const projectId = args.project as string;\n\n const { id: discoveryId, warnings } = await discoveryManager.create(\n projectId,\n {\n name: args.name,\n authObjectId: args.auth,\n hostsFilter: args.hostFilter,\n crawlerUrls: args.crawler,\n fileId: args.archive,\n repeaters: args.repeater,\n optimizedCrawler: args.smart,\n poolSize: args.concurrency,\n maxInteractionsChainLength: args.interactionsDepth,\n subdomainsCrawl: args.crawlParentSubdomains,\n headers: args.header\n } as DiscoveryConfig\n );\n\n // eslint-disable-next-line no-console\n console.log(discoveryId);\n\n if (warnings?.length) {\n logger.warn(\n `${warnings.map((warning) => warning.message).join('\\n')}\\n`\n );\n }\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:run'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Cert, RequestExecutorOptions } from '../RequestExecutor';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport container from '../container';\nimport { DefaultRepeaterServerOptions, RepeaterLauncher } from '../Repeater';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { captureException } from '@sentry/node';\nimport { normalize } from 'node:path';\nimport process from 'node:process';\n\nexport class RunRepeater implements CommandModule {\n public readonly command = 'repeater [options]';\n public readonly describe = 'Starts an on-prem agent.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('id', {\n alias: 'agent',\n describe:\n 'ID of an existing repeater which you want to use to run a new scan.',\n type: 'string',\n requiresArg: true,\n demandOption: true\n })\n .option('scripts', {\n alias: 'S',\n requiresArg: true,\n string: true,\n describe:\n 'JSON string which contains script list, which is initially empty and consists of zero or more host and path pairs. Example: {\"*.example.com\": \"./hmac.js\"}',\n coerce(arg: string): Record<string, string> {\n return JSON.parse(arg);\n }\n })\n .option('timeout', {\n number: true,\n requiresArg: true,\n default: 30000,\n describe:\n 'Time to wait for a server to send response headers (and start the response body) before aborting the request.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n conflicts: ['headers'],\n array: true,\n describe:\n 'A list of specific headers that should be included into request.',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .option('headers', {\n requiresArg: true,\n deprecated: 'Use --header instead.',\n string: true,\n conflicts: ['header'],\n describe:\n 'JSON string which contains header list, which is initially empty and consists of zero or more name and value pairs. Example: {\"x-slack-signature\": \"Z2dFIHJldHNhRQ\"}',\n coerce(arg: string): Record<string, string> {\n return JSON.parse(arg);\n }\n })\n .option('cacert', {\n default: false,\n requiresArg: true,\n describe:\n 'The path to file which may contain multiple CA certificates. Example: /etc/ssl/certs/ca-certificates.crt',\n coerce(arg: string): string | boolean {\n return typeof arg === 'string' || typeof arg === 'boolean'\n ? arg\n : false;\n }\n })\n .option('cert', {\n requiresArg: true,\n array: true,\n string: true,\n describe:\n 'The certificate must be in PKCS, or PEM format. Example: {\"hostname\": \"example.com\", \"path\": \"./example.pem\", \"passphrase\": \"pa$$word\", \"port\": \"1234\"}.',\n coerce(args: string[]): Cert[] {\n return args\n .map((arg: string) => JSON.parse(arg))\n .map(({ path, hostname, passphrase, port }: Cert) => {\n if (!path) {\n logger.error(\n 'Error during \"repeater\": Specify the path to your client certificate file.'\n );\n process.exit(1);\n }\n\n if (!hostname) {\n logger.error(\n 'Error during \"repeater\": Specify the hostname (without protocol and port) of the request URL for which you want to use the certificate.'\n );\n process.exit(1);\n }\n\n return {\n hostname,\n passphrase,\n path: normalize(path),\n port\n };\n });\n }\n })\n .option('experimental-connection-reuse', {\n deprecated: 'Use --ntlm instead',\n boolean: true,\n describe: 'Configure ntlm support (enables TCP connection reuse)'\n })\n .option('ntlm', {\n boolean: true,\n describe: 'Configure ntlm support (enables TCP connection reuse)'\n })\n .option('daemon', {\n requiresArg: false,\n alias: 'd',\n describe: 'Run as repeater in daemon mode'\n })\n .option('run', {\n requiresArg: false,\n hidden: true\n })\n .option('remove-daemon', {\n requiresArg: false,\n alias: ['rm', 'remove'],\n describe: 'Stop and remove repeater daemon'\n })\n .option('proxy-domains', {\n requiresArg: true,\n array: true,\n describe:\n 'Space-separated list of domains that should be routed through the proxy. This option is only applicable when using the --proxy option',\n coerce(arg: string[]): string[] {\n if (arg[0] === undefined) {\n return undefined;\n }\n\n // if values are passed from env variable, they are passed as a single string\n if (arg.length === 1) {\n if (arg[0].includes(' ')) {\n return arg[0].trim().split(' ');\n }\n\n return arg;\n }\n\n return arg;\n }\n })\n .option('proxy-domains-bypass', {\n requiresArg: true,\n array: true,\n default: process.env.NO_PROXY?.trim()\n .split(',')\n .map((domain) => domain.trim()),\n describe:\n 'Space-separated list of domains that should not be routed through the proxy. This option is only applicable when using the --proxy option',\n coerce(arg: string[]): string[] {\n // if values are passed from env variable, they are passed as a single string\n if (arg.length === 1) {\n if (arg[0] === undefined) {\n return undefined;\n }\n\n if (arg[0].includes(' ')) {\n return arg[0].trim().split(' ');\n }\n\n return arg;\n }\n\n return arg;\n }\n })\n .conflicts({\n daemon: 'remove-daemon',\n ntlm: ['proxy', 'experimental-connection-reuse']\n })\n .conflicts('proxy-domains', 'proxy-domains-bypass')\n .env('REPEATER')\n .middleware((args: Arguments) => {\n if (Object.hasOwnProperty.call(args, '')) {\n // handling the case of having REPEATER environment variable w/o suffix,\n // that results in yargs option with empty name\n delete args[''];\n }\n }, true)\n .exitProcess(false)\n .check((args: Arguments) => {\n const id = args.id as string;\n if (!Helpers.isShortUUID(id) && !Helpers.isUUID(id)) {\n throw new Error(\n 'Option --id has wrong value. Please ensure that --id option has a valid ID.'\n );\n }\n\n const proxyDomains = (args.proxyDomains as string[]) ?? [];\n for (const domain of proxyDomains) {\n if (domain.includes(',')) {\n throw new Error(\n `Option --proxy-domains has a wrong value.` +\n `Please ensure that --proxy-domains option has space separated list of domain values`\n );\n }\n }\n\n const proxyDomainsBypass = (args.proxyDomainsBypass as string[]) ?? [];\n for (const domain of proxyDomainsBypass) {\n if (domain.includes(',')) {\n throw new Error(\n `Option --proxy-domain-bypass has wrong value.` +\n `Please ensure that --proxy-domain-bypass option has space separated list of domain values`\n );\n }\n }\n\n return true;\n })\n .middleware((args: Arguments) => {\n container\n .register<RequestExecutorOptions>(RequestExecutorOptions, {\n useValue: {\n headers: (args.header ?? args.headers) as Record<string, string>,\n timeout: args.timeout as number,\n proxyUrl: (args.proxyTarget ?? args.proxy) as string,\n certs: args.cert as Cert[],\n maxBodySize: Infinity,\n maxContentLength: 100,\n reuseConnection:\n !!args.ntlm || !!args.experimentalConnectionReuse,\n whitelistMimes: [\n { type: 'text/html', allowTruncation: false },\n { type: 'text/plain', allowTruncation: true },\n { type: 'text/css', allowTruncation: false },\n { type: 'text/javascript', allowTruncation: false },\n { type: 'text/markdown', allowTruncation: true },\n { type: 'text/xml', allowTruncation: false },\n { type: 'application/javascript', allowTruncation: false },\n { type: 'application/x-javascript', allowTruncation: false },\n { type: 'application/json', allowTruncation: false },\n { type: 'application/xml', allowTruncation: false },\n {\n type: 'application/x-www-form-urlencoded',\n allowTruncation: false\n },\n { type: 'application/msgpack', allowTruncation: false },\n { type: 'application/ld+json', allowTruncation: false },\n { type: 'application/graphql', allowTruncation: false }\n ],\n proxyDomains: args.proxyDomains as string[],\n proxyDomainsBypass: args.proxyDomainsBypass as string[]\n }\n })\n .register<DefaultRepeaterServerOptions>(\n DefaultRepeaterServerOptions,\n {\n useValue: {\n uri: args.repeaterServer as string,\n token: args.token as string,\n connectTimeout: args.timeout as number,\n proxyUrl: (args.proxyBright ?? args.proxy) as string,\n insecure: args.insecure as boolean\n }\n }\n );\n });\n }\n\n // eslint-disable-next-line complexity\n public async handler(args: Arguments): Promise<void> {\n const repeaterLauncher: RepeaterLauncher =\n container.resolve(RepeaterLauncher);\n\n if (args.cacert) {\n await repeaterLauncher.loadCerts(\n typeof args.cacert === 'string' ? args.cacert : undefined\n );\n }\n\n if (args.scripts) {\n await repeaterLauncher.loadScripts(\n args.scripts as Record<string, string>\n );\n }\n\n if (args.remove) {\n await repeaterLauncher.uninstall();\n process.exitCode = 0;\n\n return;\n }\n\n if (args.daemon) {\n await repeaterLauncher.install();\n process.exitCode = 0;\n\n return;\n }\n\n try {\n ['SIGTERM', 'SIGINT', 'SIGHUP'].forEach((event) =>\n process.on(event, async () => {\n await repeaterLauncher.close();\n process.exitCode = 0;\n })\n );\n\n await repeaterLauncher.run(args.id as string, args.run as boolean);\n } catch (error) {\n captureException(error);\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'repeater' })\n );\n await repeaterLauncher.close();\n process.exitCode = 1;\n }\n }\n}\n","import {\n AttackParamLocation,\n Module,\n RequestExclusion,\n RestScansOptions,\n ScanConfig,\n Scans,\n ATTACK_PARAM_LOCATIONS_DEFAULT\n} from '../Scan';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\nimport { EOL } from 'node:os';\n\nexport class RunScan implements CommandModule {\n public readonly command = 'scan:run [options]';\n public readonly describe = 'Start a new scan for the received configuration.';\n\n public static excludeEntryPoint(args: string[]): RequestExclusion[] {\n return args\n .map((arg: string) => JSON.parse(arg))\n .map(({ methods = [], patterns = [] }: Partial<RequestExclusion>) => {\n const nonEmptyPatterns = patterns.filter((pattern) => !!pattern);\n\n if (!nonEmptyPatterns.length) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n command: 'scan:run',\n error:\n 'please make sure that patterns contain at least one regexp'\n })\n );\n process.exit(1);\n }\n\n return {\n methods: [...new Set(methods)],\n patterns: [...new Set(nonEmptyPatterns)]\n };\n });\n }\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('name', {\n alias: 'n',\n describe: 'Name of the scan.',\n requiresArg: true,\n demandOption: true\n })\n .option('auth', {\n alias: 'o',\n describe: 'Auth object ID.',\n requiresArg: true\n })\n .option('repeater', {\n alias: 'agent',\n requiresArg: true,\n array: true,\n describe: 'ID of any repeaters connected with the scan.'\n })\n .option('archive', {\n alias: 'a',\n normalize: true,\n requiresArg: true,\n describe:\n \"A collection your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension'\n })\n .option('crawler', {\n alias: 'c',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific urls that should be included into crawler.'\n })\n .option('test', {\n array: true,\n describe:\n 'A list of tests to run during a scan. ' +\n `If no tests are specified, the default tests will be run.${EOL}` +\n `For more information on the default tests, refer to the documentation: https://docs.brightsec.com/docs/running-a-scan${EOL}` +\n 'Additional details about available tests can be found here: ' +\n 'https://docs.brightsec.com/docs/vulnerability-guide'\n })\n .option('bucket', {\n array: true,\n describe: 'A list of test buckets which you want to run during a scan.'\n })\n .option('project', {\n alias: 'p',\n requiresArg: true,\n string: true,\n describe: 'ID of the project'\n })\n .option('template', {\n alias: 'tp',\n requiresArg: false,\n string: true,\n describe: 'Scan template ID'\n })\n .option('module', {\n default: Module.DAST,\n requiresArg: true,\n choices: Helpers.toArray(Module),\n describe:\n 'The dast module tests for specific scenarios, mainly OWASP top 10 and other common scenarios. ' +\n 'The fuzzer module generates various scenarios to test for unknown vulnerabilities, ' +\n 'providing automated AI led fuzzing testing. This module can be coupled with the repeater to find additional vulnerabilities.'\n })\n .option('host-filter', {\n alias: 'F',\n requiresArg: true,\n array: true,\n describe: 'A list of specific hosts that should be included into scan.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.'\n })\n .option('exclude-param', {\n requiresArg: true,\n array: true,\n string: true,\n describe:\n 'A list of regex patterns for parameter names you would like to ignore during the tests. Example: \"Id$\"'\n })\n .option('exclude-entry-point', {\n array: true,\n describe:\n 'A list of JSON strings that contain patterns for entry points you would like to ignore during the tests. ' +\n 'Pass an empty string to remove default exclusions. ' +\n 'To apply patterns for all HTTP methods, you can set an empty array to \"methods\". ' +\n `Example: '{ \"methods\": [], \"patterns\": [\"users\\\\/?$\"] }'`,\n coerce: RunScan.excludeEntryPoint\n })\n .option('smart', {\n boolean: true,\n describe:\n 'Use automatic smart decisions such as: parameter skipping, detection phases, etc. to minimize scan time.'\n })\n .option('concurrency', {\n number: true,\n default: 10,\n requiresArg: true,\n describe:\n 'Number of maximum concurrent requests allowed to be sent to the target, can range between 1 to 50 (default: 10).'\n })\n .option('param', {\n array: true,\n defaultDescription: `[${ATTACK_PARAM_LOCATIONS_DEFAULT.map(\n (item) => `\"${item}\"`\n ).join(',')}]`,\n requiresArg: true,\n choices: Helpers.toArray(AttackParamLocation),\n describe: 'Defines which part of the request to attack.'\n })\n .option('entrypoint', {\n array: true,\n alias: 'e',\n describe:\n 'List entrypoint IDs to scan specific entrypoints. If no IDs are provided, the scan will run on the first 2000 project-level entrypoints. This option requires to specify the project ID using the --project option.'\n })\n .conflicts('entrypoint', ['crawler', 'archive'])\n .check((args) => {\n if (args.entrypoint && args.archive && args.crawler) {\n throw new Error(\n 'Arguments --entrypoint, --archive and --crawler are mutually exclusive'\n );\n }\n\n if (!args.entrypoint && !args.archive && !args.crawler) {\n throw new Error(\n 'When --entrypoint is not provided, either --archive or --crawler must be specified'\n );\n }\n\n return true;\n })\n .group(['archive', 'crawler'], 'Discovery Options')\n .group(\n ['host-filter', 'header', 'module', 'repeater', 'test', 'smart'],\n 'Additional Options'\n )\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n\n const { id: scanId, warnings = [] } = await scanManager.create({\n tests: args.test,\n name: args.name,\n module: args.module,\n authObjectId: args.auth,\n projectId: args.project,\n templateId: args.template,\n buckets: args.bucket,\n hostsFilter: args.hostFilter,\n headers: Helpers.parseHeaders(args.header as string[]),\n crawlerUrls: args.crawler,\n fileId: args.archive,\n repeaters: args.repeater,\n smart: args.smart,\n attackParamLocations: args.param,\n poolSize: args.concurrency,\n exclusions: {\n requests: args.excludeEntryPoint,\n params: args.excludeParam\n },\n entryPointIds: args.entrypoint\n } as ScanConfig);\n\n // eslint-disable-next-line no-console\n console.log(scanId);\n\n if (warnings.length) {\n logger.warn(\n `${warnings.map((warning) => warning.message).join('\\n')}\\n`\n );\n }\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'scan:run' })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, RestDiscoveryOptions } from '../Discovery';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class StopDiscovery implements CommandModule {\n public readonly command = 'discovery:stop [options] <discoveryId>';\n public readonly describe = 'Stop discovery by id.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n requiresArg: true,\n string: true,\n describe: 'ID of the project',\n demandOption: true\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery which you want to stop.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n\n await discoveryManager.stop(\n args.project as string,\n args.discoveryId as string\n );\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:stop'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { RestScansOptions, Scans } from '../Scan';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class StopScan implements CommandModule {\n public readonly command = 'scan:stop [options] <scanId>';\n public readonly describe = 'Stop scan by id.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to stop.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n\n await scanManager.stop(args.scanId as string);\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'scan:stop' })\n );\n process.exit(1);\n }\n }\n}\n","import {\n Archives,\n ParserFactory,\n RestArchivesOptions,\n Spec,\n SpecType\n} from '../Archive';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport container from '../container';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class UploadArchive implements CommandModule {\n public readonly command = 'archive:upload [options] <file>';\n public readonly describe = 'Uploads a archive to Bright.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('type', {\n alias: 'T',\n requiresArg: true,\n describe: 'The specification type',\n choices: [SpecType.OPENAPI, SpecType.HAR, SpecType.POSTMAN].map(\n (x: string) => x.toLowerCase()\n ),\n default: SpecType.HAR.toLowerCase(),\n demandOption: true\n })\n .option('discard', {\n alias: 'd',\n default: true,\n boolean: true,\n describe:\n 'Indicates if archive should be remove or not after scan running. Enabled by default.'\n })\n .option('project', {\n alias: ['p', 'projectId'],\n describe:\n 'ID of the project for uploading file (Optional for transition period, will be mandatory in future)' +\n 'In case project-level API key project ID determined from that API key'\n })\n .option('header', {\n alias: 'H',\n default: [],\n deprecated:\n 'Use --header when running a scan using the scan:run command.',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .option('variable', {\n alias: 'V',\n default: [],\n deprecated:\n 'Directly integrate variables into the file. For updated guidelines on managing variables effectively, refer to https://learning.postman.com/docs/sending-requests/variables/variables/#variable-scopes',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific variables that should be included into request. Only for Postman',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .positional('file', {\n describe:\n \"A collection your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension',\n type: 'string',\n demandOption: true,\n normalize: true\n })\n .group(['header'], 'OAS Options')\n .group(['header', 'variable'], 'Postman Options')\n .middleware((args: Arguments) => {\n container.register<RestArchivesOptions>(RestArchivesOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n });\n });\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const parserFactory: ParserFactory = container.resolve(ParserFactory);\n const archives: Archives = container.resolve(Archives);\n\n const type = Helpers.selectEnumValue(\n SpecType,\n args.type as string\n ) as SpecType;\n\n const parser = parserFactory.create(type);\n\n const file = await parser.parse(args.file as string);\n\n const spec: Spec = {\n ...file,\n type,\n discard: args.discard as boolean,\n projectId: args.project as string,\n headers: args.header as Record<string, string>,\n variables: args.variable as Record<string, string>\n };\n\n // eslint-disable-next-line no-console\n console.log(await archives.upload(spec));\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'archive:upload'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { logger } from '../Utils';\nimport { CommandModule } from 'yargs';\nimport { exec, ExecException } from 'child_process';\n\nexport class VersionCommand implements CommandModule {\n public readonly command = 'version';\n public readonly describe = 'Prints Bright CLI version this project uses.';\n\n protected static executeCommand(command: string): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n exec(\n command,\n (error: ExecException | null, stdout: string, stderr: string) => {\n if (stdout) {\n return resolve(stdout);\n }\n\n if (stderr) {\n return resolve(stderr);\n }\n\n if (error) {\n return reject(error);\n }\n\n resolve('');\n }\n );\n });\n }\n\n public async handler(): Promise<void> {\n const localNpmList: string = await VersionCommand.executeCommand(\n 'npm list --depth=0'\n );\n const localMatches: RegExpMatchArray | null = localNpmList.match(\n / @brightsec\\/cli@(.*)\\n/\n );\n const localNpmVersion: string = (\n localMatches && localMatches[1] ? localMatches[1] : ''\n )\n .replace(/\"invalid\"/gi, '')\n .trim();\n\n const globalNpmList: string = await VersionCommand.executeCommand(\n 'npm list -g --depth=0'\n );\n const globalMatches: RegExpMatchArray | null = globalNpmList.match(\n / @brightsec\\/cli@(.*)\\n/\n );\n const globalNpmVersion: string = (\n globalMatches && globalMatches[1] ? globalMatches[1] : ''\n )\n .replace(/\"invalid\"/gi, '')\n .trim();\n\n if (localNpmVersion) {\n logger.log('Local installed version:', localNpmVersion);\n } else {\n logger.warn('No local installed Bright CLI was found.');\n }\n\n if (globalNpmVersion) {\n logger.log('Global installed Bright CLI version:', globalNpmVersion);\n } else {\n logger.warn('No global installed was found.');\n }\n\n if (\n localNpmVersion &&\n globalNpmVersion &&\n localNpmVersion !== globalNpmVersion\n ) {\n logger.warn(\n 'To avoid issues with CLI please make sure your global and local Bright CLI versions match, ' +\n 'or you are using locally installed Bright CLI instead of global one.'\n );\n }\n }\n}\n","export { VersionCommand } from './VersionCommand';\nexport { RunScan } from './RunScan';\nexport { UploadArchive } from './UploadArchive';\nexport { RetestScan } from './RetestScan';\nexport { StopScan } from './StopScan';\nexport { PollingScanStatus } from './PollingScanStatus';\nexport { RunRepeater } from './RunRepeater';\nexport { Configure } from './Configure';\nexport { GetEntryPoints } from './GetEntryPoints';\n","import { CliConfig, ConfigReader } from './ConfigReader';\nimport { ClusterArgs, Helpers, logger, Logger, LogLevel } from '../Utils';\nimport { SystemConfigManager } from './SystemConfigManager';\nimport { CliInfo } from './CliInfo';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { init, runWithAsyncContext, setContext } from '@sentry/node';\nimport ms from 'ms';\nimport process from 'node:process';\n\nexport interface CliBuilderOptions {\n info: CliInfo;\n configReader: ConfigReader;\n}\n\nexport class CliBuilder {\n private _options: CliBuilderOptions;\n\n get options(): CliBuilderOptions {\n return this._options;\n }\n\n constructor(options: CliBuilderOptions) {\n this._options = options;\n }\n\n public build({ commands }: { commands: CommandModule[] }): Argv {\n const { configReader, info } = this.options;\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cli: Argv = require('yargs')\n .option('config', {\n requiresArg: true,\n describe: 'Path to the file with configuration',\n config: true,\n default: configReader.discovery(info.cwd),\n configParser: (configPath: string): CliConfig =>\n configReader.load(configPath).toJSON()\n })\n .option('log-level', {\n requiresArg: true,\n choices: Object.keys(LogLevel).map((x) =>\n !isNaN(+x) ? +x : x.toLowerCase()\n ),\n default: LogLevel.NOTICE,\n describe:\n 'What level of logs to report. Any logs of a higher level than the setting are shown.'\n })\n .option('log-file', {\n requiresArg: true,\n type: 'string',\n describe:\n 'File path to write logs to. If specified, logs will be written to this file'\n })\n .implies({\n 'log-max-size': 'log-file',\n 'log-max-files': 'log-file',\n 'log-rotate-interval': 'log-file',\n 'log-compress': 'log-file'\n })\n .group(\n [\n 'log-max-size',\n 'log-max-files',\n 'log-rotate-interval',\n 'log-compress'\n ],\n 'Log Rotation Options (requires --log-file):'\n )\n .option('log-max-size', {\n requiresArg: true,\n type: 'string',\n describe:\n 'Maximum size of log file before rotation (e.g., \"10MB\", \"1GB\"). Default: 10MB'\n })\n .option('log-max-files', {\n requiresArg: true,\n type: 'number',\n describe: 'Maximum number of rotated log files to keep. Default: 5'\n })\n .option('log-rotate-interval', {\n requiresArg: true,\n type: 'string',\n describe:\n 'Time interval to rotate log files (e.g., \"1d\", \"12h\", \"7d\"). Default: 1d'\n })\n .option('log-compress', {\n type: 'boolean',\n describe: 'Compress rotated log files using gzip. Default: true'\n })\n .option('cluster', {\n deprecated: 'Use --hostname instead',\n requiresArg: true,\n describe:\n 'Bright application name (domain name). [default: app.brightsec.com]'\n })\n .option('hostname', {\n requiresArg: true,\n describe:\n 'Bright application name (domain name). [default: app.brightsec.com]'\n })\n .option('insecure', {\n boolean: true,\n default: false,\n description:\n 'Allows CLI to proceed and operate even for server connections otherwise considered insecure.'\n })\n .option('proxy', {\n requiresArg: true,\n default: process.env.PROXY,\n describe:\n 'Specify a proxy URL to route all traffic through. This should be an HTTP(S), SOCKS4, or SOCKS5 URL. By default, if you specify SOCKS://<URL>, then SOCKS5h is applied.'\n })\n .option('proxy-bright', {\n requiresArg: true,\n describe:\n 'Specify a proxy URL to route all outbound traffic through. For more information, see the --proxy option.'\n })\n .option('proxy-target', {\n requiresArg: true,\n describe:\n 'Specify a proxy URL to route all inbound traffic through. For more information, see the --proxy option.'\n })\n .option('timeout', {\n describe:\n 'Request timeout in seconds or a duration string (e.g. 10s, 1m, 1h, 10h, 1y).',\n default: 30,\n coerce(arg: string) {\n // if arg is not a number, then it's a duration string\n // convert duration string to milliseconds\n if (isNaN(+arg)) {\n return ms(arg);\n }\n\n return +arg * 1000;\n }\n })\n .conflicts({\n proxy: ['proxy-bright', 'proxy-target'],\n hostname: 'cluster'\n })\n .middleware((args: Arguments) => {\n const { api, repeaterServer } = Helpers.getClusterUrls(\n args as ClusterArgs\n );\n args.api = api;\n args.repeaterServer = repeaterServer;\n\n // Configure logger with rotation options if log file is specified\n if (args.logFile) {\n const options = {\n maxSize: args['log-max-size'] as string | '10MB',\n maxFiles: args['log-max-files'] as number | 5,\n interval: args['log-rotate-interval'] as string | '1d',\n compress: (args['log-compress'] === false ? undefined : 'gzip') as\n | 'gzip'\n | undefined\n };\n Logger.configure(\n args.logLevel as LogLevel,\n args.logFile as string,\n options\n );\n }\n })\n\n .middleware((argv: Arguments) => {\n logger.logLevel = argv['log-level'] as LogLevel;\n if (argv['log-file']) {\n logger.logFile = argv['log-file'] as string;\n }\n\n return argv;\n })\n\n .middleware(\n (args: Arguments) =>\n (logger.logLevel = !isNaN(+args.logLevel)\n ? (+args.logLevel as unknown as LogLevel)\n : LogLevel[\n args.logLevel?.toString().toUpperCase() as keyof typeof LogLevel\n ])\n )\n .usage('Usage: $0 <command> [options] [<file | scan>]')\n .pkgConf('bright', info.cwd)\n .example(\n '$0 archive:generate --mockfile=.mockfile --name=archive.har',\n 'output har file on base your mock requests'\n );\n\n return commands\n .reduce(\n (acc: Argv, item: CommandModule) =>\n acc.command(this.wrapWithSentry(item)),\n cli\n )\n .recommendCommands()\n .demandCommand(1)\n .strict(true)\n .version(info.version)\n .alias('v', 'version')\n .help('help')\n .alias('h', 'help')\n .wrap(null);\n }\n\n private wrapWithSentry(command: CommandModule) {\n const handler = command.handler.bind(command);\n\n command.handler = async (args: Arguments) => {\n const systemConfigManager = new SystemConfigManager(args.api as string);\n const systemConfig = await systemConfigManager.read();\n\n return runWithAsyncContext(() => {\n this.initSentry(systemConfig.sentryDsn);\n setContext('args', args);\n\n systemConfigManager.enableBackgroundRotation((rotatedSystemConfig) => {\n this.initSentry(rotatedSystemConfig.sentryDsn);\n });\n\n return handler(args);\n });\n };\n\n return command;\n }\n\n private initSentry(dsn: string) {\n init({\n dsn,\n attachStacktrace: true,\n release: process.env.VERSION,\n beforeSend(event) {\n if (event.contexts.args) {\n event.contexts.args = {\n ...event.contexts.args,\n t: event.contexts.args.t && '[Filtered]',\n token: event.contexts.args.token && '[Filtered]'\n };\n }\n\n return event;\n }\n });\n }\n}\n","import { sync } from 'find-up';\nimport path from 'node:path';\nimport { readFileSync } from 'node:fs';\n\nexport class CliInfo {\n public readonly cwd: string;\n public readonly version: string;\n public readonly distribution: string | undefined;\n\n constructor(cwd: string) {\n const packagePath = this.getPackagePath(cwd);\n const packageData = this.getPackageData(packagePath);\n\n this.cwd = packagePath ? path.dirname(packagePath) : cwd;\n this.version = process.env.VERSION ?? packageData?.version;\n this.distribution = packageData?.brightCli?.distribution;\n }\n\n private getPackageData(packagePath: string) {\n try {\n const pkg = readFileSync(packagePath, 'utf8');\n\n return JSON.parse(pkg);\n } catch {\n // noop\n }\n }\n\n private getPackagePath(cwd?: string): string {\n return sync('package.json', {\n cwd: cwd || process.env.BRIGHT_CWD || process.cwd()\n });\n }\n}\n","export interface CliConfig {\n token?: string;\n api?: string;\n proxy?: string;\n repeaterServer?: string;\n id?: string;\n}\n\nexport interface ConfigReader {\n discovery(cwd: string): string | undefined;\n\n load(rcPath: string): this;\n\n get<T extends keyof CliConfig>(key: T): CliConfig[T];\n\n has(key: keyof CliConfig): boolean;\n\n toJSON(): CliConfig;\n}\n\nexport const ConfigReader: unique symbol = Symbol('ConfigReader');\n","import { CliConfig, ConfigReader } from './ConfigReader';\nimport { Helpers } from '../Utils';\nimport { sync } from 'find-up';\nimport { load } from 'js-yaml';\nimport { extname } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { Context, createContext, Script } from 'node:vm';\n\nexport class DefaultConfigReader implements ConfigReader {\n private readonly rcOptions: string[] = [\n '.brightrc',\n '.brightrc.json',\n '.brightrc.yml',\n '.brightrc.yaml',\n 'bright.config.js',\n // ADHOC: keep for backward compatibility with the legacy nexploit-cli.\n '.nexploitrc',\n '.nexploitrc.json',\n '.nexploitrc.yml',\n '.nexploitrc.yaml',\n 'nexploit.config.js'\n ];\n private readonly config: Map<keyof CliConfig, CliConfig[keyof CliConfig]>;\n\n constructor() {\n this.config = new Map<keyof CliConfig, CliConfig[keyof CliConfig]>();\n }\n\n public discovery(cwd: string): string | undefined {\n return sync(this.rcOptions, {\n cwd\n });\n }\n\n public load(rcPath: string): this {\n const rcExt: string = extname(rcPath.toLowerCase());\n\n if (rcExt === '.js') {\n this.configure(this.loadCommonJsModule(rcPath));\n } else if (rcExt === '.yml' || rcExt === '.yaml') {\n this.configure(\n load(readFileSync(rcPath, 'utf8')) as Record<string, unknown>\n );\n } else {\n this.configure(JSON.parse(readFileSync(rcPath, 'utf-8')));\n }\n\n return this;\n }\n\n public get<T extends keyof CliConfig>(key: T): CliConfig[T] {\n return this.config.get(key);\n }\n\n public has(key: keyof CliConfig): boolean {\n return this.config.has(key);\n }\n\n public toJSON(): CliConfig {\n return [...this.config.entries()].reduce(\n (acc: CliConfig, [key, value]: [string, unknown]) => {\n acc[key] = value;\n\n return acc;\n },\n {} as CliConfig\n );\n }\n\n private loadCommonJsModule(filename: string): Record<string, unknown> {\n const code: string = readFileSync(filename, { encoding: 'utf8' });\n const script: Script = new Script(code, {\n filename,\n timeout: 100\n });\n const vmModule: { exports: any } = { exports: {} };\n const context: Context = createContext({\n exports: vmModule.exports,\n module: vmModule\n });\n\n script.runInNewContext(context);\n\n const config: Record<string, unknown> | (() => Record<string, unknown>) =\n context.module?.exports ?? context.exports;\n\n if (typeof config === 'function') {\n return config();\n }\n\n return config;\n }\n\n private configure(map: Record<string, unknown>): void {\n Object.entries(Helpers.omit(map)).map(([key, value]: [string, unknown]) =>\n this.config.set(\n key as keyof CliConfig,\n value as CliConfig[keyof CliConfig]\n )\n );\n }\n}\n","import { logger } from '../Utils';\nimport axios, { Axios } from 'axios';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { setTimeout } from 'node:timers/promises';\n\nexport interface SystemConfig {\n sentryDsn?: string;\n}\n\ninterface SystemConfigFile {\n data: SystemConfig;\n updatedAt: Date;\n}\n\nexport class SystemConfigManager {\n private readonly rotationInterval = 3600000;\n private readonly path = join(homedir(), '.brightclirc');\n private readonly client: Axios;\n private backgroundRotationEnabled = false;\n\n constructor(baseURL: string) {\n this.client = axios.create({\n baseURL,\n timeout: 1500,\n responseType: 'json',\n transitional: {\n clarifyTimeoutError: true\n }\n });\n }\n\n public async read(): Promise<SystemConfig> {\n await this.rotateIfNecessary();\n const configFile = await this.getConfigFile();\n\n return {\n sentryDsn: process.env['SENTRY_DSN'],\n ...configFile.data\n };\n }\n\n public enableBackgroundRotation(onRotation: (config: SystemConfig) => void) {\n this.backgroundRotationEnabled = true;\n\n this.runBackgroundRotation(onRotation).catch((e) => {\n logger.debug('An error occurred during background rotation', e);\n });\n }\n\n public disableBackgroundRotation() {\n this.backgroundRotationEnabled = false;\n }\n\n private async runBackgroundRotation(\n onRotation: (config: SystemConfig) => void\n ) {\n while (this.backgroundRotationEnabled) {\n logger.debug('Performing background rotation of system config file');\n\n const isRotated = await this.rotateIfNecessary();\n\n if (isRotated) {\n const configFile = await this.getConfigFile();\n\n onRotation(configFile.data);\n\n logger.debug(\n 'Background rotation is done, sleeping for %s ms',\n this.rotationInterval\n );\n }\n\n await setTimeout(this.rotationInterval, undefined, { ref: false });\n }\n }\n\n private needsRotation(configFile: SystemConfigFile) {\n if (process.env.NODE_ENV !== 'production') {\n return;\n }\n\n const lifeTime = Date.now() - configFile.updatedAt.getTime();\n\n return lifeTime >= this.rotationInterval;\n }\n\n private async rotateIfNecessary() {\n logger.debug('Trying to rotate system config');\n\n const configFile = await this.getConfigFile();\n\n if (!this.needsRotation(configFile)) {\n logger.debug(\n 'Rotation is not needed, last updated on: %s ms',\n configFile.updatedAt\n );\n\n return false;\n }\n\n logger.debug(\n 'Rotating system config last updated on: %s ms',\n configFile.updatedAt\n );\n\n const newConfig = await this.fetchNewConfig();\n\n if (newConfig) {\n await this.updateConfigFile({\n data: newConfig,\n updatedAt: new Date()\n });\n\n return true;\n } else {\n logger.debug('Rotation failed');\n\n await this.updateConfigFile({\n ...configFile,\n updatedAt: new Date()\n });\n\n return false;\n }\n }\n\n private defaultConfigFile(): SystemConfigFile {\n return {\n data: {},\n updatedAt: new Date()\n };\n }\n\n private async getConfigFile() {\n const defaultConfigFile = this.defaultConfigFile();\n\n try {\n logger.debug('Loading system config file');\n\n const file = await readFile(this.path);\n const fileConfig = JSON.parse(file.toString()) as SystemConfigFile;\n\n return {\n ...fileConfig,\n updatedAt: new Date(fileConfig.updatedAt)\n };\n } catch (e) {\n if (e.code === 'ENOENT') {\n logger.debug(\"System config file doesn't exist at %s\", this.path);\n\n return defaultConfigFile;\n }\n\n logger.debug('Error during loading system config file', e);\n logger.debug('Using default system config file');\n\n return defaultConfigFile;\n }\n }\n\n private async updateConfigFile(configFile: SystemConfigFile) {\n logger.debug('Updating system config file');\n\n try {\n await writeFile(this.path, JSON.stringify(configFile));\n } catch (e) {\n logger.debug('Error during updating system config file', e);\n }\n }\n\n private async fetchNewConfig(): Promise<SystemConfig | undefined> {\n logger.debug('Fetching new system config');\n\n try {\n const { data } = await this.client.get<SystemConfig | undefined>(\n '/api/v1/cli/config'\n );\n\n return data;\n } catch (e) {\n logger.debug('Error during fetching new system config: ', e);\n }\n }\n}\n","export * from './CliBuilder';\nexport * from './ConfigReader';\nexport * from './CliInfo';\n","import {\n DiscoveryPollingConfig,\n DiscoveryPollingFactory\n} from './DiscoveryPollingFactory';\nimport { Polling } from '../Utils/Polling';\nimport { DiscoveryPolling } from './DiscoveryPolling';\nimport { Discoveries } from './Discoveries';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultDiscoveryPollingFactory implements DiscoveryPollingFactory {\n constructor(\n @inject(Discoveries)\n private readonly discoveries: Discoveries\n ) {}\n\n public create(options: DiscoveryPollingConfig): Polling {\n return new DiscoveryPolling(options, this.discoveries);\n }\n}\n","import { DiscoveryView } from './DiscoveryView';\n\nexport interface DiscoveryConfig {\n name: string;\n authObjectId?: string;\n poolSize?: number;\n crawlerUrls?: string[];\n extraHosts?: Record<string, string>;\n headers?: Record<string, string> | Header[];\n fileId?: string;\n targetId?: string;\n hostsFilter?: string[];\n optimizedCrawler?: boolean;\n maxInteractionsChainLength: number;\n subdomainsCrawl: boolean;\n exclusions?: Exclusions;\n repeaters?: string[];\n discoveryTypes?: DiscoveryType[];\n targetTimeout: number;\n}\n\nexport interface Header {\n name: string;\n value: string;\n mergeStrategy: 'replace';\n}\n\nexport interface Discoveries {\n create(\n projectId: string,\n config: DiscoveryConfig\n ): Promise<DiscoveryCreateResponse>;\n\n rerun(projectId: string, discoveryId: string): Promise<string>;\n\n stop(projectId: string, discoveryId: string): Promise<void>;\n\n delete(projectId: string, discoveryId: string): Promise<void>;\n\n get(\n projectId: string,\n discoveryId: string,\n options?: { signal?: AbortSignal }\n ): Promise<DiscoveryView>;\n}\n\nexport const Discoveries: unique symbol = Symbol('Discoveries');\n\nexport interface DiscoveryWarning {\n code: string;\n message: string;\n}\n\nexport interface DiscoveryCreateResponse {\n id: string;\n warnings?: DiscoveryWarning[];\n}\n\nexport enum DiscoveryType {\n CRAWLER = 'crawler',\n ARCHIVE = 'archive',\n OAS = 'oas'\n}\n\nexport interface RequestExclusion {\n patterns: string[];\n methods: string[];\n}\n\nexport interface Exclusions {\n params: string[];\n requests: RequestExclusion[];\n}\n\nexport interface StorageFile {\n id: string;\n type: SourceType;\n}\n\nexport enum SourceType {\n OPEN_API = 'openapi',\n RAML = 'raml',\n POSTMAN = 'postman',\n HAR = 'har'\n}\n","import { Polling } from '../Utils/Polling';\nimport { Backoff, ErrorMessageFactory, logger } from '../Utils';\nimport { DiscoveryPollingConfig } from './DiscoveryPollingFactory';\nimport { Discoveries } from './Discoveries';\nimport { DiscoveryStatus, DiscoveryView } from './DiscoveryView';\nimport axios from 'axios';\nimport { setTimeout as asyncSetTimeout } from 'node:timers/promises';\n\nexport class DiscoveryPolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n private abortController = new AbortController();\n\n constructor(\n private readonly options: DiscoveryPollingConfig,\n private readonly discoveryManager: Discoveries\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-20min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n this.initializePolling();\n await this.runPollingLoop();\n } catch (error) {\n this.handleError(error);\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.abortController.abort();\n clearTimeout(this.timeoutDescriptor);\n }\n\n private initializePolling(): void {\n if (this.options.timeout) {\n this.setTimeout();\n }\n }\n\n private async runPollingLoop(): Promise<void> {\n for await (const discovery of this.poll()) {\n const shouldContinue = await this.processDiscoveryView(discovery);\n if (!shouldContinue) break;\n }\n }\n\n private handleError(error: unknown): void {\n if (!this.abortController.signal.aborted) {\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:polling'\n });\n process.exit(1);\n }\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => {\n this.abortController.abort();\n logger.log('Polling has been stopped by timeout.');\n }, timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<DiscoveryView> {\n while (!this.abortController.signal.aborted) {\n const backoff = this.createBackoff();\n\n const view: DiscoveryView = await backoff.execute(() =>\n this.discoveryManager.get(\n this.options.projectId,\n this.options.discoveryId\n )\n );\n\n yield view;\n\n await this.delay();\n }\n }\n\n private isFinished(status: DiscoveryStatus): boolean {\n return (\n status === DiscoveryStatus.DONE ||\n status === DiscoveryStatus.STOPPED ||\n status === DiscoveryStatus.DISRUPTED ||\n status === DiscoveryStatus.FAILED\n );\n }\n\n private async delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n await asyncSetTimeout(interval, false, {\n signal: this.abortController.signal\n });\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n\n private handleDiscoveryStatus(status: DiscoveryStatus): void {\n const statusMessages = {\n [DiscoveryStatus.RUNNING]: 'Discovery is running.',\n [DiscoveryStatus.PENDING]: 'Discovery is pending.',\n [DiscoveryStatus.SCHEDULED]: 'Discovery is scheduled.',\n [DiscoveryStatus.QUEUED]: 'Discovery is queued.',\n [DiscoveryStatus.DONE]: 'Discovery has been completed.',\n [DiscoveryStatus.STOPPED]: 'Discovery has been stopped.',\n [DiscoveryStatus.DISRUPTED]: 'Discovery has been disrupted.',\n [DiscoveryStatus.FAILED]: 'Discovery has failed.'\n };\n\n const message = statusMessages[status] || `Discovery status is ${status}.`;\n logger.log(message);\n }\n\n private processDiscoveryView(discovery: DiscoveryView | null): boolean {\n if (!discovery) {\n logger.log('The discovery has not been found.');\n\n return false;\n }\n\n this.handleDiscoveryStatus(discovery.status);\n\n if (this.isFinished(discovery.status)) {\n logger.log(\n `The discovery has been finished with status: ${discovery.status}.`\n );\n\n return false;\n }\n\n return true;\n }\n}\n","import { Polling } from '../Utils/Polling';\n\nexport interface DiscoveryPollingConfig {\n timeout?: number;\n interval?: number;\n discoveryId: string;\n projectId: string;\n}\n\nexport interface DiscoveryPollingFactory {\n create(options: DiscoveryPollingConfig): Polling;\n}\n\nexport const DiscoveryPollingFactory: unique symbol = Symbol(\n 'DiscoveryPollingFactory'\n);\n","export interface DiscoveryView {\n id: string;\n name: string;\n status: DiscoveryStatus;\n}\n\nexport enum DiscoveryStatus {\n RUNNING = 'running',\n PENDING = 'pending',\n STOPPED = 'stopped',\n FAILED = 'failed',\n DONE = 'done',\n DISRUPTED = 'disrupted',\n SCHEDULED = 'scheduled',\n QUEUED = 'queued'\n}\n","import {\n Discoveries,\n DiscoveryConfig,\n DiscoveryCreateResponse,\n DiscoveryType,\n Header,\n SourceType,\n StorageFile\n} from './Discoveries';\nimport { ProxyFactory } from '../Utils';\nimport { CliInfo } from '../Config';\nimport { DiscoveryView } from './DiscoveryView';\nimport { delay, inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestDiscoveryOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestDiscoveryOptions: unique symbol = Symbol(\n 'RestDiscoveryOptions'\n);\n\n@injectable()\nexport class RestDiscoveries implements Discoveries {\n private readonly client: Axios;\n\n constructor(\n @inject(delay(() => CliInfo)) private readonly info: CliInfo,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestDiscoveryOptions)\n { baseURL, apiKey, timeout, insecure, proxyURL }: RestDiscoveryOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async create(\n projectId: string,\n config: DiscoveryConfig\n ): Promise<DiscoveryCreateResponse> {\n const preparedConfig = await this.prepareConfig({ ...config });\n const res = await this.client.post<DiscoveryCreateResponse>(\n `/api/v2/projects/${projectId}/discoveries`,\n preparedConfig\n );\n\n return res.data;\n }\n\n public async rerun(projectId: string, discoveryId: string): Promise<string> {\n const res = await this.client.post<{ id: string }>(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}/rerun`\n );\n\n return res.data.id;\n }\n\n public async stop(projectId: string, discoveryId: string): Promise<void> {\n await this.client.put(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}/lifecycle`,\n {\n action: 'stop'\n }\n );\n }\n\n public async delete(projectId: string, discoveryId: string): Promise<void> {\n await this.client.delete(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}`\n );\n }\n\n public async get(\n projectId: string,\n discoveryId: string,\n options?: { signal?: AbortSignal }\n ): Promise<DiscoveryView> {\n const res = await this.client.get<DiscoveryView>(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}`,\n { signal: options?.signal }\n );\n\n return res.data;\n }\n\n private async prepareConfig({ headers, ...rest }: DiscoveryConfig): Promise<\n Omit<DiscoveryConfig, 'headers'> & {\n headers: Header[];\n info: {\n source: string;\n client?: { name: string; version: string };\n };\n }\n > {\n const config = await this.applyDefaultSettings(rest);\n\n return {\n ...config,\n info: {\n source: 'cli',\n client: {\n name: 'bright-cli',\n version: this.info.version\n }\n },\n headers: headers\n ? Object.entries(headers).map(([name, value]: [string, string]) => ({\n name,\n value,\n mergeStrategy: 'replace'\n }))\n : undefined\n };\n }\n\n private async applyDefaultSettings(\n discoveryConfig: Omit<DiscoveryConfig, 'headers'>\n ): Promise<Omit<DiscoveryConfig, 'headers'>> {\n const exclusions =\n discoveryConfig.exclusions?.params || discoveryConfig.exclusions?.requests\n ? discoveryConfig.exclusions\n : undefined;\n\n let discoveryTypes: DiscoveryType[] = await this.exploreDiscovery(\n discoveryConfig\n );\n discoveryTypes = discoveryTypes?.length ? discoveryTypes : undefined;\n\n return {\n ...discoveryConfig,\n discoveryTypes,\n exclusions\n };\n }\n\n private async exploreDiscovery(\n body: DiscoveryConfig\n ): Promise<DiscoveryType[]> {\n const discoveryTypes: DiscoveryType[] = [];\n const { fileId, crawlerUrls } = body;\n\n if (Array.isArray(crawlerUrls)) {\n discoveryTypes.push(DiscoveryType.CRAWLER);\n }\n\n if (fileId) {\n try {\n const { data } = await this.client.get<StorageFile>(\n `/api/v2/files/${fileId}`\n );\n\n discoveryTypes.push(\n data.type === SourceType.HAR\n ? DiscoveryType.ARCHIVE\n : DiscoveryType.OAS\n );\n } catch (error) {\n throw new Error(\n `Error loading file with id \"${fileId}\": No such file or you do not have permissions.`\n );\n }\n }\n\n return discoveryTypes;\n }\n}\n","export * from './Discoveries';\nexport * from './RestDiscoveries';\nexport * from './DiscoveryPollingFactory';\nexport * from './DefaultDiscoveryPollingFactory';\n","import {\n HostUpdateJobStatusPollingConfig,\n HostUpdateJobStatusPollingFactory\n} from './HostUpdateJobStatusPollingFactory';\nimport { Polling } from '../Utils/Polling';\nimport { HostUpdateJobStatusPolling } from './HostUpdateJobStatusPolling';\nimport { EntryPoints } from './EntryPoints';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultHostUpdateJobStatusPollingFactory\n implements HostUpdateJobStatusPollingFactory\n{\n constructor(\n @inject(EntryPoints)\n private readonly entryPoints: EntryPoints\n ) {}\n\n public create(options: HostUpdateJobStatusPollingConfig): Polling {\n return new HostUpdateJobStatusPolling(options, this.entryPoints);\n }\n}\n","export interface EntryPointsListOptions {\n projectId: string;\n limit?: number;\n connectivity?: string[];\n status?: string[];\n}\n\nexport interface UpdateHostOptions {\n projectId: string;\n oldHostname: string;\n newHostname: string;\n entryPointIds?: string[];\n}\n\nexport interface GetHostUpdateJobStatusOptions {\n jobId: string;\n projectId: string;\n}\n\nexport enum JobStatus {\n PENDING = 'pending',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed'\n}\n\nexport interface HostUpdateJobStatusView {\n jobId: string;\n status: JobStatus;\n totalCount: number;\n processedCount: number;\n skippedCount: number;\n error?: string;\n}\n\nexport interface EntryPoints {\n entrypoints(filter: EntryPointsListOptions): Promise<EntryPoint[]>;\n updateHost(options: UpdateHostOptions): Promise<{ taskId: string }>;\n getHostUpdateJobStatus(\n options: GetHostUpdateJobStatusOptions\n ): Promise<HostUpdateJobStatusView>;\n}\n\nexport const EntryPoints: unique symbol = Symbol('EntryPoints');\n\nexport interface EntryPoint {\n id: string;\n method: string;\n url: string;\n responseStatus: number;\n connectivity: string;\n lastUpdated: string;\n lastEdited: string;\n lastValidated: string;\n parametersCount: number;\n responseTime: number;\n status: string;\n openIssuesCount: number;\n closedIssuesCount: number;\n createdAt: string;\n}\n","import { Polling } from '../Utils/Polling';\nimport { Backoff, ErrorMessageFactory, logger } from '../Utils';\nimport { HostUpdateJobStatusPollingConfig } from './HostUpdateJobStatusPollingFactory';\nimport { EntryPoints, HostUpdateJobStatusView, JobStatus } from './EntryPoints';\nimport axios from 'axios';\nimport { setTimeout as asyncSetTimeout } from 'node:timers/promises';\n\nexport class HostUpdateJobStatusPolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n private abortController = new AbortController();\n\n constructor(\n private readonly options: HostUpdateJobStatusPollingConfig,\n private readonly entryPoints: EntryPoints\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-60min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n this.initializePolling();\n await this.runPollingLoop();\n } catch (error) {\n this.handleError(error);\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.abortController.abort();\n clearTimeout(this.timeoutDescriptor);\n }\n\n private initializePolling(): void {\n if (this.options.timeout) {\n this.setTimeout();\n }\n }\n\n private async runPollingLoop(): Promise<void> {\n for await (const jobView of this.poll()) {\n const shouldContinue = await this.processJobView(jobView);\n if (!shouldContinue) break;\n }\n }\n\n private handleError(error: unknown): void {\n if (!this.abortController.signal.aborted) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host-polling'\n })\n );\n process.exit(1);\n }\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => {\n this.abortController.abort();\n logger.log('Polling has been stopped by timeout.');\n }, timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<HostUpdateJobStatusView> {\n while (!this.abortController.signal.aborted) {\n const backoff = this.createBackoff();\n\n const view: HostUpdateJobStatusView = await backoff.execute(() =>\n this.entryPoints.getHostUpdateJobStatus({\n jobId: this.options.jobId,\n projectId: this.options.projectId\n })\n );\n\n logger.debug('Host update job data: %j', view);\n\n yield view;\n\n await this.delay();\n }\n }\n\n private isFinished(status: JobStatus): boolean {\n return status === JobStatus.COMPLETED || status === JobStatus.FAILED;\n }\n\n private async delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n await asyncSetTimeout(interval, false, {\n signal: this.abortController.signal\n });\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n\n private handleJobStatus(status: JobStatus): void {\n const statusMessages = {\n [JobStatus.PENDING]: 'Host update job is pending.',\n [JobStatus.PROCESSING]: 'Host update job is processing.',\n [JobStatus.COMPLETED]: 'Host update job has been completed.',\n [JobStatus.FAILED]: 'Host update job has failed.'\n };\n\n const message =\n statusMessages[status] || `Host update job status is ${status}.`;\n logger.log(message);\n }\n\n private processJobView(job: HostUpdateJobStatusView | null): boolean {\n if (!job) {\n logger.log('The host update job has not been found.');\n\n return false;\n }\n\n this.handleJobStatus(job.status);\n\n if (this.isFinished(job.status)) {\n logger.log(\n `The host update job has been finished with status: ${job.status}.`\n );\n\n return false;\n }\n\n return true;\n }\n}\n","import { Polling } from '../Utils/Polling';\n\nexport interface HostUpdateJobStatusPollingConfig {\n timeout?: number;\n interval?: number;\n jobId: string;\n projectId: string;\n}\n\nexport interface HostUpdateJobStatusPollingFactory {\n create(options: HostUpdateJobStatusPollingConfig): Polling;\n}\n\nexport const HostUpdateJobStatusPollingFactory: unique symbol = Symbol(\n 'HostUpdateJobStatusPollingFactory'\n);\n","import {\n EntryPoints,\n EntryPoint,\n EntryPointsListOptions,\n GetHostUpdateJobStatusOptions,\n HostUpdateJobStatusView,\n UpdateHostOptions\n} from './EntryPoints';\nimport { ProxyFactory } from '../Utils';\nimport axios, { Axios } from 'axios';\nimport { inject, injectable } from 'tsyringe';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestProjectsOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestProjectsOptions: unique symbol = Symbol('RestProjectsOptions');\n\n@injectable()\nexport class RestEntryPoints implements EntryPoints {\n private readonly entrypointsPaginationBatchSize = 50;\n private readonly client: Axios;\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestProjectsOptions)\n { baseURL, apiKey, insecure, proxyURL, timeout }: RestProjectsOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async entrypoints({\n limit = 10,\n projectId,\n ...filters\n }: EntryPointsListOptions): Promise<EntryPoint[]> {\n let remaining = limit;\n const data: EntryPoint[] = [];\n let nextId: string;\n let nextCreatedAt: string;\n\n while (remaining > 0) {\n const {\n data: { items = [] }\n } = await this.client.get(`/api/v2/projects/${projectId}/entry-points`, {\n params: {\n nextId,\n nextCreatedAt,\n ...filters,\n limit: Math.min(remaining, this.entrypointsPaginationBatchSize)\n }\n });\n\n if (!items.length) {\n break;\n }\n\n data.push(...items);\n ({ id: nextId, createdAt: nextCreatedAt } = items[items.length - 1]);\n\n remaining -= this.entrypointsPaginationBatchSize;\n }\n\n return data;\n }\n\n public async updateHost(\n options: UpdateHostOptions\n ): Promise<{ taskId: string }> {\n const { projectId, oldHostname, newHostname, entryPointIds } = options;\n\n const { data } = await this.client.post<{ taskId: string }>(\n `/api/v2/projects/${projectId}/entry-points/update-host`,\n {\n oldHostname,\n newHostname,\n entryPointIds\n }\n );\n\n return data;\n }\n\n public async getHostUpdateJobStatus(\n options: GetHostUpdateJobStatusOptions\n ): Promise<HostUpdateJobStatusView> {\n const { jobId, projectId } = options;\n\n const { data } = await this.client.get<HostUpdateJobStatusView>(\n `/api/v2/projects/${projectId}/entry-points/update-host/${jobId}`\n );\n\n return data;\n }\n}\n","export * from './EntryPoints';\nexport * from './RestEntryPoints';\n","import { RepeaterCommandHub } from './RepeaterCommandHub';\nimport { NetworkTestType } from './NetworkTestType';\nimport { VirtualScripts, VirtualScriptType } from '../Scripts';\nimport { Helpers, logger } from '../Utils';\nimport { ReadlinePlatform } from '../Wizard';\nimport { Request, RequestExecutor, Response } from '../RequestExecutor';\nimport { inject, injectable, injectAll } from 'tsyringe';\nimport { EOL } from 'node:os';\n\n@injectable()\nexport class DefaultRepeaterCommandHub implements RepeaterCommandHub {\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @injectAll(RequestExecutor)\n private readonly requestExecutors: RequestExecutor[]\n ) {}\n\n public compileScripts(script: string | Record<string, string>): void {\n this.virtualScripts.clear(VirtualScriptType.REMOTE);\n\n if (this.virtualScripts.size) {\n logger.warn(\n 'Error Loading Script: Cannot accept scripts from the cloud when a local script is already loaded'\n );\n\n return;\n }\n\n if (typeof script === 'string') {\n this.virtualScripts.set('*', VirtualScriptType.REMOTE, script);\n } else {\n Object.entries(script).map(([wildcard, code]: [string, string]) =>\n this.virtualScripts.set(wildcard, VirtualScriptType.REMOTE, code)\n );\n }\n }\n\n public sendRequest(request: Request): Promise<Response> {\n const { protocol } = request;\n\n const requestExecutor = this.requestExecutors.find(\n (x) => x.protocol === protocol\n );\n\n if (!requestExecutor) {\n throw new Error(`Unsupported protocol \"${protocol}\"`);\n }\n\n return requestExecutor.execute(request);\n }\n\n public testNetwork(\n type: NetworkTestType,\n input: string | string[]\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['configure', `--${type}`];\n\n logger.debug('Launching \"Network Diagnostic\" process with cmd: %j', args);\n\n const child = Helpers.spawn({\n include: args,\n exclude: ['repeater']\n });\n\n child.unref();\n\n const stdout: string[] = [];\n\n child.stdout.on('data', (data: Buffer) => {\n const chunk = data.toString();\n const lines: string[] = chunk\n .split('\\n')\n .filter((line: string) => line.length > 0);\n\n stdout.push(...lines);\n\n const [first, ...rest]: string[] = [].concat(input);\n\n if (chunk.indexOf(ReadlinePlatform.URLS_QUESTION) > -1) {\n child.stdin.write(`${[first, ...rest].join(',')}${EOL}`);\n }\n\n if (chunk.indexOf(ReadlinePlatform.HOST_OR_IP_QUESTION) > -1) {\n child.stdin.write(`${new URL(first).hostname}${EOL}`);\n }\n\n if (chunk.indexOf(ReadlinePlatform.COMPELED_MESSAGE) > -1) {\n child.stdin.end();\n }\n });\n\n child.once('error', (err: Error) => {\n logger.warn(\n `Failed to start \"Network Diagnostic\" due to %s`,\n err.message\n );\n reject(err);\n });\n\n child.on('close', (code: number) => {\n if (code !== 0 || stdout.length === 0) {\n const msg = `\"Network Diagnostic\" did not start successfully. Process exited with code ${code}`;\n\n logger.warn(msg);\n\n return reject(new Error(msg));\n }\n\n resolve(this.processOutput(stdout));\n });\n });\n }\n\n // this is workaround of \\x1B[1G control code that retype string in console\n private processOutput(input: string[]): string {\n return input\n .filter(\n (element, index, arr) =>\n !(\n element.endsWith('\\u001b[1G') ||\n (!!arr[index + 1] && arr[index + 1] === '\\u001b[1G')\n )\n )\n .filter((x) => !x.startsWith(ReadlinePlatform.URLS_QUESTION))\n .join('\\n');\n }\n}\n","import { logger, ProxyFactory } from '../Utils';\nimport {\n DeployCommandOptions,\n DeploymentRuntime,\n RepeaterErrorCodes,\n RepeaterServer,\n RepeaterServerDeployedEvent,\n RepeaterServerErrorEvent,\n RepeaterServerEventHandler,\n RepeaterServerEvents,\n RepeaterServerEventsMap,\n RepeaterServerNetworkTestEvent,\n RepeaterServerNetworkTestResult,\n RepeaterServerReconnectionAttemptedEvent,\n RepeaterServerReconnectionFailedEvent,\n RepeaterServerRequestEvent,\n RepeaterServerRequestResponse,\n RepeaterServerScriptsUpdatedEvent,\n RepeaterUpgradeAvailableEvent,\n RepeaterLimitsEvent\n} from './RepeaterServer';\nimport { inject, injectable } from 'tsyringe';\nimport io, { Socket } from 'socket.io-client';\nimport parser from 'socket.io-msgpack-parser';\nimport { captureException, captureMessage } from '@sentry/node';\nimport { EventEmitter, once } from 'node:events';\nimport Timer = NodeJS.Timer;\n\nexport interface DefaultRepeaterServerOptions {\n readonly uri: string;\n readonly token: string;\n readonly connectTimeout?: number;\n readonly proxyUrl?: string;\n readonly insecure?: boolean;\n readonly proxyDomains?: string[];\n}\n\nexport const DefaultRepeaterServerOptions: unique symbol = Symbol(\n 'DefaultRepeaterServerOptions'\n);\n\ntype CallbackFunction<T = unknown> = (arg: T) => unknown;\ntype HandlerFunction = (args: unknown[]) => unknown;\n\nconst enum SocketEvents {\n DEPLOYED = 'deployed',\n DEPLOY = 'deploy',\n UNDEPLOY = 'undeploy',\n UNDEPLOYED = 'undeployed',\n TEST_NETWORK = 'test-network',\n ERROR = 'error',\n UPDATE_AVAILABLE = 'update-available',\n SCRIPT_UPDATED = 'scripts-updated',\n REQUEST = 'request',\n LIMITS = 'limits'\n}\n\ninterface SocketListeningEventMap {\n [SocketEvents.DEPLOYED]: (event: RepeaterServerDeployedEvent) => void;\n [SocketEvents.UNDEPLOYED]: () => void;\n [SocketEvents.ERROR]: (event: RepeaterServerErrorEvent) => void;\n [SocketEvents.TEST_NETWORK]: (\n event: RepeaterServerNetworkTestEvent,\n callback: CallbackFunction<RepeaterServerNetworkTestResult>\n ) => void;\n [SocketEvents.UPDATE_AVAILABLE]: (\n event: RepeaterUpgradeAvailableEvent\n ) => void;\n [SocketEvents.SCRIPT_UPDATED]: (\n event: RepeaterServerScriptsUpdatedEvent\n ) => void;\n [SocketEvents.REQUEST]: (\n request: RepeaterServerRequestEvent,\n callback: CallbackFunction<RepeaterServerRequestResponse>\n ) => void;\n [SocketEvents.LIMITS]: (request: RepeaterLimitsEvent) => void;\n}\n\ninterface SocketEmitEventMap {\n [SocketEvents.DEPLOY]: (\n options: DeployCommandOptions,\n runtime?: DeploymentRuntime\n ) => void;\n [SocketEvents.UNDEPLOY]: () => void;\n}\n\n@injectable()\nexport class DefaultRepeaterServer implements RepeaterServer {\n private readonly MAX_DEPLOYMENT_TIMEOUT = 60_000;\n private readonly MIN_RECONNECTION_DELAY = 5_000;\n private readonly MAX_RECONNECTION_DELAY = 1_000;\n private readonly events = new EventEmitter();\n private readonly handlerMap = new WeakMap<\n RepeaterServerEventHandler<any>,\n HandlerFunction\n >();\n private latestReconnectionError?: Error;\n private connectionTimer?: Timer;\n private _socket?: Socket<SocketListeningEventMap, SocketEmitEventMap>;\n private connectionAttempts = 0;\n\n private get socket() {\n if (!this._socket) {\n throw new Error(\n 'Please make sure that repeater established a connection with host.'\n );\n }\n\n return this._socket;\n }\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(DefaultRepeaterServerOptions)\n private readonly options: DefaultRepeaterServerOptions\n ) {}\n\n public disconnect() {\n this.events.removeAllListeners();\n this.clearConnectionTimer();\n\n this._socket?.disconnect();\n this._socket?.removeAllListeners();\n this._socket = undefined;\n }\n\n public async deploy(\n options: DeployCommandOptions,\n runtime: DeploymentRuntime\n ): Promise<RepeaterServerDeployedEvent> {\n process.nextTick(() =>\n this.socket.emit(SocketEvents.DEPLOY, options, runtime)\n );\n\n const [result]: RepeaterServerDeployedEvent[] = await Promise.race([\n once(this.socket, SocketEvents.DEPLOYED),\n new Promise<never>((_, reject) =>\n setTimeout(\n reject,\n this.MAX_DEPLOYMENT_TIMEOUT,\n new Error('No response.')\n ).unref()\n )\n ]);\n\n return result;\n }\n\n public async connect(hostname: string) {\n this._socket = io(this.options.uri, {\n parser,\n path: '/api/ws/v1',\n transports: ['websocket'],\n reconnectionDelayMax: this.MAX_RECONNECTION_DELAY,\n reconnectionDelay: this.MIN_RECONNECTION_DELAY,\n timeout: this.options?.connectTimeout,\n rejectUnauthorized: !this.options.insecure,\n // @ts-expect-error Type is wrong.\n // Agent is passed directly to \"ws\" package, which accepts http.Agent\n agent: this.options.proxyUrl\n ? this.proxyFactory.createProxyForClient({\n proxyUrl: this.options.proxyUrl,\n targetUrl: this.options.uri,\n rejectUnauthorized: !this.options.insecure\n })\n : undefined,\n auth: {\n token: this.options.token,\n domain: hostname\n }\n });\n\n this.listenToReservedEvents();\n this.listenToApplicationEvents();\n\n await once(this.socket, 'connect');\n\n logger.debug('Repeater connected to %s', this.options.uri);\n }\n\n public off<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler?: RepeaterServerEventHandler<K>\n ): void {\n const wrappedHandler = this.handlerMap.get(handler);\n if (wrappedHandler) {\n this.events.off(event, wrappedHandler);\n this.handlerMap.delete(handler);\n }\n }\n\n public on<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler: RepeaterServerEventHandler<K>\n ): void {\n const wrappedHandler = (...args: unknown[]) =>\n this.wrapEventListener(event, handler, ...args);\n this.handlerMap.set(handler, wrappedHandler);\n this.events.on(event, wrappedHandler);\n }\n\n private listenToApplicationEvents() {\n this.socket.on(SocketEvents.DEPLOYED, (event) =>\n this.events.emit(RepeaterServerEvents.DEPLOY, event)\n );\n this.socket.on(SocketEvents.REQUEST, (event, callback) =>\n this.events.emit(RepeaterServerEvents.REQUEST, event, callback)\n );\n this.socket.on(SocketEvents.TEST_NETWORK, (event, callback) =>\n this.events.emit(RepeaterServerEvents.TEST_NETWORK, event, callback)\n );\n this.socket.on(SocketEvents.ERROR, (event) => {\n captureMessage(event.message);\n this.events.emit(RepeaterServerEvents.ERROR, event);\n });\n this.socket.on(SocketEvents.UPDATE_AVAILABLE, (event) =>\n this.events.emit(RepeaterServerEvents.UPDATE_AVAILABLE, event)\n );\n this.socket.on(SocketEvents.SCRIPT_UPDATED, (event) =>\n this.events.emit(RepeaterServerEvents.SCRIPTS_UPDATED, event)\n );\n this.socket.on(SocketEvents.LIMITS, (event) =>\n this.events.emit(RepeaterServerEvents.LIMITS, event)\n );\n }\n\n private listenToReservedEvents() {\n this.socket.on('connect', this.handleConnect);\n this.socket.on('connect_error', this.handleConnectionError);\n this.socket.on('disconnect', this.handleDisconnect);\n this.socket.io.on('reconnect', () => {\n this.latestReconnectionError = undefined;\n });\n this.socket.io.on(\n 'reconnect_error',\n (error) => (this.latestReconnectionError = error)\n );\n this.socket.io.on('reconnect_failed', () =>\n this.events.emit(RepeaterServerEvents.RECONNECTION_FAILED, {\n error: this.latestReconnectionError\n } as RepeaterServerReconnectionFailedEvent)\n );\n this.socket.io.on('reconnect_attempt', (attempt) =>\n this.events.emit(RepeaterServerEvents.RECONNECT_ATTEMPT, {\n attempt\n } as RepeaterServerReconnectionAttemptedEvent)\n );\n this.socket.io.on('reconnect', () =>\n this.events.emit(RepeaterServerEvents.RECONNECTION_SUCCEEDED)\n );\n }\n\n private handleConnectionError = (err: Error) => {\n const { data } = err as unknown as {\n data?: Omit<RepeaterServerErrorEvent, 'transaction'>;\n };\n\n if (data && this.suppressConnectionError(data)) {\n this.events.emit(RepeaterServerEvents.ERROR, {\n ...data,\n message: err.message\n });\n }\n\n // Try reconnect in any case.\n this.scheduleReconnection();\n };\n\n private suppressConnectionError(\n data: Omit<RepeaterServerErrorEvent, 'transaction'>\n ) {\n return [\n RepeaterErrorCodes.REPEATER_UNAUTHORIZED,\n RepeaterErrorCodes.REPEATER_NOT_PERMITTED\n ].includes(data.code);\n }\n\n private scheduleReconnection() {\n let delay = Math.max(\n this.MIN_RECONNECTION_DELAY * 2 ** this.connectionAttempts,\n this.MIN_RECONNECTION_DELAY\n );\n delay += delay * 0.3 * Math.random();\n delay = Math.min(delay, this.MAX_RECONNECTION_DELAY);\n\n this.connectionAttempts++;\n\n this.events.emit(RepeaterServerEvents.RECONNECT_ATTEMPT, {\n attempt: this.connectionAttempts\n } as RepeaterServerReconnectionAttemptedEvent);\n this.connectionTimer = setTimeout(() => this.socket.connect(), delay);\n }\n\n private async wrapEventListener<TArgs extends TArg[], TArg>(\n event: string,\n handler: (...payload: TArgs) => unknown,\n ...args: unknown[]\n ) {\n try {\n const callback = this.extractLastArgument(args);\n\n // eslint-disable-next-line @typescript-eslint/return-await\n const response = await handler(...(args as TArgs));\n\n callback?.(response);\n } catch (err) {\n this.handleEventError(err, event, args);\n }\n }\n\n private extractLastArgument(args: unknown[]): CallbackFunction | undefined {\n const lastArg = args.pop();\n if (typeof lastArg === 'function') {\n return lastArg as CallbackFunction;\n } else {\n // If the last argument is not a function, add it back to the args array\n args.push(lastArg);\n\n return undefined;\n }\n }\n\n private clearConnectionTimer() {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n }\n }\n\n private handleConnect = () => {\n this.connectionAttempts = 0;\n this.clearConnectionTimer();\n this.events.emit(RepeaterServerEvents.CONNECTED);\n };\n\n private handleDisconnect = (reason: string): void => {\n if (reason !== 'io client disconnect') {\n this.events.emit(RepeaterServerEvents.DISCONNECTED);\n }\n\n // the disconnection was initiated by the server, you need to reconnect manually\n if (reason === 'io server disconnect') {\n this.socket.connect();\n }\n };\n\n private handleEventError(error: Error, event: string, args: unknown[]): void {\n captureException(error);\n logger.debug(\n 'An error occurred while processing the %s event with the following payload: %j',\n event,\n args\n );\n logger.error(error);\n }\n}\n","import { CliInfo } from '../Config';\nimport { RuntimeDetector } from './RuntimeDetector';\nimport arch from 'arch';\nimport { delay, inject, injectable } from 'tsyringe';\nimport ci from 'ci-info';\nimport { execSync } from 'node:child_process';\nimport os from 'node:os';\n\n@injectable()\nexport class DefaultRuntimeDetector implements RuntimeDetector {\n constructor(\n @inject(delay(() => CliInfo)) private readonly cliInfo: CliInfo\n ) {}\n\n public distribution(): string | undefined {\n return this.cliInfo.distribution;\n }\n\n public isInsideDocker(): boolean {\n return !!process.env['BRIGHT_CLI_DOCKER'];\n }\n\n public nodeVersion(): string {\n return process.version;\n }\n\n public ci(): string {\n return ci.name ?? undefined;\n }\n\n public arch(): string {\n try {\n return arch();\n } catch {\n // pass\n }\n\n // As a fallback use arch info for which the Node.js binary was compiled\n return os.arch();\n }\n\n public os(): string {\n const platform = os.platform();\n\n if (platform === 'darwin') {\n return this.detectMacosVersion();\n } else if (platform === 'linux') {\n return this.detectLinuxVersion();\n } else if (platform === 'win32') {\n return this.detectWindowsVersion();\n }\n\n // As a fallback use OS info for which the Node.js binary was compiled\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectMacosVersion() {\n try {\n const name = execSync('sw_vers -productName', {\n encoding: 'utf8'\n }).trim();\n const version = execSync('sw_vers -productVersion', {\n encoding: 'utf8'\n }).trim();\n const build = execSync('sw_vers -buildVersion', {\n encoding: 'utf8'\n }).trim();\n\n if (name.length && version.length && build.length) {\n return `${name} ${version} (${build})`;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectLinuxVersion() {\n try {\n const osRelease = execSync('cat /etc/os-release', {\n encoding: 'utf8'\n }).trim();\n const extractValue = (key: string) =>\n new RegExp(\n `(?:^|[\\r\\n]+)${key}(?:\\\\s*=\\\\s*?|:\\\\s+?)(\\\\s*'(?:\\\\\\\\'|[^'])*'|\\\\s*\"(?:\\\\\\\\\"|[^\"])*\"|\\\\s*\\`(?:\\\\\\\\\\`|[^\\`])*\\`|[^#\\r\\n]+)?`,\n 'i'\n )\n .exec(osRelease)?.[1]\n .replace(/^(['\"`])([\\s\\S]*)\\1$/i, '$2');\n\n const name = extractValue('NAME') || extractValue('ID');\n const version = extractValue('VERSION') || extractValue('VERSION_ID');\n const prettyName = extractValue('PRETTY_NAME');\n\n if (name.length && version.length) {\n return `${name} ${version}`;\n } else if (prettyName.length) {\n return prettyName;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectWindowsVersion() {\n try {\n const version = execSync('ver', { encoding: 'utf8' }).trim();\n\n if (version.length) {\n return version;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n}\n","export enum NetworkTestType {\n PING = 'ping',\n TRACEROUTE = 'traceroute'\n}\n","import { Request, Response } from '../RequestExecutor';\nimport { NetworkTestType } from './NetworkTestType';\n\nexport interface RepeaterCommandHub {\n compileScripts(script: string | Record<string, string>): void;\n testNetwork(type: NetworkTestType, input: string | string[]): Promise<string>;\n sendRequest(request: Request): Promise<Response>;\n}\n\nexport const RepeaterCommandHub: unique symbol = Symbol('RepeaterCommandHub');\n","export interface RepeaterLauncher {\n loadCerts(cacert?: string): Promise<void>;\n\n loadScripts(scripts: Record<string, string>): Promise<void>;\n\n run(repeaterId: string, asDaemon?: boolean): Promise<void>;\n\n close(): Promise<void>;\n\n uninstall(): Promise<void>;\n\n install(): Promise<void>;\n}\n\nexport const RepeaterLauncher: unique symbol = Symbol('RepeaterLauncher');\n","import { Protocol } from '../RequestExecutor';\nimport { NetworkTestType } from './NetworkTestType';\n\nexport interface RepeaterServerDeployedEvent {\n repeaterId: string;\n}\n\nexport interface RepeaterServerRequestEvent {\n protocol: Protocol;\n url: string;\n method?: string;\n headers?: Record<string, string | string[]>;\n correlationIdRegex?: string;\n body?: string;\n encoding?: 'base64';\n maxContentSize?: number;\n timeout?: number;\n}\n\nexport type RepeaterServerNetworkTestEvent =\n | {\n type: NetworkTestType.PING;\n input: string[];\n }\n | {\n type: NetworkTestType.TRACEROUTE;\n input: string;\n };\n\nexport type RepeaterServerNetworkTestResult =\n | {\n output: string;\n }\n | {\n error: string;\n };\n\nexport type RepeaterServerRequestResponse =\n | {\n protocol: Protocol;\n statusCode?: number;\n message?: string;\n errorCode?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: string;\n }\n | {\n protocol: Protocol;\n message?: string;\n errorCode?: string;\n };\n\nexport interface RepeaterServerReconnectionFailedEvent {\n error: Error;\n}\n\nexport interface RepeaterServerReconnectionAttemptedEvent {\n attempt: number;\n}\n\nexport enum RepeaterErrorCodes {\n REPEATER_NOT_PERMITTED = 'repeater_not_permitted',\n REPEATER_ALREADY_STARTED = 'repeater_already_started',\n REPEATER_DEACTIVATED = 'repeater_deactivated',\n REPEATER_UNAUTHORIZED = 'repeater_unauthorized',\n REPEATER_NO_LONGER_SUPPORTED = 'repeater_no_longer_supported',\n UNKNOWN_ERROR = 'unknown_error',\n UNEXPECTED_ERROR = 'unexpected_error'\n}\n\nexport interface RepeaterServerErrorEvent {\n message: string;\n code: RepeaterErrorCodes;\n transaction?: string;\n remediation?: string;\n}\n\nexport interface RepeaterUpgradeAvailableEvent {\n version: string;\n}\n\nexport interface RepeaterLimitsEvent {\n maxBodySize: number;\n}\n\nexport interface RepeaterServerScriptsUpdatedEvent {\n script: string | Record<string, string>;\n}\n\nexport interface DeployCommandOptions {\n repeaterId?: string;\n}\n\nexport interface DeploymentRuntime {\n version: string;\n scriptsLoaded: boolean;\n ci?: string;\n os?: string;\n arch?: string;\n docker?: boolean;\n distribution?: string;\n nodeVersion?: string;\n}\n\nexport const enum RepeaterServerEvents {\n DEPLOYED = 'deployed',\n DEPLOY = 'deploy',\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n REQUEST = 'request',\n TEST_NETWORK = 'test_network',\n UPDATE_AVAILABLE = 'update_available',\n LIMITS = 'limits',\n SCRIPTS_UPDATED = 'scripts_updated',\n RECONNECTION_FAILED = 'reconnection_failed',\n RECONNECT_ATTEMPT = 'reconnect_attempt',\n RECONNECTION_SUCCEEDED = 'reconnection_succeeded',\n ERROR = 'error',\n PING = 'ping'\n}\n\nexport interface RepeaterServerEventsMap {\n [RepeaterServerEvents.DEPLOY]: [DeployCommandOptions, DeploymentRuntime?];\n [RepeaterServerEvents.DEPLOYED]: RepeaterServerDeployedEvent;\n [RepeaterServerEvents.CONNECTED]: void;\n [RepeaterServerEvents.DISCONNECTED]: void;\n [RepeaterServerEvents.REQUEST]: RepeaterServerRequestEvent;\n [RepeaterServerEvents.TEST_NETWORK]: RepeaterServerNetworkTestEvent;\n [RepeaterServerEvents.UPDATE_AVAILABLE]: RepeaterUpgradeAvailableEvent;\n [RepeaterServerEvents.LIMITS]: RepeaterLimitsEvent;\n [RepeaterServerEvents.SCRIPTS_UPDATED]: RepeaterServerScriptsUpdatedEvent;\n [RepeaterServerEvents.RECONNECTION_FAILED]: RepeaterServerReconnectionFailedEvent;\n [RepeaterServerEvents.RECONNECT_ATTEMPT]: RepeaterServerReconnectionAttemptedEvent;\n [RepeaterServerEvents.RECONNECTION_SUCCEEDED]: void;\n [RepeaterServerEvents.ERROR]: RepeaterServerErrorEvent;\n [RepeaterServerEvents.PING]: void;\n}\n\nexport type RepeaterServerEventHandler<\n K extends keyof RepeaterServerEventsMap\n> = (\n ...args: RepeaterServerEventsMap[K] extends (infer U)[]\n ? U[]\n : [RepeaterServerEventsMap[K]]\n) => unknown;\n\nexport interface RepeaterServer {\n disconnect(): void;\n\n connect(hostname: string): Promise<void>;\n\n deploy(\n options: DeployCommandOptions,\n runtime?: DeploymentRuntime\n ): Promise<RepeaterServerDeployedEvent>;\n\n on<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler: RepeaterServerEventHandler<K>\n ): void;\n\n off<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler?: RepeaterServerEventHandler<K>\n ): void;\n}\n\nexport const RepeaterServer: unique symbol = Symbol('RepeaterServer');\n","export interface RuntimeDetector {\n ci(): string | undefined;\n\n os(): string;\n\n arch(): string;\n\n isInsideDocker(): boolean;\n\n nodeVersion(): string;\n\n distribution(): string | undefined;\n}\n\nexport const RuntimeDetector: unique symbol = Symbol('RuntimeDetector');\n","import { RepeaterLauncher } from './RepeaterLauncher';\nimport {\n DeploymentRuntime,\n RepeaterLimitsEvent,\n RepeaterErrorCodes,\n RepeaterServer,\n RepeaterServerErrorEvent,\n RepeaterServerEvents,\n RepeaterServerNetworkTestEvent,\n RepeaterServerReconnectionFailedEvent,\n RepeaterServerRequestEvent\n} from './RepeaterServer';\nimport { RuntimeDetector } from './RuntimeDetector';\nimport { ScriptLoader, VirtualScripts } from '../Scripts';\nimport { StartupManager } from '../StartupScripts';\nimport {\n Certificates,\n Request,\n RequestExecutorOptions\n} from '../RequestExecutor';\nimport { Helpers, logger } from '../Utils';\nimport { CliInfo } from '../Config';\nimport { RepeaterCommandHub } from './RepeaterCommandHub';\nimport { delay, inject, injectable } from 'tsyringe';\nimport chalk from 'chalk';\nimport { captureException, setTag } from '@sentry/node';\n\n@injectable()\nexport class ServerRepeaterLauncher implements RepeaterLauncher {\n private static readonly SERVICE_NAME = 'bright-repeater';\n private repeaterRunning: boolean = false;\n private repeaterId: string | undefined;\n\n constructor(\n @inject(RuntimeDetector) private readonly runtimeDetector: RuntimeDetector,\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @inject(RepeaterServer) private readonly repeaterServer: RepeaterServer,\n @inject(StartupManager)\n private readonly startupManager: StartupManager,\n @inject(RepeaterCommandHub)\n private readonly commandHub: RepeaterCommandHub,\n @inject(Certificates) private readonly certificates: Certificates,\n @inject(ScriptLoader) private readonly scriptLoader: ScriptLoader,\n @inject(RequestExecutorOptions)\n private readonly requestExecutorOptions: RequestExecutorOptions,\n @inject(delay(() => CliInfo)) private readonly info: CliInfo\n ) {}\n\n public close() {\n this.repeaterRunning = false;\n\n this.repeaterServer.disconnect();\n\n return Promise.resolve();\n }\n\n public async install(): Promise<void> {\n const { command, args: execArgs } = Helpers.getExecArgs({\n escape: false,\n include: ['--run'],\n exclude: ['--daemon', '-d']\n });\n\n await this.startupManager.install({\n command,\n args: execArgs,\n name: ServerRepeaterLauncher.SERVICE_NAME,\n displayName: 'Bright Repeater'\n });\n\n logger.log(\n 'A Repeater daemon process was initiated successfully (SERVICE: %s)',\n ServerRepeaterLauncher.SERVICE_NAME\n );\n }\n\n public loadCerts(cacert: string): Promise<void> {\n return this.certificates.load(cacert);\n }\n\n public loadScripts(scripts: Record<string, string>): Promise<void> {\n return this.scriptLoader.load(scripts);\n }\n\n public async uninstall(): Promise<void> {\n await this.startupManager.uninstall(ServerRepeaterLauncher.SERVICE_NAME);\n\n logger.log(\n 'The Repeater daemon process (SERVICE: %s) was stopped and deleted successfully',\n ServerRepeaterLauncher.SERVICE_NAME\n );\n }\n\n public async run(\n repeaterId: string,\n asDaemon: boolean = false\n ): Promise<void> {\n if (this.repeaterRunning) {\n return;\n }\n\n this.repeaterRunning = true;\n\n setTag('bridge_id', repeaterId);\n\n if (asDaemon) {\n await this.startupManager.run(() => this.close());\n }\n\n logger.log('Starting the Repeater (%s)...', this.info.version);\n\n this.repeaterId = repeaterId;\n\n this.subscribeToEvents();\n\n await this.repeaterServer.connect(this.repeaterId);\n }\n\n private getRuntime(): DeploymentRuntime {\n return {\n version: this.info.version,\n scriptsLoaded: !!this.virtualScripts.size,\n ci: this.runtimeDetector.ci(),\n os: this.runtimeDetector.os(),\n arch: this.runtimeDetector.arch(),\n docker: this.runtimeDetector.isInsideDocker(),\n distribution: this.runtimeDetector.distribution(),\n nodeVersion: this.runtimeDetector.nodeVersion()\n };\n }\n\n private subscribeToEvents() {\n this.repeaterServer.on(RepeaterServerEvents.CONNECTED, this.deployRepeater);\n this.repeaterServer.on(RepeaterServerEvents.ERROR, this.handleError);\n this.repeaterServer.on(\n RepeaterServerEvents.RECONNECTION_FAILED,\n this.reconnectionFailed\n );\n this.repeaterServer.on(RepeaterServerEvents.REQUEST, this.requestReceived);\n this.repeaterServer.on(RepeaterServerEvents.LIMITS, this.limitsReceived);\n this.repeaterServer.on(\n RepeaterServerEvents.TEST_NETWORK,\n this.testingNetwork\n );\n this.repeaterServer.on(RepeaterServerEvents.SCRIPTS_UPDATED, (payload) =>\n this.commandHub.compileScripts(payload.script)\n );\n this.repeaterServer.on(RepeaterServerEvents.UPDATE_AVAILABLE, (payload) =>\n logger.warn(\n '%s: A new Repeater version (%s) is available, for update instruction visit https://docs.brightsec.com/docs/installation-options',\n chalk.yellow('(!) IMPORTANT'),\n payload.version\n )\n );\n this.repeaterServer.on(\n RepeaterServerEvents.RECONNECT_ATTEMPT,\n ({ attempt }) =>\n logger.warn('Failed to connect to Bright cloud (attempt %d)', attempt)\n );\n this.repeaterServer.on(RepeaterServerEvents.RECONNECTION_SUCCEEDED, () =>\n logger.log('The Repeater (%s) connected', this.info.version)\n );\n }\n\n private handleError = ({\n code,\n message,\n remediation\n }: RepeaterServerErrorEvent) => {\n const normalizedMessage = this.normalizeMessage(message);\n const normalizedRemediation = this.normalizeMessage(remediation ?? '');\n\n if (this.isCriticalError(code)) {\n this.handleCriticalError(normalizedMessage, normalizedRemediation);\n } else {\n logger.error(normalizedMessage);\n }\n };\n\n private normalizeMessage(message: string): string {\n return message.replace(/\\.$/, '');\n }\n\n private isCriticalError(code: RepeaterErrorCodes): boolean {\n return [\n RepeaterErrorCodes.REPEATER_DEACTIVATED,\n RepeaterErrorCodes.REPEATER_NO_LONGER_SUPPORTED,\n RepeaterErrorCodes.REPEATER_UNAUTHORIZED,\n RepeaterErrorCodes.REPEATER_ALREADY_STARTED,\n RepeaterErrorCodes.REPEATER_NOT_PERMITTED,\n RepeaterErrorCodes.UNEXPECTED_ERROR\n ].includes(code);\n }\n\n private handleCriticalError(message: string, remediation: string): void {\n logger.error('%s: %s. %s', chalk.red('(!) CRITICAL'), message, remediation);\n this.close().catch(logger.error);\n process.exitCode = 1;\n }\n\n private deployRepeater = async () => {\n try {\n await this.repeaterServer.deploy(\n {\n repeaterId: this.repeaterId\n },\n this.getRuntime()\n );\n logger.log('The Repeater (%s) started', this.info.version);\n } catch {\n // noop\n }\n };\n\n private reconnectionFailed = ({\n error\n }: RepeaterServerReconnectionFailedEvent) => {\n captureException(error);\n logger.error(error);\n this.close().catch(logger.error);\n process.exitCode = 1;\n };\n\n private testingNetwork = async (event: RepeaterServerNetworkTestEvent) => {\n try {\n const output = await this.commandHub.testNetwork(event.type, event.input);\n\n return {\n output\n };\n } catch (e) {\n return {\n error: typeof e === 'string' ? e : (e as Error).message\n };\n }\n };\n\n private limitsReceived = (event: RepeaterLimitsEvent) => {\n logger.debug('Limits received: %i', event.maxBodySize);\n this.requestExecutorOptions.maxBodySize = event.maxBodySize;\n };\n\n private requestReceived = async (event: RepeaterServerRequestEvent) => {\n const response = await this.commandHub.sendRequest(\n new Request({ ...event })\n );\n\n const {\n statusCode,\n message,\n errorCode,\n body,\n headers,\n protocol,\n encoding\n } = response;\n\n return {\n protocol,\n body,\n headers,\n statusCode,\n errorCode,\n message,\n encoding\n };\n };\n}\n","export * from './RepeaterCommandHub';\nexport * from './DefaultRepeaterCommandHub';\nexport * from './NetworkTestType';\nexport * from './DefaultRepeaterServer';\nexport * from './RepeaterLauncher';\nexport * from './RepeaterServer';\nexport * from './ServerRepeaterLauncher';\nexport * from './RuntimeDetector';\nexport * from './DefaultRuntimeDetector';\n","export interface Certificates {\n load(path?: string): Promise<void>;\n}\n\nexport const Certificates: unique symbol = Symbol('Certificates');\n","import { Cert, Request } from './Request';\n\nexport interface CertificatesCache {\n add(request: Request, cert: Cert): void;\n get(request: Request): Cert | undefined;\n}\n\nexport const CertificatesCache: unique symbol = Symbol('CertificatesCache');\n","import { logger } from '../Utils';\nimport { Certificates } from './Certificates';\nimport loadWinCertificates from 'win-ca';\nimport https from 'node:https';\nimport { readFile } from 'node:fs/promises';\n\nexport class CertificatesLoader implements Certificates {\n private readonly CERT_FILES = [\n '/etc/ssl/certs/ca-certificates.crt', // Debian/Ubuntu/Gentoo etc.\n '/etc/pki/tls/certs/ca-bundle.crt', // Fedora/RHEL 6\n '/etc/ssl/ca-bundle.pem', // OpenSUSE\n '/etc/pki/tls/cacert.pem', // OpenELEC\n '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // CentOS/RHEL 7\n '/etc/ssl/cert.pem' // Alpine Linux\n ];\n\n public async load(path?: string): Promise<void> {\n const win = process.platform === 'win32';\n\n try {\n if (win) {\n loadWinCertificates();\n } else if (typeof path === 'string') {\n await this.loadCertsFromFile(path);\n } else {\n await this.discoveryDefaultLocations();\n }\n } catch {\n logger.warn(\n `Error Loading Certificate: Cannot load certificates from ${\n win\n ? 'Trusted Root Certification Authorities Certificate Store'\n : path\n }.`\n );\n }\n }\n\n /**\n * Discovers possible certificate files; stop after finding one\n */\n private async discoveryDefaultLocations(): Promise<void> {\n for (const path of this.CERT_FILES) {\n try {\n await this.loadCertsFromFile(path);\n\n return;\n } catch {\n // noop\n }\n }\n\n logger.warn(\n `Error Loading Certificate: Cannot load certificates from the system root. Please use --cacert option to specify the accurate path to the file. https://docs.brightsec.com/docs/initializing-the-repeater#options`\n );\n }\n\n /**\n * Workarounds about loading certs on linux https://github.com/nodejs/node/issues/4175\n * use update-ca-certificates to update '/etc/ssl/certs/ca-certificates.crt'\n */\n private async loadCertsFromFile(path: string): Promise<void> {\n const ca: string = await readFile(path, 'utf8');\n\n https.globalAgent.options.ca = ca\n .split(/-----END CERTIFICATE-----\\n?/)\n .filter((cert) => !!cert)\n .map((cert) => `${cert}-----END CERTIFICATE-----\\n`);\n }\n}\n","import { Cert, Request } from './Request';\n\nexport interface CertificatesResolver {\n resolve(request: Request, registeredCerts: Cert[]): Cert[];\n}\n\nexport const CertificatesResolver: unique symbol = Symbol(\n 'CertificatesResolver'\n);\n","import { Helpers } from '../Utils';\nimport { CertificatesCache } from './CertificatesCache';\nimport { Cert, Request } from './Request';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultCertificatesCache implements CertificatesCache {\n private readonly cache: Map<string, Cert> = new Map<string, Cert>();\n\n public add(request: Request, cert: Cert): void {\n const key = this.certificateCacheKeyFromRequest(request);\n if (this.cache.has(key)) {\n return;\n }\n this.cache.set(key, cert);\n }\n\n public get(request: Request): Cert | undefined {\n return this.cache.get(this.certificateCacheKeyFromRequest(request));\n }\n\n private certificateCacheKeyFromRequest(request: Request): string {\n const requestUrl = new URL(request.url);\n\n return `${requestUrl.hostname}_${Helpers.portFromURL(requestUrl)}`;\n }\n}\n","import { Helpers } from '../Utils/Helpers';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { Cert, Request } from './Request';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultCertificatesResolver implements CertificatesResolver {\n constructor(\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache\n ) {}\n\n public resolve(request: Request, registeredCerts: Cert[]): Cert[] {\n const cachedCertificate = this.certificatesCache.get(request);\n if (cachedCertificate) {\n return [cachedCertificate];\n }\n\n const requestUrl = new URL(request.url);\n const port = Helpers.portFromURL(requestUrl);\n\n return registeredCerts.filter((cert: Cert) =>\n this.matchHostnameAndPort(requestUrl.hostname, port, cert)\n );\n }\n\n private matchHostnameAndPort(\n hostname: string,\n port: string,\n cert: Cert\n ): boolean {\n const hostNameMatch =\n cert.hostname === hostname ||\n Helpers.wildcardToRegExp(cert.hostname).test(hostname);\n\n if (!hostNameMatch) {\n return false;\n }\n\n if (!cert.port) {\n // ADHOC: hostNameMatch has been checked above and it's true\n return true;\n }\n\n return cert.port === port;\n }\n}\n","import { RequestExecutor } from './RequestExecutor';\nimport { Response } from './Response';\nimport { Cert, Request, RequestOptions } from './Request';\nimport { Helpers, logger, ProxyFactory } from '../Utils';\nimport { VirtualScripts } from '../Scripts';\nimport { Protocol } from './Protocol';\nimport { RequestExecutorOptions } from './RequestExecutorOptions';\nimport { NormalizeZlibDeflateTransformStream } from '../Utils/NormalizeZlibDeflateTransformStream';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { inject, injectable } from 'tsyringe';\nimport iconv from 'iconv-lite';\nimport { safeParse } from 'fast-content-type-parse';\nimport { parse as parseUrl } from 'node:url';\nimport http, {\n ClientRequest,\n IncomingMessage,\n OutgoingMessage\n} from 'node:http';\nimport https, {\n AgentOptions,\n RequestOptions as ClientRequestOptions\n} from 'node:https';\nimport { once } from 'node:events';\nimport { Readable } from 'node:stream';\nimport {\n constants,\n createBrotliDecompress,\n createGunzip,\n createInflate\n} from 'node:zlib';\n\ntype ScriptEntrypoint = (\n options: RequestOptions\n) => Promise<RequestOptions> | RequestOptions;\n\n@injectable()\nexport class HttpRequestExecutor implements RequestExecutor {\n private readonly DEFAULT_SCRIPT_ENTRYPOINT = 'handle';\n private readonly httpProxyAgent?: http.Agent;\n private readonly httpsProxyAgent?: https.Agent;\n private readonly httpAgent?: http.Agent;\n private readonly httpsAgent?: https.Agent;\n private readonly proxyDomains?: RegExp[];\n private readonly proxyDomainsBypass?: RegExp[];\n\n get protocol(): Protocol {\n return Protocol.HTTP;\n }\n\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RequestExecutorOptions)\n private readonly options: RequestExecutorOptions,\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache,\n @inject(CertificatesResolver)\n private readonly certificatesResolver: CertificatesResolver\n ) {\n if (this.options.proxyUrl) {\n ({ httpsAgent: this.httpsProxyAgent, httpAgent: this.httpProxyAgent } =\n this.proxyFactory.createProxy({ proxyUrl: this.options.proxyUrl }));\n }\n\n if (this.options.reuseConnection) {\n const agentOptions: AgentOptions = {\n keepAlive: true,\n maxSockets: 100,\n timeout: this.options.timeout\n };\n\n this.httpsAgent = new https.Agent(agentOptions);\n this.httpAgent = new http.Agent(agentOptions);\n }\n\n if (this.options.proxyDomains && this.options.proxyDomainsBypass) {\n throw new Error(\n 'cannot use both proxyDomains and proxyDomainsBypass at the same time'\n );\n }\n\n if (this.options.proxyDomains) {\n this.proxyDomains = this.options.proxyDomains.map((domain) =>\n Helpers.wildcardToRegExp(domain)\n );\n }\n\n if (this.options.proxyDomainsBypass) {\n this.proxyDomainsBypass = this.options.proxyDomainsBypass.map((domain) =>\n Helpers.wildcardToRegExp(domain)\n );\n }\n }\n\n public async execute(options: Request): Promise<Response> {\n try {\n if (this.options.headers) {\n options.setHeaders(this.options.headers);\n }\n\n options = await this.transformScript(options);\n\n const targetCerts: Cert[] | undefined = this.options.certs\n ? this.certificatesResolver.resolve(options, this.options.certs)\n : undefined;\n\n if (targetCerts === undefined || targetCerts.length === 0) {\n // We may have https and http targets connected with same repeater,\n // or certificates may not be necessary.\n // If certificates not found try request anyway.\n logger.debug(\n 'Executing HTTP request with following params: %j',\n options\n );\n\n return await this.executeRequest(options);\n }\n\n return await this.tryRequestWithCertificates(options, targetCerts);\n } catch (err) {\n const { cause } = err;\n const { message, code, syscall, name } = cause ?? err;\n const errorCode = code ?? syscall ?? name;\n\n logger.error(\n 'Error executing request: \"%s %s HTTP/1.1\"',\n options.method,\n options.url\n );\n logger.error('Cause: %s', message);\n\n return new Response({\n message,\n errorCode,\n protocol: this.protocol\n });\n }\n }\n\n private async request(options: Request) {\n let timer: NodeJS.Timeout | undefined;\n let res!: IncomingMessage;\n\n try {\n const req = this.createRequest(options);\n\n process.nextTick(() =>\n req.end(\n options.encoding\n ? iconv.encode(options.body, options.encoding)\n : options.body\n )\n );\n timer = this.setTimeout(req, options.timeout);\n\n [res] = (await once(req, 'response')) as [IncomingMessage];\n } finally {\n clearTimeout(timer);\n }\n\n return this.truncateResponse(options, res);\n }\n\n private createRequest(request: Request): ClientRequest {\n const protocol = request.secureEndpoint ? https : http;\n const outgoingMessage = protocol.request(\n this.createRequestOptions(request)\n );\n this.setHeaders(outgoingMessage, request);\n\n if (!outgoingMessage.hasHeader('accept-encoding')) {\n outgoingMessage.setHeader('accept-encoding', 'gzip, deflate');\n }\n\n return outgoingMessage;\n }\n\n private setTimeout(\n req: ClientRequest,\n timeout?: number\n ): NodeJS.Timeout | undefined {\n timeout ??= this.options.timeout;\n if (typeof timeout === 'number') {\n return setTimeout(\n () =>\n req.destroy(\n Object.assign(new Error('Waiting response has timed out'), {\n code: 'ETIMEDOUT'\n })\n ),\n timeout\n );\n }\n }\n\n private createRequestOptions(request: Request): ClientRequestOptions {\n const {\n auth,\n hostname,\n port,\n hash = '',\n pathname = '/',\n search = ''\n } = parseUrl(request.url);\n const path = `${pathname ?? '/'}${search ?? ''}${hash ?? ''}`;\n const agent = this.getRequestAgent(request);\n const timeout = request.timeout ?? this.options.timeout;\n\n return {\n hostname,\n port,\n path,\n auth,\n agent,\n timeout,\n ca: request.ca,\n pfx: request.pfx,\n passphrase: request.passphrase,\n method: request.method,\n rejectUnauthorized: false\n };\n }\n\n private getRequestAgent(options: Request) {\n // do not use proxy for domains that are not in the list\n if (\n this.proxyDomains &&\n !this.proxyDomains.some((domain) =>\n domain.test(parseUrl(options.url).hostname)\n )\n ) {\n logger.debug(\"Not using proxy for URL '%s'\", options.url);\n\n return options.secureEndpoint ? this.httpsAgent : this.httpAgent;\n }\n\n // do not use proxy for domains that are in the bypass list\n if (\n this.proxyDomainsBypass &&\n this.proxyDomainsBypass.some((domain) =>\n domain.test(parseUrl(options.url).hostname)\n )\n ) {\n logger.debug(\"Bypassing proxy for URL '%s'\", options.url);\n\n return options.secureEndpoint ? this.httpsAgent : this.httpAgent;\n }\n\n return options.secureEndpoint\n ? this.httpsProxyAgent ?? this.httpsAgent\n : this.httpProxyAgent ?? this.httpAgent;\n }\n\n private async truncateResponse(\n { decompress, encoding, maxContentSize, url }: Request,\n res: IncomingMessage\n ) {\n if (this.responseHasNoBody(res)) {\n logger.debug('The response does not contain any body.');\n\n return { res, body: '' };\n }\n\n const contentType = this.parseContentType(res);\n const { type } = contentType;\n const whiteListedMimeType = this.options.whitelistMimes?.find((mime) =>\n type.startsWith(mime.type)\n );\n const maxSize = whiteListedMimeType\n ? this.options.maxBodySize\n : (maxContentSize ?? this.options.maxContentLength) * 1024;\n\n const { body, transform } = await this.parseBody(res, {\n decompress,\n allowTruncation:\n !whiteListedMimeType || whiteListedMimeType.allowTruncation,\n maxSize\n });\n\n if (transform && whiteListedMimeType) {\n logger.error(\n `The original response body for URL %s was %s because it exceeded the maximum allowed size of %i bytes.`,\n url,\n transform,\n maxSize\n );\n }\n\n res.headers['content-length'] = body.byteLength.toFixed();\n\n if (decompress) {\n delete res.headers['content-encoding'];\n }\n\n return { res, body: iconv.decode(body, encoding ?? contentType.encoding) };\n }\n\n private parseContentType(res: IncomingMessage): {\n type: string;\n encoding: string;\n } {\n const contentType =\n res.headers['content-type'] || 'application/octet-stream';\n const {\n type,\n parameters: { charset }\n } = safeParse(contentType);\n\n let encoding: string | undefined = charset;\n\n if (!encoding || !iconv.encodingExists(encoding)) {\n encoding = 'utf-8';\n }\n\n return { type, encoding };\n }\n\n private unzipBody(response: IncomingMessage): Readable {\n let body: Readable = response;\n\n if (!this.responseHasNoBody(response)) {\n let contentEncoding = response.headers['content-encoding'] || 'identity';\n contentEncoding = contentEncoding.trim().toLowerCase();\n\n // Always using Z_SYNC_FLUSH is what cURL does.\n const zlibOptions = {\n flush: constants.Z_SYNC_FLUSH,\n finishFlush: constants.Z_SYNC_FLUSH\n };\n\n switch (contentEncoding) {\n case 'gzip':\n body = response.pipe(createGunzip(zlibOptions));\n break;\n case 'deflate':\n body = response\n .pipe(new NormalizeZlibDeflateTransformStream())\n .pipe(createInflate(zlibOptions));\n break;\n case 'br':\n body = response.pipe(createBrotliDecompress());\n break;\n }\n }\n\n return body;\n }\n\n private responseHasNoBody(response: IncomingMessage): boolean {\n return (\n response.method === 'HEAD' ||\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (response.statusCode! >= 100 && response.statusCode! < 200) ||\n response.statusCode === 204 ||\n response.statusCode === 304\n );\n }\n\n private async parseBody(\n res: IncomingMessage,\n options: {\n maxSize: number;\n allowTruncation: boolean;\n decompress: boolean;\n }\n ): Promise<{ body: Buffer; transform: 'truncated' | 'omitted' | false }> {\n const chunks: Buffer[] = [];\n const stream = options.decompress ? this.unzipBody(res) : res;\n\n for await (const chuck of stream) {\n chunks.push(chuck);\n }\n\n let body = Buffer.concat(chunks);\n let transform: 'truncated' | 'omitted' | false = false;\n\n if (body.byteLength > options.maxSize) {\n const result = this.truncateBody(body, options);\n body = result.body;\n transform = result.transform;\n }\n\n return { body, transform };\n }\n\n private truncateBody(\n body: Buffer,\n options: {\n maxSize: number;\n allowTruncation: boolean;\n }\n ): { body: Buffer; transform: 'truncated' | 'omitted' } {\n if (options.allowTruncation) {\n logger.debug(\n 'Truncate original response body to %i bytes',\n options.maxSize\n );\n\n return {\n body: body.subarray(0, options.maxSize),\n transform: 'truncated'\n };\n } else {\n logger.debug(\n 'Omit original response body because body is bigger than %i bytes',\n options.maxSize\n );\n\n return {\n body: Buffer.alloc(0),\n transform: 'omitted'\n };\n }\n }\n\n /**\n * Allows to attack headers. Node.js does not accept any other characters\n * which violate [rfc7230](https://tools.ietf.org/html/rfc7230#section-3.2.6).\n * To override default behavior bypassing {@link OutgoingMessage.setHeader} method we have to set headers via internal symbol.\n */\n private setHeaders(req: OutgoingMessage, options: Request): void {\n const symbols: symbol[] = Object.getOwnPropertySymbols(req);\n const headersSymbol: symbol = symbols.find(\n // ADHOC: Node.js version < 12 uses \"outHeadersKey\" symbol to set headers\n (item) =>\n ['Symbol(kOutHeaders)', 'Symbol(outHeadersKey)'].includes(\n item.toString()\n )\n );\n\n if (!req.headersSent && headersSymbol && options.headers) {\n const headers = (req[headersSymbol] =\n req[headersSymbol] ?? Object.create(null));\n\n Object.entries(options.headers).forEach(\n ([key, value]: [string, string | string[]]) => {\n if (key) {\n headers[key.toLowerCase()] = [key.toLowerCase(), value ?? ''];\n }\n }\n );\n }\n\n if (!options.keepAlive) {\n req.setHeader('Connection', 'close');\n }\n }\n\n private async transformScript(script: Request): Promise<Request> {\n const { hostname } = new URL(script.url);\n\n const vm = this.virtualScripts.find(hostname);\n\n if (!vm) {\n return script;\n }\n\n const result = await vm.exec<ScriptEntrypoint>(\n this.DEFAULT_SCRIPT_ENTRYPOINT,\n {\n ...script.toJSON(),\n body: script.encoding\n ? iconv.encode(script.body, script.encoding).toString()\n : script.body\n }\n );\n\n return new Request(result);\n }\n\n private async executeRequest(\n request: Request\n ): Promise<Response | undefined> {\n const { res, body } = await this.request(request);\n\n logger.trace(\n 'received following response for request %j: headers: %j body: %s',\n {\n url: request.url,\n protocol: this.protocol,\n method: request.method\n },\n {\n statusCode: res.statusCode,\n headers: res.headers\n },\n body.slice(0, 500).concat(body.length > 500 ? '...' : '')\n );\n\n return new Response({\n body,\n protocol: this.protocol,\n statusCode: res.statusCode,\n headers: res.headers,\n encoding: request.encoding\n });\n }\n\n private tryRequestWithCertificates(\n request: Request,\n certs: Cert[]\n ): Promise<Response> {\n const requestsWithCerts: Promise<Response>[] = certs.map(\n async (cert: Cert) => {\n logger.debug(\n 'Executing HTTP request with following params: %j',\n request\n );\n try {\n await request.loadCert(cert);\n\n const response = await this.executeRequest(request);\n this.certificatesCache.add(request, cert);\n\n return response;\n } catch (error) {\n const msg = Helpers.isTlsCertError(error)\n ? `Failed to do successful request with certificate ${cert.path}. It will be excluded from list of known certificates.`\n : `Unexpected error occured during request: ${error}`;\n logger.warn(msg);\n throw error;\n }\n }\n );\n\n // @ts-expect-error TS forces to use es2021\n return Promise.any(requestsWithCerts);\n }\n}\n","export enum Protocol {\n HTTP = 'http',\n WS = 'ws'\n}\n","import { logger } from '../Utils';\nimport { Protocol } from './Protocol';\nimport { readFile } from 'node:fs/promises';\nimport { basename, extname } from 'node:path';\nimport { createSecureContext } from 'node:tls';\n\nexport interface RequestOptions {\n protocol: Protocol;\n url: string;\n headers?: Record<string, string | string[]>;\n method?: string;\n pfx?: Buffer | string;\n ca?: Buffer | string;\n body?: string;\n passphrase?: string;\n correlationIdRegex?: string | RegExp;\n encoding?: 'base64';\n maxContentSize?: number;\n timeout?: number;\n decompress?: boolean;\n keepAlive?: boolean;\n}\n\nexport interface Cert {\n path: string;\n hostname: string;\n passphrase?: string;\n port?: string;\n}\n\nexport class Request {\n public static readonly SINGLE_VALUE_HEADERS: ReadonlySet<string> =\n new Set<string>([\n 'authorization',\n 'content-disposition',\n 'content-length',\n 'content-type',\n 'from',\n 'host',\n 'if-modified-since',\n 'if-unmodified-since',\n 'location',\n 'max-forwards',\n 'proxy-authorization',\n 'referer',\n 'user-agent'\n ]);\n\n public readonly protocol: Protocol;\n public readonly url: string;\n public readonly body?: string;\n public readonly correlationIdRegex?: RegExp;\n public readonly encoding?: 'base64';\n public readonly maxContentSize?: number;\n public readonly decompress?: boolean;\n public readonly timeout?: number;\n public readonly keepAlive?: boolean;\n\n private _method: string;\n\n get method(): string {\n return this._method;\n }\n\n private _headers?: Record<string, string | string[]>;\n\n get headers(): Readonly<Record<string, string | string[]>> {\n return this._headers;\n }\n\n private _ca?: Buffer;\n\n get ca() {\n return this._ca;\n }\n\n private _pfx?: Buffer;\n\n get pfx() {\n return this._pfx;\n }\n\n private _passphrase?: string;\n\n get passphrase() {\n return this._passphrase;\n }\n\n get secureEndpoint(): boolean {\n return this.url.startsWith('https');\n }\n\n constructor({\n protocol,\n method,\n url,\n body,\n ca,\n pfx,\n passphrase,\n timeout,\n correlationIdRegex,\n maxContentSize,\n encoding,\n decompress = true,\n headers = {},\n keepAlive\n }: RequestOptions) {\n this.protocol = protocol;\n this._method = method?.toUpperCase() ?? 'GET';\n\n this.validateUrl(url);\n this.url = url.trim();\n\n this.precheckBody(body);\n this.body = body;\n\n this.correlationIdRegex =\n this.normalizeCorrelationIdRegex(correlationIdRegex);\n\n this.setHeaders(headers);\n\n if (pfx) {\n this._pfx = Buffer.from(pfx);\n }\n\n if (ca) {\n this._ca = Buffer.from(ca);\n }\n\n this._passphrase = passphrase;\n this.encoding = encoding;\n this.timeout = timeout;\n this.maxContentSize = maxContentSize;\n this.decompress = !!decompress;\n this.keepAlive = keepAlive;\n }\n\n public setHeaders(headers: Record<string, string | string[]>): void {\n const mergedHeaders = {\n ...this._headers,\n ...headers\n };\n\n this._headers = Object.entries(mergedHeaders).reduce(\n (result, [field, value]: [string, string | string[]]) => {\n result[field] =\n Array.isArray(value) &&\n Request.SINGLE_VALUE_HEADERS.has(field.toLowerCase())\n ? value.join(', ')\n : value;\n\n return result;\n },\n {}\n );\n }\n\n public async loadCert({ path, passphrase }: Cert): Promise<void> {\n let cert: Buffer | undefined;\n\n try {\n cert = await readFile(path);\n } catch (e) {\n logger.warn(`Warning: certificate ${path} not found.`);\n }\n\n const ext = extname(path);\n const name = basename(path);\n\n switch (ext) {\n case '.pem':\n case '.crt':\n case '.ca':\n this._ca = cert;\n break;\n case '.pfx':\n this.assertPassphrase(name, cert, passphrase);\n this._pfx = cert;\n this._passphrase = passphrase;\n break;\n default:\n logger.warn(`Warning: certificate of type \"${ext}\" does not support.`);\n }\n }\n\n public toJSON(): RequestOptions {\n return {\n protocol: this.protocol,\n url: this.url,\n body: this.body,\n method: this._method,\n headers: this._headers,\n passphrase: this._passphrase,\n ca: this._ca?.toString('utf8'),\n pfx: this._pfx?.toString('utf8'),\n correlationIdRegex: this.correlationIdRegex\n };\n }\n\n private validateUrl(url: string): void {\n try {\n new URL(url);\n } catch {\n throw new Error('Invalid URL.');\n }\n }\n\n private precheckBody(body: string | undefined): void {\n if (body && typeof body !== 'string') {\n throw new Error('Body must be string.');\n }\n }\n\n private normalizeCorrelationIdRegex(\n correlationIdRegex: RegExp | string | undefined\n ): RegExp | undefined {\n if (correlationIdRegex) {\n try {\n return new RegExp(correlationIdRegex, 'i');\n } catch {\n throw new Error('Correlation id must be regular expression.');\n }\n }\n }\n\n private assertPassphrase(\n name: string,\n pfx: Buffer,\n passphrase: string\n ): void {\n try {\n createSecureContext({ passphrase, pfx });\n } catch (e) {\n logger.warn(\n `Error Loading Certificate: Wrong passphrase for certificate ${name}.`\n );\n }\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\nimport { Protocol } from './Protocol';\n\nexport interface RequestExecutor {\n execute(script: Request): Promise<Response>;\n protocol: Protocol;\n}\n\nexport const RequestExecutor: unique symbol = Symbol('RequestExecutor');\n","import { Cert } from './Request';\n\nexport interface WhitelistMimeType {\n type: string;\n allowTruncation?: boolean;\n}\n\nexport interface RequestExecutorOptions {\n timeout?: number;\n proxyUrl?: string;\n headers?: Record<string, string | string[]>;\n certs?: Cert[];\n whitelistMimes?: WhitelistMimeType[];\n maxBodySize?: number;\n maxContentLength?: number;\n reuseConnection?: boolean;\n proxyDomains?: string[];\n proxyDomainsBypass?: string[];\n}\n\nexport const RequestExecutorOptions: unique symbol = Symbol(\n 'RequestExecutorOptions'\n);\n","import { Protocol } from './Protocol';\n\nexport class Response {\n public readonly protocol: Protocol;\n public readonly statusCode?: number;\n public readonly headers?: Record<string, string | string[]>;\n public readonly body?: string;\n public readonly encoding?: 'base64';\n public readonly message?: string;\n public readonly errorCode?: string;\n\n constructor({\n protocol,\n statusCode,\n headers,\n body,\n message,\n errorCode,\n encoding\n }: {\n protocol: Protocol;\n statusCode?: number;\n message?: string;\n errorCode?: string;\n headers?: Record<string, string | string[]>;\n body?: string;\n encoding?: 'base64';\n }) {\n this.protocol = protocol;\n this.statusCode = statusCode;\n this.headers = headers;\n this.body = body;\n this.errorCode = errorCode;\n this.message = message;\n this.encoding = encoding;\n }\n}\n","import { RequestExecutor } from './RequestExecutor';\nimport { Response } from './Response';\nimport { Cert, Request } from './Request';\nimport { Protocol } from './Protocol';\nimport { Helpers, logger, ProxyFactory } from '../Utils';\nimport { RequestExecutorOptions } from './RequestExecutorOptions';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { inject, injectable } from 'tsyringe';\nimport WebSocket from 'ws';\nimport { once } from 'node:events';\nimport { promisify } from 'node:util';\nimport http, { IncomingMessage } from 'node:http';\nimport https from 'node:https';\n\ninterface WSMessage {\n body: string;\n code?: number;\n}\n\n@injectable()\nexport class WsRequestExecutor implements RequestExecutor {\n public static readonly FORBIDDEN_HEADERS: ReadonlySet<string> = new Set([\n 'sec-websocket-version',\n 'sec-websocket-key'\n ]);\n\n private readonly httpProxyAgent?: http.Agent;\n private readonly httpsProxyAgent?: https.Agent;\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RequestExecutorOptions)\n private readonly options: RequestExecutorOptions,\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache,\n @inject(CertificatesResolver)\n private readonly certificatesResolver: CertificatesResolver\n ) {\n if (this.options.proxyUrl) {\n ({ httpsAgent: this.httpsProxyAgent, httpAgent: this.httpProxyAgent } =\n this.proxyFactory.createProxy({ proxyUrl: this.options.proxyUrl }));\n }\n }\n\n get protocol(): Protocol {\n return Protocol.WS;\n }\n\n public async execute(options: Request): Promise<Response> {\n try {\n const targetCerts: Cert[] | undefined = this.options.certs\n ? this.certificatesResolver.resolve(options, this.options.certs)\n : undefined;\n\n if (targetCerts === undefined || targetCerts.length === 0) {\n // We may have https and http targets connected with same repeater,\n // or certificates may not be necessary.\n // If certificates not found try request anyway.\n logger.debug('Executing WS request with following params: %j', options);\n\n return await this.executeRequest(options);\n }\n\n return await this.tryRequestWithCertificates(options, targetCerts);\n } catch (err) {\n const message = err.info ?? err.message;\n const errorCode = err.code ?? err.syscall;\n\n logger.error('Error executing request: %s', options.url);\n logger.error('Cause: %s', message);\n\n return new Response({\n message,\n errorCode,\n protocol: this.protocol\n });\n }\n }\n\n private setTimeout(client: WebSocket): NodeJS.Timeout {\n const timeout = setTimeout(\n () =>\n client.emit(\n 'error',\n Object.assign(new Error('Waiting frame has timed out'), {\n code: 'ETIMEDOUT'\n })\n ),\n this.options.timeout\n );\n\n timeout.unref();\n\n return timeout;\n }\n\n private async consume(\n client: WebSocket,\n matcher?: RegExp\n ): Promise<WSMessage> {\n const result = (await Promise.race([\n this.waitForResponse(client, matcher),\n once(client, 'close')\n ])) as [string | number, string | undefined];\n\n let msg: WSMessage | undefined;\n\n if (result.length) {\n const [data, reason]: [string | number, string | undefined] = result;\n const body = typeof data === 'string' ? data : reason;\n const code = typeof data === 'number' ? data : undefined;\n\n msg = {\n body,\n code\n };\n }\n\n return msg;\n }\n\n private waitForResponse(\n client: WebSocket,\n matcher: RegExp\n ): Promise<[string]> {\n return new Promise((resolve) => {\n client.on('message', (data: WebSocket.Data) => {\n const dataString = String(data);\n !matcher || matcher.test(dataString)\n ? resolve([dataString])\n : undefined;\n });\n });\n }\n\n private async connect(client: WebSocket): Promise<IncomingMessage> {\n const [, upgrading]: [unknown, [IncomingMessage]] = await Promise.all([\n once(client, 'open'),\n once(client, 'upgrade') as Promise<[IncomingMessage]>\n ]);\n\n const [res]: [IncomingMessage] = upgrading;\n\n return res;\n }\n\n private normalizeHeaders(\n headers: Record<string, string | string[]>\n ): Record<string, string | string[]> {\n return Object.entries(headers).reduce(\n (\n result: Record<string, string | string[]>,\n [key, value]: [string, string | string[]]\n ) => {\n const headerName = key.trim().toLowerCase();\n if (!WsRequestExecutor.FORBIDDEN_HEADERS.has(headerName)) {\n result[key] = value;\n }\n\n return result;\n },\n {}\n );\n }\n\n private async executeRequest(\n request: Request\n ): Promise<Response | undefined> {\n let timeout: NodeJS.Timeout;\n let client: WebSocket;\n\n try {\n client = new WebSocket(request.url, {\n agent: request.secureEndpoint\n ? this.httpsProxyAgent\n : this.httpProxyAgent,\n rejectUnauthorized: false,\n handshakeTimeout: this.options.timeout,\n headers: this.normalizeHeaders(request.headers),\n ca: request.ca,\n pfx: request.pfx,\n passphrase: request.passphrase\n });\n\n const res: IncomingMessage = await this.connect(client);\n\n // @ts-expect-error TS infers a wrong type here\n await promisify(client.send.bind(client))(request.body);\n\n timeout = this.setTimeout(client);\n\n const msg = await this.consume(client, request.correlationIdRegex);\n\n return new Response({\n protocol: this.protocol,\n statusCode: msg.code ?? res.statusCode,\n headers: res.headers,\n body: msg.body\n });\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (client?.readyState === WebSocket.OPEN) {\n client.close(1000);\n }\n }\n }\n\n private tryRequestWithCertificates(\n request: Request,\n certs: Cert[]\n ): Promise<Response> {\n const requestsWithCerts: Promise<Response>[] = certs.map(\n async (cert: Cert) => {\n logger.debug(\n 'Executing HTTP request with following params: %j',\n request\n );\n try {\n await request.loadCert(cert);\n\n const response = await this.executeRequest(request);\n this.certificatesCache.add(request, cert);\n\n return response;\n } catch (error) {\n const msg = Helpers.isTlsCertError(error)\n ? `Failed to do successful request with certificate ${cert.path}. It will be excluded from list of known certificates.`\n : `Unexpected error occured during request: ${error}`;\n logger.warn(msg);\n throw error;\n }\n }\n );\n\n // @ts-expect-error TS forces to use es2021\n return Promise.any(requestsWithCerts);\n }\n}\n","export * from './RequestExecutor';\nexport * from './RequestExecutorOptions';\nexport * from './HttpRequestExecutor';\nexport * from './WsRequestExecutor';\nexport * from './Response';\nexport * from './Request';\nexport * from './Protocol';\nexport * from './Certificates';\nexport * from './CertificatesLoader';\nexport * from './CertificatesCache';\nexport * from './CertificatesResolver';\n","import { Scans, ScanState, ScanStatus } from './Scans';\nimport { Polling } from '../Utils/Polling';\nimport { Breakpoint } from './Breakpoint';\nimport { Backoff, logger } from '../Utils';\nimport { PollingConfig } from './PollingFactory';\nimport axios from 'axios';\nimport { ok } from 'node:assert';\n\nexport class BasePolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n\n private _active = true;\n\n get active(): boolean {\n return this._active;\n }\n\n constructor(\n private readonly options: Omit<PollingConfig, 'breakpoint'>,\n private readonly scanManager: Scans,\n private readonly breakpoint: Breakpoint\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-20min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n\n ok(breakpoint, 'You should choose a breakpoint for polling.');\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n\n if (this.options.timeout) {\n this.setTimeout();\n }\n\n for await (const x of this.poll()) {\n await this.breakpoint.execute(x);\n }\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n if (!this._active) {\n logger.log('Polling has been terminated by timeout.');\n }\n this._active = false;\n clearTimeout(this.timeoutDescriptor);\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => (this._active = false), timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<ScanState> {\n while (this.active) {\n await this.delay();\n\n const backoff = this.createBackoff();\n\n const state: ScanState = await backoff.execute(() =>\n this.scanManager.status(this.options.scanId)\n );\n\n if (this.isRedundant(state.status)) {\n break;\n }\n\n yield state;\n }\n }\n\n private isRedundant(status: ScanStatus): boolean {\n return (\n status === ScanStatus.DONE ||\n status === ScanStatus.STOPPED ||\n status === ScanStatus.DISRUPTED ||\n status === ScanStatus.FAILED\n );\n }\n\n private delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n\n return new Promise<void>((resolve) => setTimeout(resolve, interval));\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n}\n","import { ScanState } from './Scans';\n\nexport abstract class Breakpoint {\n protected abstract breakOn(stat: ScanState): never | void;\n protected abstract isExcepted(stats: ScanState): boolean;\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async execute(scanIssues: ScanState): Promise<void> {\n if (this.isExcepted(scanIssues)) {\n this.breakOn(scanIssues);\n }\n }\n}\n","import { Breakpoint } from './Breakpoint';\nimport { BreakpointType } from './BreakpointType';\n\nexport interface BreakpointFactory {\n create(type: BreakpointType): Breakpoint;\n}\n\nexport const BreakpointFactory: unique symbol = Symbol('BreakpointFactory');\n","export enum BreakpointType {\n ANY = 'any',\n MEDIUM_ISSUE = 'medium_issue',\n HIGH_ISSUE = 'high_issue',\n CRITICAL_ISSUE = 'critical_issue'\n}\n","export class BreakpointException extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Breakpoint } from '../Breakpoint';\nimport { BreakpointException } from './BreakpointException';\nimport { ScanIssues } from '../Scans';\nimport { Severity, severityRanges } from '../Severity';\n\nexport class OnSeverity extends Breakpoint {\n private readonly breakSeverities: readonly Severity[];\n\n constructor(private readonly severity: Severity) {\n super();\n this.breakSeverities = severityRanges.get(severity) ?? [];\n }\n\n protected breakOn(): never {\n throw new BreakpointException(\n `Bright CLI found a first ${this.severity} issue.`\n );\n }\n\n protected isExcepted(stats: ScanIssues): boolean {\n return this.breakSeverities.some(\n (severity) => stats[`numberOf${severity}SeverityIssues`] > 0\n );\n }\n}\n","export { BreakpointException } from './BreakpointException';\nexport { OnSeverity } from './OnSeverity';\n","import { Breakpoint } from './Breakpoint';\nimport { OnSeverity } from './Breakpoints';\nimport { BreakpointFactory } from './BreakpointFactory';\nimport { BreakpointType } from './BreakpointType';\nimport { Severity } from './Severity';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultBreakpointFactory implements BreakpointFactory {\n public create(type: BreakpointType): Breakpoint {\n switch (type) {\n case BreakpointType.ANY:\n return new OnSeverity(Severity.LOW);\n case BreakpointType.HIGH_ISSUE:\n return new OnSeverity(Severity.HIGH);\n case BreakpointType.MEDIUM_ISSUE:\n return new OnSeverity(Severity.MEDIUM);\n case BreakpointType.CRITICAL_ISSUE:\n return new OnSeverity(Severity.CRITICAL);\n default:\n return null;\n }\n }\n}\n","import { PollingConfig, PollingFactory } from './PollingFactory';\nimport { Scans } from './Scans';\nimport { Polling } from '../Utils/Polling';\nimport { BasePolling } from './BasePolling';\nimport { BreakpointFactory } from './BreakpointFactory';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultPollingFactory implements PollingFactory {\n constructor(\n @inject(Scans) private readonly scans: Scans,\n @inject(BreakpointFactory)\n private readonly breakpointFactory: BreakpointFactory\n ) {}\n\n public create(options: PollingConfig): Polling {\n const breakpoint = this.breakpointFactory.create(options.breakpoint);\n\n return new BasePolling(options, this.scans, breakpoint);\n }\n}\n","import { Polling } from '../Utils/Polling';\nimport { BreakpointType } from './BreakpointType';\n\nexport interface PollingConfig {\n timeout?: number;\n interval?: number;\n breakpoint: BreakpointType;\n scanId: string;\n}\n\nexport interface PollingFactory {\n create(options: PollingConfig): Polling;\n}\n\nexport const PollingFactory: unique symbol = Symbol('PollingFactory');\n","import {\n Discovery,\n Header,\n ScanConfig,\n Scans,\n ScanState,\n SourceType,\n StorageFile,\n ATTACK_PARAM_LOCATIONS_DEFAULT,\n ScanCreateResponse,\n AttackParamLocation\n} from './Scans';\nimport { CliInfo } from '../Config';\nimport { ProxyFactory } from '../Utils';\nimport { delay, inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestScansOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestScansOptions: unique symbol = Symbol('RestScansOptions');\n\n@injectable()\nexport class RestScans implements Scans {\n private readonly client: Axios;\n\n constructor(\n @inject(delay(() => CliInfo)) private readonly info: CliInfo,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestScansOptions)\n { baseURL, apiKey, insecure, proxyURL, timeout }: RestScansOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async create(body: ScanConfig): Promise<ScanCreateResponse> {\n const scanConfig = await this.prepareScanConfig({ ...body });\n\n const res = await this.client.post<ScanCreateResponse>(\n '/api/v1/scans',\n scanConfig\n );\n\n return res.data;\n }\n\n public async retest(scanId: string): Promise<string> {\n const res = await this.client.post<{ id: string }>(\n `/api/v1/scans/${scanId}/retest`\n );\n\n return res.data.id;\n }\n\n public async status(scanId: string): Promise<ScanState> {\n const res = await this.client.get<ScanState>(`/api/v1/scans/${scanId}`);\n\n return res.data;\n }\n\n public async stop(scanId: string): Promise<void> {\n await this.client.get(`/api/v1/scans/${scanId}/stop`);\n }\n\n public async delete(scanId: string): Promise<void> {\n await this.client.delete(`/api/v1/scans/${scanId}`);\n }\n\n private async prepareScanConfig({ headers, ...rest }: ScanConfig): Promise<\n Omit<ScanConfig, 'headers'> & {\n headers: Header[];\n info: {\n source: string;\n client?: { name: string; version: string };\n };\n }\n > {\n const config = await this.applyDefaultSettings(rest);\n const updatedConfig = this.replaceDeprecatedAttackParamLocations(config);\n\n return {\n ...updatedConfig,\n info: {\n source: 'cli',\n client: {\n name: 'bright-cli',\n version: this.info.version\n }\n },\n headers: headers\n ? Object.entries(headers).map(([name, value]: [string, string]) => ({\n name,\n value,\n mergeStrategy: 'replace'\n }))\n : undefined\n };\n }\n\n private async exploreDiscovery(body: ScanConfig): Promise<Discovery[]> {\n const discoveryTypes: Discovery[] = [];\n const { fileId, crawlerUrls } = body;\n\n if (Array.isArray(crawlerUrls)) {\n discoveryTypes.push(Discovery.CRAWLER);\n }\n\n if (fileId) {\n try {\n const { data } = await this.client.get<StorageFile>(\n `/api/v2/files/${fileId}`\n );\n\n discoveryTypes.push(\n data.type === SourceType.HAR ? Discovery.ARCHIVE : Discovery.OAS\n );\n } catch (error) {\n throw new Error(\n `Error loading file with id \"${fileId}\": No such file or you do not have permissions.`\n );\n }\n }\n\n return discoveryTypes;\n }\n\n private async applyDefaultSettings(\n scanConfig: Omit<ScanConfig, 'headers'>\n ): Promise<Omit<ScanConfig, 'headers'>> {\n const attackParamLocations =\n scanConfig.attackParamLocations ??\n (scanConfig.templateId ? undefined : [...ATTACK_PARAM_LOCATIONS_DEFAULT]);\n\n const exclusions =\n scanConfig.exclusions?.params || scanConfig.exclusions?.requests\n ? scanConfig.exclusions\n : undefined;\n\n let discoveryTypes: Discovery[] = await this.exploreDiscovery(scanConfig);\n discoveryTypes = discoveryTypes?.length ? discoveryTypes : undefined;\n\n return {\n ...scanConfig,\n attackParamLocations,\n discoveryTypes,\n exclusions\n };\n }\n\n private replaceDeprecatedAttackParamLocations(\n scanConfig: Omit<ScanConfig, 'headers'>\n ): Omit<ScanConfig, 'headers'> {\n if (\n scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICAL_FRAGMENT\n )\n ) {\n scanConfig.attackParamLocations = scanConfig.attackParamLocations.filter(\n (loc) => loc !== AttackParamLocation.ARTIFICAL_FRAGMENT\n );\n\n if (\n !scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICIAL_FRAGMENT\n )\n ) {\n scanConfig.attackParamLocations = [\n ...scanConfig.attackParamLocations,\n AttackParamLocation.ARTIFICIAL_FRAGMENT\n ];\n }\n }\n\n if (\n scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICAL_QUERY\n )\n ) {\n scanConfig.attackParamLocations = scanConfig.attackParamLocations.filter(\n (loc) => loc !== AttackParamLocation.ARTIFICAL_QUERY\n );\n\n if (\n !scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICIAL_QUERY\n )\n ) {\n scanConfig.attackParamLocations = [\n ...scanConfig.attackParamLocations,\n AttackParamLocation.ARTIFICIAL_QUERY\n ];\n }\n }\n\n return scanConfig;\n }\n}\n","import { Severity } from './Severity';\n\nexport enum Discovery {\n CRAWLER = 'crawler',\n ARCHIVE = 'archive',\n OAS = 'oas'\n}\n\nexport enum AttackParamLocation {\n ARTIFICAL_FRAGMENT = 'artifical-fragment', // deprecated, use ARTIFICIAL_FRAGMENT instead\n ARTIFICAL_QUERY = 'artifical-query', // deprecated, use ARTIFICIAL_QUERY instead\n ARTIFICIAL_FRAGMENT = 'artificial-fragment',\n ARTIFICIAL_QUERY = 'artificial-query',\n BODY = 'body',\n FRAGMENT = 'fragment',\n HEADER = 'header',\n PATH = 'path',\n QUERY = 'query'\n}\n\nexport const ATTACK_PARAM_LOCATIONS_DEFAULT: readonly AttackParamLocation[] = [\n AttackParamLocation.BODY,\n AttackParamLocation.FRAGMENT,\n AttackParamLocation.QUERY\n];\n\nexport enum Module {\n DAST = 'dast',\n FUZZER = 'fuzzer'\n}\n\nexport interface Header {\n name: string;\n value: string;\n mergeStrategy: 'replace';\n}\n\nexport interface RequestExclusion {\n patterns: string[];\n methods: string[];\n}\n\nexport interface Exclusions {\n params: string[];\n requests: RequestExclusion[];\n}\n\nexport interface ScanConfig {\n name: string;\n module: Module;\n authObjectId?: string;\n projectId?: string;\n templateId?: string;\n discoveryTypes?: Discovery[];\n tests?: string[];\n buckets?: string[];\n poolSize?: number;\n fileId?: string;\n attackParamLocations?: AttackParamLocation[];\n smart?: boolean;\n extraHosts?: Record<string, string>;\n exclusions?: Exclusions;\n headers?: Record<string, string> | Header[];\n crawlerUrls?: string[];\n hostsFilter?: string[];\n repeaters?: string[];\n entryPointIds?: string[];\n}\n\nexport enum ScanStatus {\n RUNNING = 'running',\n PENDING = 'pending',\n STOPPED = 'stopped',\n FAILED = 'failed',\n DONE = 'done',\n DISRUPTED = 'disrupted',\n SCHEDULED = 'scheduled',\n QUEUED = 'queued'\n}\n\nexport type ScanIssues = Record<`numberOf${Severity}SeverityIssues`, number>;\n\nexport interface ScanState extends ScanIssues {\n status: ScanStatus;\n}\n\nexport enum SourceType {\n OPEN_API = 'openapi',\n RAML = 'raml',\n POSTMAN = 'postman',\n HAR = 'har'\n}\n\nexport interface StorageFile {\n id: string;\n type: SourceType;\n}\n\nexport interface ScanWarning {\n code: string;\n message: string;\n}\n\nexport interface ScanCreateResponse {\n id: string;\n warnings: ScanWarning[];\n}\n\nexport interface Scans {\n create(body: ScanConfig): Promise<ScanCreateResponse>;\n\n retest(scanId: string): Promise<string>;\n\n stop(scanId: string): Promise<void>;\n\n delete(scanId: string): Promise<void>;\n\n status(scanId: string): Promise<ScanState>;\n}\n\nexport const Scans: unique symbol = Symbol('Scans');\n","export enum Severity {\n MEDIUM = 'Medium',\n HIGH = 'High',\n LOW = 'Low',\n CRITICAL = 'Critical'\n}\n\nexport const severityRanges: ReadonlyMap<Severity, Severity[]> = new Map(\n Object.values(Severity).map((severity) => {\n switch (severity) {\n case Severity.CRITICAL:\n return [severity, [Severity.CRITICAL]];\n case Severity.HIGH:\n return [severity, [Severity.HIGH, Severity.CRITICAL]];\n case Severity.MEDIUM:\n return [severity, [Severity.MEDIUM, Severity.HIGH, Severity.CRITICAL]];\n case Severity.LOW:\n return [severity, Object.values(Severity)];\n }\n })\n);\n","export * from './BreakpointFactory';\nexport * from './DefaultBreakpointFactory';\nexport * from './PollingFactory';\nexport * from './DefaultPollingFactory';\nexport * from '../Utils/Polling';\nexport * from './Scans';\nexport * from './BreakpointType';\nexport * from './Breakpoint';\nexport * from './Breakpoints';\nexport * from './RestScans';\nexport * from './Severity';\n","import { VirtualScript, VirtualScriptType } from './VirtualScript';\nimport { Helpers } from '../Utils';\nimport { VirtualScripts } from './VirtualScripts';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultVirtualScripts implements VirtualScripts {\n private readonly store = new Map<string, VirtualScript>();\n\n get size(): number {\n return this.store.size;\n }\n\n public [Symbol.iterator](): IterableIterator<[string, VirtualScript]> {\n return this.store[Symbol.iterator]();\n }\n\n public clear(type?: VirtualScriptType): void {\n if (!type) {\n this.store.clear();\n } else {\n this.store.forEach((x: VirtualScript) => {\n if (x.type === type) {\n this.delete(x.id);\n }\n });\n }\n }\n\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n public entries(): IterableIterator<[string, VirtualScript]> {\n return this.store.entries();\n }\n\n public find(host: string): VirtualScript | undefined {\n return [...this.store.values()].find((script: VirtualScript) =>\n Helpers.wildcardToRegExp(script.id).test(host)\n );\n }\n\n public keys(): IterableIterator<string> {\n return this.store.keys();\n }\n\n public set(wildcard: string, type: VirtualScriptType, code: string): this {\n const script = new VirtualScript(wildcard, type, code);\n\n this.store.set(script.id, script);\n\n script.compile();\n\n return this;\n }\n\n public values(): IterableIterator<VirtualScript> {\n return this.store.values();\n }\n}\n","import { ScriptLoader } from './ScriptLoader';\nimport { VirtualScripts } from './VirtualScripts';\nimport { logger } from '../Utils';\nimport { VirtualScriptType } from './VirtualScript';\nimport { inject, injectable } from 'tsyringe';\nimport { readFile } from 'node:fs/promises';\n\n@injectable()\nexport class FSScriptLoader implements ScriptLoader {\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts\n ) {}\n\n public async load(scripts: Record<string, string>): Promise<void> {\n await Promise.all(\n Object.entries(scripts).map(([wildcard, path]: [string, string]) =>\n this.loadScript(wildcard, path)\n )\n );\n }\n\n private async loadScript(wildcard: string, path: string): Promise<void> {\n let code: string;\n\n try {\n code = await readFile(path, { encoding: 'utf8' });\n } catch (e) {\n logger.debug(`Cannot load ${path}. Error: ${e.message}`);\n throw new Error(`Error Loading Script: Cannot load ${path}`);\n }\n\n this.virtualScripts.set(wildcard, VirtualScriptType.LOCAL, code);\n }\n}\n","export interface ScriptLoader {\n load(scripts: Record<string, string>): Promise<void>;\n}\n\nexport const ScriptLoader: unique symbol = Symbol('ScriptLoader');\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Context, createContext, Script } from 'node:vm';\nimport Module from 'node:module';\nimport { join } from 'node:path';\n\ninterface VirtualScriptContext extends Context {\n module: Module;\n __filename: string;\n __dirname: string;\n}\n\nexport enum VirtualScriptType {\n LOCAL = 'local',\n REMOTE = 'remote'\n}\n\nexport class VirtualScript {\n public readonly id: string;\n public readonly type: VirtualScriptType;\n private readonly MODULE_EXEC_ARGS: string[] = [\n 'module.exports',\n 'module.require',\n 'module',\n '__filename',\n '__dirname'\n ];\n private readonly script: Script;\n private context: VirtualScriptContext;\n\n constructor(id: string, type: VirtualScriptType, code: string) {\n if (!id) {\n throw new Error('ID must be declared explicitly.');\n }\n this.id = id;\n\n if (!type) {\n throw new Error(\n `Type might accept one of the following values: ${Object.values(\n VirtualScriptType\n ).join(', ')}.`\n );\n }\n this.type = type;\n\n if (!code) {\n throw new Error('Code must be declared explicitly.');\n }\n\n this.script = new Script(this.wrapScriptCode(code), {\n filename: id\n });\n }\n\n public compile(): this {\n const module = new Module(this.id);\n this.context = createContext({\n module,\n __filename: join(this.id, process.cwd()),\n __dirname: process.cwd()\n }) as VirtualScriptContext;\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async exec<Fun extends (...args: any[]) => any>(\n functionName: string,\n ...functionArgs: Parameters<Fun>\n ): Promise<ReturnType<Fun>> {\n this.script.runInContext(this.context, {\n timeout: 100\n });\n\n const { exports = {} } = this.context.module;\n\n const func: Fun = exports[functionName];\n\n if (typeof func !== 'function') {\n throw new Error(\n `Error Loading Script: Script ${this.id} does not match expected format, missing function ${functionName}.`\n );\n }\n\n return func(...functionArgs);\n }\n\n private wrapScriptCode(code: string): string {\n const decoratedModule = Module.wrap(\n code.replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n );\n\n return `${decoratedModule.slice(\n 0,\n decoratedModule.length - 1\n )}(${this.MODULE_EXEC_ARGS.join(',')})`;\n }\n}\n","import { VirtualScript, VirtualScriptType } from './VirtualScript';\n\nexport interface VirtualScripts {\n size: number;\n\n [Symbol.iterator](): IterableIterator<[string, VirtualScript]>;\n\n clear(type?: VirtualScriptType): void;\n\n delete(key: string): boolean;\n\n entries(): IterableIterator<[string, VirtualScript]>;\n\n find(host: string): VirtualScript | undefined;\n\n keys(): IterableIterator<string>;\n\n set(wildcard: string, type: VirtualScriptType, code: string): this;\n\n values(): IterableIterator<VirtualScript>;\n}\n\nexport const VirtualScripts: unique symbol = Symbol('VirtualScripts');\n","export * from './VirtualScript';\nexport * from './FSScriptLoader';\nexport * from './ScriptLoader';\nexport * from './VirtualScripts';\nexport * from './DefaultVirtualScripts';\n","import { StartupManager } from './StartupManager';\nimport { StartupOptions } from './StartupOptions';\nimport {\n add,\n AddOptions,\n remove,\n run,\n stop,\n enable,\n disable\n} from '@neuralegion/os-service';\nimport { promisify } from 'node:util';\n\nexport class DefaultStartupManager implements StartupManager {\n public async install({ name, ...options }: StartupOptions): Promise<void> {\n await promisify<string, AddOptions>(add)(name, options);\n await promisify<string>(enable)(name);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async run(dispose?: () => Promise<unknown> | unknown): Promise<void> {\n run(() => this.exit(0, dispose));\n }\n\n public async uninstall(name: string): Promise<void> {\n try {\n await promisify(disable)(name);\n } catch {\n // noop: os-service does not have isExists method\n }\n\n try {\n await promisify(remove)(name);\n } catch {\n // noop: os-service does not have isExists method\n }\n }\n\n private async exit(\n code: number,\n dispose?: () => Promise<unknown> | unknown\n ): Promise<void> {\n await dispose?.();\n stop(code);\n }\n}\n","import { StartupOptions } from './StartupOptions';\n\nexport interface StartupManager {\n install(opts: StartupOptions): Promise<void>;\n run(dispose?: () => Promise<unknown> | unknown): Promise<void>;\n uninstall(name: string): Promise<void>;\n}\n\nexport const StartupManager: unique symbol = Symbol('StartupManager');\n","export * from './DefaultStartupManager';\nexport * from './StartupManager';\nexport * from './StartupOptions';\n","import { logger } from './Logger';\nimport { setTimeout } from 'node:timers/promises';\n\nexport class Backoff {\n private depth: number = 0;\n\n constructor(\n private readonly maxDepth: number,\n private readonly shouldRetry: (err: Error) => unknown\n ) {}\n\n public async execute<T extends (...args: unknown[]) => unknown>(\n task: T\n ): Promise<ReturnType<T>> {\n try {\n return (await task()) as ReturnType<T>;\n } catch (e) {\n if (this.shouldRetry?.(e) && this.depth < this.maxDepth) {\n return this.retry(task);\n }\n\n throw e;\n }\n }\n\n /* eslint-disable-next-line space-before-function-paren */\n private async retry<T extends (...args: any[]) => any>(\n task: T\n ): Promise<ReturnType<T>> {\n const delay = Math.max(2 ** this.depth * 100, 1000);\n\n logger.warn(\n 'Failed to connect, retrying in %d second (attempt %d/%d)',\n Math.round(delay / 1000),\n this.depth + 1,\n this.maxDepth\n );\n\n await setTimeout(delay);\n\n this.depth++;\n\n return this.execute(task);\n }\n}\n","import { ProxyFactory, ProxyOptions, TargetProxyOptions } from './ProxyFactory';\nimport { PatchedHttpsProxyAgent } from './PatchedHttpsProxyAgent';\nimport { HttpProxyAgent } from 'http-proxy-agent';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\nimport https from 'node:https';\nimport http from 'node:http';\n\nexport class DefaultProxyFactory implements ProxyFactory {\n public createProxy({ proxyUrl, rejectUnauthorized = false }: ProxyOptions) {\n let protocol: string;\n try {\n ({ protocol } = new URL(proxyUrl));\n } catch (error) {\n throw new Error(\n `Invalid Proxy URL: '${proxyUrl}'. Please provide a valid URL.`\n );\n }\n\n switch (protocol) {\n case 'http:':\n case 'https:':\n return this.createHttpProxy(proxyUrl, rejectUnauthorized);\n case 'socks:':\n case 'socks4:':\n case 'socks4a:':\n case 'socks5:':\n case 'socks5h:':\n return this.createSocksProxy(proxyUrl);\n default:\n throw new Error(\n `Unsupported proxy protocol: '${protocol.replace(\n ':',\n ''\n )}'. Please use a supported protocol (HTTP(S), SOCKS4, or SOCKS5).`\n );\n }\n }\n\n public createProxyForClient({\n targetUrl,\n ...options\n }: TargetProxyOptions): https.Agent | http.Agent {\n const proxies = this.createProxy(options);\n let protocol: string;\n try {\n ({ protocol } = new URL(targetUrl));\n } catch (error) {\n throw new Error(\n `Invalid Target URL: '${targetUrl}'. Please contact support at support@brightsec.com`\n );\n }\n\n switch (protocol) {\n case 'http:':\n case 'ws:':\n return proxies.httpAgent;\n case 'https:':\n case 'wss:':\n return proxies.httpsAgent;\n default:\n throw new Error(\n `Proxy not supported for protocol '${protocol}'. Please contact support at support@brightsec.com`\n );\n }\n }\n\n private createHttpProxy(proxyUrl: string, rejectUnauthorized?: boolean) {\n return {\n httpsAgent: new PatchedHttpsProxyAgent(proxyUrl, {\n rejectUnauthorized\n }),\n httpAgent: new HttpProxyAgent(proxyUrl, {\n rejectUnauthorized\n })\n };\n }\n\n private createSocksProxy(proxyUrl: string) {\n const common = new SocksProxyAgent(proxyUrl);\n\n return { httpAgent: common, httpsAgent: common };\n }\n}\n","import { isAxiosError } from 'axios';\n\ntype GenericCommandErrorParams =\n | { command: string; error: any }\n | { message: string; error: unknown };\n\nexport class ErrorMessageFactory {\n public static genericCommandError(params: GenericCommandErrorParams): string {\n const message = this.getTitle(params);\n const details = this.extractErrorDetails(params);\n\n return this.formatFinalMessage(message, details);\n }\n\n private static formatFinalMessage(\n baseMessage: string,\n errorDetails?: string\n ): string {\n return errorDetails\n ? `${baseMessage}: ${errorDetails}.`\n : `${baseMessage}.`;\n }\n\n private static getTitle(params: GenericCommandErrorParams): string {\n return 'message' in params\n ? params.message\n : `Error during \"${params.command}\"`;\n }\n\n private static extractErrorDetails(\n params: GenericCommandErrorParams\n ): string | null {\n if (typeof params.error === 'string') {\n return params.error;\n }\n\n if (isAxiosError(params.error)) {\n switch (typeof params.error.response?.data) {\n case 'string':\n return params.error.response.data;\n }\n }\n\n return (params.error.error || params.error.message) ?? null;\n }\n}\n","import { ok } from 'node:assert';\nimport { ChildProcess, spawn } from 'node:child_process';\nimport { normalize } from 'node:path';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace NodeJS {\n interface Process {\n pkg?: {\n entrypoint: string;\n };\n }\n }\n}\n\nexport interface CommandArgs {\n command: string;\n args: string[];\n shell: boolean;\n windowsVerbatimArguments: boolean;\n}\n\nexport interface ClusterArgs {\n cluster?: string;\n hostname?: string;\n}\n\nexport interface ClusterUrls {\n api: string;\n repeaterServer: string;\n}\n\nexport interface TlsError {\n code?: string;\n}\n\nexport class Helpers {\n private static readonly UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n private static readonly SHORT_UUID_PATTERN = /^[1-9a-z]{10,22}$/i;\n private static readonly META_CHARS_REGEXP = /([()\\][%!^\"`<>&|;, *?])/g;\n\n private static readonly OPENSSL_CODES = new Set([\n 'CERT_HAS_EXPIRED',\n 'CERT_NOT_YET_VALID',\n 'DEPTH_ZERO_SELF_SIGNED_CERT',\n 'SELF_SIGNED_CERT_IN_CHAIN',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n 'UNABLE_TO_GET_ISSUER_CERT',\n 'HOSTNAME_MISMATCH',\n 'CERT_REJECTED',\n 'CERT_UNTRUSTED'\n ]);\n\n public static isUUID(value: string): boolean {\n ok(value, 'Value must be string');\n\n return this.UUID_PATTERN.test(value);\n }\n\n public static isShortUUID(value: string): boolean {\n ok(value, 'Value must be string');\n\n return this.SHORT_UUID_PATTERN.test(value);\n }\n\n public static getClusterUrls(args: ClusterArgs): ClusterUrls {\n let repeaterServer: string;\n let api: string;\n\n const hostname = args.cluster ?? args.hostname;\n\n if (hostname) {\n let host = hostname;\n\n try {\n ({ host } = new URL(hostname));\n } catch {\n // noop\n }\n\n if (['localhost', '127.0.0.1'].includes(host)) {\n api = `http://${host}:8000`;\n repeaterServer = `ws://${host}:8000/workstations`;\n } else {\n api = `https://${host}`;\n repeaterServer = `wss://${host}/workstations`;\n }\n } else {\n api = 'https://app.brightsec.com';\n repeaterServer = `wss://app.brightsec.com/workstations`;\n }\n\n return { api, repeaterServer };\n }\n\n public static spawn(\n options: {\n exclude?: string[];\n include?: string[];\n detached?: boolean;\n } = { detached: false }\n ): ChildProcess {\n const { command, args, windowsVerbatimArguments, shell } =\n Helpers.getExecArgs({\n spawn: true,\n excludeAll: true,\n include: options.include,\n exclude: options.exclude\n });\n\n return spawn(command, args, {\n shell,\n windowsVerbatimArguments,\n detached: !shell && options.detached,\n windowsHide: shell && options.detached\n });\n }\n\n public static getExecArgs(options?: {\n exclude?: string[];\n include?: string[];\n excludeAll?: boolean;\n escape?: boolean;\n spawn?: boolean;\n }): CommandArgs {\n options = {\n escape: true,\n excludeAll: false,\n spawn: false,\n ...(options ?? {})\n };\n\n let args: string[] = process.argv.slice(1);\n\n if (options.excludeAll) {\n args = args.slice(0, 1);\n }\n\n if (options.include) {\n args = [...args, ...options.include];\n }\n\n if (options.exclude) {\n args = args.filter((x: string) => !options.exclude.includes(x));\n }\n\n args = [...process.execArgv, ...args].filter((arg: string) =>\n process.pkg && !options.spawn\n ? !arg.startsWith(process.pkg.entrypoint)\n : true\n );\n\n let command = normalize(process.execPath);\n\n const shell = this.win();\n const windowsVerbatimArguments = shell && options.escape;\n\n if (windowsVerbatimArguments) {\n command = `\"${command}\"`;\n args = args.map(this.escapeShellArgument, this);\n }\n\n return {\n args,\n shell,\n command,\n windowsVerbatimArguments\n };\n }\n\n public static async pool<T, R>(\n poolLimit: number,\n items: Iterable<T>,\n iterator: (subject: T) => Promise<R>\n ): Promise<R[]> {\n const promises: Promise<R>[] = [];\n\n const poolPromises: Promise<void>[] = [];\n\n for (const item of items) {\n const promise = iterator(item);\n\n promises.push(promise);\n\n const poolMember: Promise<void> = promise.then(() => {\n poolPromises.splice(poolPromises.indexOf(poolMember), 1);\n });\n\n poolPromises.push(poolMember);\n\n if (poolPromises.length >= poolLimit) {\n await Promise.race(poolPromises);\n }\n }\n\n return Promise.all(promises);\n }\n\n public static wildcardToRegExp(s: string): RegExp {\n return new RegExp(`^${s.split(/\\*+/).map(this.regExpEscape).join('.*')}$`);\n }\n\n public static selectEnumValue(\n enumType: Record<string, string>,\n caseAgnosticValue: string\n ): string | undefined {\n return Object.values(enumType).find(\n (x: string) =>\n x.toLowerCase().trim() === caseAgnosticValue.toLowerCase().trim()\n );\n }\n\n public static omit<T, K extends keyof T>(data: T): Omit<T, undefined | null> {\n return (Object.entries(data) as [K, T[K]][]).reduce(\n (acc: Omit<T, undefined | null>, [k, v]: [K, T[K]]) =>\n v == null ? acc : { ...acc, [k]: v },\n {} as Omit<T, undefined | null>\n );\n }\n\n public static split<T extends R[], R>(array: T, count: number): R[][] {\n ok(Array.isArray(array), 'First argument must be an instance of Array.');\n\n const countItemInChunk: number = Math.ceil(array.length / count);\n\n return Array(countItemInChunk)\n .fill(null)\n .map(\n (_value: string, i: number) =>\n array.slice(i * count, i * count + count) as R[]\n );\n }\n\n public static toArray<T>(enumeration: unknown): T[] {\n return [...Object.values(enumeration)] as T[];\n }\n\n public static parseHeaders(headers: string[] = []): Record<string, string> {\n ok(Array.isArray(headers), 'First argument must be an instance of Array.');\n\n return headers.reduce((acc: Record<string, string>, value: string) => {\n const [key, header]: [string, string] = this.parseHeader(value);\n\n return { ...acc, [key]: header };\n }, {});\n }\n\n public static portFromURL(url: URL): string {\n return (\n url.port ||\n (url.protocol === 'http:' ? '80' : url.protocol === 'https:' ? '443' : '')\n );\n }\n\n public static isTlsCertError(error: Error) {\n const err = error as TlsError;\n\n if (!err.code) return false;\n\n if (\n typeof err.code === 'string' &&\n (err.code.startsWith('ERR_TLS_') || err.code === 'ECONNRESET')\n ) {\n return true;\n }\n\n if (Helpers.OPENSSL_CODES.has(err.code)) return true;\n\n return false;\n }\n\n // It's based on https://qntm.org/cmd\n private static escapeShellArgument(val: string): string {\n val = `${val}`;\n\n val = val.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n\n val = val.replace(/(\\\\*)$/, '$1$1');\n\n val = `\"${val}\"`;\n\n return val.replace(this.META_CHARS_REGEXP, '^$1');\n }\n\n private static parseHeader(header: string): [string, string] | undefined {\n ok(\n typeof header === 'string',\n 'First argument must be an instance of String.'\n );\n\n if (header) {\n const [key, ...values]: string[] = header.split(':');\n\n return [key, values.join(':')].map((item: string) =>\n decodeURIComponent(item.trim())\n ) as [string, string];\n }\n }\n\n private static win(): boolean {\n return process.platform === 'win32';\n }\n\n /**\n * RegExp-escapes all characters in the given string.\n */\n private static regExpEscape(s: string): string {\n return s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n }\n}\n","import chalk from 'chalk';\nimport { createStream } from 'rotating-file-stream';\nimport { format } from 'node:util';\nimport { mkdirSync, existsSync } from 'fs';\nimport { dirname } from 'path';\n\nexport enum LogLevel {\n SILENT,\n ERROR,\n WARN,\n NOTICE,\n VERBOSE,\n TRACE\n}\n\nexport interface LogFile {\n write(data: string): void;\n end?(): void;\n}\n\nexport interface LogOptions {\n // Size in bytes, default 10MB\n maxSize?: string;\n // Maximum number of rotated files to keep, default 5\n maxFiles?: number;\n // Interval to rotate the file even if size is not exceeded\n // Examples: '1d', '12h', '7d'\n interval?: string;\n // Compression for rotated files ('gzip' or undefined)\n compress?: 'gzip';\n}\n\nexport class Logger {\n private static instance: Logger;\n private readonly MAX_FORMATTED_LEVEL_LENGTH = Object.keys(LogLevel)\n .sort((a: string, b: string) => a.length - b.length)\n .slice(0)\n .pop().length;\n private _logLevel: LogLevel;\n private _logFile?: LogFile;\n private _logPath?: string;\n private _logOptions: LogOptions;\n\n constructor(\n logLevel: LogLevel = LogLevel.NOTICE,\n logFile?: string,\n options: LogOptions = {}\n ) {\n this._logLevel = logLevel;\n this._logOptions = {\n maxSize: options.maxSize || '10MB',\n maxFiles: options.maxFiles ?? 5,\n interval: options.interval || '1d',\n compress: options.compress ?? 'gzip'\n };\n if (logFile) {\n this.logFile = logFile;\n }\n }\n\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n\n return Logger.instance;\n }\n\n public static configure(\n logLevel: LogLevel = LogLevel.NOTICE,\n logFile?: string,\n options: LogOptions = {}\n ): Logger {\n const instance = Logger.getInstance();\n instance._logLevel = logLevel;\n instance._logOptions = {\n maxSize: options.maxSize || '10MB',\n maxFiles: options.maxFiles ?? 5,\n interval: options.interval || '1d',\n compress: options.compress ?? 'gzip'\n };\n if (logFile) {\n instance.logFile = logFile;\n }\n\n return instance;\n }\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n\n set logLevel(value: LogLevel) {\n this._logLevel = value;\n }\n\n get logFile(): string | undefined {\n return this._logPath;\n }\n\n set logFile(filePath: string | undefined) {\n if (this._logFile && 'end' in this._logFile) {\n this._logFile.end();\n }\n this._logFile = undefined;\n this._logPath = undefined;\n\n if (filePath) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Create a rotating write stream\n this._logFile = createStream(filePath, {\n size: this._logOptions.maxSize,\n interval: this._logOptions.interval,\n compress: this._logOptions.compress,\n maxFiles: this._logOptions.maxFiles,\n // Rotate file names with timestamp\n rotate: 1\n });\n this._logPath = filePath;\n }\n }\n\n public error(error: Error, message?: string, ...args: any[]): void;\n public error(message: string, ...args: any[]): void;\n public error(\n errorOrMessage: Error | string,\n messageOrArg: any,\n ...args: any[]\n ): void {\n if (this.logLevel < LogLevel.ERROR) {\n return;\n }\n\n let message: string;\n\n if (typeof errorOrMessage === 'string') {\n if (arguments.length > 1) {\n args.unshift(messageOrArg);\n }\n message = errorOrMessage;\n } else {\n const error = errorOrMessage as Error;\n message = messageOrArg || error.message;\n if (error.stack) {\n args.push(`\\n${error.stack}`);\n }\n }\n\n const formatted = this.formatMessage('ERROR', message, args);\n if (!this._logFile) {\n this.writeToStderr(chalk.red(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public warn(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.WARN) {\n return;\n }\n\n const formatted = this.formatMessage('WARN', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.yellow(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public log(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.NOTICE) {\n return;\n }\n\n const formatted = this.formatMessage('NOTICE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.green(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public debug(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.VERBOSE) {\n return;\n }\n\n const formatted = this.formatMessage('VERBOSE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.cyan(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public trace(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.TRACE) {\n return;\n }\n\n const formatted = this.formatMessage('TRACE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.cyan(formatted));\n }\n this.writeToFile(formatted);\n }\n\n private formatMessage(level: string, message: string, args: any[]): string {\n const formattedMessage = format(message, ...args);\n const formattedLevel = level\n .toUpperCase()\n .padEnd(this.MAX_FORMATTED_LEVEL_LENGTH, ' ');\n\n return `${new Date().toISOString()} [${formattedLevel}] ${formattedMessage}`;\n }\n\n private writeToFile(message: string): void {\n if (this._logFile) {\n try {\n this._logFile.write(`${message}\\n`);\n } catch (error) {\n // Silently handle write errors in tests\n }\n }\n }\n\n private writeToStdout(message: string): void {\n process.stdout.write(`${message}\\n`);\n }\n\n private writeToStderr(message: string): void {\n process.stderr.write(`${message}\\n`);\n }\n}\n\nexport const logger: Logger = Logger.getInstance();\n","import { Transform, TransformCallback } from 'node:stream';\n\nexport class NormalizeZlibDeflateTransformStream extends Transform {\n private hasCheckedHead = false;\n private readonly header = Buffer.from([0x78, 0x9c]);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public _transform(\n chunk: any,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this.hasCheckedHead && chunk.length !== 0) {\n // ADHOC: detects raw deflate: https://stackoverflow.com/a/37528114\n if (chunk.compare(this.header, 0, 1, 0, 1) !== 0) {\n this.push(this.header, encoding);\n }\n this.hasCheckedHead = true;\n }\n\n this.push(chunk, encoding);\n callback();\n }\n}\n","import {\n HttpsProxyAgent,\n type HttpsProxyAgentOptions\n} from 'https-proxy-agent';\nimport { type URL } from 'node:url';\nimport type http from 'node:http';\nimport type net from 'node:net';\n\nconst kTlsUpgradeOptions = Symbol('tlsUpgradeOptions');\n\n// ADHOC: This is a workaround for this issue: https://github.com/TooTallNate/node-https-proxy-agent/issues/89\nexport class PatchedHttpsProxyAgent<\n T extends string\n> extends HttpsProxyAgent<T> {\n private readonly [kTlsUpgradeOptions]?: HttpsProxyAgentOptions<T>;\n\n constructor(proxy: T | URL, opts?: HttpsProxyAgentOptions<T>) {\n super(proxy, opts);\n this[kTlsUpgradeOptions] = opts;\n }\n\n public override connect(\n req: http.ClientRequest,\n opts: Parameters<HttpsProxyAgent<T>['connect']>[1]\n ): Promise<net.Socket> {\n return super.connect(req, { ...this[kTlsUpgradeOptions], ...opts });\n }\n}\n","import https from 'node:https';\nimport http from 'node:http';\n\nexport interface ProxyOptions {\n proxyUrl: string;\n rejectUnauthorized?: boolean;\n}\n\nexport interface TargetProxyOptions extends ProxyOptions {\n targetUrl: string;\n}\n\nexport interface ProxyFactory {\n createProxy(options: ProxyOptions): {\n httpsAgent: https.Agent;\n httpAgent: http.Agent;\n };\n\n createProxyForClient(options: TargetProxyOptions): https.Agent | http.Agent;\n}\n\nexport const ProxyFactory: unique symbol = Symbol('ProxyFactory');\n","import { Helpers } from './Helpers';\nimport { logger } from './Logger';\nimport raw from '@neuralegion/raw-socket';\nimport dgram from 'node:dgram';\nimport { Resolver } from 'node:dns/promises';\nimport { EventEmitter, once } from 'node:events';\nimport { isIP } from 'node:net';\n\nexport { Protocol } from '@neuralegion/raw-socket';\n\nconst Stop: unique symbol = Symbol('Stop');\n\ninterface ReturnType {\n reached: boolean;\n}\n\nexport interface Options {\n amountProbes: number;\n maximumHops: number;\n timeoutInMillis: number;\n reverseLookup: boolean;\n protocol: number;\n packetSize: number;\n outStream: typeof process.stdout;\n}\n\nconst defaultOptions: Options = {\n amountProbes: 3,\n maximumHops: 64,\n timeoutInMillis: 3000,\n reverseLookup: true,\n protocol: raw.Protocol.ICMP,\n packetSize: 52,\n outStream: process.stdout\n};\n\nexport class Traceroute {\n private readonly icmpSocket = raw.createSocket({\n protocol: raw.Protocol.ICMP\n });\n private readonly resolver = new Resolver();\n private readonly options: Options;\n private readonly subject = new EventEmitter();\n private port = 33433;\n private ttl = 1;\n private startTime?: [number, number];\n private probes = 0;\n private timeout?: NodeJS.Timeout;\n private previousIP?: string;\n private udpSocket?: dgram.Socket;\n private destinationHostname: string;\n\n constructor(\n private destinationIp: string,\n userOptions: Partial<Options> = {}\n ) {\n const maximumHops = userOptions.maximumHops || defaultOptions.maximumHops;\n\n this.options = {\n ...defaultOptions,\n ...Helpers.omit(userOptions),\n ...(maximumHops > 255 || maximumHops < 1\n ? { maximumHops: defaultOptions.maximumHops }\n : { maximumHops })\n };\n\n this.destinationHostname = this.destinationIp;\n\n this.icmpSocket.on('error', (e) => this.emitError(e));\n\n this.icmpSocket.on('message', async (buffer: Buffer, ip: string) => {\n const port = this.parseIdFromIcmpMessage(buffer);\n\n logger.debug(\n 'Received ICMP %s bytes (message: %s) from %s:%s',\n buffer.length,\n buffer.toString('hex'),\n ip,\n port\n );\n\n if (port === this.port) {\n const hostName = await this.getHostName(ip);\n this.handleReply(ip, hostName);\n }\n });\n }\n\n public async execute(): Promise<ReturnType> {\n if (!isIP(this.destinationIp)) {\n try {\n this.destinationIp = (\n await this.resolver.resolve(this.destinationHostname, 'A')\n )[0];\n } catch (err) {\n logger.debug(\n 'Cannot resolve the following hostname: %s. Error: %s',\n this.destinationHostname,\n err\n );\n }\n }\n\n process.stdout.write(\n `traceroute to ${this.destinationHostname} (${this.destinationIp}), ${this.options.maximumHops} hops max, ${this.options.packetSize} byte packets`\n );\n\n if (this.options.protocol === raw.Protocol.UDP) {\n this.udpSocket = dgram.createSocket('udp4');\n\n this.udpSocket.on('error', (e) => this.emitError(e));\n\n this.udpSocket.bind(() => this.sendPacket());\n } else {\n setImmediate(() => this.sendPacket());\n }\n\n const [reached]: ReturnType[] = await once(this.subject, Stop);\n\n this.abort();\n\n return reached;\n }\n\n private abort(): void {\n if (this.udpSocket) {\n this.udpSocket.close();\n }\n this.icmpSocket.close();\n }\n\n private async getHostName(ip: string): Promise<string | undefined> {\n if (!this.options.reverseLookup) {\n return;\n }\n\n try {\n const [hostname]: string[] = await this.resolver.reverse(ip);\n\n return hostname;\n } catch (err) {\n logger.debug(\n 'Cannot reverse the following IP address: %s. Error: %s',\n ip,\n err\n );\n }\n }\n\n private sendPacket(): void {\n if (this.probes >= this.options.amountProbes) {\n this.probes = 0;\n this.ttl++;\n }\n\n this.probes++;\n\n const buffer = this.createPingRequest(\n 0,\n 0,\n ++this.port,\n this.options.packetSize\n );\n\n if (this.udpSocket) {\n try {\n this.udpSocket.setTTL(this.ttl);\n } catch (e) {\n this.emitError(e as Error);\n\n return;\n }\n this.udpSocket.send(\n buffer,\n 0,\n buffer.length,\n this.port,\n this.destinationIp,\n this.afterSend.bind(this)\n );\n } else {\n this.icmpSocket.setOption(\n raw.SocketLevel.IPPROTO_IP,\n raw.SocketOption.IP_TTL,\n this.ttl\n );\n this.icmpSocket.send(\n buffer,\n 0,\n buffer.length,\n this.destinationIp,\n this.afterSend.bind(this)\n );\n }\n }\n\n /**\n * For error type responses the sequence and ID cannot be\n * extracted, the data part contains the IP header from our request,\n * followed with at least 8 bytes from the echo request that generated the error.\n * In detail look up in https://en.wikipedia.org/wiki/Ping_(networking_utility)\n * and https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol\n */\n private parseIdFromIcmpMessage(msg: Buffer): number | undefined {\n let offset = 20;\n\n const type = msg.readUInt8(offset);\n\n if (type === 3 || type === 4 || type === 5 || type === 11) {\n const icmpIPOffset = offset + 8;\n\n // IPv4 takes no less 20 bytes in an IP header\n if (\n msg.length - icmpIPOffset < 20 ||\n // eslint-disable-next-line no-bitwise\n (msg.readUInt8(icmpIPOffset) & 0xf0) !== 0x40\n ) {\n return;\n }\n\n // eslint-disable-next-line no-bitwise\n const icmpIPLength = (msg.readUInt8(icmpIPOffset) & 0x0f) * 4;\n\n // ICMP message too short\n if (msg.length - icmpIPOffset - icmpIPLength < 8) {\n return;\n }\n\n offset = icmpIPOffset + icmpIPLength;\n }\n\n return msg.readUInt16BE(offset + 6);\n }\n\n private afterSend(error: Error | null) {\n if (error) {\n this.emitError(error);\n\n return;\n }\n\n this.timeout = setTimeout(\n () => this.handleReply(),\n this.options.timeoutInMillis\n );\n }\n\n private handleReply(ip?: string, symbolicAddress?: string): void {\n this.clearTimeout();\n\n const formattedTTL = this.ttl.toFixed().padStart(3, ' ');\n\n if (ip) {\n const elapsedTime = `${(\n process.hrtime(this.startTime)[1] / 1000000\n ).toFixed(3)} ms`;\n\n if (ip === this.previousIP) {\n process.stdout.write(` ${elapsedTime} `);\n } else if (this.probes === 1) {\n process.stdout.write(\n `\\n${formattedTTL} ${\n symbolicAddress ? symbolicAddress : ip\n } (${ip}) ${elapsedTime} `\n );\n } else {\n process.stdout.write(\n `\\n${Array(formattedTTL.length).fill(' ').join('')} ${\n symbolicAddress ? symbolicAddress : ip\n } (${ip}) ${elapsedTime} `\n );\n }\n } else {\n process.stdout.write(this.probes === 1 ? `\\n${formattedTTL} * ` : `* `);\n }\n\n if (\n this.probes === this.options.amountProbes &&\n (ip === this.destinationIp || this.ttl >= this.options.maximumHops)\n ) {\n process.stdout.write('\\n');\n this.subject.emit(Stop, {\n reached: ip === this.destinationIp\n });\n\n return;\n }\n\n this.previousIP = ip;\n\n setImmediate(() => this.sendPacket());\n }\n\n private createPingRequest(\n type: number,\n identifier: number,\n sequence: number,\n packetSize = 0\n ): Buffer {\n const header = [\n type || 0x08,\n 0x00,\n 0x00,\n 0x00,\n this.secondByte(identifier),\n this.firstByte(identifier),\n this.secondByte(sequence),\n this.firstByte(sequence)\n ];\n const req = [...header, ...Array(packetSize).fill(0xff)];\n\n const buffer = Buffer.from(req);\n raw.writeChecksum(buffer, 2, raw.createChecksum(buffer));\n\n return buffer;\n }\n\n private firstByte(value: number): number {\n // eslint-disable-next-line no-bitwise\n return value & 0xff;\n }\n\n private secondByte(value: number): number {\n // eslint-disable-next-line no-bitwise\n return (value & 0xff00) >> 8;\n }\n\n private clearTimeout(): void {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n }\n\n private emitError(error: Error): void {\n this.subject.emit('error', error);\n }\n}\n","export * from './Backoff';\nexport * from './DefaultProxyFactory';\nexport * from './ErrorMessageFactory';\nexport * from './Helpers';\nexport * from './Logger';\nexport * from './ProxyFactory';\nexport * from './Traceroute';\n","import { TestType } from '../TestType';\nimport { Connectivity } from './Connectivity';\nimport { logger } from '../../Utils';\nimport { Credentials } from '../Credentials';\nimport { Tokens } from '../Tokens';\nimport axios from 'axios';\nimport { inject, injectable } from 'tsyringe';\nimport { resolve } from 'node:url';\n\n@injectable()\nexport class AuthConnectivity implements Connectivity {\n public readonly type = TestType.AUTH;\n private readonly CONNECTION_TIMEOUT = 10 * 1000; // 10 seconds\n\n constructor(@inject(Tokens) private readonly tokens: Tokens) {}\n\n public async test(url: URL): Promise<boolean> {\n const { repeaterId, authToken }: Credentials | undefined =\n this.tokens.readTokens();\n\n try {\n const { data } = await axios.get<{ id: string }>(\n resolve(url.toString(), `/api/v1/repeaters/${repeaterId}`),\n {\n timeout: this.CONNECTION_TIMEOUT,\n headers: {\n Authorization: `api-key ${authToken}`\n }\n }\n );\n\n logger.debug(\n 'Authentication test successful with repeater ID: %s',\n data.id\n );\n\n return data.id === repeaterId;\n } catch (err) {\n if (\n axios.isAxiosError(err) &&\n (err.status === 401 || err.status === 403 || err.status === 404)\n ) {\n logger.debug(\n 'Authentication test failed with repeater ID: %s',\n repeaterId\n );\n } else {\n logger.debug('Authentication test failed: %s', err.message);\n }\n\n return false;\n }\n }\n}\n","import { TestType } from '../TestType';\nimport { Options } from '../Options';\n\nexport interface Connectivity {\n type: TestType;\n\n test(target: string | URL, opt?: Options): Promise<boolean>;\n}\n\nexport const Connectivity: unique symbol = Symbol('Connectivity');\n","import { TestType } from '../TestType';\n\nexport interface ConnectivityAnalyzer {\n verifyAccess(type: TestType, target?: string | URL): Promise<boolean>;\n}\n\nexport const ConnectivityAnalyzer: unique symbol = Symbol(\n 'ConnectivityAnalyzer'\n);\n","import { Connectivity } from './Connectivity';\nimport { ConnectivityAnalyzer } from './ConnectivityAnalyzer';\nimport { logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Options } from '../Options';\nimport { inject, injectable, injectAll } from 'tsyringe';\n\nexport const ConnectivityUrls = Symbol('ConnectivityUrls');\n\n@injectable()\nexport class DefaultConnectivityAnalyzer implements ConnectivityAnalyzer {\n constructor(\n @inject(ConnectivityUrls)\n private readonly urls: Map<TestType, string | URL>,\n @inject(Options) private readonly opt: Options,\n @injectAll(Connectivity)\n private readonly connectivityTestRegistry: Connectivity[]\n ) {}\n\n public async verifyAccess(\n type: TestType,\n target?: string | URL\n ): Promise<boolean> {\n logger.debug('Calling connectivity status test with type %s', type);\n\n const connectivity: Connectivity | undefined =\n this.connectivityTestRegistry.find((x: Connectivity) => x.type === type);\n\n if (!connectivity) {\n throw new Error('Selected test is not support.');\n }\n\n return connectivity.test(\n target ?? this.urls.get(connectivity.type),\n this.opt\n );\n }\n}\n","import { Connectivity } from './Connectivity';\nimport { logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { injectable } from 'tsyringe';\nimport https, { RequestOptions } from 'node:https';\nimport http, { ClientRequest } from 'node:http';\nimport { once } from 'node:events';\n\ninterface ReqFactory {\n request(options: RequestOptions): ClientRequest;\n}\n\n@injectable()\nexport class HTTPConnectivity implements Connectivity {\n public readonly type = TestType.HTTP;\n\n private readonly CONNECTION_TIMEOUT = 10 * 1000; // 10 seconds\n private readonly FACTORY_REGISTRY: ReadonlyMap<string, ReqFactory> = new Map<\n string,\n ReqFactory\n >([\n ['http:', http],\n ['https:', https]\n ]);\n\n public async test({ port, hostname, protocol }: URL): Promise<boolean> {\n const factory = this.FACTORY_REGISTRY.get(protocol);\n\n const req: ClientRequest = factory.request({\n port,\n hostname,\n method: 'GET',\n rejectUnauthorized: false,\n timeout: this.CONNECTION_TIMEOUT\n });\n\n try {\n req.once('timeout', () => req.destroy(new Error('Reached timeout.')));\n process.nextTick(() => req.end());\n\n await once(req, 'response');\n\n logger.debug('Http connectivity test. The connection is successful.');\n\n return true;\n } catch (err) {\n logger.debug(\n 'Http connectivity test. The connection failed: %s',\n err.message\n );\n\n return false;\n } finally {\n if (!req.aborted) {\n req.destroy();\n }\n }\n }\n}\n","import { Connectivity } from './Connectivity';\nimport { logger, Traceroute } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Options } from '../Options';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class TracerouteConnectivity implements Connectivity {\n public readonly type = TestType.TRACEROUTE;\n\n public async test(target: string, opt?: Options): Promise<boolean> {\n const trace = new Traceroute(target, {\n maximumHops: opt?.traceroute?.maxTTL,\n amountProbes: opt?.traceroute?.probes\n });\n\n try {\n const { reached } = await trace.execute();\n\n logger.debug('Traceroute test has been finished.');\n\n return reached;\n } catch (err) {\n logger.debug('Traceroute test has been failed: %s', err.stack);\n\n return false;\n }\n }\n}\n","export * from './AuthConnectivity';\nexport * from './Connectivity';\nexport * from './ConnectivityAnalyzer';\nexport * from './DefaultConnectivityAnalyzer';\nexport * from './HTTPConnectivity';\nexport * from './TracerouteConnectivity';\n","export const AUTH_TOKEN_VALIDATION_REGEXP =\n /^[A-Za-z0-9+/=]{7}\\.nex[ap]\\.[A-Za-z0-9+/=]{32}$/;\n\nexport interface Credentials {\n readonly authToken: string;\n readonly repeaterId: string;\n}\n","import { Credentials } from './Credentials';\nimport { logger } from '../Utils';\nimport { Tokens } from './Tokens';\nimport { injectable } from 'tsyringe';\nimport { homedir } from 'node:os';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n@injectable()\nexport class FSTokens implements Tokens {\n private readonly baseDir: string = homedir();\n\n public writeTokens(credentials: Credentials): void {\n logger.debug('Saving tokens to file %s', this.path);\n\n writeFileSync(this.path, JSON.stringify(credentials));\n }\n\n public readTokens(): Credentials | undefined {\n let result: Credentials;\n for (const path of [this.path, this.legacyPath]) {\n logger.debug('Reading saved tokens from file %s', path);\n if (existsSync(path)) {\n logger.debug('File found. Return the tokens.');\n const resultRaw: Buffer = readFileSync(path);\n\n return JSON.parse(resultRaw.toString('utf8')) as Credentials;\n }\n }\n if (!result) {\n logger.debug(\"File doesn't exist.\");\n }\n }\n\n private get path(): string {\n return join(this.baseDir, '.bright-cli');\n }\n\n /**\n * @deprecated `.nexploit-cli` path is deprecated, use .bright-cli. It's handled for backward compatibility.\n */\n private get legacyPath(): string {\n return join(this.baseDir, '.nexploit-cli');\n }\n}\n","export interface TracerouteOptions {\n maxTTL?: number;\n probes?: number;\n}\n\nexport interface Options {\n traceroute?: TracerouteOptions;\n}\n\nexport const Options: unique symbol = Symbol('Options');\n","export interface StartOptions {\n ping: boolean;\n traceroute: boolean;\n}\n\nexport interface Platform {\n start(options?: StartOptions): Promise<void>;\n\n stop(): Promise<void>;\n}\n\nexport const Platform: unique symbol = Symbol('Platform');\n","import { Platform, StartOptions } from '../Platform';\nimport { AUTH_TOKEN_VALIDATION_REGEXP } from '../Credentials';\nimport { ConnectivityAnalyzer, ConnectivityUrls } from '../Connectivity';\nimport { Helpers, logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Tokens } from '../Tokens';\nimport { inject, injectable } from 'tsyringe';\nimport readline from 'node:readline';\nimport { EOL } from 'node:os';\n\n@injectable()\nexport class ReadlinePlatform implements Platform {\n public static URLS_QUESTION =\n 'Please enter the target URLs to test (separated by commas)';\n public static HOST_OR_IP_QUESTION =\n 'Please enter the target hostname or IP to test';\n public static COMPELED_MESSAGE =\n 'Communication diagnostics done, close the terminal to exit.';\n public static INTERNAL_DIAGNOSTIC = `Starting INTERNAL communication diagnostics:${EOL}`;\n\n private rl: readline.Interface;\n private readonly delimiter = `${EOL}\\r--${EOL}`;\n\n constructor(\n @inject(ConnectivityUrls) private readonly urls: ReadonlyMap<TestType, URL>,\n @inject(Tokens) private readonly tokens: Tokens,\n @inject(ConnectivityAnalyzer)\n private readonly connectivityService: ConnectivityAnalyzer\n ) {}\n\n public async start(options?: StartOptions): Promise<void> {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n if (options?.traceroute) {\n await this.processTraceroute();\n } else {\n await this.configure(options);\n }\n\n // eslint-disable-next-line no-console\n console.log(this.delimiter);\n\n // eslint-disable-next-line no-console\n console.log(ReadlinePlatform.COMPELED_MESSAGE);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.rl.close();\n }\n\n private async configure(options?: StartOptions): Promise<void> {\n if (!options?.ping) {\n /* eslint-disable no-console */\n console.log(`Welcome to the Bright Network Testing wizard!${EOL}`);\n\n console.log(\n 'Note: To run the test, you will require a `Repeater ID` and an `Repeater Token` with the correct scopes.'\n );\n\n console.log(\n 'If you are running the configuration as part of a POC, both of these should have been sent to you via your sales contact.'\n );\n\n process.stdout.write(EOL);\n\n await this.requestTokens();\n\n console.log(this.delimiter);\n\n await this.processExternalCommunication();\n\n console.log(this.delimiter);\n /* eslint-enable no-console */\n }\n\n await this.processPing();\n }\n\n private async requestTokens(): Promise<void> {\n const repeaterId = await this.question('Please enter your Repeater ID');\n const authToken = await this.question(\n `Please enter your Repeater API Token`\n );\n\n process.stdout.write(EOL);\n\n if (!authToken || !AUTH_TOKEN_VALIDATION_REGEXP.test(authToken)) {\n // eslint-disable-next-line no-console\n console.error('Invalid value for authentication token');\n\n return;\n }\n\n if (!repeaterId) {\n // eslint-disable-next-line no-console\n console.error('Invalid value for repeater id');\n\n return;\n }\n\n await this.tokens.writeTokens({ repeaterId, authToken });\n }\n\n private processConnectivity(type: TestType): Promise<void> {\n const url = this.urls.get(type);\n\n return this.process(\n `Validating the ${type} connection to ${url.toString()}`,\n () => this.connectivityService.verifyAccess(type, url)\n );\n }\n\n private async processExternalCommunication(): Promise<void> {\n // eslint-disable-next-line no-console\n console.log(`Starting EXTERNAL communication diagnostics:${EOL}`);\n\n await this.processConnectivity(TestType.HTTP);\n\n await this.process('Verifying provided Token and Repeater ID', () =>\n this.connectivityService.verifyAccess(TestType.AUTH)\n );\n\n process.stdout.write(EOL);\n\n // eslint-disable-next-line no-console\n console.log('EXTERNAL communication diagnostics completed.');\n }\n\n private async processPing(): Promise<void> {\n /* eslint-disable no-console */\n console.log(\n `Next step is to validate the connection to your INTERNAL (local) target application(s).${EOL}`\n );\n const urls = this.getDelimitedInput(\n await this.question(ReadlinePlatform.URLS_QUESTION),\n ','\n );\n\n console.log(this.delimiter);\n\n console.log(ReadlinePlatform.INTERNAL_DIAGNOSTIC);\n\n let reachedCount = 0;\n\n await Helpers.pool(250, urls, (url: string) =>\n this.process(`Trying to reach ${url}`, async () => {\n const result = await this.connectivityService.verifyAccess(\n TestType.HTTP,\n new URL(url)\n );\n\n reachedCount += Number(result);\n\n return result;\n })\n );\n\n process.stdout.write(EOL);\n\n console.log('INTERNAL communication diagnostics completed.');\n console.log(\n `${urls.length - reachedCount} out of ${\n urls.length\n } URLs could not be reached.`\n );\n /* eslint-enable no-console */\n }\n\n private async processTraceroute(): Promise<void> {\n /* eslint-disable no-console */\n console.log(\n `Traceroute to your INTERNAL (local) target application.${EOL}`\n );\n\n if (process.platform === 'win32') {\n console.log(\n `Note: Some Windows users might need to allow the ICMP network traffic through a firewall to enable this functionality.\n For more information, see: https://docs.brightsec.com/docs/testing-network-connectivity${EOL}`\n );\n }\n\n const target = await this.question(ReadlinePlatform.HOST_OR_IP_QUESTION);\n\n console.log(this.delimiter);\n\n console.log(ReadlinePlatform.INTERNAL_DIAGNOSTIC);\n\n const result = await this.connectivityService.verifyAccess(\n TestType.TRACEROUTE,\n target\n );\n\n process.stdout.write(EOL);\n\n console.log(`Traceroute ${result ? 'completed' : 'failed'}.`);\n /* eslint-enable no-console */\n }\n\n private async question(question: string): Promise<string> {\n return new Promise((resolve) => this.rl.question(`${question}: `, resolve));\n }\n\n private async process(\n text: string,\n handler?: () => Promise<boolean>\n ): Promise<void> {\n process.stdout.write(`${text}...`);\n readline.cursorTo(process.stdout, 0);\n\n let result: boolean;\n\n try {\n result = await handler();\n } catch (err) {\n logger.debug(err.message);\n result = false;\n }\n\n // eslint-disable-next-line no-console\n console.log(`${text}... ${result ? 'Success' : 'Failed'}`);\n }\n\n private getDelimitedInput(\n value: string,\n delimiter: string | RegExp\n ): string[] {\n const inputVal = (value ?? '').trim();\n\n return inputVal\n ? inputVal\n .split(delimiter)\n .map((x: string) => x.trim())\n .filter(Boolean)\n : [];\n }\n}\n","export * from './ReadlinePlatform';\n","export enum TestType {\n HTTP = 'http',\n AUTH = 'auth',\n TRACEROUTE = 'traceroute'\n}\n","import { Credentials } from './Credentials';\n\nexport interface Tokens {\n writeTokens(credentials: Credentials): void;\n\n readTokens(): Credentials | undefined;\n}\n\nexport const Tokens: unique symbol = Symbol('Tokens');\n","export * from './Connectivity';\nexport * from './Readline';\nexport * from './Credentials';\nexport * from './FSTokens';\nexport * from './Platform';\nexport * from './TestType';\nexport * from './Tokens';\nexport * from './Options';\n","import 'reflect-metadata';\nimport {\n Certificates,\n CertificatesLoader,\n CertificatesCache,\n CertificatesResolver,\n HttpRequestExecutor,\n RequestExecutor,\n WsRequestExecutor\n} from './RequestExecutor';\nimport {\n DefaultVirtualScripts,\n FSScriptLoader,\n ScriptLoader,\n VirtualScripts\n} from './Scripts';\nimport { DefaultStartupManager, StartupManager } from './StartupScripts';\nimport {\n AuthConnectivity,\n Connectivity,\n ConnectivityAnalyzer,\n DefaultConnectivityAnalyzer,\n FSTokens,\n HTTPConnectivity,\n Platform,\n ReadlinePlatform,\n TracerouteConnectivity,\n Tokens\n} from './Wizard';\nimport {\n BreakpointFactory,\n DefaultBreakpointFactory,\n DefaultPollingFactory,\n PollingFactory,\n RestScans,\n Scans\n} from './Scan';\nimport { EntryPoints, RestEntryPoints } from './EntryPoint';\nimport {\n Archives,\n DefaultParserFactory,\n ParserFactory,\n RestArchives\n} from './Archive';\nimport { ConfigReader } from './Config/ConfigReader';\nimport { DefaultConfigReader } from './Config/DefaultConfigReader';\nimport { CliInfo } from './Config/CliInfo';\nimport { CliBuilder } from './Config/CliBuilder';\nimport {\n RepeaterServer,\n DefaultRepeaterServer,\n RepeaterCommandHub,\n DefaultRepeaterCommandHub,\n RuntimeDetector,\n DefaultRuntimeDetector,\n RepeaterLauncher,\n ServerRepeaterLauncher\n} from './Repeater';\nimport { ProxyFactory, DefaultProxyFactory } from './Utils';\nimport {\n Discoveries,\n RestDiscoveries,\n DiscoveryPollingFactory as DiscoveryPollingFactory,\n DefaultDiscoveryPollingFactory as DefaultDiscoveryPollingFactory\n} from './Discovery';\nimport { DefaultHostUpdateJobStatusPollingFactory } from './EntryPoint/DefaultHostUpdateJobStatusPollingFactory';\nimport { HostUpdateJobStatusPollingFactory } from './EntryPoint/HostUpdateJobStatusPollingFactory';\nimport { DefaultCertificatesCache } from './RequestExecutor/DefaultCertificatesCache';\nimport { DefaultCertificatesResolver } from './RequestExecutor/DefaultCertificatesResolver';\nimport { container, Lifecycle } from 'tsyringe';\n\ncontainer\n .register('tsyringe', {\n useValue: container\n })\n .register<CliInfo>(CliInfo, {\n useValue: new CliInfo(__dirname)\n })\n .register(\n RequestExecutor,\n {\n useClass: HttpRequestExecutor\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Certificates,\n {\n useClass: CertificatesLoader\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n CertificatesCache,\n {\n useClass: DefaultCertificatesCache\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n CertificatesResolver,\n {\n useClass: DefaultCertificatesResolver\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RequestExecutor,\n {\n useClass: WsRequestExecutor\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n VirtualScripts,\n {\n useClass: DefaultVirtualScripts\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n StartupManager,\n {\n useClass: DefaultStartupManager\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RuntimeDetector,\n { useClass: DefaultRuntimeDetector },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RepeaterServer,\n {\n useClass: DefaultRepeaterServer\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RepeaterCommandHub,\n {\n useClass: DefaultRepeaterCommandHub\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Tokens,\n {\n useClass: FSTokens\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n {\n useClass: HTTPConnectivity\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n { useClass: TracerouteConnectivity },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n {\n useClass: AuthConnectivity\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n BreakpointFactory,\n {\n useClass: DefaultBreakpointFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n PollingFactory,\n {\n useClass: DefaultPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n DiscoveryPollingFactory,\n {\n useClass: DefaultDiscoveryPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n HostUpdateJobStatusPollingFactory,\n {\n useClass: DefaultHostUpdateJobStatusPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(Scans, { useClass: RestScans }, { lifecycle: Lifecycle.Singleton })\n .register(\n Discoveries,\n { useClass: RestDiscoveries },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n EntryPoints,\n { useClass: RestEntryPoints },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Archives,\n { useClass: RestArchives },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ParserFactory,\n { useClass: DefaultParserFactory },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ScriptLoader,\n {\n useClass: FSScriptLoader\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ConnectivityAnalyzer,\n {\n useClass: DefaultConnectivityAnalyzer\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<Platform>(\n Platform,\n { useClass: ReadlinePlatform },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<ConfigReader>(\n ConfigReader,\n { useClass: DefaultConfigReader },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<CliBuilder>(CliBuilder, {\n useFactory: (deps) =>\n new CliBuilder({\n info: deps.resolve(CliInfo),\n configReader: deps.resolve(ConfigReader)\n })\n })\n .register<ProxyFactory>(ProxyFactory, {\n useClass: DefaultProxyFactory\n })\n .register<RepeaterLauncher>(\n RepeaterLauncher,\n {\n useClass: ServerRepeaterLauncher\n },\n { lifecycle: Lifecycle.Singleton }\n );\n\nexport default container;\n","module.exports = require(\"@neuralegion/os-service\");","module.exports = require(\"@neuralegion/raw-socket\");","module.exports = require(\"@sentry/node\");","module.exports = require(\"ajv\");","module.exports = require(\"ajv/lib/compile/formats\");","module.exports = require(\"ajv/lib/refs/json-schema-draft-04.json\");","module.exports = require(\"ajv/lib/refs/json-schema-draft-07.json\");","module.exports = require(\"arch\");","module.exports = require(\"axios\");","module.exports = require(\"better-ajv-errors\");","module.exports = require(\"chalk\");","module.exports = require(\"ci-info\");","module.exports = require(\"fast-content-type-parse\");","module.exports = require(\"find-up\");","module.exports = require(\"form-data\");","module.exports = require(\"http-proxy-agent\");","module.exports = require(\"https-proxy-agent\");","module.exports = require(\"iconv-lite\");","module.exports = require(\"js-yaml\");","module.exports = require(\"ms\");","module.exports = require(\"reflect-metadata\");","module.exports = require(\"rotating-file-stream\");","module.exports = require(\"semver\");","module.exports = require(\"socket.io-client\");","module.exports = require(\"socket.io-msgpack-parser\");","module.exports = require(\"socks-proxy-agent\");","module.exports = require(\"tslib\");","module.exports = require(\"tsyringe\");","module.exports = require(\"win-ca\");","module.exports = require(\"ws\");","module.exports = require(\"yargs\");","module.exports = require(\"assert\");","module.exports = require(\"child_process\");","module.exports = require(\"fs\");","module.exports = require(\"node:assert\");","module.exports = require(\"node:child_process\");","module.exports = require(\"node:dgram\");","module.exports = require(\"node:dns/promises\");","module.exports = require(\"node:events\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:fs/promises\");","module.exports = require(\"node:http\");","module.exports = require(\"node:https\");","module.exports = require(\"node:module\");","module.exports = require(\"node:net\");","module.exports = require(\"node:os\");","module.exports = require(\"node:path\");","module.exports = require(\"node:process\");","module.exports = require(\"node:readline\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:timers/promises\");","module.exports = require(\"node:tls\");","module.exports = require(\"node:url\");","module.exports = require(\"node:util\");","module.exports = require(\"node:vm\");","module.exports = require(\"node:zlib\");","module.exports = require(\"path\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","process.env.UV_THREADPOOL_SIZE = String(1024);\nprocess.env.NODE_OPTIONS = `${\n process.env.NODE_OPTIONS ?? ''\n} --max-http-header-size=40960`.trim();\nimport 'reflect-metadata';\nimport {\n PollingScanStatus,\n RetestScan,\n RunRepeater,\n RunScan,\n StopScan,\n UploadArchive,\n VersionCommand,\n Configure,\n GetEntryPoints\n} from './Commands';\nimport { CliBuilder } from './Config';\nimport container from './container';\nimport { RunDiscovery } from './Commands/RunDiscovery';\nimport { StopDiscovery } from './Commands/StopDiscovery';\nimport { RerunDiscovery } from './Commands/RerunDiscovery';\nimport { PollingDiscoveryStatus } from './Commands/PollingDiscoveryStatus';\nimport { PollingHostUpdateJobStatus } from './Commands/PollingHostUpdateJobStatus';\nimport { EntryPointsUpdateHost } from './Commands/EntryPointsUpdateHost';\n\ncontainer.resolve(CliBuilder).build({\n commands: [\n new RunRepeater(),\n new VersionCommand(),\n new PollingScanStatus(),\n new RunScan(),\n new RetestScan(),\n new StopScan(),\n new RunDiscovery(),\n new StopDiscovery(),\n new RerunDiscovery(),\n new PollingDiscoveryStatus(),\n new PollingHostUpdateJobStatus(),\n new UploadArchive(),\n new Configure(),\n new GetEntryPoints(),\n new EntryPointsUpdateHost()\n ]\n}).argv;\n"],"names":["SpecType","Archives","Symbol","BaseParser","constructor","validator","FILE_SIZE_LIMIT","parse","path","this","access","stat","size","Error","content","readFile","ext","extname","data","deserialize","e","message","validate","filename","basename","contentType","file","_meta","JSON","ok","constants","F_OK","DefaultParserFactory","harValidator","oasValidator","postmanValidator","create","spec","HAR","OPENAPI","OasParser","POSTMAN","injectable","HarValidator","OasValidator","PostmanValidator","super","meta","load","ParserFactory","RestArchivesOptions","RestArchives","proxyFactory","baseURL","apiKey","proxyURL","insecure","timeout","ALLOWED_SPECS","httpAgent","Agent","httpsAgent","rejectUnauthorized","createProxy","proxyUrl","client","responseType","headers","authorization","upload","includes","type","discard","variables","projectId","castToFile","formData","append","value","options","stringify","post","params","id","Buffer","from","inject","ProxyFactory","ajv","allErrors","async","jsonPointers","extendRefs","addSchema","getSchema","logger","error","schema","errors","indent","entriesAreValid","log","entries","urls","map","parseEntry","filter","item","Set","length","entry","host","protocol","URL","request","url","MIN_ALLOWED_VERSION","VERSION_SCHEMA_MAP","Map","SCHEMAS","$data","schemaId","addFormat","full","addMetaSchema","_refs","forEach","x","version","getVersion","major","get","validateVersion","gte","openapi","swagger","trim","valid","startsWith","ALLOWED_SCHEMAS","META_SCHEMAS","concat","collection","info","dir","Configure","command","describe","getMapEntryOrThrow","input","err","builder","argv","option","TestType","HTTP","hidden","requiresArg","AUTH","boolean","number","default","alias","group","conflicts","middleware","args","register","Options","useValue","traceroute","maxTTL","isNaN","maxTtl","undefined","probes","ConnectivityUrls","api","handler","app","resolve","Platform","stop","process","exit","on","start","ping","ErrorMessageFactory","genericCommandError","EntryPointsUpdateHost","string","demandOption","array","container","RestProjectsOptions","token","proxyBright","proxy","entryPointsManager","EntryPoints","project","taskId","updateHost","entryPointIds","entrypointIds","newHostname","oldHostname","console","exitCode","GetEntryPoints","choices","entryPoints","entrypoints","limit","connectivity","status","ep","verbose","entryPoint","method","pretty","PollingDiscoveryStatus","positional","RestDiscoveryOptions","polling","DiscoveryPollingFactory","discoveryId","interval","PollingHostUpdateJobStatus","HostUpdateJobStatusPollingFactory","jobId","PollingScanStatus","Helpers","toArray","BreakpointType","ANY","RestScansOptions","PollingFactory","scanId","breakpoint","BreakpointException","RerunDiscovery","discoveryManager","Discoveries","newDiscoveryId","rerun","RetestScan","scanManager","Scans","retest","RunDiscovery","normalize","check","archive","crawler","warnings","name","authObjectId","auth","hostsFilter","hostFilter","crawlerUrls","fileId","repeaters","repeater","optimizedCrawler","smart","poolSize","concurrency","maxInteractionsChainLength","interactionsDepth","subdomainsCrawl","crawlParentSubdomains","header","warn","warning","join","RunRepeater","coerce","arg","Array","isArray","parseHeaders","deprecated","hostname","passphrase","port","split","env","NO_PROXY","domain","daemon","ntlm","Object","hasOwnProperty","call","exitProcess","isShortUUID","isUUID","proxyDomains","proxyDomainsBypass","RequestExecutorOptions","proxyTarget","certs","cert","maxBodySize","Infinity","maxContentLength","reuseConnection","experimentalConnectionReuse","whitelistMimes","allowTruncation","DefaultRepeaterServerOptions","uri","repeaterServer","connectTimeout","repeaterLauncher","RepeaterLauncher","cacert","loadCerts","scripts","loadScripts","remove","uninstall","install","event","close","run","captureException","RunScan","excludeEntryPoint","methods","patterns","nonEmptyPatterns","pattern","EOL","Module","DAST","defaultDescription","ATTACK_PARAM_LOCATIONS_DEFAULT","AttackParamLocation","entrypoint","tests","test","module","templateId","template","buckets","bucket","attackParamLocations","param","exclusions","requests","excludeParam","StopDiscovery","StopScan","UploadArchive","toLowerCase","parserFactory","archives","selectEnumValue","parser","variable","VersionCommand","executeCommand","Promise","reject","exec","stdout","stderr","localMatches","match","localNpmVersion","replace","globalMatches","globalNpmVersion","CliBuilder","_options","build","commands","configReader","cli","config","discovery","cwd","configParser","configPath","toJSON","keys","LogLevel","NOTICE","implies","description","PROXY","getClusterUrls","logFile","maxSize","maxFiles","compress","Logger","configure","logLevel","toString","toUpperCase","usage","pkgConf","example","reduce","acc","wrapWithSentry","recommendCommands","demandCommand","strict","help","wrap","bind","systemConfigManager","SystemConfigManager","systemConfig","read","runWithAsyncContext","initSentry","sentryDsn","setContext","enableBackgroundRotation","rotatedSystemConfig","dsn","init","attachStacktrace","release","VERSION","beforeSend","contexts","t","CliInfo","packagePath","getPackagePath","packageData","getPackageData","dirname","distribution","brightCli","pkg","readFileSync","sync","BRIGHT_CWD","ConfigReader","DefaultConfigReader","rcOptions","rcPath","rcExt","loadCommonJsModule","key","has","code","encoding","script","Script","vmModule","exports","context","createContext","runInNewContext","omit","set","rotationInterval","homedir","backgroundRotationEnabled","transitional","clarifyTimeoutError","rotateIfNecessary","getConfigFile","onRotation","runBackgroundRotation","catch","debug","disableBackgroundRotation","setTimeout","ref","needsRotation","configFile","Date","now","updatedAt","getTime","newConfig","fetchNewConfig","updateConfigFile","defaultConfigFile","fileConfig","writeFile","DefaultDiscoveryPollingFactory","discoveries","DiscoveryPolling","DiscoveryType","SourceType","defaultInterval","DEFAULT_RECONNECT_TIMES","abortController","AbortController","initializePolling","runPollingLoop","handleError","abort","clearTimeout","timeoutDescriptor","poll","processDiscoveryView","signal","aborted","backoff","createBackoff","view","execute","delay","isFinished","DiscoveryStatus","DONE","STOPPED","DISRUPTED","FAILED","Backoff","isAxiosError","handleDiscoveryStatus","RUNNING","PENDING","SCHEDULED","QUEUED","RestDiscoveries","preparedConfig","prepareConfig","put","action","delete","rest","applyDefaultSettings","source","mergeStrategy","discoveryConfig","discoveryTypes","exploreDiscovery","body","push","CRAWLER","ARCHIVE","OAS","DefaultHostUpdateJobStatusPollingFactory","HostUpdateJobStatusPolling","JobStatus","jobView","processJobView","getHostUpdateJobStatus","COMPLETED","handleJobStatus","PROCESSING","job","RestEntryPoints","entrypointsPaginationBatchSize","filters","remaining","nextId","nextCreatedAt","items","Math","min","createdAt","DefaultRepeaterCommandHub","virtualScripts","requestExecutors","compileScripts","clear","VirtualScriptType","REMOTE","wildcard","sendRequest","requestExecutor","find","testNetwork","child","spawn","include","exclude","unref","chunk","lines","line","first","indexOf","ReadlinePlatform","URLS_QUESTION","stdin","write","HOST_OR_IP_QUESTION","COMPELED_MESSAGE","end","once","msg","processOutput","element","index","arr","endsWith","VirtualScripts","injectAll","RequestExecutor","DefaultRepeaterServer","MAX_DEPLOYMENT_TIMEOUT","MIN_RECONNECTION_DELAY","MAX_RECONNECTION_DELAY","events","EventEmitter","handlerMap","WeakMap","connectionAttempts","handleConnectionError","suppressConnectionError","emit","scheduleReconnection","handleConnect","clearConnectionTimer","handleDisconnect","reason","socket","connect","_socket","disconnect","removeAllListeners","deploy","runtime","nextTick","result","race","_","transports","reconnectionDelayMax","reconnectionDelay","agent","createProxyForClient","targetUrl","listenToReservedEvents","listenToApplicationEvents","off","wrappedHandler","wrapEventListener","callback","captureMessage","io","latestReconnectionError","attempt","RepeaterErrorCodes","REPEATER_UNAUTHORIZED","REPEATER_NOT_PERMITTED","max","random","connectionTimer","extractLastArgument","response","handleEventError","lastArg","pop","DefaultRuntimeDetector","cliInfo","isInsideDocker","nodeVersion","ci","arch","os","platform","detectMacosVersion","detectLinuxVersion","detectWindowsVersion","execSync","osRelease","extractValue","RegExp","prettyName","NetworkTestType","RepeaterCommandHub","RepeaterServer","RuntimeDetector","ServerRepeaterLauncher","runtimeDetector","startupManager","commandHub","certificates","scriptLoader","requestExecutorOptions","repeaterRunning","remediation","normalizedMessage","normalizeMessage","normalizedRemediation","isCriticalError","handleCriticalError","deployRepeater","repeaterId","getRuntime","reconnectionFailed","testingNetwork","output","limitsReceived","requestReceived","Request","statusCode","errorCode","execArgs","getExecArgs","escape","SERVICE_NAME","displayName","asDaemon","setTag","subscribeToEvents","scriptsLoaded","docker","payload","yellow","REPEATER_DEACTIVATED","REPEATER_NO_LONGER_SUPPORTED","REPEATER_ALREADY_STARTED","UNEXPECTED_ERROR","red","StartupManager","Certificates","ScriptLoader","CertificatesCache","CertificatesLoader","CERT_FILES","win","loadCertsFromFile","discoveryDefaultLocations","ca","globalAgent","CertificatesResolver","DefaultCertificatesCache","cache","add","certificateCacheKeyFromRequest","requestUrl","portFromURL","DefaultCertificatesResolver","certificatesCache","registeredCerts","cachedCertificate","matchHostnameAndPort","wildcardToRegExp","HttpRequestExecutor","certificatesResolver","DEFAULT_SCRIPT_ENTRYPOINT","httpsProxyAgent","httpProxyAgent","agentOptions","keepAlive","maxSockets","Protocol","setHeaders","transformScript","targetCerts","executeRequest","tryRequestWithCertificates","cause","syscall","Response","timer","res","req","createRequest","encode","truncateResponse","outgoingMessage","secureEndpoint","createRequestOptions","hasHeader","setHeader","destroy","assign","hash","pathname","search","getRequestAgent","pfx","some","decompress","maxContentSize","responseHasNoBody","parseContentType","whiteListedMimeType","mime","transform","parseBody","byteLength","toFixed","decode","parameters","charset","safeParse","encodingExists","unzipBody","contentEncoding","zlibOptions","flush","Z_SYNC_FLUSH","finishFlush","pipe","createGunzip","NormalizeZlibDeflateTransformStream","createInflate","createBrotliDecompress","chunks","stream","chuck","truncateBody","subarray","alloc","headersSymbol","getOwnPropertySymbols","headersSent","vm","trace","slice","requestsWithCerts","loadCert","isTlsCertError","any","correlationIdRegex","_method","validateUrl","precheckBody","normalizeCorrelationIdRegex","_pfx","_ca","_passphrase","_headers","mergedHeaders","field","SINGLE_VALUE_HEADERS","assertPassphrase","createSecureContext","WsRequestExecutor","WS","consume","matcher","waitForResponse","dataString","String","upgrading","all","normalizeHeaders","headerName","FORBIDDEN_HEADERS","handshakeTimeout","promisify","send","readyState","OPEN","BasePolling","_active","active","state","isRedundant","ScanStatus","Breakpoint","scanIssues","isExcepted","breakOn","BreakpointFactory","setPrototypeOf","prototype","OnSeverity","severity","breakSeverities","severityRanges","stats","DefaultBreakpointFactory","Severity","LOW","HIGH_ISSUE","HIGH","MEDIUM_ISSUE","MEDIUM","CRITICAL_ISSUE","CRITICAL","DefaultPollingFactory","scans","breakpointFactory","RestScans","scanConfig","prepareScanConfig","replaceDeprecatedAttackParamLocations","Discovery","ARTIFICAL_FRAGMENT","loc","ARTIFICIAL_FRAGMENT","ARTIFICAL_QUERY","ARTIFICIAL_QUERY","BODY","FRAGMENT","QUERY","values","DefaultVirtualScripts","store","iterator","VirtualScript","compile","FSScriptLoader","loadScript","LOCAL","MODULE_EXEC_ARGS","wrapScriptCode","__filename","__dirname","functionName","functionArgs","runInContext","func","decoratedModule","DefaultStartupManager","enable","dispose","disable","maxDepth","shouldRetry","depth","task","retry","round","DefaultProxyFactory","createHttpProxy","createSocksProxy","proxies","PatchedHttpsProxyAgent","HttpProxyAgent","common","SocksProxyAgent","getTitle","details","extractErrorDetails","formatFinalMessage","baseMessage","errorDetails","UUID_PATTERN","SHORT_UUID_PATTERN","cluster","detached","windowsVerbatimArguments","shell","excludeAll","windowsHide","execArgv","execPath","escapeShellArgument","pool","poolLimit","promises","poolPromises","promise","poolMember","then","splice","s","regExpEscape","enumType","caseAgnosticValue","k","v","count","countItemInChunk","ceil","fill","_value","i","enumeration","parseHeader","OPENSSL_CODES","val","META_CHARS_REGEXP","decodeURIComponent","MAX_FORMATTED_LEVEL_LENGTH","sort","a","b","_logLevel","_logOptions","getInstance","instance","_logPath","filePath","_logFile","existsSync","mkdirSync","recursive","createStream","rotate","errorOrMessage","messageOrArg","ERROR","arguments","unshift","stack","formatted","formatMessage","writeToStderr","writeToFile","WARN","writeToStdout","green","VERBOSE","cyan","TRACE","level","formattedMessage","format","formattedLevel","padEnd","toISOString","Transform","hasCheckedHead","_transform","compare","kTlsUpgradeOptions","HttpsProxyAgent","opts","Stop","defaultOptions","amountProbes","maximumHops","timeoutInMillis","reverseLookup","ICMP","packetSize","outStream","Traceroute","destinationIp","userOptions","icmpSocket","createSocket","resolver","Resolver","subject","ttl","destinationHostname","emitError","buffer","ip","parseIdFromIcmpMessage","hostName","getHostName","handleReply","isIP","UDP","udpSocket","sendPacket","setImmediate","reached","reverse","createPingRequest","setTTL","afterSend","setOption","SocketLevel","IPPROTO_IP","SocketOption","IP_TTL","offset","readUInt8","icmpIPOffset","icmpIPLength","readUInt16BE","symbolicAddress","formattedTTL","padStart","elapsedTime","hrtime","startTime","previousIP","identifier","sequence","secondByte","firstByte","writeChecksum","createChecksum","AuthConnectivity","tokens","CONNECTION_TIMEOUT","authToken","readTokens","Authorization","Tokens","Connectivity","ConnectivityAnalyzer","DefaultConnectivityAnalyzer","opt","connectivityTestRegistry","verifyAccess","target","HTTPConnectivity","FACTORY_REGISTRY","TracerouteConnectivity","TRACEROUTE","AUTH_TOKEN_VALIDATION_REGEXP","FSTokens","baseDir","writeTokens","credentials","writeFileSync","legacyPath","resultRaw","connectivityService","delimiter","rl","createInterface","processTraceroute","requestTokens","processExternalCommunication","processPing","question","processConnectivity","getDelimitedInput","INTERNAL_DIAGNOSTIC","reachedCount","Number","text","cursorTo","inputVal","Boolean","useClass","lifecycle","Lifecycle","Singleton","useFactory","deps","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","UV_THREADPOOL_SIZE","NODE_OPTIONS"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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qB,QAAQ,e,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,M,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,0B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,yC,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,yC,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,O,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,0B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,uB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,2B,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Q,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,S,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,gB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,K,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,qB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,oB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,mB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,a,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,e,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,gB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,c,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,uB,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,W,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,UCAzBnxB,EAAOmH,QAAUgqB,QAAQ,U,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,Y,WCAzBnxB,EAAOmH,QAAUgqB,QAAQ,O,oj5ICCrBC,EAA2B,CAAC,EAGhC,SAASC,oBAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBj8B,IAAjBk8B,EACH,OAAOA,EAAapqB,QAGrB,IAAInH,EAASoxB,EAAyBE,GAAY,CAGjDnqB,QAAS,CAAC,GAOX,OAHAqqB,EAAoBF,GAAUv0B,KAAKiD,EAAOmH,QAASnH,EAAQA,EAAOmH,QAASkqB,qBAGpErxB,EAAOmH,OACf,C,4GCtBArR,QAAQ0G,IAAIi1B,mBAAqBrS,OAAO,MACxCtpB,QAAQ0G,IAAIk1B,aAAe,GACD,QAAxB,EAAA57B,QAAQ0G,IAAIk1B,oBAAY,QAAI,kCACE3+B,OAChC,0BACA,kCAWA,4BACA,+CACA,0BACA,4BACA,4BACA,4BACA,4BACA,4BAEA,UAAU4C,QAAQ,EAAAqM,YAAYE,MAAM,CAClCC,SAAU,CACR,IAAI,EAAAtG,YACJ,IAAI,EAAAsF,eACJ,IAAI,EAAApI,kBACJ,IAAI,EAAAkG,QACJ,IAAI,EAAAnF,WACJ,IAAI,EAAA6G,SACJ,IAAI,EAAAzG,aACJ,IAAI,EAAAwG,cACJ,IAAI,EAAAjH,eACJ,IAAI,EAAApB,uBACJ,IAAI,EAAAO,2BACJ,IAAI,EAAAgI,cACJ,IAAI,EAAApN,UACJ,IAAI,EAAAiE,eACJ,IAAI,EAAApB,yBAELtC,I","sources":["webpack://@brightsec/cli/./src/Archive/Archives.ts","webpack://@brightsec/cli/./src/Archive/Parsers/BaseParser.ts","webpack://@brightsec/cli/./src/Archive/Parsers/DefaultParserFactory.ts","webpack://@brightsec/cli/./src/Archive/Parsers/OasParser.ts","webpack://@brightsec/cli/./src/Archive/Parsers/ParserFactory.ts","webpack://@brightsec/cli/./src/Archive/Parsers/index.ts","webpack://@brightsec/cli/./src/Archive/RestArchives.ts","webpack://@brightsec/cli/./src/Archive/Validators/HarValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/OasValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/PostmanValidator.ts","webpack://@brightsec/cli/./src/Archive/Validators/index.ts","webpack://@brightsec/cli/./src/Archive/index.ts","webpack://@brightsec/cli/./src/Commands/Configure.ts","webpack://@brightsec/cli/./src/Commands/EntryPointsUpdateHost.ts","webpack://@brightsec/cli/./src/Commands/GetEntryPoints.ts","webpack://@brightsec/cli/./src/Commands/PollingDiscoveryStatus.ts","webpack://@brightsec/cli/./src/Commands/PollingHostUpdateJobStatus.ts","webpack://@brightsec/cli/./src/Commands/PollingScanStatus.ts","webpack://@brightsec/cli/./src/Commands/RerunDiscovery.ts","webpack://@brightsec/cli/./src/Commands/RetestScan.ts","webpack://@brightsec/cli/./src/Commands/RunDiscovery.ts","webpack://@brightsec/cli/./src/Commands/RunRepeater.ts","webpack://@brightsec/cli/./src/Commands/RunScan.ts","webpack://@brightsec/cli/./src/Commands/StopDiscovery.ts","webpack://@brightsec/cli/./src/Commands/StopScan.ts","webpack://@brightsec/cli/./src/Commands/UploadArchive.ts","webpack://@brightsec/cli/./src/Commands/VersionCommand.ts","webpack://@brightsec/cli/./src/Commands/index.ts","webpack://@brightsec/cli/./src/Config/CliBuilder.ts","webpack://@brightsec/cli/./src/Config/CliInfo.ts","webpack://@brightsec/cli/./src/Config/ConfigReader.ts","webpack://@brightsec/cli/./src/Config/DefaultConfigReader.ts","webpack://@brightsec/cli/./src/Config/SystemConfigManager.ts","webpack://@brightsec/cli/./src/Config/index.ts","webpack://@brightsec/cli/./src/Discovery/DefaultDiscoveryPollingFactory.ts","webpack://@brightsec/cli/./src/Discovery/Discoveries.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryPolling.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryPollingFactory.ts","webpack://@brightsec/cli/./src/Discovery/DiscoveryView.ts","webpack://@brightsec/cli/./src/Discovery/RestDiscoveries.ts","webpack://@brightsec/cli/./src/Discovery/index.ts","webpack://@brightsec/cli/./src/EntryPoint/DefaultHostUpdateJobStatusPollingFactory.ts","webpack://@brightsec/cli/./src/EntryPoint/EntryPoints.ts","webpack://@brightsec/cli/./src/EntryPoint/HostUpdateJobStatusPolling.ts","webpack://@brightsec/cli/./src/EntryPoint/HostUpdateJobStatusPollingFactory.ts","webpack://@brightsec/cli/./src/EntryPoint/RestEntryPoints.ts","webpack://@brightsec/cli/./src/EntryPoint/index.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRepeaterCommandHub.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRepeaterServer.ts","webpack://@brightsec/cli/./src/Repeater/DefaultRuntimeDetector.ts","webpack://@brightsec/cli/./src/Repeater/NetworkTestType.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterCommandHub.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterLauncher.ts","webpack://@brightsec/cli/./src/Repeater/RepeaterServer.ts","webpack://@brightsec/cli/./src/Repeater/RuntimeDetector.ts","webpack://@brightsec/cli/./src/Repeater/ServerRepeaterLauncher.ts","webpack://@brightsec/cli/./src/Repeater/index.ts","webpack://@brightsec/cli/./src/RequestExecutor/Certificates.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesCache.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesLoader.ts","webpack://@brightsec/cli/./src/RequestExecutor/CertificatesResolver.ts","webpack://@brightsec/cli/./src/RequestExecutor/DefaultCertificatesCache.ts","webpack://@brightsec/cli/./src/RequestExecutor/DefaultCertificatesResolver.ts","webpack://@brightsec/cli/./src/RequestExecutor/HttpRequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/Protocol.ts","webpack://@brightsec/cli/./src/RequestExecutor/Request.ts","webpack://@brightsec/cli/./src/RequestExecutor/RequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/RequestExecutorOptions.ts","webpack://@brightsec/cli/./src/RequestExecutor/Response.ts","webpack://@brightsec/cli/./src/RequestExecutor/WsRequestExecutor.ts","webpack://@brightsec/cli/./src/RequestExecutor/index.ts","webpack://@brightsec/cli/./src/Scan/BasePolling.ts","webpack://@brightsec/cli/./src/Scan/Breakpoint.ts","webpack://@brightsec/cli/./src/Scan/BreakpointFactory.ts","webpack://@brightsec/cli/./src/Scan/BreakpointType.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/BreakpointException.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/OnSeverity.ts","webpack://@brightsec/cli/./src/Scan/Breakpoints/index.ts","webpack://@brightsec/cli/./src/Scan/DefaultBreakpointFactory.ts","webpack://@brightsec/cli/./src/Scan/DefaultPollingFactory.ts","webpack://@brightsec/cli/./src/Scan/PollingFactory.ts","webpack://@brightsec/cli/./src/Scan/RestScans.ts","webpack://@brightsec/cli/./src/Scan/Scans.ts","webpack://@brightsec/cli/./src/Scan/Severity.ts","webpack://@brightsec/cli/./src/Scan/index.ts","webpack://@brightsec/cli/./src/Scripts/DefaultVirtualScripts.ts","webpack://@brightsec/cli/./src/Scripts/FSScriptLoader.ts","webpack://@brightsec/cli/./src/Scripts/ScriptLoader.ts","webpack://@brightsec/cli/./src/Scripts/VirtualScript.ts","webpack://@brightsec/cli/./src/Scripts/VirtualScripts.ts","webpack://@brightsec/cli/./src/Scripts/index.ts","webpack://@brightsec/cli/./src/StartupScripts/DefaultStartupManager.ts","webpack://@brightsec/cli/./src/StartupScripts/StartupManager.ts","webpack://@brightsec/cli/./src/StartupScripts/index.ts","webpack://@brightsec/cli/./src/Utils/Backoff.ts","webpack://@brightsec/cli/./src/Utils/DefaultProxyFactory.ts","webpack://@brightsec/cli/./src/Utils/ErrorMessageFactory.ts","webpack://@brightsec/cli/./src/Utils/Helpers.ts","webpack://@brightsec/cli/./src/Utils/Logger.ts","webpack://@brightsec/cli/./src/Utils/NormalizeZlibDeflateTransformStream.ts","webpack://@brightsec/cli/./src/Utils/PatchedHttpsProxyAgent.ts","webpack://@brightsec/cli/./src/Utils/ProxyFactory.ts","webpack://@brightsec/cli/./src/Utils/Traceroute.ts","webpack://@brightsec/cli/./src/Utils/index.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/AuthConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/Connectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/ConnectivityAnalyzer.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/DefaultConnectivityAnalyzer.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/HTTPConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/TracerouteConnectivity.ts","webpack://@brightsec/cli/./src/Wizard/Connectivity/index.ts","webpack://@brightsec/cli/./src/Wizard/Credentials.ts","webpack://@brightsec/cli/./src/Wizard/FSTokens.ts","webpack://@brightsec/cli/./src/Wizard/Options.ts","webpack://@brightsec/cli/./src/Wizard/Platform.ts","webpack://@brightsec/cli/./src/Wizard/Readline/ReadlinePlatform.ts","webpack://@brightsec/cli/./src/Wizard/Readline/index.ts","webpack://@brightsec/cli/./src/Wizard/TestType.ts","webpack://@brightsec/cli/./src/Wizard/Tokens.ts","webpack://@brightsec/cli/./src/Wizard/index.ts","webpack://@brightsec/cli/./src/container.ts","webpack://@brightsec/cli/external commonjs \"@neuralegion/os-service\"","webpack://@brightsec/cli/external commonjs \"@neuralegion/raw-socket\"","webpack://@brightsec/cli/external commonjs \"@sentry/node\"","webpack://@brightsec/cli/external commonjs \"ajv\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/compile/formats\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/refs/json-schema-draft-04.json\"","webpack://@brightsec/cli/external commonjs \"ajv/lib/refs/json-schema-draft-07.json\"","webpack://@brightsec/cli/external commonjs \"arch\"","webpack://@brightsec/cli/external commonjs \"axios\"","webpack://@brightsec/cli/external commonjs \"better-ajv-errors\"","webpack://@brightsec/cli/external commonjs \"chalk\"","webpack://@brightsec/cli/external commonjs \"ci-info\"","webpack://@brightsec/cli/external commonjs \"fast-content-type-parse\"","webpack://@brightsec/cli/external commonjs \"find-up\"","webpack://@brightsec/cli/external commonjs \"form-data\"","webpack://@brightsec/cli/external commonjs \"http-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"https-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"iconv-lite\"","webpack://@brightsec/cli/external commonjs \"js-yaml\"","webpack://@brightsec/cli/external commonjs \"ms\"","webpack://@brightsec/cli/external commonjs \"reflect-metadata\"","webpack://@brightsec/cli/external commonjs \"rotating-file-stream\"","webpack://@brightsec/cli/external commonjs \"semver\"","webpack://@brightsec/cli/external commonjs \"socket.io-client\"","webpack://@brightsec/cli/external commonjs \"socket.io-msgpack-parser\"","webpack://@brightsec/cli/external commonjs \"socks-proxy-agent\"","webpack://@brightsec/cli/external commonjs \"tslib\"","webpack://@brightsec/cli/external commonjs \"tsyringe\"","webpack://@brightsec/cli/external commonjs \"win-ca\"","webpack://@brightsec/cli/external commonjs \"ws\"","webpack://@brightsec/cli/external commonjs \"yargs\"","webpack://@brightsec/cli/external node-commonjs \"assert\"","webpack://@brightsec/cli/external node-commonjs \"child_process\"","webpack://@brightsec/cli/external node-commonjs \"fs\"","webpack://@brightsec/cli/external node-commonjs \"node:assert\"","webpack://@brightsec/cli/external node-commonjs \"node:child_process\"","webpack://@brightsec/cli/external node-commonjs \"node:dgram\"","webpack://@brightsec/cli/external node-commonjs \"node:dns/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:events\"","webpack://@brightsec/cli/external node-commonjs \"node:fs\"","webpack://@brightsec/cli/external node-commonjs \"node:fs/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:http\"","webpack://@brightsec/cli/external node-commonjs \"node:https\"","webpack://@brightsec/cli/external node-commonjs \"node:module\"","webpack://@brightsec/cli/external node-commonjs \"node:net\"","webpack://@brightsec/cli/external node-commonjs \"node:os\"","webpack://@brightsec/cli/external node-commonjs \"node:path\"","webpack://@brightsec/cli/external node-commonjs \"node:process\"","webpack://@brightsec/cli/external node-commonjs \"node:readline\"","webpack://@brightsec/cli/external node-commonjs \"node:stream\"","webpack://@brightsec/cli/external node-commonjs \"node:timers/promises\"","webpack://@brightsec/cli/external node-commonjs \"node:tls\"","webpack://@brightsec/cli/external node-commonjs \"node:url\"","webpack://@brightsec/cli/external node-commonjs \"node:util\"","webpack://@brightsec/cli/external node-commonjs \"node:vm\"","webpack://@brightsec/cli/external node-commonjs \"node:zlib\"","webpack://@brightsec/cli/external node-commonjs \"path\"","webpack://@brightsec/cli/webpack/bootstrap","webpack://@brightsec/cli/./src/index.ts"],"sourcesContent":["export interface Spec {\n content: string | Buffer;\n filename: string;\n type: SpecType;\n contentType?: string;\n discard?: boolean;\n projectId?: string;\n headers?: Record<string, string>;\n variables?: Record<string, string>;\n}\n\nexport enum SpecType {\n HAR = 'HAR',\n OPENAPI = 'OpenAPI',\n POSTMAN = 'Postman'\n}\n\nexport interface Archives {\n upload(spec: Spec): Promise<string>;\n}\n\nexport const Archives: unique symbol = Symbol('Archives');\n","import { Validator } from '../Validators';\nimport { File, Parser } from './Parser';\nimport { access, constants, readFile, stat } from 'node:fs/promises';\nimport { ok } from 'assert';\nimport { basename, extname } from 'path';\n\nexport class BaseParser<T> implements Parser {\n private readonly FILE_SIZE_LIMIT = 500 * 1024 ** 2;\n\n constructor(protected readonly validator: Validator<T>) {}\n\n public async parse(path: string): Promise<File> {\n await this.access(path);\n\n const fileStat = await stat(path);\n\n if (fileStat.size > this.FILE_SIZE_LIMIT) {\n throw new Error('There is not enough storage space to save this file');\n }\n\n const content: string = await readFile(path, 'utf8');\n const ext: string = extname(path);\n\n let data: T | undefined;\n\n try {\n data = await this.deserialize(content, {\n ext\n });\n } catch (e) {\n throw new Error(`File is invalid. ${e.message}`);\n }\n\n await this.validator.validate(data);\n\n return {\n content,\n filename: basename(path),\n contentType: this.contentType(ext)\n };\n }\n\n protected deserialize(file: string, _meta?: { ext: string }): Promise<T> | T {\n return JSON.parse(file) as T;\n }\n\n private contentType(ext: string): string {\n switch (ext) {\n case '.yml':\n case '.yaml':\n return 'application/yaml';\n case '.json':\n default:\n return 'application/json';\n }\n }\n\n private async access(path: string): Promise<never | void> {\n ok(path, `The path is invalid.`);\n\n try {\n await access(path, constants.F_OK);\n } catch (e) {\n throw new Error(`${basename(path)} file doesn't found.`);\n }\n }\n}\n","import { SpecType } from '../Archives';\nimport { HarValidator, OasValidator, PostmanValidator } from '../Validators';\nimport { ParserFactory } from './ParserFactory';\nimport { BaseParser } from './BaseParser';\nimport { OasParser } from './OasParser';\nimport { Parser } from './Parser';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultParserFactory implements ParserFactory {\n constructor(\n private readonly harValidator: HarValidator,\n private readonly oasValidator: OasValidator,\n private readonly postmanValidator: PostmanValidator\n ) {}\n\n public create(spec: SpecType): Parser | never {\n switch (spec) {\n case SpecType.HAR:\n return new BaseParser(this.harValidator);\n case SpecType.OPENAPI:\n return new OasParser(this.oasValidator);\n case SpecType.POSTMAN:\n return new BaseParser(this.postmanValidator);\n default:\n throw new Error('Incorrect a specification type');\n }\n }\n}\n","import { Validator } from '../Validators';\nimport { BaseParser } from './BaseParser';\n\nexport class OasParser extends BaseParser<any> {\n constructor(validator: Validator<any>) {\n super(validator);\n }\n\n protected async deserialize(\n file: string,\n meta: { ext: string }\n ): Promise<any> {\n if (meta.ext === '.yml' || meta.ext === '.yaml') {\n return (await import('js-yaml')).load(file);\n } else {\n return JSON.parse(file);\n }\n }\n}\n","import { Parser } from './Parser';\nimport { SpecType } from '../Archives';\n\nexport interface ParserFactory {\n create(spec: SpecType): Parser;\n}\n\nexport const ParserFactory: unique symbol = Symbol('ParserFactory');\n","export * from './OasParser';\nexport * from './BaseParser';\nexport * from './Parser';\nexport * from './DefaultParserFactory';\nexport * from './ParserFactory';\n","import { Archives, Spec, SpecType } from './Archives';\nimport { ProxyFactory } from '../Utils';\nimport { inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport FormData from 'form-data';\nimport { ok } from 'node:assert';\nimport https from 'node:https';\nimport http from 'node:http';\n\nexport interface RestArchivesOptions {\n insecure?: boolean;\n timeout?: number;\n baseURL: string;\n apiKey: string;\n proxyURL?: string;\n}\n\nexport const RestArchivesOptions: unique symbol = Symbol('RestArchivesOptions');\n\n@injectable()\nexport class RestArchives implements Archives {\n private readonly client: Axios;\n private readonly ALLOWED_SPECS: readonly SpecType[] = [\n SpecType.OPENAPI,\n SpecType.POSTMAN,\n SpecType.HAR\n ];\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestArchivesOptions)\n {\n baseURL,\n apiKey,\n proxyURL,\n insecure,\n timeout = 10000\n }: RestArchivesOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async upload(spec: Spec): Promise<string> {\n ok(\n this.ALLOWED_SPECS.includes(spec.type),\n `Invalid specification type. Allowed: ${this.ALLOWED_SPECS}`\n );\n\n const { discard, headers, variables, projectId } = spec;\n const file = this.castToFile(spec);\n\n const formData = new FormData();\n formData.append('file', file.value, file.options);\n formData.append('projectId', projectId);\n formData.append('headers', JSON.stringify(headers ?? {}));\n formData.append('variables', JSON.stringify(variables ?? {}));\n const res = await this.client.post<{ id: string }>(\n '/api/v1/files',\n formData,\n {\n params: { discard }\n }\n );\n\n return res.data.id;\n }\n\n private castToFile({\n filename,\n content,\n contentType = 'application/json'\n }: Spec): {\n options: { filename: string; contentType: string };\n value: Buffer;\n } {\n return {\n options: {\n filename,\n contentType\n },\n value: Buffer.from(content)\n };\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport schema from './schemas/har/schema.json';\nimport { Entry, Har } from 'har-format';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport betterAjvErrors from 'better-ajv-errors';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class HarValidator implements Validator<Har> {\n private readonly ajv: Ajv.Ajv;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n async: true,\n jsonPointers: true,\n extendRefs: true\n });\n this.ajv.addSchema(schema);\n }\n\n public async validate(data: Har): Promise<void | never> {\n const validate: ValidateFunction = this.ajv.getSchema('har');\n\n if (!(await validate(data))) {\n logger.error(\n betterAjvErrors(validate.schema, data, validate.errors, {\n indent: 2\n }) as any\n );\n throw new Error(`The HAR file is corrupted.`);\n }\n\n if (!this.entriesAreValid(data.log.entries)) {\n throw new Error(`HAR is empty or contains none of request.`);\n }\n }\n\n private entriesAreValid(entries: Entry[]): boolean {\n if (!entries) {\n return false;\n }\n\n const urls: string[] = entries\n .map(this.parseEntry, this)\n .filter((item: string) => !!item);\n\n const targets: string[] = [...new Set(urls)];\n\n return targets.length !== 0;\n }\n\n private parseEntry(entry: Entry): string | undefined {\n const { host, protocol } = new URL(entry.request.url);\n\n if (!host || !protocol) {\n return;\n }\n\n if (protocol === 'chrome-extension:') {\n return;\n }\n\n return entry.request.url;\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport schemaV2 from './schemas/openapi/v2.0/schema.json';\nimport schemaV3 from './schemas/openapi/v3.0/schema.json';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport semver from 'semver';\nimport betterAjvErrors from 'better-ajv-errors';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport ajvFormats from 'ajv/lib/compile/formats';\nimport draft4 from 'ajv/lib/refs/json-schema-draft-04.json';\nimport { injectable } from 'tsyringe';\nimport { ok } from 'node:assert';\n\n@injectable()\nexport class OasValidator implements Validator<any> {\n private readonly ajv: Ajv.Ajv;\n private readonly MIN_ALLOWED_VERSION = '2.0.0';\n private readonly VERSION_SCHEMA_MAP = new Map([\n [2, 'http://swagger.io/v2/schema.json#'],\n [3, 'https://spec.openapis.org/oas/3.0/schema/2019-04-02']\n ]);\n private readonly SCHEMAS: readonly unknown[] = [schemaV2, schemaV3];\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n $data: true,\n jsonPointers: true,\n extendRefs: true,\n async: true,\n schemaId: 'auto'\n });\n this.ajv.addFormat('uriref', ajvFormats.full['uri-reference']);\n this.ajv.addMetaSchema(draft4);\n (this.ajv as any)._refs['http://json-schema.org/schema'] =\n 'http://json-schema.org/draft-04/schema'; // optional, using unversioned URI is out of spec\n this.SCHEMAS.forEach((x: any) => this.ajv.addSchema(x));\n }\n\n public async validate(spec: any): Promise<void | never> {\n const version = this.getVersion(spec);\n\n const schemaNotFound =\n 'Cannot determine version of schema. Schema ID is missed.';\n const major = semver.major(version);\n const schemaId = this.VERSION_SCHEMA_MAP.get(major);\n\n ok(schemaId, schemaNotFound);\n\n this.validateVersion(spec);\n\n const validate: ValidateFunction = this.ajv.getSchema(schemaId);\n\n if (!(await validate(spec))) {\n logger.error(\n betterAjvErrors(validate.schema, spec, validate.errors, {\n indent: 2\n }) as any\n );\n throw new Error(`The OAS file is corrupted.`);\n }\n }\n\n private validateVersion(spec: any): void | never {\n const version = this.getVersion(spec);\n\n if (!semver.gte(version, this.MIN_ALLOWED_VERSION)) {\n throw new Error(\n 'Swagger v1 are not supported. If you are using an older format, convert it to v2 and try again.'\n );\n }\n }\n\n private getVersion(spec: any): string {\n let version = (spec.openapi || spec.swagger || '').trim();\n\n ok(version, 'Cannot determine version of specification.');\n\n if (\n !semver.valid(version) &&\n this.MIN_ALLOWED_VERSION.startsWith(version)\n ) {\n version = this.MIN_ALLOWED_VERSION;\n }\n\n return version;\n }\n}\n","import { Validator } from './Validator';\nimport { logger } from '../../Utils';\nimport collectionV2Draft7 from './schemas/postman/draft-07/v2.0.0/collection.json';\nimport collectionV2Draft4 from './schemas/postman/draft-04/v2.0.0/collection.json';\nimport collectionDraft7 from './schemas/postman/draft-07/v2.1.0/collection.json';\nimport collectionDraft4 from './schemas/postman/draft-04/v2.1.0/collection.json';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport betterAjvErrors from 'better-ajv-errors';\nimport schemaDraft04 from 'ajv/lib/refs/json-schema-draft-04.json';\nimport schemaDraft07 from 'ajv/lib/refs/json-schema-draft-07.json';\nimport { injectable } from 'tsyringe';\nimport { ok } from 'node:assert';\nimport { parse } from 'node:path';\n\n@injectable()\nexport class PostmanValidator implements Validator<any> {\n private readonly ajv: Ajv.Ajv;\n private readonly ALLOWED_SCHEMAS: readonly string[] = [\n 'https://schema.getpostman.com/json/draft-07/collection/v2.0.0/',\n 'https://schema.getpostman.com/json/draft-07/collection/v2.1.0/',\n 'https://schema.getpostman.com/json/collection/v2.0.0/',\n 'https://schema.getpostman.com/json/collection/v2.1.0/'\n ];\n private readonly META_SCHEMAS: readonly unknown[] = [\n schemaDraft04,\n schemaDraft07\n ];\n private readonly SCHEMAS: readonly unknown[] = [\n collectionV2Draft7,\n collectionV2Draft4,\n collectionDraft7,\n collectionDraft4\n ];\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n async: true,\n meta: false,\n schemaId: 'auto'\n });\n []\n .concat(this.META_SCHEMAS, this.SCHEMAS)\n .forEach((x: unknown) => this.ajv.addMetaSchema(x as any));\n (this.ajv as any)._refs['http://json-schema.org/schema'] =\n 'http://json-schema.org/draft-04/schema'; // optional, using unversioned URI is out of spec\n }\n\n public async validate(collection: any): Promise<void | never> {\n ok(collection, 'Postman collection is not provided.');\n ok(collection.info, '\"info\" section is missed in the collection.');\n\n const schemaId: string = collection.info.schema\n ? parse(collection.info.schema).dir + '/'\n : '';\n\n if (!this.ALLOWED_SCHEMAS.includes(schemaId.trim())) {\n throw new Error(\n 'Postman v1 collections are not supported. If you are using an older format, convert it to v2 and try again.'\n );\n }\n const validate: ValidateFunction | undefined = this.ajv.getSchema(schemaId);\n\n if (!validate) {\n throw new Error(\n 'Cannot determine version of schema. Schema ID is missed.'\n );\n }\n\n if (!(await validate(collection))) {\n logger.error(\n betterAjvErrors(validate.schema, collection, validate.errors, {\n indent: 2\n }) as any\n );\n\n throw new Error(`The Postman Collection file is corrupted.`);\n }\n }\n}\n","export * from './HarValidator';\nexport * from './OasValidator';\nexport * from './PostmanValidator';\nexport * from './Validator';\n","export * from './Archives';\nexport * from './RestArchives';\nexport { Parser, ParserFactory, DefaultParserFactory } from './Parsers';\nexport { Validator } from './Validators';\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport { ConnectivityUrls, Platform, TestType, Options } from '../Wizard';\nimport container from '../container';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class Configure implements CommandModule {\n public readonly command = 'configure [options]';\n public readonly describe = 'Start a configuration wizard';\n\n private static getMapEntryOrThrow(\n type: TestType,\n input: string\n ): [TestType, URL] {\n try {\n return [type, new URL(input)];\n } catch (err) {\n throw new Error(`Invalid value for ${type} testing endpoint`);\n }\n }\n\n public builder(argv: Argv): Argv {\n return argv\n .option(TestType.HTTP, {\n hidden: true,\n requiresArg: true,\n describe: `Bright application base URL`\n })\n .option(TestType.AUTH, {\n hidden: true,\n requiresArg: true,\n describe: `Bright event message authentication endpoint`\n })\n .option('ping', {\n boolean: true,\n describe: `Start network tests.`\n })\n .option('traceroute', {\n boolean: true,\n describe: `Start treceroute to a local recource.`\n })\n .option('max-ttl', {\n number: true,\n requiresArg: true,\n describe: `Set the max time-to-live (max number of hops) used in outgoing probe packets.`,\n default: 64\n })\n .option('probes', {\n alias: 'p',\n number: true,\n requiresArg: true,\n describe: `Set the number of probes per 'ttl'.`,\n default: 3\n })\n .group(['max-ttl', 'probes'], 'Traceroute Options')\n .conflicts('ping', 'traceroute')\n .middleware((args: Arguments) => {\n container\n .register<Options>(Options, {\n useValue: {\n traceroute: {\n maxTTL: !isNaN(+args.maxTtl) ? +args.maxTtl : undefined,\n probes: !isNaN(+args.probes) ? +args.probes : undefined\n }\n }\n })\n .register(ConnectivityUrls, {\n useValue: new Map([\n Configure.getMapEntryOrThrow(\n TestType.HTTP,\n (args[TestType.HTTP] ?? args.api) as string\n ),\n Configure.getMapEntryOrThrow(\n TestType.AUTH,\n (args[TestType.AUTH] ?? args.api) as string\n )\n ])\n });\n });\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const app = container.resolve<Platform>(Platform);\n\n const stop = async () => {\n await app.stop();\n process.exit(0);\n };\n\n process.on('SIGTERM', stop).on('SIGINT', stop).on('SIGHUP', stop);\n await app.start({ ping: !!args.ping, traceroute: !!args.traceroute });\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'configure' })\n );\n process.exit(1);\n }\n }\n}\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport {\n EntryPoints,\n RestProjectsOptions,\n UpdateHostOptions\n} from '../EntryPoint';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class EntryPointsUpdateHost implements CommandModule {\n public readonly command = 'entrypoints:update-host [options]';\n public readonly describe = 'Bulk update target entry points host.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('old-hostname', {\n alias: 'o',\n describe: 'Old hostname of entrypoints.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('new-hostname', {\n alias: 'n',\n describe: 'New hostname of entrypoints.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('entrypoint-ids', {\n alias: 'e',\n describe: 'IDs of entrypoints to update.',\n string: true,\n requiresArg: true,\n array: true\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const entryPointsManager: EntryPoints = container.resolve(EntryPoints);\n\n const projectId = args.project as string;\n\n const { taskId } = await entryPointsManager.updateHost({\n projectId,\n entryPointIds: args.entrypointIds as undefined | string[],\n newHostname: args.newHostname as string,\n oldHostname: args.oldHostname as string\n } as UpdateHostOptions);\n\n // eslint-disable-next-line no-console\n console.log(taskId);\n\n process.exitCode = 0;\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host'\n })\n );\n process.exitCode = 1;\n }\n }\n}\n","import { EntryPoint, EntryPoints, RestProjectsOptions } from '../EntryPoint';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class GetEntryPoints implements CommandModule {\n public readonly command = 'entrypoints:list [options]';\n public readonly describe = 'get all entrypoints of the project.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n requiresArg: true,\n demandOption: true\n })\n .option('verbose', {\n describe: 'Enable verbose mode',\n boolean: true,\n default: false\n })\n .option('limit', {\n describe: 'Limit the number of entrypoints',\n default: 10\n })\n .option('pretty', {\n describe: 'Pretty print the output',\n boolean: true,\n default: false\n })\n .option('connectivity', {\n describe: 'Filter by connectivity',\n array: true,\n choices: [\n 'ok',\n 'unreachable',\n 'problem',\n 'skipped',\n 'unauthorized',\n 'unavailable'\n ]\n })\n .option('status', {\n describe: 'Filter by status',\n array: true,\n choices: ['new', 'changed', 'tested', 'vulnerable']\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n const entryPointsManager: EntryPoints = container.resolve(EntryPoints);\n\n try {\n const entryPoints: EntryPoint[] = await entryPointsManager.entrypoints({\n projectId: args.project as string,\n limit: args.limit as number,\n connectivity: args.connectivity as string[],\n status: args.status as string[]\n });\n\n const ep = args.verbose\n ? entryPoints\n : entryPoints.map((entryPoint) => ({\n id: entryPoint.id,\n method: entryPoint.method,\n url: entryPoint.url\n }));\n\n // eslint-disable-next-line no-console\n console.log(\n args.pretty ? JSON.stringify(ep, null, 2) : JSON.stringify(ep)\n );\n\n process.exitCode = 0;\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:list'\n })\n );\n process.exitCode = 1;\n }\n }\n}\n","import { RestDiscoveryOptions } from 'src/Discovery';\nimport { DiscoveryPollingFactory } from 'src/Discovery/DiscoveryPollingFactory';\nimport { ErrorMessageFactory, logger } from 'src/Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class PollingDiscoveryStatus implements CommandModule {\n public readonly command = 'discovery:polling [options] <discoveryId>';\n public readonly describe =\n 'Allows to configure a polling of discovery status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'The sampling interval between status checks. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a discovery status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery.',\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory = container.resolve<DiscoveryPollingFactory>(\n DiscoveryPollingFactory\n );\n const polling = pollingFactory.create({\n discoveryId: args.discoveryId as string,\n projectId: args.project as string,\n timeout: args.timeout as number,\n interval: args.interval as number\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { ErrorMessageFactory, logger } from '../Utils';\nimport { HostUpdateJobStatusPollingFactory } from '../EntryPoint/HostUpdateJobStatusPollingFactory';\nimport { RestProjectsOptions } from '../EntryPoint';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class PollingHostUpdateJobStatus implements CommandModule {\n public readonly command = 'entrypoints:update-host-polling [options] <jobId>';\n public readonly describe =\n 'Allows to configure a polling of host update job status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a host update job status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a host update job status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .positional('jobId', {\n describe: 'ID of an existing update host job which you want to check.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestProjectsOptions>(RestProjectsOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory =\n container.resolve<HostUpdateJobStatusPollingFactory>(\n HostUpdateJobStatusPollingFactory\n );\n const polling = pollingFactory.create({\n timeout: args.timeout as number,\n interval: args.interval as number,\n jobId: args.jobId as string,\n projectId: args.project as string\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host-polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import {\n BreakpointException,\n BreakpointType,\n PollingFactory,\n RestScansOptions\n} from '../Scan';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class PollingScanStatus implements CommandModule {\n public readonly command = 'scan:polling [options] <scanId>';\n public readonly describe = 'Allows to configure a polling of scan status.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('interval', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a scan status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.',\n default: 5000\n })\n .option('timeout', {\n requiresArg: true,\n describe:\n 'Period of time between the end of a timeout period or completion of a scan status request, and the next request for status. ' +\n 'Eg: 60, \"2min\", \"10h\", \"7d\". A numeric value is interpreted as a milliseconds count.'\n })\n .option('breakpoint', {\n alias: 'b',\n choices: Helpers.toArray(BreakpointType),\n string: true,\n describe:\n 'A conditional breakpoint that allows to finish the process with exit code 50 only after fulfilling the predefined condition.',\n requiresArg: true,\n default: BreakpointType.ANY\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to check.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const pollingFactory = container.resolve<PollingFactory>(PollingFactory);\n const polling = pollingFactory.create({\n scanId: args.scanId as string,\n timeout: args.timeout as number,\n interval: args.interval as number,\n breakpoint: args.breakpoint as BreakpointType\n });\n\n await polling.start();\n\n process.exit(0);\n } catch (error) {\n if (error instanceof BreakpointException) {\n logger.error(`The breakpoint has been hit during polling.`);\n logger.error(`Breakpoint: ${error.message}`);\n process.exit(50);\n }\n\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'scan:polling'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, RestDiscoveryOptions } from 'src/Discovery';\nimport { ErrorMessageFactory, logger } from 'src/Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class RerunDiscovery implements CommandModule {\n public readonly command = 'discovery:rerun [options] <discoveryId>';\n public readonly describe =\n 'Request to start a new discovery using the same configuration as an existing discovery, by discovery ID.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery which you want to re-run.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: any): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n const projectId = args.project as string;\n const discoveryId = args.discoveryId as string;\n const newDiscoveryId = await discoveryManager.rerun(\n projectId,\n discoveryId\n );\n\n // eslint-disable-next-line no-console\n console.log(newDiscoveryId);\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:rerun'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { RestScansOptions, Scans } from '../Scan';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class RetestScan implements CommandModule {\n public readonly command = 'scan:retest [options] <scanId>';\n public readonly describe =\n 'Request to start a new scan using the same configuration as an existing scan, by scan ID.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to re-run.',\n type: 'string',\n demandOption: true\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n const scanId: string = await scanManager.retest(args.scanId as string);\n\n // eslint-disable-next-line no-console\n console.log(scanId);\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'scan:retest'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, DiscoveryConfig } from '../Discovery';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { RestDiscoveryOptions } from '../Discovery/RestDiscoveries';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class RunDiscovery implements CommandModule {\n public readonly command = 'discovery:run [options]';\n public readonly describe =\n 'Start a new discovery for the received configuration.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n describe: 'ID of the project',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('name', {\n alias: 'n',\n describe: 'Name of the discovery.',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('auth', {\n alias: 'o',\n describe: 'Auth object ID.',\n string: true,\n requiresArg: true\n })\n .option('repeater', {\n alias: 'agent',\n requiresArg: true,\n array: true,\n describe: 'ID of any repeaters connected with the discovery.'\n })\n .option('archive', {\n alias: 'a',\n normalize: true,\n requiresArg: true,\n describe:\n \"A collection of your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension'\n })\n .option('crawler', {\n alias: 'c',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific urls that should be included into crawler.'\n })\n .conflicts('archive', 'crawler')\n .check((args) => {\n if (args.archive && args.crawler) {\n throw new Error(\n 'Arguments --archive and --crawler are mutually exclusive'\n );\n }\n\n if (!args.archive && !args.crawler) {\n throw new Error('Either --archive or --crawler must be specified');\n }\n\n return true;\n })\n .option('host-filter', {\n alias: 'F',\n requiresArg: true,\n array: true,\n describe: 'A list of specific hosts that should be included into scan.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.'\n })\n .option('smart', {\n boolean: true,\n describe:\n 'Use automatic smart decisions such as: parameter skipping, detection phases, etc. to minimize scan time.'\n })\n .option('crawl-parent-subdomains', {\n boolean: true,\n describe: 'Crawl parent path folders and subdomains',\n default: false\n })\n .option('concurrency', {\n number: true,\n default: 10,\n describe:\n 'Number of maximum concurrent requests allowed to be sent to the target, can range between 1 to 50 (default: 10).',\n requiresArg: true\n })\n .option('interactions-depth', {\n number: true,\n default: 3,\n describe:\n 'Number of maximum interactions with nested objects, can range between 1 to 5 (default: 3).',\n requiresArg: true\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n\n const projectId = args.project as string;\n\n const { id: discoveryId, warnings } = await discoveryManager.create(\n projectId,\n {\n name: args.name,\n authObjectId: args.auth,\n hostsFilter: args.hostFilter,\n crawlerUrls: args.crawler,\n fileId: args.archive,\n repeaters: args.repeater,\n optimizedCrawler: args.smart,\n poolSize: args.concurrency,\n maxInteractionsChainLength: args.interactionsDepth,\n subdomainsCrawl: args.crawlParentSubdomains,\n headers: args.header\n } as DiscoveryConfig\n );\n\n // eslint-disable-next-line no-console\n console.log(discoveryId);\n\n if (warnings?.length) {\n logger.warn(\n `${warnings.map((warning) => warning.message).join('\\n')}\\n`\n );\n }\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:run'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { Cert, RequestExecutorOptions } from '../RequestExecutor';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport container from '../container';\nimport { DefaultRepeaterServerOptions, RepeaterLauncher } from '../Repeater';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { captureException } from '@sentry/node';\nimport { normalize } from 'node:path';\nimport process from 'node:process';\n\nexport class RunRepeater implements CommandModule {\n public readonly command = 'repeater [options]';\n public readonly describe = 'Starts an on-prem agent.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('id', {\n alias: 'agent',\n describe:\n 'ID of an existing repeater which you want to use to run a new scan.',\n type: 'string',\n requiresArg: true,\n demandOption: true\n })\n .option('scripts', {\n alias: 'S',\n requiresArg: true,\n string: true,\n describe:\n 'JSON string which contains script list, which is initially empty and consists of zero or more host and path pairs. Example: {\"*.example.com\": \"./hmac.js\"}',\n coerce(arg: string): Record<string, string> {\n return JSON.parse(arg);\n }\n })\n .option('timeout', {\n number: true,\n requiresArg: true,\n default: 30000,\n describe:\n 'Time to wait for a server to send response headers (and start the response body) before aborting the request.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n conflicts: ['headers'],\n array: true,\n describe:\n 'A list of specific headers that should be included into request.',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .option('headers', {\n requiresArg: true,\n deprecated: 'Use --header instead.',\n string: true,\n conflicts: ['header'],\n describe:\n 'JSON string which contains header list, which is initially empty and consists of zero or more name and value pairs. Example: {\"x-slack-signature\": \"Z2dFIHJldHNhRQ\"}',\n coerce(arg: string): Record<string, string> {\n return JSON.parse(arg);\n }\n })\n .option('cacert', {\n default: false,\n requiresArg: true,\n describe:\n 'The path to file which may contain multiple CA certificates. Example: /etc/ssl/certs/ca-certificates.crt',\n coerce(arg: string): string | boolean {\n return typeof arg === 'string' || typeof arg === 'boolean'\n ? arg\n : false;\n }\n })\n .option('cert', {\n requiresArg: true,\n array: true,\n string: true,\n describe:\n 'The certificate must be in PKCS, or PEM format. Example: {\"hostname\": \"example.com\", \"path\": \"./example.pem\", \"passphrase\": \"pa$$word\", \"port\": \"1234\"}.',\n coerce(args: string[]): Cert[] {\n return args\n .map((arg: string) => JSON.parse(arg))\n .map(({ path, hostname, passphrase, port }: Cert) => {\n if (!path) {\n logger.error(\n 'Error during \"repeater\": Specify the path to your client certificate file.'\n );\n process.exit(1);\n }\n\n if (!hostname) {\n logger.error(\n 'Error during \"repeater\": Specify the hostname (without protocol and port) of the request URL for which you want to use the certificate.'\n );\n process.exit(1);\n }\n\n return {\n hostname,\n passphrase,\n path: normalize(path),\n port\n };\n });\n }\n })\n .option('experimental-connection-reuse', {\n deprecated: 'Use --ntlm instead',\n boolean: true,\n describe: 'Configure ntlm support (enables TCP connection reuse)'\n })\n .option('ntlm', {\n boolean: true,\n describe: 'Configure ntlm support (enables TCP connection reuse)'\n })\n .option('daemon', {\n requiresArg: false,\n alias: 'd',\n describe: 'Run as repeater in daemon mode'\n })\n .option('run', {\n requiresArg: false,\n hidden: true\n })\n .option('remove-daemon', {\n requiresArg: false,\n alias: ['rm', 'remove'],\n describe: 'Stop and remove repeater daemon'\n })\n .option('proxy-domains', {\n requiresArg: true,\n array: true,\n describe:\n 'Space-separated list of domains that should be routed through the proxy. This option is only applicable when using the --proxy option',\n coerce(arg: string[]): string[] {\n if (arg[0] === undefined) {\n return undefined;\n }\n\n // if values are passed from env variable, they are passed as a single string\n if (arg.length === 1) {\n if (arg[0].includes(' ')) {\n return arg[0].trim().split(' ');\n }\n\n return arg;\n }\n\n return arg;\n }\n })\n .option('proxy-domains-bypass', {\n requiresArg: true,\n array: true,\n default: process.env.NO_PROXY?.trim()\n .split(',')\n .map((domain) => domain.trim()),\n describe:\n 'Space-separated list of domains that should not be routed through the proxy. This option is only applicable when using the --proxy option',\n coerce(arg: string[]): string[] {\n // if values are passed from env variable, they are passed as a single string\n if (arg.length === 1) {\n if (arg[0] === undefined) {\n return undefined;\n }\n\n if (arg[0].includes(' ')) {\n return arg[0].trim().split(' ');\n }\n\n return arg;\n }\n\n return arg;\n }\n })\n .conflicts({\n daemon: 'remove-daemon',\n ntlm: ['proxy', 'experimental-connection-reuse']\n })\n .conflicts('proxy-domains', 'proxy-domains-bypass')\n .env('REPEATER')\n .middleware((args: Arguments) => {\n if (Object.hasOwnProperty.call(args, '')) {\n // handling the case of having REPEATER environment variable w/o suffix,\n // that results in yargs option with empty name\n delete args[''];\n }\n }, true)\n .exitProcess(false)\n .check((args: Arguments) => {\n const id = args.id as string;\n if (!Helpers.isShortUUID(id) && !Helpers.isUUID(id)) {\n throw new Error(\n 'Option --id has wrong value. Please ensure that --id option has a valid ID.'\n );\n }\n\n const proxyDomains = (args.proxyDomains as string[]) ?? [];\n for (const domain of proxyDomains) {\n if (domain.includes(',')) {\n throw new Error(\n `Option --proxy-domains has a wrong value.` +\n `Please ensure that --proxy-domains option has space separated list of domain values`\n );\n }\n }\n\n const proxyDomainsBypass = (args.proxyDomainsBypass as string[]) ?? [];\n for (const domain of proxyDomainsBypass) {\n if (domain.includes(',')) {\n throw new Error(\n `Option --proxy-domain-bypass has wrong value.` +\n `Please ensure that --proxy-domain-bypass option has space separated list of domain values`\n );\n }\n }\n\n return true;\n })\n .middleware((args: Arguments) => {\n container\n .register<RequestExecutorOptions>(RequestExecutorOptions, {\n useValue: {\n headers: (args.header ?? args.headers) as Record<string, string>,\n timeout: args.timeout as number,\n proxyUrl: (args.proxyTarget ?? args.proxy) as string,\n certs: args.cert as Cert[],\n maxBodySize: Infinity,\n maxContentLength: 100,\n reuseConnection:\n !!args.ntlm || !!args.experimentalConnectionReuse,\n whitelistMimes: [\n { type: 'text/html', allowTruncation: false },\n { type: 'text/plain', allowTruncation: true },\n { type: 'text/css', allowTruncation: false },\n { type: 'text/javascript', allowTruncation: false },\n { type: 'text/markdown', allowTruncation: true },\n { type: 'text/xml', allowTruncation: false },\n { type: 'application/javascript', allowTruncation: false },\n { type: 'application/x-javascript', allowTruncation: false },\n { type: 'application/json', allowTruncation: false },\n { type: 'application/xml', allowTruncation: false },\n {\n type: 'application/x-www-form-urlencoded',\n allowTruncation: false\n },\n { type: 'application/msgpack', allowTruncation: false },\n { type: 'application/ld+json', allowTruncation: false },\n { type: 'application/graphql', allowTruncation: false }\n ],\n proxyDomains: args.proxyDomains as string[],\n proxyDomainsBypass: args.proxyDomainsBypass as string[]\n }\n })\n .register<DefaultRepeaterServerOptions>(\n DefaultRepeaterServerOptions,\n {\n useValue: {\n uri: args.repeaterServer as string,\n token: args.token as string,\n connectTimeout: args.timeout as number,\n proxyUrl: (args.proxyBright ?? args.proxy) as string,\n insecure: args.insecure as boolean\n }\n }\n );\n });\n }\n\n // eslint-disable-next-line complexity\n public async handler(args: Arguments): Promise<void> {\n const repeaterLauncher: RepeaterLauncher =\n container.resolve(RepeaterLauncher);\n\n if (args.cacert) {\n await repeaterLauncher.loadCerts(\n typeof args.cacert === 'string' ? args.cacert : undefined\n );\n }\n\n if (args.scripts) {\n await repeaterLauncher.loadScripts(\n args.scripts as Record<string, string>\n );\n }\n\n if (args.remove) {\n await repeaterLauncher.uninstall();\n process.exitCode = 0;\n\n return;\n }\n\n if (args.daemon) {\n await repeaterLauncher.install();\n process.exitCode = 0;\n\n return;\n }\n\n try {\n ['SIGTERM', 'SIGINT', 'SIGHUP'].forEach((event) =>\n process.on(event, async () => {\n await repeaterLauncher.close();\n process.exitCode = 0;\n })\n );\n\n await repeaterLauncher.run(args.id as string, args.run as boolean);\n } catch (error) {\n captureException(error);\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'repeater' })\n );\n await repeaterLauncher.close();\n process.exitCode = 1;\n }\n }\n}\n","import {\n AttackParamLocation,\n Module,\n RequestExclusion,\n RestScansOptions,\n ScanConfig,\n Scans,\n ATTACK_PARAM_LOCATIONS_DEFAULT\n} from '../Scan';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\nimport { EOL } from 'node:os';\n\nexport class RunScan implements CommandModule {\n public readonly command = 'scan:run [options]';\n public readonly describe = 'Start a new scan for the received configuration.';\n\n public static excludeEntryPoint(args: string[]): RequestExclusion[] {\n return args\n .map((arg: string) => JSON.parse(arg))\n .map(({ methods = [], patterns = [] }: Partial<RequestExclusion>) => {\n const nonEmptyPatterns = patterns.filter((pattern) => !!pattern);\n\n if (!nonEmptyPatterns.length) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n command: 'scan:run',\n error:\n 'please make sure that patterns contain at least one regexp'\n })\n );\n process.exit(1);\n }\n\n return {\n methods: [...new Set(methods)],\n patterns: [...new Set(nonEmptyPatterns)]\n };\n });\n }\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('name', {\n alias: 'n',\n describe: 'Name of the scan.',\n requiresArg: true,\n demandOption: true\n })\n .option('auth', {\n alias: 'o',\n describe: 'Auth object ID.',\n requiresArg: true\n })\n .option('repeater', {\n alias: 'agent',\n requiresArg: true,\n array: true,\n describe: 'ID of any repeaters connected with the scan.'\n })\n .option('archive', {\n alias: 'a',\n normalize: true,\n requiresArg: true,\n describe:\n \"A collection your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension'\n })\n .option('crawler', {\n alias: 'c',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific urls that should be included into crawler.'\n })\n .option('test', {\n array: true,\n describe:\n 'A list of tests to run during a scan. ' +\n `If no tests are specified, the default tests will be run.${EOL}` +\n `For more information about the available tests, please refer to the documentation: https://docs.brightsec.com/docs/vulnerabilities-index${EOL}`\n })\n .option('bucket', {\n array: true,\n describe: 'A list of test buckets which you want to run during a scan.'\n })\n .option('project', {\n alias: 'p',\n requiresArg: true,\n string: true,\n describe: 'ID of the project'\n })\n .option('template', {\n alias: 'tp',\n requiresArg: false,\n string: true,\n describe: 'Scan template ID'\n })\n .option('module', {\n default: Module.DAST,\n requiresArg: true,\n choices: Helpers.toArray(Module),\n describe:\n 'The dast module tests for specific scenarios, mainly OWASP top 10 and other common scenarios. ' +\n 'The fuzzer module generates various scenarios to test for unknown vulnerabilities, ' +\n 'providing automated AI led fuzzing testing. This module can be coupled with the repeater to find additional vulnerabilities.'\n })\n .option('host-filter', {\n alias: 'F',\n requiresArg: true,\n array: true,\n describe: 'A list of specific hosts that should be included into scan.'\n })\n .option('header', {\n alias: 'H',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.'\n })\n .option('exclude-param', {\n requiresArg: true,\n array: true,\n string: true,\n describe:\n 'A list of regex patterns for parameter names you would like to ignore during the tests. Example: \"Id$\"'\n })\n .option('exclude-entry-point', {\n array: true,\n describe:\n 'A list of JSON strings that contain patterns for entry points you would like to ignore during the tests. ' +\n 'Pass an empty string to remove default exclusions. ' +\n 'To apply patterns for all HTTP methods, you can set an empty array to \"methods\". ' +\n `Example: '{ \"methods\": [], \"patterns\": [\"users\\\\/?$\"] }'`,\n coerce: RunScan.excludeEntryPoint\n })\n .option('smart', {\n boolean: true,\n describe:\n 'Use automatic smart decisions such as: parameter skipping, detection phases, etc. to minimize scan time.'\n })\n .option('concurrency', {\n number: true,\n default: 10,\n requiresArg: true,\n describe:\n 'Number of maximum concurrent requests allowed to be sent to the target, can range between 1 to 50 (default: 10).'\n })\n .option('param', {\n array: true,\n defaultDescription: `[${ATTACK_PARAM_LOCATIONS_DEFAULT.map(\n (item) => `\"${item}\"`\n ).join(',')}]`,\n requiresArg: true,\n choices: Helpers.toArray(AttackParamLocation),\n describe: 'Defines which part of the request to attack.'\n })\n .option('entrypoint', {\n array: true,\n alias: 'e',\n describe:\n 'List entrypoint IDs to scan specific entrypoints. If no IDs are provided, the scan will run on the first 2000 project-level entrypoints. This option requires to specify the project ID using the --project option.'\n })\n .conflicts('entrypoint', ['crawler', 'archive'])\n .check((args) => {\n if (args.entrypoint && args.archive && args.crawler) {\n throw new Error(\n 'Arguments --entrypoint, --archive and --crawler are mutually exclusive'\n );\n }\n\n if (!args.entrypoint && !args.archive && !args.crawler) {\n throw new Error(\n 'When --entrypoint is not provided, either --archive or --crawler must be specified'\n );\n }\n\n return true;\n })\n .group(['archive', 'crawler'], 'Discovery Options')\n .group(\n ['host-filter', 'header', 'module', 'repeater', 'test', 'smart'],\n 'Additional Options'\n )\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n\n const { id: scanId, warnings = [] } = await scanManager.create({\n tests: args.test,\n name: args.name,\n module: args.module,\n authObjectId: args.auth,\n projectId: args.project,\n templateId: args.template,\n buckets: args.bucket,\n hostsFilter: args.hostFilter,\n headers: Helpers.parseHeaders(args.header as string[]),\n crawlerUrls: args.crawler,\n fileId: args.archive,\n repeaters: args.repeater,\n smart: args.smart,\n attackParamLocations: args.param,\n poolSize: args.concurrency,\n exclusions: {\n requests: args.excludeEntryPoint,\n params: args.excludeParam\n },\n entryPointIds: args.entrypoint\n } as ScanConfig);\n\n // eslint-disable-next-line no-console\n console.log(scanId);\n\n if (warnings.length) {\n logger.warn(\n `${warnings.map((warning) => warning.message).join('\\n')}\\n`\n );\n }\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'scan:run' })\n );\n process.exit(1);\n }\n }\n}\n","import { Discoveries, RestDiscoveryOptions } from '../Discovery';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { container } from 'tsyringe';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class StopDiscovery implements CommandModule {\n public readonly command = 'discovery:stop [options] <discoveryId>';\n public readonly describe = 'Stop discovery by id.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n string: true,\n requiresArg: true,\n demandOption: true\n })\n .option('project', {\n alias: 'p',\n requiresArg: true,\n string: true,\n describe: 'ID of the project',\n demandOption: true\n })\n .positional('discoveryId', {\n describe: 'ID of an existing discovery which you want to stop.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestDiscoveryOptions>(RestDiscoveryOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const discoveryManager: Discoveries = container.resolve(Discoveries);\n\n await discoveryManager.stop(\n args.project as string,\n args.discoveryId as string\n );\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:stop'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { RestScansOptions, Scans } from '../Scan';\nimport { ErrorMessageFactory, logger } from '../Utils';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { container } from 'tsyringe';\n\nexport class StopScan implements CommandModule {\n public readonly command = 'scan:stop [options] <scanId>';\n public readonly describe = 'Stop scan by id.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .positional('scanId', {\n describe: 'ID of an existing scan which you want to stop.',\n requiresArg: true,\n demandOption: true,\n type: 'string'\n })\n .middleware((args: Arguments) =>\n container.register<RestScansOptions>(RestScansOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n })\n );\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const scanManager: Scans = container.resolve(Scans);\n\n await scanManager.stop(args.scanId as string);\n\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({ error, command: 'scan:stop' })\n );\n process.exit(1);\n }\n }\n}\n","import {\n Archives,\n ParserFactory,\n RestArchivesOptions,\n Spec,\n SpecType\n} from '../Archive';\nimport { ErrorMessageFactory, Helpers, logger } from '../Utils';\nimport container from '../container';\nimport { Arguments, Argv, CommandModule } from 'yargs';\n\nexport class UploadArchive implements CommandModule {\n public readonly command = 'archive:upload [options] <file>';\n public readonly describe = 'Uploads a archive to Bright.';\n\n public builder(argv: Argv): Argv {\n return argv\n .option('token', {\n alias: 't',\n describe: 'Bright API-key',\n requiresArg: true,\n demandOption: true\n })\n .option('type', {\n alias: 'T',\n requiresArg: true,\n describe: 'The specification type',\n choices: [SpecType.OPENAPI, SpecType.HAR, SpecType.POSTMAN].map(\n (x: string) => x.toLowerCase()\n ),\n default: SpecType.HAR.toLowerCase(),\n demandOption: true\n })\n .option('discard', {\n alias: 'd',\n default: true,\n boolean: true,\n describe:\n 'Indicates if archive should be remove or not after scan running. Enabled by default.'\n })\n .option('project', {\n alias: ['p', 'projectId'],\n describe:\n 'ID of the project for uploading file (Optional for transition period, will be mandatory in future)' +\n 'In case project-level API key project ID determined from that API key'\n })\n .option('header', {\n alias: 'H',\n default: [],\n deprecated:\n 'Use --header when running a scan using the scan:run command.',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific headers that should be included into request.',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .option('variable', {\n alias: 'V',\n default: [],\n deprecated:\n 'Directly integrate variables into the file. For updated guidelines on managing variables effectively, refer to https://learning.postman.com/docs/sending-requests/variables/variables/#variable-scopes',\n requiresArg: true,\n array: true,\n describe:\n 'A list of specific variables that should be included into request. Only for Postman',\n coerce(arg: string[]): Record<string, string> {\n return Array.isArray(arg) ? Helpers.parseHeaders(arg) : {};\n }\n })\n .positional('file', {\n describe:\n \"A collection your app's http/websockets logs into HAR file. \" +\n 'Usually you can use browser dev tools or our browser web extension',\n type: 'string',\n demandOption: true,\n normalize: true\n })\n .group(['header'], 'OAS Options')\n .group(['header', 'variable'], 'Postman Options')\n .middleware((args: Arguments) => {\n container.register<RestArchivesOptions>(RestArchivesOptions, {\n useValue: {\n insecure: args.insecure as boolean,\n baseURL: args.api as string,\n apiKey: args.token as string,\n proxyURL: (args.proxyBright ?? args.proxy) as string,\n timeout: args.timeout as number\n }\n });\n });\n }\n\n public async handler(args: Arguments): Promise<void> {\n try {\n const parserFactory: ParserFactory = container.resolve(ParserFactory);\n const archives: Archives = container.resolve(Archives);\n\n const type = Helpers.selectEnumValue(\n SpecType,\n args.type as string\n ) as SpecType;\n\n const parser = parserFactory.create(type);\n\n const file = await parser.parse(args.file as string);\n\n const spec: Spec = {\n ...file,\n type,\n discard: args.discard as boolean,\n projectId: args.project as string,\n headers: args.header as Record<string, string>,\n variables: args.variable as Record<string, string>\n };\n\n // eslint-disable-next-line no-console\n console.log(await archives.upload(spec));\n process.exit(0);\n } catch (error) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'archive:upload'\n })\n );\n process.exit(1);\n }\n }\n}\n","import { logger } from '../Utils';\nimport { CommandModule } from 'yargs';\nimport { exec, ExecException } from 'child_process';\n\nexport class VersionCommand implements CommandModule {\n public readonly command = 'version';\n public readonly describe = 'Prints Bright CLI version this project uses.';\n\n protected static executeCommand(command: string): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n exec(\n command,\n (error: ExecException | null, stdout: string, stderr: string) => {\n if (stdout) {\n return resolve(stdout);\n }\n\n if (stderr) {\n return resolve(stderr);\n }\n\n if (error) {\n return reject(error);\n }\n\n resolve('');\n }\n );\n });\n }\n\n public async handler(): Promise<void> {\n const localNpmList: string = await VersionCommand.executeCommand(\n 'npm list --depth=0'\n );\n const localMatches: RegExpMatchArray | null = localNpmList.match(\n / @brightsec\\/cli@(.*)\\n/\n );\n const localNpmVersion: string = (\n localMatches && localMatches[1] ? localMatches[1] : ''\n )\n .replace(/\"invalid\"/gi, '')\n .trim();\n\n const globalNpmList: string = await VersionCommand.executeCommand(\n 'npm list -g --depth=0'\n );\n const globalMatches: RegExpMatchArray | null = globalNpmList.match(\n / @brightsec\\/cli@(.*)\\n/\n );\n const globalNpmVersion: string = (\n globalMatches && globalMatches[1] ? globalMatches[1] : ''\n )\n .replace(/\"invalid\"/gi, '')\n .trim();\n\n if (localNpmVersion) {\n logger.log('Local installed version:', localNpmVersion);\n } else {\n logger.warn('No local installed Bright CLI was found.');\n }\n\n if (globalNpmVersion) {\n logger.log('Global installed Bright CLI version:', globalNpmVersion);\n } else {\n logger.warn('No global installed was found.');\n }\n\n if (\n localNpmVersion &&\n globalNpmVersion &&\n localNpmVersion !== globalNpmVersion\n ) {\n logger.warn(\n 'To avoid issues with CLI please make sure your global and local Bright CLI versions match, ' +\n 'or you are using locally installed Bright CLI instead of global one.'\n );\n }\n }\n}\n","export { VersionCommand } from './VersionCommand';\nexport { RunScan } from './RunScan';\nexport { UploadArchive } from './UploadArchive';\nexport { RetestScan } from './RetestScan';\nexport { StopScan } from './StopScan';\nexport { PollingScanStatus } from './PollingScanStatus';\nexport { RunRepeater } from './RunRepeater';\nexport { Configure } from './Configure';\nexport { GetEntryPoints } from './GetEntryPoints';\n","import { CliConfig, ConfigReader } from './ConfigReader';\nimport { ClusterArgs, Helpers, logger, Logger, LogLevel } from '../Utils';\nimport { SystemConfigManager } from './SystemConfigManager';\nimport { CliInfo } from './CliInfo';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { init, runWithAsyncContext, setContext } from '@sentry/node';\nimport ms from 'ms';\nimport process from 'node:process';\n\nexport interface CliBuilderOptions {\n info: CliInfo;\n configReader: ConfigReader;\n}\n\nexport class CliBuilder {\n private _options: CliBuilderOptions;\n\n get options(): CliBuilderOptions {\n return this._options;\n }\n\n constructor(options: CliBuilderOptions) {\n this._options = options;\n }\n\n public build({ commands }: { commands: CommandModule[] }): Argv {\n const { configReader, info } = this.options;\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cli: Argv = require('yargs')\n .option('config', {\n requiresArg: true,\n describe: 'Path to the file with configuration',\n config: true,\n default: configReader.discovery(info.cwd),\n configParser: (configPath: string): CliConfig =>\n configReader.load(configPath).toJSON()\n })\n .option('log-level', {\n requiresArg: true,\n choices: Object.keys(LogLevel).map((x) =>\n !isNaN(+x) ? +x : x.toLowerCase()\n ),\n default: LogLevel.NOTICE,\n describe:\n 'What level of logs to report. Any logs of a higher level than the setting are shown.'\n })\n .option('log-file', {\n requiresArg: true,\n type: 'string',\n describe:\n 'File path to write logs to. If specified, logs will be written to this file'\n })\n .implies({\n 'log-max-size': 'log-file',\n 'log-max-files': 'log-file',\n 'log-rotate-interval': 'log-file',\n 'log-compress': 'log-file'\n })\n .group(\n [\n 'log-max-size',\n 'log-max-files',\n 'log-rotate-interval',\n 'log-compress'\n ],\n 'Log Rotation Options (requires --log-file):'\n )\n .option('log-max-size', {\n requiresArg: true,\n type: 'string',\n describe:\n 'Maximum size of log file before rotation (e.g., \"10MB\", \"1GB\"). Default: 10MB'\n })\n .option('log-max-files', {\n requiresArg: true,\n type: 'number',\n describe: 'Maximum number of rotated log files to keep. Default: 5'\n })\n .option('log-rotate-interval', {\n requiresArg: true,\n type: 'string',\n describe:\n 'Time interval to rotate log files (e.g., \"1d\", \"12h\", \"7d\"). Default: 1d'\n })\n .option('log-compress', {\n type: 'boolean',\n describe: 'Compress rotated log files using gzip. Default: true'\n })\n .option('cluster', {\n deprecated: 'Use --hostname instead',\n requiresArg: true,\n describe:\n 'Bright application name (domain name). [default: app.brightsec.com]'\n })\n .option('hostname', {\n requiresArg: true,\n describe:\n 'Bright application name (domain name). [default: app.brightsec.com]'\n })\n .option('insecure', {\n boolean: true,\n default: false,\n description:\n 'Allows CLI to proceed and operate even for server connections otherwise considered insecure.'\n })\n .option('proxy', {\n requiresArg: true,\n default: process.env.PROXY,\n describe:\n 'Specify a proxy URL to route all traffic through. This should be an HTTP(S), SOCKS4, or SOCKS5 URL. By default, if you specify SOCKS://<URL>, then SOCKS5h is applied.'\n })\n .option('proxy-bright', {\n requiresArg: true,\n describe:\n 'Specify a proxy URL to route all outbound traffic through. For more information, see the --proxy option.'\n })\n .option('proxy-target', {\n requiresArg: true,\n describe:\n 'Specify a proxy URL to route all inbound traffic through. For more information, see the --proxy option.'\n })\n .option('timeout', {\n describe:\n 'Request timeout in seconds or a duration string (e.g. 10s, 1m, 1h, 10h, 1y).',\n default: 30,\n coerce(arg: string) {\n // if arg is not a number, then it's a duration string\n // convert duration string to milliseconds\n if (isNaN(+arg)) {\n return ms(arg);\n }\n\n return +arg * 1000;\n }\n })\n .conflicts({\n proxy: ['proxy-bright', 'proxy-target'],\n hostname: 'cluster'\n })\n .middleware((args: Arguments) => {\n const { api, repeaterServer } = Helpers.getClusterUrls(\n args as ClusterArgs\n );\n args.api = api;\n args.repeaterServer = repeaterServer;\n\n // Configure logger with rotation options if log file is specified\n if (args.logFile) {\n const options = {\n maxSize: args['log-max-size'] as string | '10MB',\n maxFiles: args['log-max-files'] as number | 5,\n interval: args['log-rotate-interval'] as string | '1d',\n compress: (args['log-compress'] === false ? undefined : 'gzip') as\n | 'gzip'\n | undefined\n };\n Logger.configure(\n args.logLevel as LogLevel,\n args.logFile as string,\n options\n );\n }\n })\n\n .middleware((argv: Arguments) => {\n logger.logLevel = argv['log-level'] as LogLevel;\n if (argv['log-file']) {\n logger.logFile = argv['log-file'] as string;\n }\n\n return argv;\n })\n\n .middleware(\n (args: Arguments) =>\n (logger.logLevel = !isNaN(+args.logLevel)\n ? (+args.logLevel as unknown as LogLevel)\n : LogLevel[\n args.logLevel?.toString().toUpperCase() as keyof typeof LogLevel\n ])\n )\n .usage('Usage: $0 <command> [options] [<file | scan>]')\n .pkgConf('bright', info.cwd)\n .example(\n '$0 archive:generate --mockfile=.mockfile --name=archive.har',\n 'output har file on base your mock requests'\n );\n\n return commands\n .reduce(\n (acc: Argv, item: CommandModule) =>\n acc.command(this.wrapWithSentry(item)),\n cli\n )\n .recommendCommands()\n .demandCommand(1)\n .strict(true)\n .version(info.version)\n .alias('v', 'version')\n .help('help')\n .alias('h', 'help')\n .wrap(null);\n }\n\n private wrapWithSentry(command: CommandModule) {\n const handler = command.handler.bind(command);\n\n command.handler = async (args: Arguments) => {\n const systemConfigManager = new SystemConfigManager(args.api as string);\n const systemConfig = await systemConfigManager.read();\n\n return runWithAsyncContext(() => {\n this.initSentry(systemConfig.sentryDsn);\n setContext('args', args);\n\n systemConfigManager.enableBackgroundRotation((rotatedSystemConfig) => {\n this.initSentry(rotatedSystemConfig.sentryDsn);\n });\n\n return handler(args);\n });\n };\n\n return command;\n }\n\n private initSentry(dsn: string) {\n init({\n dsn,\n attachStacktrace: true,\n release: process.env.VERSION,\n beforeSend(event) {\n if (event.contexts.args) {\n event.contexts.args = {\n ...event.contexts.args,\n t: event.contexts.args.t && '[Filtered]',\n token: event.contexts.args.token && '[Filtered]'\n };\n }\n\n return event;\n }\n });\n }\n}\n","import { sync } from 'find-up';\nimport path from 'node:path';\nimport { readFileSync } from 'node:fs';\n\nexport class CliInfo {\n public readonly cwd: string;\n public readonly version: string;\n public readonly distribution: string | undefined;\n\n constructor(cwd: string) {\n const packagePath = this.getPackagePath(cwd);\n const packageData = this.getPackageData(packagePath);\n\n this.cwd = packagePath ? path.dirname(packagePath) : cwd;\n this.version = process.env.VERSION ?? packageData?.version;\n this.distribution = packageData?.brightCli?.distribution;\n }\n\n private getPackageData(packagePath: string) {\n try {\n const pkg = readFileSync(packagePath, 'utf8');\n\n return JSON.parse(pkg);\n } catch {\n // noop\n }\n }\n\n private getPackagePath(cwd?: string): string {\n return sync('package.json', {\n cwd: cwd || process.env.BRIGHT_CWD || process.cwd()\n });\n }\n}\n","export interface CliConfig {\n token?: string;\n api?: string;\n proxy?: string;\n repeaterServer?: string;\n id?: string;\n}\n\nexport interface ConfigReader {\n discovery(cwd: string): string | undefined;\n\n load(rcPath: string): this;\n\n get<T extends keyof CliConfig>(key: T): CliConfig[T];\n\n has(key: keyof CliConfig): boolean;\n\n toJSON(): CliConfig;\n}\n\nexport const ConfigReader: unique symbol = Symbol('ConfigReader');\n","import { CliConfig, ConfigReader } from './ConfigReader';\nimport { Helpers } from '../Utils';\nimport { sync } from 'find-up';\nimport { load } from 'js-yaml';\nimport { extname } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { Context, createContext, Script } from 'node:vm';\n\nexport class DefaultConfigReader implements ConfigReader {\n private readonly rcOptions: string[] = [\n '.brightrc',\n '.brightrc.json',\n '.brightrc.yml',\n '.brightrc.yaml',\n 'bright.config.js',\n // ADHOC: keep for backward compatibility with the legacy nexploit-cli.\n '.nexploitrc',\n '.nexploitrc.json',\n '.nexploitrc.yml',\n '.nexploitrc.yaml',\n 'nexploit.config.js'\n ];\n private readonly config: Map<keyof CliConfig, CliConfig[keyof CliConfig]>;\n\n constructor() {\n this.config = new Map<keyof CliConfig, CliConfig[keyof CliConfig]>();\n }\n\n public discovery(cwd: string): string | undefined {\n return sync(this.rcOptions, {\n cwd\n });\n }\n\n public load(rcPath: string): this {\n const rcExt: string = extname(rcPath.toLowerCase());\n\n if (rcExt === '.js') {\n this.configure(this.loadCommonJsModule(rcPath));\n } else if (rcExt === '.yml' || rcExt === '.yaml') {\n this.configure(\n load(readFileSync(rcPath, 'utf8')) as Record<string, unknown>\n );\n } else {\n this.configure(JSON.parse(readFileSync(rcPath, 'utf-8')));\n }\n\n return this;\n }\n\n public get<T extends keyof CliConfig>(key: T): CliConfig[T] {\n return this.config.get(key);\n }\n\n public has(key: keyof CliConfig): boolean {\n return this.config.has(key);\n }\n\n public toJSON(): CliConfig {\n return [...this.config.entries()].reduce(\n (acc: CliConfig, [key, value]: [string, unknown]) => {\n acc[key] = value;\n\n return acc;\n },\n {} as CliConfig\n );\n }\n\n private loadCommonJsModule(filename: string): Record<string, unknown> {\n const code: string = readFileSync(filename, { encoding: 'utf8' });\n const script: Script = new Script(code, {\n filename,\n timeout: 100\n });\n const vmModule: { exports: any } = { exports: {} };\n const context: Context = createContext({\n exports: vmModule.exports,\n module: vmModule\n });\n\n script.runInNewContext(context);\n\n const config: Record<string, unknown> | (() => Record<string, unknown>) =\n context.module?.exports ?? context.exports;\n\n if (typeof config === 'function') {\n return config();\n }\n\n return config;\n }\n\n private configure(map: Record<string, unknown>): void {\n Object.entries(Helpers.omit(map)).map(([key, value]: [string, unknown]) =>\n this.config.set(\n key as keyof CliConfig,\n value as CliConfig[keyof CliConfig]\n )\n );\n }\n}\n","import { logger } from '../Utils';\nimport axios, { Axios } from 'axios';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { setTimeout } from 'node:timers/promises';\n\nexport interface SystemConfig {\n sentryDsn?: string;\n}\n\ninterface SystemConfigFile {\n data: SystemConfig;\n updatedAt: Date;\n}\n\nexport class SystemConfigManager {\n private readonly rotationInterval = 3600000;\n private readonly path = join(homedir(), '.brightclirc');\n private readonly client: Axios;\n private backgroundRotationEnabled = false;\n\n constructor(baseURL: string) {\n this.client = axios.create({\n baseURL,\n timeout: 1500,\n responseType: 'json',\n transitional: {\n clarifyTimeoutError: true\n }\n });\n }\n\n public async read(): Promise<SystemConfig> {\n await this.rotateIfNecessary();\n const configFile = await this.getConfigFile();\n\n return {\n sentryDsn: process.env['SENTRY_DSN'],\n ...configFile.data\n };\n }\n\n public enableBackgroundRotation(onRotation: (config: SystemConfig) => void) {\n this.backgroundRotationEnabled = true;\n\n this.runBackgroundRotation(onRotation).catch((e) => {\n logger.debug('An error occurred during background rotation', e);\n });\n }\n\n public disableBackgroundRotation() {\n this.backgroundRotationEnabled = false;\n }\n\n private async runBackgroundRotation(\n onRotation: (config: SystemConfig) => void\n ) {\n while (this.backgroundRotationEnabled) {\n logger.debug('Performing background rotation of system config file');\n\n const isRotated = await this.rotateIfNecessary();\n\n if (isRotated) {\n const configFile = await this.getConfigFile();\n\n onRotation(configFile.data);\n\n logger.debug(\n 'Background rotation is done, sleeping for %s ms',\n this.rotationInterval\n );\n }\n\n await setTimeout(this.rotationInterval, undefined, { ref: false });\n }\n }\n\n private needsRotation(configFile: SystemConfigFile) {\n if (process.env.NODE_ENV !== 'production') {\n return;\n }\n\n const lifeTime = Date.now() - configFile.updatedAt.getTime();\n\n return lifeTime >= this.rotationInterval;\n }\n\n private async rotateIfNecessary() {\n logger.debug('Trying to rotate system config');\n\n const configFile = await this.getConfigFile();\n\n if (!this.needsRotation(configFile)) {\n logger.debug(\n 'Rotation is not needed, last updated on: %s ms',\n configFile.updatedAt\n );\n\n return false;\n }\n\n logger.debug(\n 'Rotating system config last updated on: %s ms',\n configFile.updatedAt\n );\n\n const newConfig = await this.fetchNewConfig();\n\n if (newConfig) {\n await this.updateConfigFile({\n data: newConfig,\n updatedAt: new Date()\n });\n\n return true;\n } else {\n logger.debug('Rotation failed');\n\n await this.updateConfigFile({\n ...configFile,\n updatedAt: new Date()\n });\n\n return false;\n }\n }\n\n private defaultConfigFile(): SystemConfigFile {\n return {\n data: {},\n updatedAt: new Date()\n };\n }\n\n private async getConfigFile() {\n const defaultConfigFile = this.defaultConfigFile();\n\n try {\n logger.debug('Loading system config file');\n\n const file = await readFile(this.path);\n const fileConfig = JSON.parse(file.toString()) as SystemConfigFile;\n\n return {\n ...fileConfig,\n updatedAt: new Date(fileConfig.updatedAt)\n };\n } catch (e) {\n if (e.code === 'ENOENT') {\n logger.debug(\"System config file doesn't exist at %s\", this.path);\n\n return defaultConfigFile;\n }\n\n logger.debug('Error during loading system config file', e);\n logger.debug('Using default system config file');\n\n return defaultConfigFile;\n }\n }\n\n private async updateConfigFile(configFile: SystemConfigFile) {\n logger.debug('Updating system config file');\n\n try {\n await writeFile(this.path, JSON.stringify(configFile));\n } catch (e) {\n logger.debug('Error during updating system config file', e);\n }\n }\n\n private async fetchNewConfig(): Promise<SystemConfig | undefined> {\n logger.debug('Fetching new system config');\n\n try {\n const { data } = await this.client.get<SystemConfig | undefined>(\n '/api/v1/cli/config'\n );\n\n return data;\n } catch (e) {\n logger.debug('Error during fetching new system config: ', e);\n }\n }\n}\n","export * from './CliBuilder';\nexport * from './ConfigReader';\nexport * from './CliInfo';\n","import {\n DiscoveryPollingConfig,\n DiscoveryPollingFactory\n} from './DiscoveryPollingFactory';\nimport { Polling } from '../Utils/Polling';\nimport { DiscoveryPolling } from './DiscoveryPolling';\nimport { Discoveries } from './Discoveries';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultDiscoveryPollingFactory implements DiscoveryPollingFactory {\n constructor(\n @inject(Discoveries)\n private readonly discoveries: Discoveries\n ) {}\n\n public create(options: DiscoveryPollingConfig): Polling {\n return new DiscoveryPolling(options, this.discoveries);\n }\n}\n","import { DiscoveryView } from './DiscoveryView';\n\nexport interface DiscoveryConfig {\n name: string;\n authObjectId?: string;\n poolSize?: number;\n crawlerUrls?: string[];\n extraHosts?: Record<string, string>;\n headers?: Record<string, string> | Header[];\n fileId?: string;\n targetId?: string;\n hostsFilter?: string[];\n optimizedCrawler?: boolean;\n maxInteractionsChainLength: number;\n subdomainsCrawl: boolean;\n exclusions?: Exclusions;\n repeaters?: string[];\n discoveryTypes?: DiscoveryType[];\n targetTimeout: number;\n}\n\nexport interface Header {\n name: string;\n value: string;\n mergeStrategy: 'replace';\n}\n\nexport interface Discoveries {\n create(\n projectId: string,\n config: DiscoveryConfig\n ): Promise<DiscoveryCreateResponse>;\n\n rerun(projectId: string, discoveryId: string): Promise<string>;\n\n stop(projectId: string, discoveryId: string): Promise<void>;\n\n delete(projectId: string, discoveryId: string): Promise<void>;\n\n get(\n projectId: string,\n discoveryId: string,\n options?: { signal?: AbortSignal }\n ): Promise<DiscoveryView>;\n}\n\nexport const Discoveries: unique symbol = Symbol('Discoveries');\n\nexport interface DiscoveryWarning {\n code: string;\n message: string;\n}\n\nexport interface DiscoveryCreateResponse {\n id: string;\n warnings?: DiscoveryWarning[];\n}\n\nexport enum DiscoveryType {\n CRAWLER = 'crawler',\n ARCHIVE = 'archive',\n OAS = 'oas'\n}\n\nexport interface RequestExclusion {\n patterns: string[];\n methods: string[];\n}\n\nexport interface Exclusions {\n params: string[];\n requests: RequestExclusion[];\n}\n\nexport interface StorageFile {\n id: string;\n type: SourceType;\n}\n\nexport enum SourceType {\n OPEN_API = 'openapi',\n RAML = 'raml',\n POSTMAN = 'postman',\n HAR = 'har'\n}\n","import { Polling } from '../Utils/Polling';\nimport { Backoff, ErrorMessageFactory, logger } from '../Utils';\nimport { DiscoveryPollingConfig } from './DiscoveryPollingFactory';\nimport { Discoveries } from './Discoveries';\nimport { DiscoveryStatus, DiscoveryView } from './DiscoveryView';\nimport axios from 'axios';\nimport { setTimeout as asyncSetTimeout } from 'node:timers/promises';\n\nexport class DiscoveryPolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n private abortController = new AbortController();\n\n constructor(\n private readonly options: DiscoveryPollingConfig,\n private readonly discoveryManager: Discoveries\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-20min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n this.initializePolling();\n await this.runPollingLoop();\n } catch (error) {\n this.handleError(error);\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.abortController.abort();\n clearTimeout(this.timeoutDescriptor);\n }\n\n private initializePolling(): void {\n if (this.options.timeout) {\n this.setTimeout();\n }\n }\n\n private async runPollingLoop(): Promise<void> {\n for await (const discovery of this.poll()) {\n const shouldContinue = await this.processDiscoveryView(discovery);\n if (!shouldContinue) break;\n }\n }\n\n private handleError(error: unknown): void {\n if (!this.abortController.signal.aborted) {\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'discovery:polling'\n });\n process.exit(1);\n }\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => {\n this.abortController.abort();\n logger.log('Polling has been stopped by timeout.');\n }, timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<DiscoveryView> {\n while (!this.abortController.signal.aborted) {\n const backoff = this.createBackoff();\n\n const view: DiscoveryView = await backoff.execute(() =>\n this.discoveryManager.get(\n this.options.projectId,\n this.options.discoveryId\n )\n );\n\n yield view;\n\n await this.delay();\n }\n }\n\n private isFinished(status: DiscoveryStatus): boolean {\n return (\n status === DiscoveryStatus.DONE ||\n status === DiscoveryStatus.STOPPED ||\n status === DiscoveryStatus.DISRUPTED ||\n status === DiscoveryStatus.FAILED\n );\n }\n\n private async delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n await asyncSetTimeout(interval, false, {\n signal: this.abortController.signal\n });\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n\n private handleDiscoveryStatus(status: DiscoveryStatus): void {\n const statusMessages = {\n [DiscoveryStatus.RUNNING]: 'Discovery is running.',\n [DiscoveryStatus.PENDING]: 'Discovery is pending.',\n [DiscoveryStatus.SCHEDULED]: 'Discovery is scheduled.',\n [DiscoveryStatus.QUEUED]: 'Discovery is queued.',\n [DiscoveryStatus.DONE]: 'Discovery has been completed.',\n [DiscoveryStatus.STOPPED]: 'Discovery has been stopped.',\n [DiscoveryStatus.DISRUPTED]: 'Discovery has been disrupted.',\n [DiscoveryStatus.FAILED]: 'Discovery has failed.'\n };\n\n const message = statusMessages[status] || `Discovery status is ${status}.`;\n logger.log(message);\n }\n\n private processDiscoveryView(discovery: DiscoveryView | null): boolean {\n if (!discovery) {\n logger.log('The discovery has not been found.');\n\n return false;\n }\n\n this.handleDiscoveryStatus(discovery.status);\n\n if (this.isFinished(discovery.status)) {\n logger.log(\n `The discovery has been finished with status: ${discovery.status}.`\n );\n\n return false;\n }\n\n return true;\n }\n}\n","import { Polling } from '../Utils/Polling';\n\nexport interface DiscoveryPollingConfig {\n timeout?: number;\n interval?: number;\n discoveryId: string;\n projectId: string;\n}\n\nexport interface DiscoveryPollingFactory {\n create(options: DiscoveryPollingConfig): Polling;\n}\n\nexport const DiscoveryPollingFactory: unique symbol = Symbol(\n 'DiscoveryPollingFactory'\n);\n","export interface DiscoveryView {\n id: string;\n name: string;\n status: DiscoveryStatus;\n}\n\nexport enum DiscoveryStatus {\n RUNNING = 'running',\n PENDING = 'pending',\n STOPPED = 'stopped',\n FAILED = 'failed',\n DONE = 'done',\n DISRUPTED = 'disrupted',\n SCHEDULED = 'scheduled',\n QUEUED = 'queued'\n}\n","import {\n Discoveries,\n DiscoveryConfig,\n DiscoveryCreateResponse,\n DiscoveryType,\n Header,\n SourceType,\n StorageFile\n} from './Discoveries';\nimport { ProxyFactory } from '../Utils';\nimport { CliInfo } from '../Config';\nimport { DiscoveryView } from './DiscoveryView';\nimport { delay, inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestDiscoveryOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestDiscoveryOptions: unique symbol = Symbol(\n 'RestDiscoveryOptions'\n);\n\n@injectable()\nexport class RestDiscoveries implements Discoveries {\n private readonly client: Axios;\n\n constructor(\n @inject(delay(() => CliInfo)) private readonly info: CliInfo,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestDiscoveryOptions)\n { baseURL, apiKey, timeout, insecure, proxyURL }: RestDiscoveryOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async create(\n projectId: string,\n config: DiscoveryConfig\n ): Promise<DiscoveryCreateResponse> {\n const preparedConfig = await this.prepareConfig({ ...config });\n const res = await this.client.post<DiscoveryCreateResponse>(\n `/api/v2/projects/${projectId}/discoveries`,\n preparedConfig\n );\n\n return res.data;\n }\n\n public async rerun(projectId: string, discoveryId: string): Promise<string> {\n const res = await this.client.post<{ id: string }>(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}/rerun`\n );\n\n return res.data.id;\n }\n\n public async stop(projectId: string, discoveryId: string): Promise<void> {\n await this.client.put(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}/lifecycle`,\n {\n action: 'stop'\n }\n );\n }\n\n public async delete(projectId: string, discoveryId: string): Promise<void> {\n await this.client.delete(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}`\n );\n }\n\n public async get(\n projectId: string,\n discoveryId: string,\n options?: { signal?: AbortSignal }\n ): Promise<DiscoveryView> {\n const res = await this.client.get<DiscoveryView>(\n `/api/v2/projects/${projectId}/discoveries/${discoveryId}`,\n { signal: options?.signal }\n );\n\n return res.data;\n }\n\n private async prepareConfig({ headers, ...rest }: DiscoveryConfig): Promise<\n Omit<DiscoveryConfig, 'headers'> & {\n headers: Header[];\n info: {\n source: string;\n client?: { name: string; version: string };\n };\n }\n > {\n const config = await this.applyDefaultSettings(rest);\n\n return {\n ...config,\n info: {\n source: 'cli',\n client: {\n name: 'bright-cli',\n version: this.info.version\n }\n },\n headers: headers\n ? Object.entries(headers).map(([name, value]: [string, string]) => ({\n name,\n value,\n mergeStrategy: 'replace'\n }))\n : undefined\n };\n }\n\n private async applyDefaultSettings(\n discoveryConfig: Omit<DiscoveryConfig, 'headers'>\n ): Promise<Omit<DiscoveryConfig, 'headers'>> {\n const exclusions =\n discoveryConfig.exclusions?.params || discoveryConfig.exclusions?.requests\n ? discoveryConfig.exclusions\n : undefined;\n\n let discoveryTypes: DiscoveryType[] = await this.exploreDiscovery(\n discoveryConfig\n );\n discoveryTypes = discoveryTypes?.length ? discoveryTypes : undefined;\n\n return {\n ...discoveryConfig,\n discoveryTypes,\n exclusions\n };\n }\n\n private async exploreDiscovery(\n body: DiscoveryConfig\n ): Promise<DiscoveryType[]> {\n const discoveryTypes: DiscoveryType[] = [];\n const { fileId, crawlerUrls } = body;\n\n if (Array.isArray(crawlerUrls)) {\n discoveryTypes.push(DiscoveryType.CRAWLER);\n }\n\n if (fileId) {\n try {\n const { data } = await this.client.get<StorageFile>(\n `/api/v2/files/${fileId}`\n );\n\n discoveryTypes.push(\n data.type === SourceType.HAR\n ? DiscoveryType.ARCHIVE\n : DiscoveryType.OAS\n );\n } catch (error) {\n throw new Error(\n `Error loading file with id \"${fileId}\": No such file or you do not have permissions.`\n );\n }\n }\n\n return discoveryTypes;\n }\n}\n","export * from './Discoveries';\nexport * from './RestDiscoveries';\nexport * from './DiscoveryPollingFactory';\nexport * from './DefaultDiscoveryPollingFactory';\n","import {\n HostUpdateJobStatusPollingConfig,\n HostUpdateJobStatusPollingFactory\n} from './HostUpdateJobStatusPollingFactory';\nimport { Polling } from '../Utils/Polling';\nimport { HostUpdateJobStatusPolling } from './HostUpdateJobStatusPolling';\nimport { EntryPoints } from './EntryPoints';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultHostUpdateJobStatusPollingFactory\n implements HostUpdateJobStatusPollingFactory\n{\n constructor(\n @inject(EntryPoints)\n private readonly entryPoints: EntryPoints\n ) {}\n\n public create(options: HostUpdateJobStatusPollingConfig): Polling {\n return new HostUpdateJobStatusPolling(options, this.entryPoints);\n }\n}\n","export interface EntryPointsListOptions {\n projectId: string;\n limit?: number;\n connectivity?: string[];\n status?: string[];\n}\n\nexport interface UpdateHostOptions {\n projectId: string;\n oldHostname: string;\n newHostname: string;\n entryPointIds?: string[];\n}\n\nexport interface GetHostUpdateJobStatusOptions {\n jobId: string;\n projectId: string;\n}\n\nexport enum JobStatus {\n PENDING = 'pending',\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed'\n}\n\nexport interface HostUpdateJobStatusView {\n jobId: string;\n status: JobStatus;\n totalCount: number;\n processedCount: number;\n skippedCount: number;\n error?: string;\n}\n\nexport interface EntryPoints {\n entrypoints(filter: EntryPointsListOptions): Promise<EntryPoint[]>;\n updateHost(options: UpdateHostOptions): Promise<{ taskId: string }>;\n getHostUpdateJobStatus(\n options: GetHostUpdateJobStatusOptions\n ): Promise<HostUpdateJobStatusView>;\n}\n\nexport const EntryPoints: unique symbol = Symbol('EntryPoints');\n\nexport interface EntryPoint {\n id: string;\n method: string;\n url: string;\n responseStatus: number;\n connectivity: string;\n lastUpdated: string;\n lastEdited: string;\n lastValidated: string;\n parametersCount: number;\n responseTime: number;\n status: string;\n openIssuesCount: number;\n closedIssuesCount: number;\n createdAt: string;\n}\n","import { Polling } from '../Utils/Polling';\nimport { Backoff, ErrorMessageFactory, logger } from '../Utils';\nimport { HostUpdateJobStatusPollingConfig } from './HostUpdateJobStatusPollingFactory';\nimport { EntryPoints, HostUpdateJobStatusView, JobStatus } from './EntryPoints';\nimport axios from 'axios';\nimport { setTimeout as asyncSetTimeout } from 'node:timers/promises';\n\nexport class HostUpdateJobStatusPolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n private abortController = new AbortController();\n\n constructor(\n private readonly options: HostUpdateJobStatusPollingConfig,\n private readonly entryPoints: EntryPoints\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-60min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n this.initializePolling();\n await this.runPollingLoop();\n } catch (error) {\n this.handleError(error);\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.abortController.abort();\n clearTimeout(this.timeoutDescriptor);\n }\n\n private initializePolling(): void {\n if (this.options.timeout) {\n this.setTimeout();\n }\n }\n\n private async runPollingLoop(): Promise<void> {\n for await (const jobView of this.poll()) {\n const shouldContinue = await this.processJobView(jobView);\n if (!shouldContinue) break;\n }\n }\n\n private handleError(error: unknown): void {\n if (!this.abortController.signal.aborted) {\n logger.error(\n ErrorMessageFactory.genericCommandError({\n error,\n command: 'entrypoints:update-host-polling'\n })\n );\n process.exit(1);\n }\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => {\n this.abortController.abort();\n logger.log('Polling has been stopped by timeout.');\n }, timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<HostUpdateJobStatusView> {\n while (!this.abortController.signal.aborted) {\n const backoff = this.createBackoff();\n\n const view: HostUpdateJobStatusView = await backoff.execute(() =>\n this.entryPoints.getHostUpdateJobStatus({\n jobId: this.options.jobId,\n projectId: this.options.projectId\n })\n );\n\n logger.debug('Host update job data: %j', view);\n\n yield view;\n\n await this.delay();\n }\n }\n\n private isFinished(status: JobStatus): boolean {\n return status === JobStatus.COMPLETED || status === JobStatus.FAILED;\n }\n\n private async delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n await asyncSetTimeout(interval, false, {\n signal: this.abortController.signal\n });\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n\n private handleJobStatus(status: JobStatus): void {\n const statusMessages = {\n [JobStatus.PENDING]: 'Host update job is pending.',\n [JobStatus.PROCESSING]: 'Host update job is processing.',\n [JobStatus.COMPLETED]: 'Host update job has been completed.',\n [JobStatus.FAILED]: 'Host update job has failed.'\n };\n\n const message =\n statusMessages[status] || `Host update job status is ${status}.`;\n logger.log(message);\n }\n\n private processJobView(job: HostUpdateJobStatusView | null): boolean {\n if (!job) {\n logger.log('The host update job has not been found.');\n\n return false;\n }\n\n this.handleJobStatus(job.status);\n\n if (this.isFinished(job.status)) {\n logger.log(\n `The host update job has been finished with status: ${job.status}.`\n );\n\n return false;\n }\n\n return true;\n }\n}\n","import { Polling } from '../Utils/Polling';\n\nexport interface HostUpdateJobStatusPollingConfig {\n timeout?: number;\n interval?: number;\n jobId: string;\n projectId: string;\n}\n\nexport interface HostUpdateJobStatusPollingFactory {\n create(options: HostUpdateJobStatusPollingConfig): Polling;\n}\n\nexport const HostUpdateJobStatusPollingFactory: unique symbol = Symbol(\n 'HostUpdateJobStatusPollingFactory'\n);\n","import {\n EntryPoints,\n EntryPoint,\n EntryPointsListOptions,\n GetHostUpdateJobStatusOptions,\n HostUpdateJobStatusView,\n UpdateHostOptions\n} from './EntryPoints';\nimport { ProxyFactory } from '../Utils';\nimport axios, { Axios } from 'axios';\nimport { inject, injectable } from 'tsyringe';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestProjectsOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestProjectsOptions: unique symbol = Symbol('RestProjectsOptions');\n\n@injectable()\nexport class RestEntryPoints implements EntryPoints {\n private readonly entrypointsPaginationBatchSize = 50;\n private readonly client: Axios;\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestProjectsOptions)\n { baseURL, apiKey, insecure, proxyURL, timeout }: RestProjectsOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async entrypoints({\n limit = 10,\n projectId,\n ...filters\n }: EntryPointsListOptions): Promise<EntryPoint[]> {\n let remaining = limit;\n const data: EntryPoint[] = [];\n let nextId: string;\n let nextCreatedAt: string;\n\n while (remaining > 0) {\n const {\n data: { items = [] }\n } = await this.client.get(`/api/v2/projects/${projectId}/entry-points`, {\n params: {\n nextId,\n nextCreatedAt,\n ...filters,\n limit: Math.min(remaining, this.entrypointsPaginationBatchSize)\n }\n });\n\n if (!items.length) {\n break;\n }\n\n data.push(...items);\n ({ id: nextId, createdAt: nextCreatedAt } = items[items.length - 1]);\n\n remaining -= this.entrypointsPaginationBatchSize;\n }\n\n return data;\n }\n\n public async updateHost(\n options: UpdateHostOptions\n ): Promise<{ taskId: string }> {\n const { projectId, oldHostname, newHostname, entryPointIds } = options;\n\n const { data } = await this.client.post<{ taskId: string }>(\n `/api/v2/projects/${projectId}/entry-points/update-host`,\n {\n oldHostname,\n newHostname,\n entryPointIds\n }\n );\n\n return data;\n }\n\n public async getHostUpdateJobStatus(\n options: GetHostUpdateJobStatusOptions\n ): Promise<HostUpdateJobStatusView> {\n const { jobId, projectId } = options;\n\n const { data } = await this.client.get<HostUpdateJobStatusView>(\n `/api/v2/projects/${projectId}/entry-points/update-host/${jobId}`\n );\n\n return data;\n }\n}\n","export * from './EntryPoints';\nexport * from './RestEntryPoints';\n","import { RepeaterCommandHub } from './RepeaterCommandHub';\nimport { NetworkTestType } from './NetworkTestType';\nimport { VirtualScripts, VirtualScriptType } from '../Scripts';\nimport { Helpers, logger } from '../Utils';\nimport { ReadlinePlatform } from '../Wizard';\nimport { Request, RequestExecutor, Response } from '../RequestExecutor';\nimport { inject, injectable, injectAll } from 'tsyringe';\nimport { EOL } from 'node:os';\n\n@injectable()\nexport class DefaultRepeaterCommandHub implements RepeaterCommandHub {\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @injectAll(RequestExecutor)\n private readonly requestExecutors: RequestExecutor[]\n ) {}\n\n public compileScripts(script: string | Record<string, string>): void {\n this.virtualScripts.clear(VirtualScriptType.REMOTE);\n\n if (this.virtualScripts.size) {\n logger.warn(\n 'Error Loading Script: Cannot accept scripts from the cloud when a local script is already loaded'\n );\n\n return;\n }\n\n if (typeof script === 'string') {\n this.virtualScripts.set('*', VirtualScriptType.REMOTE, script);\n } else {\n Object.entries(script).map(([wildcard, code]: [string, string]) =>\n this.virtualScripts.set(wildcard, VirtualScriptType.REMOTE, code)\n );\n }\n }\n\n public sendRequest(request: Request): Promise<Response> {\n const { protocol } = request;\n\n const requestExecutor = this.requestExecutors.find(\n (x) => x.protocol === protocol\n );\n\n if (!requestExecutor) {\n throw new Error(`Unsupported protocol \"${protocol}\"`);\n }\n\n return requestExecutor.execute(request);\n }\n\n public testNetwork(\n type: NetworkTestType,\n input: string | string[]\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['configure', `--${type}`];\n\n logger.debug('Launching \"Network Diagnostic\" process with cmd: %j', args);\n\n const child = Helpers.spawn({\n include: args,\n exclude: ['repeater']\n });\n\n child.unref();\n\n const stdout: string[] = [];\n\n child.stdout.on('data', (data: Buffer) => {\n const chunk = data.toString();\n const lines: string[] = chunk\n .split('\\n')\n .filter((line: string) => line.length > 0);\n\n stdout.push(...lines);\n\n const [first, ...rest]: string[] = [].concat(input);\n\n if (chunk.indexOf(ReadlinePlatform.URLS_QUESTION) > -1) {\n child.stdin.write(`${[first, ...rest].join(',')}${EOL}`);\n }\n\n if (chunk.indexOf(ReadlinePlatform.HOST_OR_IP_QUESTION) > -1) {\n child.stdin.write(`${new URL(first).hostname}${EOL}`);\n }\n\n if (chunk.indexOf(ReadlinePlatform.COMPELED_MESSAGE) > -1) {\n child.stdin.end();\n }\n });\n\n child.once('error', (err: Error) => {\n logger.warn(\n `Failed to start \"Network Diagnostic\" due to %s`,\n err.message\n );\n reject(err);\n });\n\n child.on('close', (code: number) => {\n if (code !== 0 || stdout.length === 0) {\n const msg = `\"Network Diagnostic\" did not start successfully. Process exited with code ${code}`;\n\n logger.warn(msg);\n\n return reject(new Error(msg));\n }\n\n resolve(this.processOutput(stdout));\n });\n });\n }\n\n // this is workaround of \\x1B[1G control code that retype string in console\n private processOutput(input: string[]): string {\n return input\n .filter(\n (element, index, arr) =>\n !(\n element.endsWith('\\u001b[1G') ||\n (!!arr[index + 1] && arr[index + 1] === '\\u001b[1G')\n )\n )\n .filter((x) => !x.startsWith(ReadlinePlatform.URLS_QUESTION))\n .join('\\n');\n }\n}\n","import { logger, ProxyFactory } from '../Utils';\nimport {\n DeployCommandOptions,\n DeploymentRuntime,\n RepeaterErrorCodes,\n RepeaterServer,\n RepeaterServerDeployedEvent,\n RepeaterServerErrorEvent,\n RepeaterServerEventHandler,\n RepeaterServerEvents,\n RepeaterServerEventsMap,\n RepeaterServerNetworkTestEvent,\n RepeaterServerNetworkTestResult,\n RepeaterServerReconnectionAttemptedEvent,\n RepeaterServerReconnectionFailedEvent,\n RepeaterServerRequestEvent,\n RepeaterServerRequestResponse,\n RepeaterServerScriptsUpdatedEvent,\n RepeaterUpgradeAvailableEvent,\n RepeaterLimitsEvent\n} from './RepeaterServer';\nimport { inject, injectable } from 'tsyringe';\nimport io, { Socket } from 'socket.io-client';\nimport parser from 'socket.io-msgpack-parser';\nimport { captureException, captureMessage } from '@sentry/node';\nimport { EventEmitter, once } from 'node:events';\nimport Timer = NodeJS.Timer;\n\nexport interface DefaultRepeaterServerOptions {\n readonly uri: string;\n readonly token: string;\n readonly connectTimeout?: number;\n readonly proxyUrl?: string;\n readonly insecure?: boolean;\n readonly proxyDomains?: string[];\n}\n\nexport const DefaultRepeaterServerOptions: unique symbol = Symbol(\n 'DefaultRepeaterServerOptions'\n);\n\ntype CallbackFunction<T = unknown> = (arg: T) => unknown;\ntype HandlerFunction = (args: unknown[]) => unknown;\n\nconst enum SocketEvents {\n DEPLOYED = 'deployed',\n DEPLOY = 'deploy',\n UNDEPLOY = 'undeploy',\n UNDEPLOYED = 'undeployed',\n TEST_NETWORK = 'test-network',\n ERROR = 'error',\n UPDATE_AVAILABLE = 'update-available',\n SCRIPT_UPDATED = 'scripts-updated',\n REQUEST = 'request',\n LIMITS = 'limits'\n}\n\ninterface SocketListeningEventMap {\n [SocketEvents.DEPLOYED]: (event: RepeaterServerDeployedEvent) => void;\n [SocketEvents.UNDEPLOYED]: () => void;\n [SocketEvents.ERROR]: (event: RepeaterServerErrorEvent) => void;\n [SocketEvents.TEST_NETWORK]: (\n event: RepeaterServerNetworkTestEvent,\n callback: CallbackFunction<RepeaterServerNetworkTestResult>\n ) => void;\n [SocketEvents.UPDATE_AVAILABLE]: (\n event: RepeaterUpgradeAvailableEvent\n ) => void;\n [SocketEvents.SCRIPT_UPDATED]: (\n event: RepeaterServerScriptsUpdatedEvent\n ) => void;\n [SocketEvents.REQUEST]: (\n request: RepeaterServerRequestEvent,\n callback: CallbackFunction<RepeaterServerRequestResponse>\n ) => void;\n [SocketEvents.LIMITS]: (request: RepeaterLimitsEvent) => void;\n}\n\ninterface SocketEmitEventMap {\n [SocketEvents.DEPLOY]: (\n options: DeployCommandOptions,\n runtime?: DeploymentRuntime\n ) => void;\n [SocketEvents.UNDEPLOY]: () => void;\n}\n\n@injectable()\nexport class DefaultRepeaterServer implements RepeaterServer {\n private readonly MAX_DEPLOYMENT_TIMEOUT = 60_000;\n private readonly MIN_RECONNECTION_DELAY = 5_000;\n private readonly MAX_RECONNECTION_DELAY = 1_000;\n private readonly events = new EventEmitter();\n private readonly handlerMap = new WeakMap<\n RepeaterServerEventHandler<any>,\n HandlerFunction\n >();\n private latestReconnectionError?: Error;\n private connectionTimer?: Timer;\n private _socket?: Socket<SocketListeningEventMap, SocketEmitEventMap>;\n private connectionAttempts = 0;\n\n private get socket() {\n if (!this._socket) {\n throw new Error(\n 'Please make sure that repeater established a connection with host.'\n );\n }\n\n return this._socket;\n }\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(DefaultRepeaterServerOptions)\n private readonly options: DefaultRepeaterServerOptions\n ) {}\n\n public disconnect() {\n this.events.removeAllListeners();\n this.clearConnectionTimer();\n\n this._socket?.disconnect();\n this._socket?.removeAllListeners();\n this._socket = undefined;\n }\n\n public async deploy(\n options: DeployCommandOptions,\n runtime: DeploymentRuntime\n ): Promise<RepeaterServerDeployedEvent> {\n process.nextTick(() =>\n this.socket.emit(SocketEvents.DEPLOY, options, runtime)\n );\n\n const [result]: RepeaterServerDeployedEvent[] = await Promise.race([\n once(this.socket, SocketEvents.DEPLOYED),\n new Promise<never>((_, reject) =>\n setTimeout(\n reject,\n this.MAX_DEPLOYMENT_TIMEOUT,\n new Error('No response.')\n ).unref()\n )\n ]);\n\n return result;\n }\n\n public async connect(hostname: string) {\n this._socket = io(this.options.uri, {\n parser,\n path: '/api/ws/v1',\n transports: ['websocket'],\n reconnectionDelayMax: this.MAX_RECONNECTION_DELAY,\n reconnectionDelay: this.MIN_RECONNECTION_DELAY,\n timeout: this.options?.connectTimeout,\n rejectUnauthorized: !this.options.insecure,\n // @ts-expect-error Type is wrong.\n // Agent is passed directly to \"ws\" package, which accepts http.Agent\n agent: this.options.proxyUrl\n ? this.proxyFactory.createProxyForClient({\n proxyUrl: this.options.proxyUrl,\n targetUrl: this.options.uri,\n rejectUnauthorized: !this.options.insecure\n })\n : undefined,\n auth: {\n token: this.options.token,\n domain: hostname\n }\n });\n\n this.listenToReservedEvents();\n this.listenToApplicationEvents();\n\n await once(this.socket, 'connect');\n\n logger.debug('Repeater connected to %s', this.options.uri);\n }\n\n public off<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler?: RepeaterServerEventHandler<K>\n ): void {\n const wrappedHandler = this.handlerMap.get(handler);\n if (wrappedHandler) {\n this.events.off(event, wrappedHandler);\n this.handlerMap.delete(handler);\n }\n }\n\n public on<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler: RepeaterServerEventHandler<K>\n ): void {\n const wrappedHandler = (...args: unknown[]) =>\n this.wrapEventListener(event, handler, ...args);\n this.handlerMap.set(handler, wrappedHandler);\n this.events.on(event, wrappedHandler);\n }\n\n private listenToApplicationEvents() {\n this.socket.on(SocketEvents.DEPLOYED, (event) =>\n this.events.emit(RepeaterServerEvents.DEPLOY, event)\n );\n this.socket.on(SocketEvents.REQUEST, (event, callback) =>\n this.events.emit(RepeaterServerEvents.REQUEST, event, callback)\n );\n this.socket.on(SocketEvents.TEST_NETWORK, (event, callback) =>\n this.events.emit(RepeaterServerEvents.TEST_NETWORK, event, callback)\n );\n this.socket.on(SocketEvents.ERROR, (event) => {\n captureMessage(event.message);\n this.events.emit(RepeaterServerEvents.ERROR, event);\n });\n this.socket.on(SocketEvents.UPDATE_AVAILABLE, (event) =>\n this.events.emit(RepeaterServerEvents.UPDATE_AVAILABLE, event)\n );\n this.socket.on(SocketEvents.SCRIPT_UPDATED, (event) =>\n this.events.emit(RepeaterServerEvents.SCRIPTS_UPDATED, event)\n );\n this.socket.on(SocketEvents.LIMITS, (event) =>\n this.events.emit(RepeaterServerEvents.LIMITS, event)\n );\n }\n\n private listenToReservedEvents() {\n this.socket.on('connect', this.handleConnect);\n this.socket.on('connect_error', this.handleConnectionError);\n this.socket.on('disconnect', this.handleDisconnect);\n this.socket.io.on('reconnect', () => {\n this.latestReconnectionError = undefined;\n });\n this.socket.io.on(\n 'reconnect_error',\n (error) => (this.latestReconnectionError = error)\n );\n this.socket.io.on('reconnect_failed', () =>\n this.events.emit(RepeaterServerEvents.RECONNECTION_FAILED, {\n error: this.latestReconnectionError\n } as RepeaterServerReconnectionFailedEvent)\n );\n this.socket.io.on('reconnect_attempt', (attempt) =>\n this.events.emit(RepeaterServerEvents.RECONNECT_ATTEMPT, {\n attempt\n } as RepeaterServerReconnectionAttemptedEvent)\n );\n this.socket.io.on('reconnect', () =>\n this.events.emit(RepeaterServerEvents.RECONNECTION_SUCCEEDED)\n );\n }\n\n private handleConnectionError = (err: Error) => {\n const { data } = err as unknown as {\n data?: Omit<RepeaterServerErrorEvent, 'transaction'>;\n };\n\n if (data && this.suppressConnectionError(data)) {\n this.events.emit(RepeaterServerEvents.ERROR, {\n ...data,\n message: err.message\n });\n }\n\n // Try reconnect in any case.\n this.scheduleReconnection();\n };\n\n private suppressConnectionError(\n data: Omit<RepeaterServerErrorEvent, 'transaction'>\n ) {\n return [\n RepeaterErrorCodes.REPEATER_UNAUTHORIZED,\n RepeaterErrorCodes.REPEATER_NOT_PERMITTED\n ].includes(data.code);\n }\n\n private scheduleReconnection() {\n let delay = Math.max(\n this.MIN_RECONNECTION_DELAY * 2 ** this.connectionAttempts,\n this.MIN_RECONNECTION_DELAY\n );\n delay += delay * 0.3 * Math.random();\n delay = Math.min(delay, this.MAX_RECONNECTION_DELAY);\n\n this.connectionAttempts++;\n\n this.events.emit(RepeaterServerEvents.RECONNECT_ATTEMPT, {\n attempt: this.connectionAttempts\n } as RepeaterServerReconnectionAttemptedEvent);\n this.connectionTimer = setTimeout(() => this.socket.connect(), delay);\n }\n\n private async wrapEventListener<TArgs extends TArg[], TArg>(\n event: string,\n handler: (...payload: TArgs) => unknown,\n ...args: unknown[]\n ) {\n try {\n const callback = this.extractLastArgument(args);\n\n // eslint-disable-next-line @typescript-eslint/return-await\n const response = await handler(...(args as TArgs));\n\n callback?.(response);\n } catch (err) {\n this.handleEventError(err, event, args);\n }\n }\n\n private extractLastArgument(args: unknown[]): CallbackFunction | undefined {\n const lastArg = args.pop();\n if (typeof lastArg === 'function') {\n return lastArg as CallbackFunction;\n } else {\n // If the last argument is not a function, add it back to the args array\n args.push(lastArg);\n\n return undefined;\n }\n }\n\n private clearConnectionTimer() {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n }\n }\n\n private handleConnect = () => {\n this.connectionAttempts = 0;\n this.clearConnectionTimer();\n this.events.emit(RepeaterServerEvents.CONNECTED);\n };\n\n private handleDisconnect = (reason: string): void => {\n if (reason !== 'io client disconnect') {\n this.events.emit(RepeaterServerEvents.DISCONNECTED);\n }\n\n // the disconnection was initiated by the server, you need to reconnect manually\n if (reason === 'io server disconnect') {\n this.socket.connect();\n }\n };\n\n private handleEventError(error: Error, event: string, args: unknown[]): void {\n captureException(error);\n logger.debug(\n 'An error occurred while processing the %s event with the following payload: %j',\n event,\n args\n );\n logger.error(error);\n }\n}\n","import { CliInfo } from '../Config';\nimport { RuntimeDetector } from './RuntimeDetector';\nimport arch from 'arch';\nimport { delay, inject, injectable } from 'tsyringe';\nimport ci from 'ci-info';\nimport { execSync } from 'node:child_process';\nimport os from 'node:os';\n\n@injectable()\nexport class DefaultRuntimeDetector implements RuntimeDetector {\n constructor(\n @inject(delay(() => CliInfo)) private readonly cliInfo: CliInfo\n ) {}\n\n public distribution(): string | undefined {\n return this.cliInfo.distribution;\n }\n\n public isInsideDocker(): boolean {\n return !!process.env['BRIGHT_CLI_DOCKER'];\n }\n\n public nodeVersion(): string {\n return process.version;\n }\n\n public ci(): string {\n return ci.name ?? undefined;\n }\n\n public arch(): string {\n try {\n return arch();\n } catch {\n // pass\n }\n\n // As a fallback use arch info for which the Node.js binary was compiled\n return os.arch();\n }\n\n public os(): string {\n const platform = os.platform();\n\n if (platform === 'darwin') {\n return this.detectMacosVersion();\n } else if (platform === 'linux') {\n return this.detectLinuxVersion();\n } else if (platform === 'win32') {\n return this.detectWindowsVersion();\n }\n\n // As a fallback use OS info for which the Node.js binary was compiled\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectMacosVersion() {\n try {\n const name = execSync('sw_vers -productName', {\n encoding: 'utf8'\n }).trim();\n const version = execSync('sw_vers -productVersion', {\n encoding: 'utf8'\n }).trim();\n const build = execSync('sw_vers -buildVersion', {\n encoding: 'utf8'\n }).trim();\n\n if (name.length && version.length && build.length) {\n return `${name} ${version} (${build})`;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectLinuxVersion() {\n try {\n const osRelease = execSync('cat /etc/os-release', {\n encoding: 'utf8'\n }).trim();\n const extractValue = (key: string) =>\n new RegExp(\n `(?:^|[\\r\\n]+)${key}(?:\\\\s*=\\\\s*?|:\\\\s+?)(\\\\s*'(?:\\\\\\\\'|[^'])*'|\\\\s*\"(?:\\\\\\\\\"|[^\"])*\"|\\\\s*\\`(?:\\\\\\\\\\`|[^\\`])*\\`|[^#\\r\\n]+)?`,\n 'i'\n )\n .exec(osRelease)?.[1]\n .replace(/^(['\"`])([\\s\\S]*)\\1$/i, '$2');\n\n const name = extractValue('NAME') || extractValue('ID');\n const version = extractValue('VERSION') || extractValue('VERSION_ID');\n const prettyName = extractValue('PRETTY_NAME');\n\n if (name.length && version.length) {\n return `${name} ${version}`;\n } else if (prettyName.length) {\n return prettyName;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n\n private detectWindowsVersion() {\n try {\n const version = execSync('ver', { encoding: 'utf8' }).trim();\n\n if (version.length) {\n return version;\n }\n } catch {\n // pass\n }\n\n return `${os.platform()} (${os.release()})`;\n }\n}\n","export enum NetworkTestType {\n PING = 'ping',\n TRACEROUTE = 'traceroute'\n}\n","import { Request, Response } from '../RequestExecutor';\nimport { NetworkTestType } from './NetworkTestType';\n\nexport interface RepeaterCommandHub {\n compileScripts(script: string | Record<string, string>): void;\n testNetwork(type: NetworkTestType, input: string | string[]): Promise<string>;\n sendRequest(request: Request): Promise<Response>;\n}\n\nexport const RepeaterCommandHub: unique symbol = Symbol('RepeaterCommandHub');\n","export interface RepeaterLauncher {\n loadCerts(cacert?: string): Promise<void>;\n\n loadScripts(scripts: Record<string, string>): Promise<void>;\n\n run(repeaterId: string, asDaemon?: boolean): Promise<void>;\n\n close(): Promise<void>;\n\n uninstall(): Promise<void>;\n\n install(): Promise<void>;\n}\n\nexport const RepeaterLauncher: unique symbol = Symbol('RepeaterLauncher');\n","import { Protocol } from '../RequestExecutor';\nimport { NetworkTestType } from './NetworkTestType';\n\nexport interface RepeaterServerDeployedEvent {\n repeaterId: string;\n}\n\nexport interface RepeaterServerRequestEvent {\n protocol: Protocol;\n url: string;\n method?: string;\n headers?: Record<string, string | string[]>;\n correlationIdRegex?: string;\n body?: string;\n encoding?: 'base64';\n maxContentSize?: number;\n timeout?: number;\n}\n\nexport type RepeaterServerNetworkTestEvent =\n | {\n type: NetworkTestType.PING;\n input: string[];\n }\n | {\n type: NetworkTestType.TRACEROUTE;\n input: string;\n };\n\nexport type RepeaterServerNetworkTestResult =\n | {\n output: string;\n }\n | {\n error: string;\n };\n\nexport type RepeaterServerRequestResponse =\n | {\n protocol: Protocol;\n statusCode?: number;\n message?: string;\n errorCode?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: string;\n }\n | {\n protocol: Protocol;\n message?: string;\n errorCode?: string;\n };\n\nexport interface RepeaterServerReconnectionFailedEvent {\n error: Error;\n}\n\nexport interface RepeaterServerReconnectionAttemptedEvent {\n attempt: number;\n}\n\nexport enum RepeaterErrorCodes {\n REPEATER_NOT_PERMITTED = 'repeater_not_permitted',\n REPEATER_ALREADY_STARTED = 'repeater_already_started',\n REPEATER_DEACTIVATED = 'repeater_deactivated',\n REPEATER_UNAUTHORIZED = 'repeater_unauthorized',\n REPEATER_NO_LONGER_SUPPORTED = 'repeater_no_longer_supported',\n UNKNOWN_ERROR = 'unknown_error',\n UNEXPECTED_ERROR = 'unexpected_error'\n}\n\nexport interface RepeaterServerErrorEvent {\n message: string;\n code: RepeaterErrorCodes;\n transaction?: string;\n remediation?: string;\n}\n\nexport interface RepeaterUpgradeAvailableEvent {\n version: string;\n}\n\nexport interface RepeaterLimitsEvent {\n maxBodySize: number;\n}\n\nexport interface RepeaterServerScriptsUpdatedEvent {\n script: string | Record<string, string>;\n}\n\nexport interface DeployCommandOptions {\n repeaterId?: string;\n}\n\nexport interface DeploymentRuntime {\n version: string;\n scriptsLoaded: boolean;\n ci?: string;\n os?: string;\n arch?: string;\n docker?: boolean;\n distribution?: string;\n nodeVersion?: string;\n}\n\nexport const enum RepeaterServerEvents {\n DEPLOYED = 'deployed',\n DEPLOY = 'deploy',\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n REQUEST = 'request',\n TEST_NETWORK = 'test_network',\n UPDATE_AVAILABLE = 'update_available',\n LIMITS = 'limits',\n SCRIPTS_UPDATED = 'scripts_updated',\n RECONNECTION_FAILED = 'reconnection_failed',\n RECONNECT_ATTEMPT = 'reconnect_attempt',\n RECONNECTION_SUCCEEDED = 'reconnection_succeeded',\n ERROR = 'error',\n PING = 'ping'\n}\n\nexport interface RepeaterServerEventsMap {\n [RepeaterServerEvents.DEPLOY]: [DeployCommandOptions, DeploymentRuntime?];\n [RepeaterServerEvents.DEPLOYED]: RepeaterServerDeployedEvent;\n [RepeaterServerEvents.CONNECTED]: void;\n [RepeaterServerEvents.DISCONNECTED]: void;\n [RepeaterServerEvents.REQUEST]: RepeaterServerRequestEvent;\n [RepeaterServerEvents.TEST_NETWORK]: RepeaterServerNetworkTestEvent;\n [RepeaterServerEvents.UPDATE_AVAILABLE]: RepeaterUpgradeAvailableEvent;\n [RepeaterServerEvents.LIMITS]: RepeaterLimitsEvent;\n [RepeaterServerEvents.SCRIPTS_UPDATED]: RepeaterServerScriptsUpdatedEvent;\n [RepeaterServerEvents.RECONNECTION_FAILED]: RepeaterServerReconnectionFailedEvent;\n [RepeaterServerEvents.RECONNECT_ATTEMPT]: RepeaterServerReconnectionAttemptedEvent;\n [RepeaterServerEvents.RECONNECTION_SUCCEEDED]: void;\n [RepeaterServerEvents.ERROR]: RepeaterServerErrorEvent;\n [RepeaterServerEvents.PING]: void;\n}\n\nexport type RepeaterServerEventHandler<\n K extends keyof RepeaterServerEventsMap\n> = (\n ...args: RepeaterServerEventsMap[K] extends (infer U)[]\n ? U[]\n : [RepeaterServerEventsMap[K]]\n) => unknown;\n\nexport interface RepeaterServer {\n disconnect(): void;\n\n connect(hostname: string): Promise<void>;\n\n deploy(\n options: DeployCommandOptions,\n runtime?: DeploymentRuntime\n ): Promise<RepeaterServerDeployedEvent>;\n\n on<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler: RepeaterServerEventHandler<K>\n ): void;\n\n off<K extends keyof RepeaterServerEventsMap>(\n event: K,\n handler?: RepeaterServerEventHandler<K>\n ): void;\n}\n\nexport const RepeaterServer: unique symbol = Symbol('RepeaterServer');\n","export interface RuntimeDetector {\n ci(): string | undefined;\n\n os(): string;\n\n arch(): string;\n\n isInsideDocker(): boolean;\n\n nodeVersion(): string;\n\n distribution(): string | undefined;\n}\n\nexport const RuntimeDetector: unique symbol = Symbol('RuntimeDetector');\n","import { RepeaterLauncher } from './RepeaterLauncher';\nimport {\n DeploymentRuntime,\n RepeaterLimitsEvent,\n RepeaterErrorCodes,\n RepeaterServer,\n RepeaterServerErrorEvent,\n RepeaterServerEvents,\n RepeaterServerNetworkTestEvent,\n RepeaterServerReconnectionFailedEvent,\n RepeaterServerRequestEvent\n} from './RepeaterServer';\nimport { RuntimeDetector } from './RuntimeDetector';\nimport { ScriptLoader, VirtualScripts } from '../Scripts';\nimport { StartupManager } from '../StartupScripts';\nimport {\n Certificates,\n Request,\n RequestExecutorOptions\n} from '../RequestExecutor';\nimport { Helpers, logger } from '../Utils';\nimport { CliInfo } from '../Config';\nimport { RepeaterCommandHub } from './RepeaterCommandHub';\nimport { delay, inject, injectable } from 'tsyringe';\nimport chalk from 'chalk';\nimport { captureException, setTag } from '@sentry/node';\n\n@injectable()\nexport class ServerRepeaterLauncher implements RepeaterLauncher {\n private static readonly SERVICE_NAME = 'bright-repeater';\n private repeaterRunning: boolean = false;\n private repeaterId: string | undefined;\n\n constructor(\n @inject(RuntimeDetector) private readonly runtimeDetector: RuntimeDetector,\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @inject(RepeaterServer) private readonly repeaterServer: RepeaterServer,\n @inject(StartupManager)\n private readonly startupManager: StartupManager,\n @inject(RepeaterCommandHub)\n private readonly commandHub: RepeaterCommandHub,\n @inject(Certificates) private readonly certificates: Certificates,\n @inject(ScriptLoader) private readonly scriptLoader: ScriptLoader,\n @inject(RequestExecutorOptions)\n private readonly requestExecutorOptions: RequestExecutorOptions,\n @inject(delay(() => CliInfo)) private readonly info: CliInfo\n ) {}\n\n public close() {\n this.repeaterRunning = false;\n\n this.repeaterServer.disconnect();\n\n return Promise.resolve();\n }\n\n public async install(): Promise<void> {\n const { command, args: execArgs } = Helpers.getExecArgs({\n escape: false,\n include: ['--run'],\n exclude: ['--daemon', '-d']\n });\n\n await this.startupManager.install({\n command,\n args: execArgs,\n name: ServerRepeaterLauncher.SERVICE_NAME,\n displayName: 'Bright Repeater'\n });\n\n logger.log(\n 'A Repeater daemon process was initiated successfully (SERVICE: %s)',\n ServerRepeaterLauncher.SERVICE_NAME\n );\n }\n\n public loadCerts(cacert: string): Promise<void> {\n return this.certificates.load(cacert);\n }\n\n public loadScripts(scripts: Record<string, string>): Promise<void> {\n return this.scriptLoader.load(scripts);\n }\n\n public async uninstall(): Promise<void> {\n await this.startupManager.uninstall(ServerRepeaterLauncher.SERVICE_NAME);\n\n logger.log(\n 'The Repeater daemon process (SERVICE: %s) was stopped and deleted successfully',\n ServerRepeaterLauncher.SERVICE_NAME\n );\n }\n\n public async run(\n repeaterId: string,\n asDaemon: boolean = false\n ): Promise<void> {\n if (this.repeaterRunning) {\n return;\n }\n\n this.repeaterRunning = true;\n\n setTag('bridge_id', repeaterId);\n\n if (asDaemon) {\n await this.startupManager.run(() => this.close());\n }\n\n logger.log('Starting the Repeater (%s)...', this.info.version);\n\n this.repeaterId = repeaterId;\n\n this.subscribeToEvents();\n\n await this.repeaterServer.connect(this.repeaterId);\n }\n\n private getRuntime(): DeploymentRuntime {\n return {\n version: this.info.version,\n scriptsLoaded: !!this.virtualScripts.size,\n ci: this.runtimeDetector.ci(),\n os: this.runtimeDetector.os(),\n arch: this.runtimeDetector.arch(),\n docker: this.runtimeDetector.isInsideDocker(),\n distribution: this.runtimeDetector.distribution(),\n nodeVersion: this.runtimeDetector.nodeVersion()\n };\n }\n\n private subscribeToEvents() {\n this.repeaterServer.on(RepeaterServerEvents.CONNECTED, this.deployRepeater);\n this.repeaterServer.on(RepeaterServerEvents.ERROR, this.handleError);\n this.repeaterServer.on(\n RepeaterServerEvents.RECONNECTION_FAILED,\n this.reconnectionFailed\n );\n this.repeaterServer.on(RepeaterServerEvents.REQUEST, this.requestReceived);\n this.repeaterServer.on(RepeaterServerEvents.LIMITS, this.limitsReceived);\n this.repeaterServer.on(\n RepeaterServerEvents.TEST_NETWORK,\n this.testingNetwork\n );\n this.repeaterServer.on(RepeaterServerEvents.SCRIPTS_UPDATED, (payload) =>\n this.commandHub.compileScripts(payload.script)\n );\n this.repeaterServer.on(RepeaterServerEvents.UPDATE_AVAILABLE, (payload) =>\n logger.warn(\n '%s: A new Repeater version (%s) is available, for update instruction visit https://docs.brightsec.com/docs/cli-installation-guide',\n chalk.yellow('(!) IMPORTANT'),\n payload.version\n )\n );\n this.repeaterServer.on(\n RepeaterServerEvents.RECONNECT_ATTEMPT,\n ({ attempt }) =>\n logger.warn('Failed to connect to Bright cloud (attempt %d)', attempt)\n );\n this.repeaterServer.on(RepeaterServerEvents.RECONNECTION_SUCCEEDED, () =>\n logger.log('The Repeater (%s) connected', this.info.version)\n );\n }\n\n private handleError = ({\n code,\n message,\n remediation\n }: RepeaterServerErrorEvent) => {\n const normalizedMessage = this.normalizeMessage(message);\n const normalizedRemediation = this.normalizeMessage(remediation ?? '');\n\n if (this.isCriticalError(code)) {\n this.handleCriticalError(normalizedMessage, normalizedRemediation);\n } else {\n logger.error(normalizedMessage);\n }\n };\n\n private normalizeMessage(message: string): string {\n return message.replace(/\\.$/, '');\n }\n\n private isCriticalError(code: RepeaterErrorCodes): boolean {\n return [\n RepeaterErrorCodes.REPEATER_DEACTIVATED,\n RepeaterErrorCodes.REPEATER_NO_LONGER_SUPPORTED,\n RepeaterErrorCodes.REPEATER_UNAUTHORIZED,\n RepeaterErrorCodes.REPEATER_ALREADY_STARTED,\n RepeaterErrorCodes.REPEATER_NOT_PERMITTED,\n RepeaterErrorCodes.UNEXPECTED_ERROR\n ].includes(code);\n }\n\n private handleCriticalError(message: string, remediation: string): void {\n logger.error('%s: %s. %s', chalk.red('(!) CRITICAL'), message, remediation);\n this.close().catch(logger.error);\n process.exitCode = 1;\n }\n\n private deployRepeater = async () => {\n try {\n await this.repeaterServer.deploy(\n {\n repeaterId: this.repeaterId\n },\n this.getRuntime()\n );\n logger.log('The Repeater (%s) started', this.info.version);\n } catch {\n // noop\n }\n };\n\n private reconnectionFailed = ({\n error\n }: RepeaterServerReconnectionFailedEvent) => {\n captureException(error);\n logger.error(error);\n this.close().catch(logger.error);\n process.exitCode = 1;\n };\n\n private testingNetwork = async (event: RepeaterServerNetworkTestEvent) => {\n try {\n const output = await this.commandHub.testNetwork(event.type, event.input);\n\n return {\n output\n };\n } catch (e) {\n return {\n error: typeof e === 'string' ? e : (e as Error).message\n };\n }\n };\n\n private limitsReceived = (event: RepeaterLimitsEvent) => {\n logger.debug('Limits received: %i', event.maxBodySize);\n this.requestExecutorOptions.maxBodySize = event.maxBodySize;\n };\n\n private requestReceived = async (event: RepeaterServerRequestEvent) => {\n const response = await this.commandHub.sendRequest(\n new Request({ ...event })\n );\n\n const {\n statusCode,\n message,\n errorCode,\n body,\n headers,\n protocol,\n encoding\n } = response;\n\n return {\n protocol,\n body,\n headers,\n statusCode,\n errorCode,\n message,\n encoding\n };\n };\n}\n","export * from './RepeaterCommandHub';\nexport * from './DefaultRepeaterCommandHub';\nexport * from './NetworkTestType';\nexport * from './DefaultRepeaterServer';\nexport * from './RepeaterLauncher';\nexport * from './RepeaterServer';\nexport * from './ServerRepeaterLauncher';\nexport * from './RuntimeDetector';\nexport * from './DefaultRuntimeDetector';\n","export interface Certificates {\n load(path?: string): Promise<void>;\n}\n\nexport const Certificates: unique symbol = Symbol('Certificates');\n","import { Cert, Request } from './Request';\n\nexport interface CertificatesCache {\n add(request: Request, cert: Cert): void;\n get(request: Request): Cert | undefined;\n}\n\nexport const CertificatesCache: unique symbol = Symbol('CertificatesCache');\n","import { logger } from '../Utils';\nimport { Certificates } from './Certificates';\nimport loadWinCertificates from 'win-ca';\nimport https from 'node:https';\nimport { readFile } from 'node:fs/promises';\n\nexport class CertificatesLoader implements Certificates {\n private readonly CERT_FILES = [\n '/etc/ssl/certs/ca-certificates.crt', // Debian/Ubuntu/Gentoo etc.\n '/etc/pki/tls/certs/ca-bundle.crt', // Fedora/RHEL 6\n '/etc/ssl/ca-bundle.pem', // OpenSUSE\n '/etc/pki/tls/cacert.pem', // OpenELEC\n '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // CentOS/RHEL 7\n '/etc/ssl/cert.pem' // Alpine Linux\n ];\n\n public async load(path?: string): Promise<void> {\n const win = process.platform === 'win32';\n\n try {\n if (win) {\n loadWinCertificates();\n } else if (typeof path === 'string') {\n await this.loadCertsFromFile(path);\n } else {\n await this.discoveryDefaultLocations();\n }\n } catch {\n logger.warn(\n `Error Loading Certificate: Cannot load certificates from ${\n win\n ? 'Trusted Root Certification Authorities Certificate Store'\n : path\n }.`\n );\n }\n }\n\n /**\n * Discovers possible certificate files; stop after finding one\n */\n private async discoveryDefaultLocations(): Promise<void> {\n for (const path of this.CERT_FILES) {\n try {\n await this.loadCertsFromFile(path);\n\n return;\n } catch {\n // noop\n }\n }\n\n logger.warn(\n `Error Loading Certificate: Cannot load certificates from the system root. Please use --cacert option to specify the accurate path to the file. https://docs.brightsec.com/docs/cli-initializing-the-repeater#options`\n );\n }\n\n /**\n * Workarounds about loading certs on linux https://github.com/nodejs/node/issues/4175\n * use update-ca-certificates to update '/etc/ssl/certs/ca-certificates.crt'\n */\n private async loadCertsFromFile(path: string): Promise<void> {\n const ca: string = await readFile(path, 'utf8');\n\n https.globalAgent.options.ca = ca\n .split(/-----END CERTIFICATE-----\\n?/)\n .filter((cert) => !!cert)\n .map((cert) => `${cert}-----END CERTIFICATE-----\\n`);\n }\n}\n","import { Cert, Request } from './Request';\n\nexport interface CertificatesResolver {\n resolve(request: Request, registeredCerts: Cert[]): Cert[];\n}\n\nexport const CertificatesResolver: unique symbol = Symbol(\n 'CertificatesResolver'\n);\n","import { Helpers } from '../Utils';\nimport { CertificatesCache } from './CertificatesCache';\nimport { Cert, Request } from './Request';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultCertificatesCache implements CertificatesCache {\n private readonly cache: Map<string, Cert> = new Map<string, Cert>();\n\n public add(request: Request, cert: Cert): void {\n const key = this.certificateCacheKeyFromRequest(request);\n if (this.cache.has(key)) {\n return;\n }\n this.cache.set(key, cert);\n }\n\n public get(request: Request): Cert | undefined {\n return this.cache.get(this.certificateCacheKeyFromRequest(request));\n }\n\n private certificateCacheKeyFromRequest(request: Request): string {\n const requestUrl = new URL(request.url);\n\n return `${requestUrl.hostname}_${Helpers.portFromURL(requestUrl)}`;\n }\n}\n","import { Helpers } from '../Utils/Helpers';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { Cert, Request } from './Request';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultCertificatesResolver implements CertificatesResolver {\n constructor(\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache\n ) {}\n\n public resolve(request: Request, registeredCerts: Cert[]): Cert[] {\n const cachedCertificate = this.certificatesCache.get(request);\n if (cachedCertificate) {\n return [cachedCertificate];\n }\n\n const requestUrl = new URL(request.url);\n const port = Helpers.portFromURL(requestUrl);\n\n return registeredCerts.filter((cert: Cert) =>\n this.matchHostnameAndPort(requestUrl.hostname, port, cert)\n );\n }\n\n private matchHostnameAndPort(\n hostname: string,\n port: string,\n cert: Cert\n ): boolean {\n const hostNameMatch =\n cert.hostname === hostname ||\n Helpers.wildcardToRegExp(cert.hostname).test(hostname);\n\n if (!hostNameMatch) {\n return false;\n }\n\n if (!cert.port) {\n // ADHOC: hostNameMatch has been checked above and it's true\n return true;\n }\n\n return cert.port === port;\n }\n}\n","import { RequestExecutor } from './RequestExecutor';\nimport { Response } from './Response';\nimport { Cert, Request, RequestOptions } from './Request';\nimport { Helpers, logger, ProxyFactory } from '../Utils';\nimport { VirtualScripts } from '../Scripts';\nimport { Protocol } from './Protocol';\nimport { RequestExecutorOptions } from './RequestExecutorOptions';\nimport { NormalizeZlibDeflateTransformStream } from '../Utils/NormalizeZlibDeflateTransformStream';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { inject, injectable } from 'tsyringe';\nimport iconv from 'iconv-lite';\nimport { safeParse } from 'fast-content-type-parse';\nimport { parse as parseUrl } from 'node:url';\nimport http, {\n ClientRequest,\n IncomingMessage,\n OutgoingMessage\n} from 'node:http';\nimport https, {\n AgentOptions,\n RequestOptions as ClientRequestOptions\n} from 'node:https';\nimport { once } from 'node:events';\nimport { Readable } from 'node:stream';\nimport {\n constants,\n createBrotliDecompress,\n createGunzip,\n createInflate\n} from 'node:zlib';\n\ntype ScriptEntrypoint = (\n options: RequestOptions\n) => Promise<RequestOptions> | RequestOptions;\n\n@injectable()\nexport class HttpRequestExecutor implements RequestExecutor {\n private readonly DEFAULT_SCRIPT_ENTRYPOINT = 'handle';\n private readonly httpProxyAgent?: http.Agent;\n private readonly httpsProxyAgent?: https.Agent;\n private readonly httpAgent?: http.Agent;\n private readonly httpsAgent?: https.Agent;\n private readonly proxyDomains?: RegExp[];\n private readonly proxyDomainsBypass?: RegExp[];\n\n get protocol(): Protocol {\n return Protocol.HTTP;\n }\n\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RequestExecutorOptions)\n private readonly options: RequestExecutorOptions,\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache,\n @inject(CertificatesResolver)\n private readonly certificatesResolver: CertificatesResolver\n ) {\n if (this.options.proxyUrl) {\n ({ httpsAgent: this.httpsProxyAgent, httpAgent: this.httpProxyAgent } =\n this.proxyFactory.createProxy({ proxyUrl: this.options.proxyUrl }));\n }\n\n if (this.options.reuseConnection) {\n const agentOptions: AgentOptions = {\n keepAlive: true,\n maxSockets: 100,\n timeout: this.options.timeout\n };\n\n this.httpsAgent = new https.Agent(agentOptions);\n this.httpAgent = new http.Agent(agentOptions);\n }\n\n if (this.options.proxyDomains && this.options.proxyDomainsBypass) {\n throw new Error(\n 'cannot use both proxyDomains and proxyDomainsBypass at the same time'\n );\n }\n\n if (this.options.proxyDomains) {\n this.proxyDomains = this.options.proxyDomains.map((domain) =>\n Helpers.wildcardToRegExp(domain)\n );\n }\n\n if (this.options.proxyDomainsBypass) {\n this.proxyDomainsBypass = this.options.proxyDomainsBypass.map((domain) =>\n Helpers.wildcardToRegExp(domain)\n );\n }\n }\n\n public async execute(options: Request): Promise<Response> {\n try {\n if (this.options.headers) {\n options.setHeaders(this.options.headers);\n }\n\n options = await this.transformScript(options);\n\n const targetCerts: Cert[] | undefined = this.options.certs\n ? this.certificatesResolver.resolve(options, this.options.certs)\n : undefined;\n\n if (targetCerts === undefined || targetCerts.length === 0) {\n // We may have https and http targets connected with same repeater,\n // or certificates may not be necessary.\n // If certificates not found try request anyway.\n logger.debug(\n 'Executing HTTP request with following params: %j',\n options\n );\n\n return await this.executeRequest(options);\n }\n\n return await this.tryRequestWithCertificates(options, targetCerts);\n } catch (err) {\n const { cause } = err;\n const { message, code, syscall, name } = cause ?? err;\n const errorCode = code ?? syscall ?? name;\n\n logger.error(\n 'Error executing request: \"%s %s HTTP/1.1\"',\n options.method,\n options.url\n );\n logger.error('Cause: %s', message);\n\n return new Response({\n message,\n errorCode,\n protocol: this.protocol\n });\n }\n }\n\n private async request(options: Request) {\n let timer: NodeJS.Timeout | undefined;\n let res!: IncomingMessage;\n\n try {\n const req = this.createRequest(options);\n\n process.nextTick(() =>\n req.end(\n options.encoding\n ? iconv.encode(options.body, options.encoding)\n : options.body\n )\n );\n timer = this.setTimeout(req, options.timeout);\n\n [res] = (await once(req, 'response')) as [IncomingMessage];\n } finally {\n clearTimeout(timer);\n }\n\n return this.truncateResponse(options, res);\n }\n\n private createRequest(request: Request): ClientRequest {\n const protocol = request.secureEndpoint ? https : http;\n const outgoingMessage = protocol.request(\n this.createRequestOptions(request)\n );\n this.setHeaders(outgoingMessage, request);\n\n if (!outgoingMessage.hasHeader('accept-encoding')) {\n outgoingMessage.setHeader('accept-encoding', 'gzip, deflate');\n }\n\n return outgoingMessage;\n }\n\n private setTimeout(\n req: ClientRequest,\n timeout?: number\n ): NodeJS.Timeout | undefined {\n timeout ??= this.options.timeout;\n if (typeof timeout === 'number') {\n return setTimeout(\n () =>\n req.destroy(\n Object.assign(new Error('Waiting response has timed out'), {\n code: 'ETIMEDOUT'\n })\n ),\n timeout\n );\n }\n }\n\n private createRequestOptions(request: Request): ClientRequestOptions {\n const {\n auth,\n hostname,\n port,\n hash = '',\n pathname = '/',\n search = ''\n } = parseUrl(request.url);\n const path = `${pathname ?? '/'}${search ?? ''}${hash ?? ''}`;\n const agent = this.getRequestAgent(request);\n const timeout = request.timeout ?? this.options.timeout;\n\n return {\n hostname,\n port,\n path,\n auth,\n agent,\n timeout,\n ca: request.ca,\n pfx: request.pfx,\n passphrase: request.passphrase,\n method: request.method,\n rejectUnauthorized: false\n };\n }\n\n private getRequestAgent(options: Request) {\n // do not use proxy for domains that are not in the list\n if (\n this.proxyDomains &&\n !this.proxyDomains.some((domain) =>\n domain.test(parseUrl(options.url).hostname)\n )\n ) {\n logger.debug(\"Not using proxy for URL '%s'\", options.url);\n\n return options.secureEndpoint ? this.httpsAgent : this.httpAgent;\n }\n\n // do not use proxy for domains that are in the bypass list\n if (\n this.proxyDomainsBypass &&\n this.proxyDomainsBypass.some((domain) =>\n domain.test(parseUrl(options.url).hostname)\n )\n ) {\n logger.debug(\"Bypassing proxy for URL '%s'\", options.url);\n\n return options.secureEndpoint ? this.httpsAgent : this.httpAgent;\n }\n\n return options.secureEndpoint\n ? this.httpsProxyAgent ?? this.httpsAgent\n : this.httpProxyAgent ?? this.httpAgent;\n }\n\n private async truncateResponse(\n { decompress, encoding, maxContentSize, url }: Request,\n res: IncomingMessage\n ) {\n if (this.responseHasNoBody(res)) {\n logger.debug('The response does not contain any body.');\n\n return { res, body: '' };\n }\n\n const contentType = this.parseContentType(res);\n const { type } = contentType;\n const whiteListedMimeType = this.options.whitelistMimes?.find((mime) =>\n type.startsWith(mime.type)\n );\n const maxSize = whiteListedMimeType\n ? this.options.maxBodySize\n : (maxContentSize ?? this.options.maxContentLength) * 1024;\n\n const { body, transform } = await this.parseBody(res, {\n decompress,\n allowTruncation:\n !whiteListedMimeType || whiteListedMimeType.allowTruncation,\n maxSize\n });\n\n if (transform && whiteListedMimeType) {\n logger.error(\n `The original response body for URL %s was %s because it exceeded the maximum allowed size of %i bytes.`,\n url,\n transform,\n maxSize\n );\n }\n\n res.headers['content-length'] = body.byteLength.toFixed();\n\n if (decompress) {\n delete res.headers['content-encoding'];\n }\n\n return { res, body: iconv.decode(body, encoding ?? contentType.encoding) };\n }\n\n private parseContentType(res: IncomingMessage): {\n type: string;\n encoding: string;\n } {\n const contentType =\n res.headers['content-type'] || 'application/octet-stream';\n const {\n type,\n parameters: { charset }\n } = safeParse(contentType);\n\n let encoding: string | undefined = charset;\n\n if (!encoding || !iconv.encodingExists(encoding)) {\n encoding = 'utf-8';\n }\n\n return { type, encoding };\n }\n\n private unzipBody(response: IncomingMessage): Readable {\n let body: Readable = response;\n\n if (!this.responseHasNoBody(response)) {\n let contentEncoding = response.headers['content-encoding'] || 'identity';\n contentEncoding = contentEncoding.trim().toLowerCase();\n\n // Always using Z_SYNC_FLUSH is what cURL does.\n const zlibOptions = {\n flush: constants.Z_SYNC_FLUSH,\n finishFlush: constants.Z_SYNC_FLUSH\n };\n\n switch (contentEncoding) {\n case 'gzip':\n body = response.pipe(createGunzip(zlibOptions));\n break;\n case 'deflate':\n body = response\n .pipe(new NormalizeZlibDeflateTransformStream())\n .pipe(createInflate(zlibOptions));\n break;\n case 'br':\n body = response.pipe(createBrotliDecompress());\n break;\n }\n }\n\n return body;\n }\n\n private responseHasNoBody(response: IncomingMessage): boolean {\n return (\n response.method === 'HEAD' ||\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (response.statusCode! >= 100 && response.statusCode! < 200) ||\n response.statusCode === 204 ||\n response.statusCode === 304\n );\n }\n\n private async parseBody(\n res: IncomingMessage,\n options: {\n maxSize: number;\n allowTruncation: boolean;\n decompress: boolean;\n }\n ): Promise<{ body: Buffer; transform: 'truncated' | 'omitted' | false }> {\n const chunks: Buffer[] = [];\n const stream = options.decompress ? this.unzipBody(res) : res;\n\n for await (const chuck of stream) {\n chunks.push(chuck);\n }\n\n let body = Buffer.concat(chunks);\n let transform: 'truncated' | 'omitted' | false = false;\n\n if (body.byteLength > options.maxSize) {\n const result = this.truncateBody(body, options);\n body = result.body;\n transform = result.transform;\n }\n\n return { body, transform };\n }\n\n private truncateBody(\n body: Buffer,\n options: {\n maxSize: number;\n allowTruncation: boolean;\n }\n ): { body: Buffer; transform: 'truncated' | 'omitted' } {\n if (options.allowTruncation) {\n logger.debug(\n 'Truncate original response body to %i bytes',\n options.maxSize\n );\n\n return {\n body: body.subarray(0, options.maxSize),\n transform: 'truncated'\n };\n } else {\n logger.debug(\n 'Omit original response body because body is bigger than %i bytes',\n options.maxSize\n );\n\n return {\n body: Buffer.alloc(0),\n transform: 'omitted'\n };\n }\n }\n\n /**\n * Allows to attack headers. Node.js does not accept any other characters\n * which violate [rfc7230](https://tools.ietf.org/html/rfc7230#section-3.2.6).\n * To override default behavior bypassing {@link OutgoingMessage.setHeader} method we have to set headers via internal symbol.\n */\n private setHeaders(req: OutgoingMessage, options: Request): void {\n const symbols: symbol[] = Object.getOwnPropertySymbols(req);\n const headersSymbol: symbol = symbols.find(\n // ADHOC: Node.js version < 12 uses \"outHeadersKey\" symbol to set headers\n (item) =>\n ['Symbol(kOutHeaders)', 'Symbol(outHeadersKey)'].includes(\n item.toString()\n )\n );\n\n if (!req.headersSent && headersSymbol && options.headers) {\n const headers = (req[headersSymbol] =\n req[headersSymbol] ?? Object.create(null));\n\n Object.entries(options.headers).forEach(\n ([key, value]: [string, string | string[]]) => {\n if (key) {\n headers[key.toLowerCase()] = [key.toLowerCase(), value ?? ''];\n }\n }\n );\n }\n\n if (!options.keepAlive) {\n req.setHeader('Connection', 'close');\n }\n }\n\n private async transformScript(script: Request): Promise<Request> {\n const { hostname } = new URL(script.url);\n\n const vm = this.virtualScripts.find(hostname);\n\n if (!vm) {\n return script;\n }\n\n const result = await vm.exec<ScriptEntrypoint>(\n this.DEFAULT_SCRIPT_ENTRYPOINT,\n {\n ...script.toJSON(),\n body: script.encoding\n ? iconv.encode(script.body, script.encoding).toString()\n : script.body\n }\n );\n\n return new Request(result);\n }\n\n private async executeRequest(\n request: Request\n ): Promise<Response | undefined> {\n const { res, body } = await this.request(request);\n\n logger.trace(\n 'received following response for request %j: headers: %j body: %s',\n {\n url: request.url,\n protocol: this.protocol,\n method: request.method\n },\n {\n statusCode: res.statusCode,\n headers: res.headers\n },\n body.slice(0, 500).concat(body.length > 500 ? '...' : '')\n );\n\n return new Response({\n body,\n protocol: this.protocol,\n statusCode: res.statusCode,\n headers: res.headers,\n encoding: request.encoding\n });\n }\n\n private tryRequestWithCertificates(\n request: Request,\n certs: Cert[]\n ): Promise<Response> {\n const requestsWithCerts: Promise<Response>[] = certs.map(\n async (cert: Cert) => {\n logger.debug(\n 'Executing HTTP request with following params: %j',\n request\n );\n try {\n await request.loadCert(cert);\n\n const response = await this.executeRequest(request);\n this.certificatesCache.add(request, cert);\n\n return response;\n } catch (error) {\n const msg = Helpers.isTlsCertError(error)\n ? `Failed to do successful request with certificate ${cert.path}. It will be excluded from list of known certificates.`\n : `Unexpected error occured during request: ${error}`;\n logger.warn(msg);\n throw error;\n }\n }\n );\n\n // @ts-expect-error TS forces to use es2021\n return Promise.any(requestsWithCerts);\n }\n}\n","export enum Protocol {\n HTTP = 'http',\n WS = 'ws'\n}\n","import { logger } from '../Utils';\nimport { Protocol } from './Protocol';\nimport { readFile } from 'node:fs/promises';\nimport { basename, extname } from 'node:path';\nimport { createSecureContext } from 'node:tls';\n\nexport interface RequestOptions {\n protocol: Protocol;\n url: string;\n headers?: Record<string, string | string[]>;\n method?: string;\n pfx?: Buffer | string;\n ca?: Buffer | string;\n body?: string;\n passphrase?: string;\n correlationIdRegex?: string | RegExp;\n encoding?: 'base64';\n maxContentSize?: number;\n timeout?: number;\n decompress?: boolean;\n keepAlive?: boolean;\n}\n\nexport interface Cert {\n path: string;\n hostname: string;\n passphrase?: string;\n port?: string;\n}\n\nexport class Request {\n public static readonly SINGLE_VALUE_HEADERS: ReadonlySet<string> =\n new Set<string>([\n 'authorization',\n 'content-disposition',\n 'content-length',\n 'content-type',\n 'from',\n 'host',\n 'if-modified-since',\n 'if-unmodified-since',\n 'location',\n 'max-forwards',\n 'proxy-authorization',\n 'referer',\n 'user-agent'\n ]);\n\n public readonly protocol: Protocol;\n public readonly url: string;\n public readonly body?: string;\n public readonly correlationIdRegex?: RegExp;\n public readonly encoding?: 'base64';\n public readonly maxContentSize?: number;\n public readonly decompress?: boolean;\n public readonly timeout?: number;\n public readonly keepAlive?: boolean;\n\n private _method: string;\n\n get method(): string {\n return this._method;\n }\n\n private _headers?: Record<string, string | string[]>;\n\n get headers(): Readonly<Record<string, string | string[]>> {\n return this._headers;\n }\n\n private _ca?: Buffer;\n\n get ca() {\n return this._ca;\n }\n\n private _pfx?: Buffer;\n\n get pfx() {\n return this._pfx;\n }\n\n private _passphrase?: string;\n\n get passphrase() {\n return this._passphrase;\n }\n\n get secureEndpoint(): boolean {\n return this.url.startsWith('https');\n }\n\n constructor({\n protocol,\n method,\n url,\n body,\n ca,\n pfx,\n passphrase,\n timeout,\n correlationIdRegex,\n maxContentSize,\n encoding,\n decompress = true,\n headers = {},\n keepAlive\n }: RequestOptions) {\n this.protocol = protocol;\n this._method = method?.toUpperCase() ?? 'GET';\n\n this.validateUrl(url);\n this.url = url.trim();\n\n this.precheckBody(body);\n this.body = body;\n\n this.correlationIdRegex =\n this.normalizeCorrelationIdRegex(correlationIdRegex);\n\n this.setHeaders(headers);\n\n if (pfx) {\n this._pfx = Buffer.from(pfx);\n }\n\n if (ca) {\n this._ca = Buffer.from(ca);\n }\n\n this._passphrase = passphrase;\n this.encoding = encoding;\n this.timeout = timeout;\n this.maxContentSize = maxContentSize;\n this.decompress = !!decompress;\n this.keepAlive = keepAlive;\n }\n\n public setHeaders(headers: Record<string, string | string[]>): void {\n const mergedHeaders = {\n ...this._headers,\n ...headers\n };\n\n this._headers = Object.entries(mergedHeaders).reduce(\n (result, [field, value]: [string, string | string[]]) => {\n result[field] =\n Array.isArray(value) &&\n Request.SINGLE_VALUE_HEADERS.has(field.toLowerCase())\n ? value.join(', ')\n : value;\n\n return result;\n },\n {}\n );\n }\n\n public async loadCert({ path, passphrase }: Cert): Promise<void> {\n let cert: Buffer | undefined;\n\n try {\n cert = await readFile(path);\n } catch (e) {\n logger.warn(`Warning: certificate ${path} not found.`);\n }\n\n const ext = extname(path);\n const name = basename(path);\n\n switch (ext) {\n case '.pem':\n case '.crt':\n case '.ca':\n this._ca = cert;\n break;\n case '.pfx':\n this.assertPassphrase(name, cert, passphrase);\n this._pfx = cert;\n this._passphrase = passphrase;\n break;\n default:\n logger.warn(`Warning: certificate of type \"${ext}\" does not support.`);\n }\n }\n\n public toJSON(): RequestOptions {\n return {\n protocol: this.protocol,\n url: this.url,\n body: this.body,\n method: this._method,\n headers: this._headers,\n passphrase: this._passphrase,\n ca: this._ca?.toString('utf8'),\n pfx: this._pfx?.toString('utf8'),\n correlationIdRegex: this.correlationIdRegex\n };\n }\n\n private validateUrl(url: string): void {\n try {\n new URL(url);\n } catch {\n throw new Error('Invalid URL.');\n }\n }\n\n private precheckBody(body: string | undefined): void {\n if (body && typeof body !== 'string') {\n throw new Error('Body must be string.');\n }\n }\n\n private normalizeCorrelationIdRegex(\n correlationIdRegex: RegExp | string | undefined\n ): RegExp | undefined {\n if (correlationIdRegex) {\n try {\n return new RegExp(correlationIdRegex, 'i');\n } catch {\n throw new Error('Correlation id must be regular expression.');\n }\n }\n }\n\n private assertPassphrase(\n name: string,\n pfx: Buffer,\n passphrase: string\n ): void {\n try {\n createSecureContext({ passphrase, pfx });\n } catch (e) {\n logger.warn(\n `Error Loading Certificate: Wrong passphrase for certificate ${name}.`\n );\n }\n }\n}\n","import { Request } from './Request';\nimport { Response } from './Response';\nimport { Protocol } from './Protocol';\n\nexport interface RequestExecutor {\n execute(script: Request): Promise<Response>;\n protocol: Protocol;\n}\n\nexport const RequestExecutor: unique symbol = Symbol('RequestExecutor');\n","import { Cert } from './Request';\n\nexport interface WhitelistMimeType {\n type: string;\n allowTruncation?: boolean;\n}\n\nexport interface RequestExecutorOptions {\n timeout?: number;\n proxyUrl?: string;\n headers?: Record<string, string | string[]>;\n certs?: Cert[];\n whitelistMimes?: WhitelistMimeType[];\n maxBodySize?: number;\n maxContentLength?: number;\n reuseConnection?: boolean;\n proxyDomains?: string[];\n proxyDomainsBypass?: string[];\n}\n\nexport const RequestExecutorOptions: unique symbol = Symbol(\n 'RequestExecutorOptions'\n);\n","import { Protocol } from './Protocol';\n\nexport class Response {\n public readonly protocol: Protocol;\n public readonly statusCode?: number;\n public readonly headers?: Record<string, string | string[]>;\n public readonly body?: string;\n public readonly encoding?: 'base64';\n public readonly message?: string;\n public readonly errorCode?: string;\n\n constructor({\n protocol,\n statusCode,\n headers,\n body,\n message,\n errorCode,\n encoding\n }: {\n protocol: Protocol;\n statusCode?: number;\n message?: string;\n errorCode?: string;\n headers?: Record<string, string | string[]>;\n body?: string;\n encoding?: 'base64';\n }) {\n this.protocol = protocol;\n this.statusCode = statusCode;\n this.headers = headers;\n this.body = body;\n this.errorCode = errorCode;\n this.message = message;\n this.encoding = encoding;\n }\n}\n","import { RequestExecutor } from './RequestExecutor';\nimport { Response } from './Response';\nimport { Cert, Request } from './Request';\nimport { Protocol } from './Protocol';\nimport { Helpers, logger, ProxyFactory } from '../Utils';\nimport { RequestExecutorOptions } from './RequestExecutorOptions';\nimport { CertificatesCache } from './CertificatesCache';\nimport { CertificatesResolver } from './CertificatesResolver';\nimport { inject, injectable } from 'tsyringe';\nimport WebSocket from 'ws';\nimport { once } from 'node:events';\nimport { promisify } from 'node:util';\nimport http, { IncomingMessage } from 'node:http';\nimport https from 'node:https';\n\ninterface WSMessage {\n body: string;\n code?: number;\n}\n\n@injectable()\nexport class WsRequestExecutor implements RequestExecutor {\n public static readonly FORBIDDEN_HEADERS: ReadonlySet<string> = new Set([\n 'sec-websocket-version',\n 'sec-websocket-key'\n ]);\n\n private readonly httpProxyAgent?: http.Agent;\n private readonly httpsProxyAgent?: https.Agent;\n\n constructor(\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RequestExecutorOptions)\n private readonly options: RequestExecutorOptions,\n @inject(CertificatesCache)\n private readonly certificatesCache: CertificatesCache,\n @inject(CertificatesResolver)\n private readonly certificatesResolver: CertificatesResolver\n ) {\n if (this.options.proxyUrl) {\n ({ httpsAgent: this.httpsProxyAgent, httpAgent: this.httpProxyAgent } =\n this.proxyFactory.createProxy({ proxyUrl: this.options.proxyUrl }));\n }\n }\n\n get protocol(): Protocol {\n return Protocol.WS;\n }\n\n public async execute(options: Request): Promise<Response> {\n try {\n const targetCerts: Cert[] | undefined = this.options.certs\n ? this.certificatesResolver.resolve(options, this.options.certs)\n : undefined;\n\n if (targetCerts === undefined || targetCerts.length === 0) {\n // We may have https and http targets connected with same repeater,\n // or certificates may not be necessary.\n // If certificates not found try request anyway.\n logger.debug('Executing WS request with following params: %j', options);\n\n return await this.executeRequest(options);\n }\n\n return await this.tryRequestWithCertificates(options, targetCerts);\n } catch (err) {\n const message = err.info ?? err.message;\n const errorCode = err.code ?? err.syscall;\n\n logger.error('Error executing request: %s', options.url);\n logger.error('Cause: %s', message);\n\n return new Response({\n message,\n errorCode,\n protocol: this.protocol\n });\n }\n }\n\n private setTimeout(client: WebSocket): NodeJS.Timeout {\n const timeout = setTimeout(\n () =>\n client.emit(\n 'error',\n Object.assign(new Error('Waiting frame has timed out'), {\n code: 'ETIMEDOUT'\n })\n ),\n this.options.timeout\n );\n\n timeout.unref();\n\n return timeout;\n }\n\n private async consume(\n client: WebSocket,\n matcher?: RegExp\n ): Promise<WSMessage> {\n const result = (await Promise.race([\n this.waitForResponse(client, matcher),\n once(client, 'close')\n ])) as [string | number, string | undefined];\n\n let msg: WSMessage | undefined;\n\n if (result.length) {\n const [data, reason]: [string | number, string | undefined] = result;\n const body = typeof data === 'string' ? data : reason;\n const code = typeof data === 'number' ? data : undefined;\n\n msg = {\n body,\n code\n };\n }\n\n return msg;\n }\n\n private waitForResponse(\n client: WebSocket,\n matcher: RegExp\n ): Promise<[string]> {\n return new Promise((resolve) => {\n client.on('message', (data: WebSocket.Data) => {\n const dataString = String(data);\n !matcher || matcher.test(dataString)\n ? resolve([dataString])\n : undefined;\n });\n });\n }\n\n private async connect(client: WebSocket): Promise<IncomingMessage> {\n const [, upgrading]: [unknown, [IncomingMessage]] = await Promise.all([\n once(client, 'open'),\n once(client, 'upgrade') as Promise<[IncomingMessage]>\n ]);\n\n const [res]: [IncomingMessage] = upgrading;\n\n return res;\n }\n\n private normalizeHeaders(\n headers: Record<string, string | string[]>\n ): Record<string, string | string[]> {\n return Object.entries(headers).reduce(\n (\n result: Record<string, string | string[]>,\n [key, value]: [string, string | string[]]\n ) => {\n const headerName = key.trim().toLowerCase();\n if (!WsRequestExecutor.FORBIDDEN_HEADERS.has(headerName)) {\n result[key] = value;\n }\n\n return result;\n },\n {}\n );\n }\n\n private async executeRequest(\n request: Request\n ): Promise<Response | undefined> {\n let timeout: NodeJS.Timeout;\n let client: WebSocket;\n\n try {\n client = new WebSocket(request.url, {\n agent: request.secureEndpoint\n ? this.httpsProxyAgent\n : this.httpProxyAgent,\n rejectUnauthorized: false,\n handshakeTimeout: this.options.timeout,\n headers: this.normalizeHeaders(request.headers),\n ca: request.ca,\n pfx: request.pfx,\n passphrase: request.passphrase\n });\n\n const res: IncomingMessage = await this.connect(client);\n\n // @ts-expect-error TS infers a wrong type here\n await promisify(client.send.bind(client))(request.body);\n\n timeout = this.setTimeout(client);\n\n const msg = await this.consume(client, request.correlationIdRegex);\n\n return new Response({\n protocol: this.protocol,\n statusCode: msg.code ?? res.statusCode,\n headers: res.headers,\n body: msg.body\n });\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (client?.readyState === WebSocket.OPEN) {\n client.close(1000);\n }\n }\n }\n\n private tryRequestWithCertificates(\n request: Request,\n certs: Cert[]\n ): Promise<Response> {\n const requestsWithCerts: Promise<Response>[] = certs.map(\n async (cert: Cert) => {\n logger.debug(\n 'Executing HTTP request with following params: %j',\n request\n );\n try {\n await request.loadCert(cert);\n\n const response = await this.executeRequest(request);\n this.certificatesCache.add(request, cert);\n\n return response;\n } catch (error) {\n const msg = Helpers.isTlsCertError(error)\n ? `Failed to do successful request with certificate ${cert.path}. It will be excluded from list of known certificates.`\n : `Unexpected error occured during request: ${error}`;\n logger.warn(msg);\n throw error;\n }\n }\n );\n\n // @ts-expect-error TS forces to use es2021\n return Promise.any(requestsWithCerts);\n }\n}\n","export * from './RequestExecutor';\nexport * from './RequestExecutorOptions';\nexport * from './HttpRequestExecutor';\nexport * from './WsRequestExecutor';\nexport * from './Response';\nexport * from './Request';\nexport * from './Protocol';\nexport * from './Certificates';\nexport * from './CertificatesLoader';\nexport * from './CertificatesCache';\nexport * from './CertificatesResolver';\n","import { Scans, ScanState, ScanStatus } from './Scans';\nimport { Polling } from '../Utils/Polling';\nimport { Breakpoint } from './Breakpoint';\nimport { Backoff, logger } from '../Utils';\nimport { PollingConfig } from './PollingFactory';\nimport axios from 'axios';\nimport { ok } from 'node:assert';\n\nexport class BasePolling implements Polling {\n private timeoutDescriptor?: NodeJS.Timeout;\n private defaultInterval: number = 10000;\n private readonly DEFAULT_RECONNECT_TIMES = 20;\n\n private _active = true;\n\n get active(): boolean {\n return this._active;\n }\n\n constructor(\n private readonly options: Omit<PollingConfig, 'breakpoint'>,\n private readonly scanManager: Scans,\n private readonly breakpoint: Breakpoint\n ) {\n if (!this.options.timeout) {\n logger.warn(\n `Warning: It looks like you've been running polling without \"timeout\" option.`\n );\n logger.warn(\n `The recommended way to install polling with a minimal timeout: 10-20min.`\n );\n }\n\n if (this.options.interval) {\n if (this.options.interval < this.defaultInterval) {\n logger.warn(\n `Warning: The minimal value for polling interval is 10 seconds.`\n );\n }\n }\n\n ok(breakpoint, 'You should choose a breakpoint for polling.');\n }\n\n public async start(): Promise<void> {\n try {\n logger.log('Starting polling...');\n\n if (this.options.timeout) {\n this.setTimeout();\n }\n\n for await (const x of this.poll()) {\n await this.breakpoint.execute(x);\n }\n } finally {\n await this.stop();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n if (!this._active) {\n logger.log('Polling has been terminated by timeout.');\n }\n this._active = false;\n clearTimeout(this.timeoutDescriptor);\n }\n\n private setTimeout(timeout: number = this.options.timeout): void {\n this.timeoutDescriptor = setTimeout(() => (this._active = false), timeout);\n logger.debug(`The polling timeout has been set to %d ms.`, timeout);\n }\n\n private async *poll(): AsyncIterableIterator<ScanState> {\n while (this.active) {\n await this.delay();\n\n const backoff = this.createBackoff();\n\n const state: ScanState = await backoff.execute(() =>\n this.scanManager.status(this.options.scanId)\n );\n\n if (this.isRedundant(state.status)) {\n break;\n }\n\n yield state;\n }\n }\n\n private isRedundant(status: ScanStatus): boolean {\n return (\n status === ScanStatus.DONE ||\n status === ScanStatus.STOPPED ||\n status === ScanStatus.DISRUPTED ||\n status === ScanStatus.FAILED\n );\n }\n\n private delay(): Promise<void> {\n const interval = this.options.interval ?? this.defaultInterval;\n\n return new Promise<void>((resolve) => setTimeout(resolve, interval));\n }\n\n private createBackoff(): Backoff {\n return new Backoff(\n this.DEFAULT_RECONNECT_TIMES,\n (err: unknown) =>\n (axios.isAxiosError(err) && err.status > 500) ||\n [\n 'ECONNRESET',\n 'ENETDOWN',\n 'ENETUNREACH',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'ESOCKETTIMEDOUT'\n ].includes((err as NodeJS.ErrnoException).code)\n );\n }\n}\n","import { ScanState } from './Scans';\n\nexport abstract class Breakpoint {\n protected abstract breakOn(stat: ScanState): never | void;\n protected abstract isExcepted(stats: ScanState): boolean;\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async execute(scanIssues: ScanState): Promise<void> {\n if (this.isExcepted(scanIssues)) {\n this.breakOn(scanIssues);\n }\n }\n}\n","import { Breakpoint } from './Breakpoint';\nimport { BreakpointType } from './BreakpointType';\n\nexport interface BreakpointFactory {\n create(type: BreakpointType): Breakpoint;\n}\n\nexport const BreakpointFactory: unique symbol = Symbol('BreakpointFactory');\n","export enum BreakpointType {\n ANY = 'any',\n MEDIUM_ISSUE = 'medium_issue',\n HIGH_ISSUE = 'high_issue',\n CRITICAL_ISSUE = 'critical_issue'\n}\n","export class BreakpointException extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Breakpoint } from '../Breakpoint';\nimport { BreakpointException } from './BreakpointException';\nimport { ScanIssues } from '../Scans';\nimport { Severity, severityRanges } from '../Severity';\n\nexport class OnSeverity extends Breakpoint {\n private readonly breakSeverities: readonly Severity[];\n\n constructor(private readonly severity: Severity) {\n super();\n this.breakSeverities = severityRanges.get(severity) ?? [];\n }\n\n protected breakOn(): never {\n throw new BreakpointException(\n `Bright CLI found a first ${this.severity} issue.`\n );\n }\n\n protected isExcepted(stats: ScanIssues): boolean {\n return this.breakSeverities.some(\n (severity) => stats[`numberOf${severity}SeverityIssues`] > 0\n );\n }\n}\n","export { BreakpointException } from './BreakpointException';\nexport { OnSeverity } from './OnSeverity';\n","import { Breakpoint } from './Breakpoint';\nimport { OnSeverity } from './Breakpoints';\nimport { BreakpointFactory } from './BreakpointFactory';\nimport { BreakpointType } from './BreakpointType';\nimport { Severity } from './Severity';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultBreakpointFactory implements BreakpointFactory {\n public create(type: BreakpointType): Breakpoint {\n switch (type) {\n case BreakpointType.ANY:\n return new OnSeverity(Severity.LOW);\n case BreakpointType.HIGH_ISSUE:\n return new OnSeverity(Severity.HIGH);\n case BreakpointType.MEDIUM_ISSUE:\n return new OnSeverity(Severity.MEDIUM);\n case BreakpointType.CRITICAL_ISSUE:\n return new OnSeverity(Severity.CRITICAL);\n default:\n return null;\n }\n }\n}\n","import { PollingConfig, PollingFactory } from './PollingFactory';\nimport { Scans } from './Scans';\nimport { Polling } from '../Utils/Polling';\nimport { BasePolling } from './BasePolling';\nimport { BreakpointFactory } from './BreakpointFactory';\nimport { inject, injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultPollingFactory implements PollingFactory {\n constructor(\n @inject(Scans) private readonly scans: Scans,\n @inject(BreakpointFactory)\n private readonly breakpointFactory: BreakpointFactory\n ) {}\n\n public create(options: PollingConfig): Polling {\n const breakpoint = this.breakpointFactory.create(options.breakpoint);\n\n return new BasePolling(options, this.scans, breakpoint);\n }\n}\n","import { Polling } from '../Utils/Polling';\nimport { BreakpointType } from './BreakpointType';\n\nexport interface PollingConfig {\n timeout?: number;\n interval?: number;\n breakpoint: BreakpointType;\n scanId: string;\n}\n\nexport interface PollingFactory {\n create(options: PollingConfig): Polling;\n}\n\nexport const PollingFactory: unique symbol = Symbol('PollingFactory');\n","import {\n Discovery,\n Header,\n ScanConfig,\n Scans,\n ScanState,\n SourceType,\n StorageFile,\n ATTACK_PARAM_LOCATIONS_DEFAULT,\n ScanCreateResponse,\n AttackParamLocation\n} from './Scans';\nimport { CliInfo } from '../Config';\nimport { ProxyFactory } from '../Utils';\nimport { delay, inject, injectable } from 'tsyringe';\nimport axios, { Axios } from 'axios';\nimport http from 'node:http';\nimport https from 'node:https';\n\nexport interface RestScansOptions {\n baseURL: string;\n apiKey: string;\n timeout?: number;\n insecure?: boolean;\n proxyURL?: string;\n proxyDomains?: string[];\n}\n\nexport const RestScansOptions: unique symbol = Symbol('RestScansOptions');\n\n@injectable()\nexport class RestScans implements Scans {\n private readonly client: Axios;\n\n constructor(\n @inject(delay(() => CliInfo)) private readonly info: CliInfo,\n @inject(ProxyFactory) private readonly proxyFactory: ProxyFactory,\n @inject(RestScansOptions)\n { baseURL, apiKey, insecure, proxyURL, timeout }: RestScansOptions\n ) {\n const {\n httpAgent = new http.Agent(),\n httpsAgent = new https.Agent({ rejectUnauthorized: !insecure })\n } = proxyURL\n ? this.proxyFactory.createProxy({\n proxyUrl: proxyURL,\n rejectUnauthorized: !insecure\n })\n : {};\n\n this.client = axios.create({\n baseURL,\n timeout,\n httpAgent,\n httpsAgent,\n responseType: 'json',\n headers: { authorization: `Api-Key ${apiKey}` }\n });\n }\n\n public async create(body: ScanConfig): Promise<ScanCreateResponse> {\n const scanConfig = await this.prepareScanConfig({ ...body });\n\n const res = await this.client.post<ScanCreateResponse>(\n '/api/v1/scans',\n scanConfig\n );\n\n return res.data;\n }\n\n public async retest(scanId: string): Promise<string> {\n const res = await this.client.post<{ id: string }>(\n `/api/v1/scans/${scanId}/retest`\n );\n\n return res.data.id;\n }\n\n public async status(scanId: string): Promise<ScanState> {\n const res = await this.client.get<ScanState>(`/api/v1/scans/${scanId}`);\n\n return res.data;\n }\n\n public async stop(scanId: string): Promise<void> {\n await this.client.get(`/api/v1/scans/${scanId}/stop`);\n }\n\n public async delete(scanId: string): Promise<void> {\n await this.client.delete(`/api/v1/scans/${scanId}`);\n }\n\n private async prepareScanConfig({ headers, ...rest }: ScanConfig): Promise<\n Omit<ScanConfig, 'headers'> & {\n headers: Header[];\n info: {\n source: string;\n client?: { name: string; version: string };\n };\n }\n > {\n const config = await this.applyDefaultSettings(rest);\n const updatedConfig = this.replaceDeprecatedAttackParamLocations(config);\n\n return {\n ...updatedConfig,\n info: {\n source: 'cli',\n client: {\n name: 'bright-cli',\n version: this.info.version\n }\n },\n headers: headers\n ? Object.entries(headers).map(([name, value]: [string, string]) => ({\n name,\n value,\n mergeStrategy: 'replace'\n }))\n : undefined\n };\n }\n\n private async exploreDiscovery(body: ScanConfig): Promise<Discovery[]> {\n const discoveryTypes: Discovery[] = [];\n const { fileId, crawlerUrls } = body;\n\n if (Array.isArray(crawlerUrls)) {\n discoveryTypes.push(Discovery.CRAWLER);\n }\n\n if (fileId) {\n try {\n const { data } = await this.client.get<StorageFile>(\n `/api/v2/files/${fileId}`\n );\n\n discoveryTypes.push(\n data.type === SourceType.HAR ? Discovery.ARCHIVE : Discovery.OAS\n );\n } catch (error) {\n throw new Error(\n `Error loading file with id \"${fileId}\": No such file or you do not have permissions.`\n );\n }\n }\n\n return discoveryTypes;\n }\n\n private async applyDefaultSettings(\n scanConfig: Omit<ScanConfig, 'headers'>\n ): Promise<Omit<ScanConfig, 'headers'>> {\n const attackParamLocations =\n scanConfig.attackParamLocations ??\n (scanConfig.templateId ? undefined : [...ATTACK_PARAM_LOCATIONS_DEFAULT]);\n\n const exclusions =\n scanConfig.exclusions?.params || scanConfig.exclusions?.requests\n ? scanConfig.exclusions\n : undefined;\n\n let discoveryTypes: Discovery[] = await this.exploreDiscovery(scanConfig);\n discoveryTypes = discoveryTypes?.length ? discoveryTypes : undefined;\n\n return {\n ...scanConfig,\n attackParamLocations,\n discoveryTypes,\n exclusions\n };\n }\n\n private replaceDeprecatedAttackParamLocations(\n scanConfig: Omit<ScanConfig, 'headers'>\n ): Omit<ScanConfig, 'headers'> {\n if (\n scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICAL_FRAGMENT\n )\n ) {\n scanConfig.attackParamLocations = scanConfig.attackParamLocations.filter(\n (loc) => loc !== AttackParamLocation.ARTIFICAL_FRAGMENT\n );\n\n if (\n !scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICIAL_FRAGMENT\n )\n ) {\n scanConfig.attackParamLocations = [\n ...scanConfig.attackParamLocations,\n AttackParamLocation.ARTIFICIAL_FRAGMENT\n ];\n }\n }\n\n if (\n scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICAL_QUERY\n )\n ) {\n scanConfig.attackParamLocations = scanConfig.attackParamLocations.filter(\n (loc) => loc !== AttackParamLocation.ARTIFICAL_QUERY\n );\n\n if (\n !scanConfig.attackParamLocations?.includes(\n AttackParamLocation.ARTIFICIAL_QUERY\n )\n ) {\n scanConfig.attackParamLocations = [\n ...scanConfig.attackParamLocations,\n AttackParamLocation.ARTIFICIAL_QUERY\n ];\n }\n }\n\n return scanConfig;\n }\n}\n","import { Severity } from './Severity';\n\nexport enum Discovery {\n CRAWLER = 'crawler',\n ARCHIVE = 'archive',\n OAS = 'oas'\n}\n\nexport enum AttackParamLocation {\n ARTIFICAL_FRAGMENT = 'artifical-fragment', // deprecated, use ARTIFICIAL_FRAGMENT instead\n ARTIFICAL_QUERY = 'artifical-query', // deprecated, use ARTIFICIAL_QUERY instead\n ARTIFICIAL_FRAGMENT = 'artificial-fragment',\n ARTIFICIAL_QUERY = 'artificial-query',\n BODY = 'body',\n FRAGMENT = 'fragment',\n HEADER = 'header',\n PATH = 'path',\n QUERY = 'query'\n}\n\nexport const ATTACK_PARAM_LOCATIONS_DEFAULT: readonly AttackParamLocation[] = [\n AttackParamLocation.BODY,\n AttackParamLocation.FRAGMENT,\n AttackParamLocation.QUERY\n];\n\nexport enum Module {\n DAST = 'dast',\n FUZZER = 'fuzzer'\n}\n\nexport interface Header {\n name: string;\n value: string;\n mergeStrategy: 'replace';\n}\n\nexport interface RequestExclusion {\n patterns: string[];\n methods: string[];\n}\n\nexport interface Exclusions {\n params: string[];\n requests: RequestExclusion[];\n}\n\nexport interface ScanConfig {\n name: string;\n module: Module;\n authObjectId?: string;\n projectId?: string;\n templateId?: string;\n discoveryTypes?: Discovery[];\n tests?: string[];\n buckets?: string[];\n poolSize?: number;\n fileId?: string;\n attackParamLocations?: AttackParamLocation[];\n smart?: boolean;\n extraHosts?: Record<string, string>;\n exclusions?: Exclusions;\n headers?: Record<string, string> | Header[];\n crawlerUrls?: string[];\n hostsFilter?: string[];\n repeaters?: string[];\n entryPointIds?: string[];\n}\n\nexport enum ScanStatus {\n RUNNING = 'running',\n PENDING = 'pending',\n STOPPED = 'stopped',\n FAILED = 'failed',\n DONE = 'done',\n DISRUPTED = 'disrupted',\n SCHEDULED = 'scheduled',\n QUEUED = 'queued'\n}\n\nexport type ScanIssues = Record<`numberOf${Severity}SeverityIssues`, number>;\n\nexport interface ScanState extends ScanIssues {\n status: ScanStatus;\n}\n\nexport enum SourceType {\n OPEN_API = 'openapi',\n RAML = 'raml',\n POSTMAN = 'postman',\n HAR = 'har'\n}\n\nexport interface StorageFile {\n id: string;\n type: SourceType;\n}\n\nexport interface ScanWarning {\n code: string;\n message: string;\n}\n\nexport interface ScanCreateResponse {\n id: string;\n warnings: ScanWarning[];\n}\n\nexport interface Scans {\n create(body: ScanConfig): Promise<ScanCreateResponse>;\n\n retest(scanId: string): Promise<string>;\n\n stop(scanId: string): Promise<void>;\n\n delete(scanId: string): Promise<void>;\n\n status(scanId: string): Promise<ScanState>;\n}\n\nexport const Scans: unique symbol = Symbol('Scans');\n","export enum Severity {\n MEDIUM = 'Medium',\n HIGH = 'High',\n LOW = 'Low',\n CRITICAL = 'Critical'\n}\n\nexport const severityRanges: ReadonlyMap<Severity, Severity[]> = new Map(\n Object.values(Severity).map((severity) => {\n switch (severity) {\n case Severity.CRITICAL:\n return [severity, [Severity.CRITICAL]];\n case Severity.HIGH:\n return [severity, [Severity.HIGH, Severity.CRITICAL]];\n case Severity.MEDIUM:\n return [severity, [Severity.MEDIUM, Severity.HIGH, Severity.CRITICAL]];\n case Severity.LOW:\n return [severity, Object.values(Severity)];\n }\n })\n);\n","export * from './BreakpointFactory';\nexport * from './DefaultBreakpointFactory';\nexport * from './PollingFactory';\nexport * from './DefaultPollingFactory';\nexport * from '../Utils/Polling';\nexport * from './Scans';\nexport * from './BreakpointType';\nexport * from './Breakpoint';\nexport * from './Breakpoints';\nexport * from './RestScans';\nexport * from './Severity';\n","import { VirtualScript, VirtualScriptType } from './VirtualScript';\nimport { Helpers } from '../Utils';\nimport { VirtualScripts } from './VirtualScripts';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class DefaultVirtualScripts implements VirtualScripts {\n private readonly store = new Map<string, VirtualScript>();\n\n get size(): number {\n return this.store.size;\n }\n\n public [Symbol.iterator](): IterableIterator<[string, VirtualScript]> {\n return this.store[Symbol.iterator]();\n }\n\n public clear(type?: VirtualScriptType): void {\n if (!type) {\n this.store.clear();\n } else {\n this.store.forEach((x: VirtualScript) => {\n if (x.type === type) {\n this.delete(x.id);\n }\n });\n }\n }\n\n public delete(key: string): boolean {\n return this.store.delete(key);\n }\n\n public entries(): IterableIterator<[string, VirtualScript]> {\n return this.store.entries();\n }\n\n public find(host: string): VirtualScript | undefined {\n return [...this.store.values()].find((script: VirtualScript) =>\n Helpers.wildcardToRegExp(script.id).test(host)\n );\n }\n\n public keys(): IterableIterator<string> {\n return this.store.keys();\n }\n\n public set(wildcard: string, type: VirtualScriptType, code: string): this {\n const script = new VirtualScript(wildcard, type, code);\n\n this.store.set(script.id, script);\n\n script.compile();\n\n return this;\n }\n\n public values(): IterableIterator<VirtualScript> {\n return this.store.values();\n }\n}\n","import { ScriptLoader } from './ScriptLoader';\nimport { VirtualScripts } from './VirtualScripts';\nimport { logger } from '../Utils';\nimport { VirtualScriptType } from './VirtualScript';\nimport { inject, injectable } from 'tsyringe';\nimport { readFile } from 'node:fs/promises';\n\n@injectable()\nexport class FSScriptLoader implements ScriptLoader {\n constructor(\n @inject(VirtualScripts) private readonly virtualScripts: VirtualScripts\n ) {}\n\n public async load(scripts: Record<string, string>): Promise<void> {\n await Promise.all(\n Object.entries(scripts).map(([wildcard, path]: [string, string]) =>\n this.loadScript(wildcard, path)\n )\n );\n }\n\n private async loadScript(wildcard: string, path: string): Promise<void> {\n let code: string;\n\n try {\n code = await readFile(path, { encoding: 'utf8' });\n } catch (e) {\n logger.debug(`Cannot load ${path}. Error: ${e.message}`);\n throw new Error(`Error Loading Script: Cannot load ${path}`);\n }\n\n this.virtualScripts.set(wildcard, VirtualScriptType.LOCAL, code);\n }\n}\n","export interface ScriptLoader {\n load(scripts: Record<string, string>): Promise<void>;\n}\n\nexport const ScriptLoader: unique symbol = Symbol('ScriptLoader');\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Context, createContext, Script } from 'node:vm';\nimport Module from 'node:module';\nimport { join } from 'node:path';\n\ninterface VirtualScriptContext extends Context {\n module: Module;\n __filename: string;\n __dirname: string;\n}\n\nexport enum VirtualScriptType {\n LOCAL = 'local',\n REMOTE = 'remote'\n}\n\nexport class VirtualScript {\n public readonly id: string;\n public readonly type: VirtualScriptType;\n private readonly MODULE_EXEC_ARGS: string[] = [\n 'module.exports',\n 'module.require',\n 'module',\n '__filename',\n '__dirname'\n ];\n private readonly script: Script;\n private context: VirtualScriptContext;\n\n constructor(id: string, type: VirtualScriptType, code: string) {\n if (!id) {\n throw new Error('ID must be declared explicitly.');\n }\n this.id = id;\n\n if (!type) {\n throw new Error(\n `Type might accept one of the following values: ${Object.values(\n VirtualScriptType\n ).join(', ')}.`\n );\n }\n this.type = type;\n\n if (!code) {\n throw new Error('Code must be declared explicitly.');\n }\n\n this.script = new Script(this.wrapScriptCode(code), {\n filename: id\n });\n }\n\n public compile(): this {\n const module = new Module(this.id);\n this.context = createContext({\n module,\n __filename: join(this.id, process.cwd()),\n __dirname: process.cwd()\n }) as VirtualScriptContext;\n\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async exec<Fun extends (...args: any[]) => any>(\n functionName: string,\n ...functionArgs: Parameters<Fun>\n ): Promise<ReturnType<Fun>> {\n this.script.runInContext(this.context, {\n timeout: 100\n });\n\n const { exports = {} } = this.context.module;\n\n const func: Fun = exports[functionName];\n\n if (typeof func !== 'function') {\n throw new Error(\n `Error Loading Script: Script ${this.id} does not match expected format, missing function ${functionName}.`\n );\n }\n\n return func(...functionArgs);\n }\n\n private wrapScriptCode(code: string): string {\n const decoratedModule = Module.wrap(\n code.replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n );\n\n return `${decoratedModule.slice(\n 0,\n decoratedModule.length - 1\n )}(${this.MODULE_EXEC_ARGS.join(',')})`;\n }\n}\n","import { VirtualScript, VirtualScriptType } from './VirtualScript';\n\nexport interface VirtualScripts {\n size: number;\n\n [Symbol.iterator](): IterableIterator<[string, VirtualScript]>;\n\n clear(type?: VirtualScriptType): void;\n\n delete(key: string): boolean;\n\n entries(): IterableIterator<[string, VirtualScript]>;\n\n find(host: string): VirtualScript | undefined;\n\n keys(): IterableIterator<string>;\n\n set(wildcard: string, type: VirtualScriptType, code: string): this;\n\n values(): IterableIterator<VirtualScript>;\n}\n\nexport const VirtualScripts: unique symbol = Symbol('VirtualScripts');\n","export * from './VirtualScript';\nexport * from './FSScriptLoader';\nexport * from './ScriptLoader';\nexport * from './VirtualScripts';\nexport * from './DefaultVirtualScripts';\n","import { StartupManager } from './StartupManager';\nimport { StartupOptions } from './StartupOptions';\nimport {\n add,\n AddOptions,\n remove,\n run,\n stop,\n enable,\n disable\n} from '@neuralegion/os-service';\nimport { promisify } from 'node:util';\n\nexport class DefaultStartupManager implements StartupManager {\n public async install({ name, ...options }: StartupOptions): Promise<void> {\n await promisify<string, AddOptions>(add)(name, options);\n await promisify<string>(enable)(name);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async run(dispose?: () => Promise<unknown> | unknown): Promise<void> {\n run(() => this.exit(0, dispose));\n }\n\n public async uninstall(name: string): Promise<void> {\n try {\n await promisify(disable)(name);\n } catch {\n // noop: os-service does not have isExists method\n }\n\n try {\n await promisify(remove)(name);\n } catch {\n // noop: os-service does not have isExists method\n }\n }\n\n private async exit(\n code: number,\n dispose?: () => Promise<unknown> | unknown\n ): Promise<void> {\n await dispose?.();\n stop(code);\n }\n}\n","import { StartupOptions } from './StartupOptions';\n\nexport interface StartupManager {\n install(opts: StartupOptions): Promise<void>;\n run(dispose?: () => Promise<unknown> | unknown): Promise<void>;\n uninstall(name: string): Promise<void>;\n}\n\nexport const StartupManager: unique symbol = Symbol('StartupManager');\n","export * from './DefaultStartupManager';\nexport * from './StartupManager';\nexport * from './StartupOptions';\n","import { logger } from './Logger';\nimport { setTimeout } from 'node:timers/promises';\n\nexport class Backoff {\n private depth: number = 0;\n\n constructor(\n private readonly maxDepth: number,\n private readonly shouldRetry: (err: Error) => unknown\n ) {}\n\n public async execute<T extends (...args: unknown[]) => unknown>(\n task: T\n ): Promise<ReturnType<T>> {\n try {\n return (await task()) as ReturnType<T>;\n } catch (e) {\n if (this.shouldRetry?.(e) && this.depth < this.maxDepth) {\n return this.retry(task);\n }\n\n throw e;\n }\n }\n\n /* eslint-disable-next-line space-before-function-paren */\n private async retry<T extends (...args: any[]) => any>(\n task: T\n ): Promise<ReturnType<T>> {\n const delay = Math.max(2 ** this.depth * 100, 1000);\n\n logger.warn(\n 'Failed to connect, retrying in %d second (attempt %d/%d)',\n Math.round(delay / 1000),\n this.depth + 1,\n this.maxDepth\n );\n\n await setTimeout(delay);\n\n this.depth++;\n\n return this.execute(task);\n }\n}\n","import { ProxyFactory, ProxyOptions, TargetProxyOptions } from './ProxyFactory';\nimport { PatchedHttpsProxyAgent } from './PatchedHttpsProxyAgent';\nimport { HttpProxyAgent } from 'http-proxy-agent';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\nimport https from 'node:https';\nimport http from 'node:http';\n\nexport class DefaultProxyFactory implements ProxyFactory {\n public createProxy({ proxyUrl, rejectUnauthorized = false }: ProxyOptions) {\n let protocol: string;\n try {\n ({ protocol } = new URL(proxyUrl));\n } catch (error) {\n throw new Error(\n `Invalid Proxy URL: '${proxyUrl}'. Please provide a valid URL.`\n );\n }\n\n switch (protocol) {\n case 'http:':\n case 'https:':\n return this.createHttpProxy(proxyUrl, rejectUnauthorized);\n case 'socks:':\n case 'socks4:':\n case 'socks4a:':\n case 'socks5:':\n case 'socks5h:':\n return this.createSocksProxy(proxyUrl);\n default:\n throw new Error(\n `Unsupported proxy protocol: '${protocol.replace(\n ':',\n ''\n )}'. Please use a supported protocol (HTTP(S), SOCKS4, or SOCKS5).`\n );\n }\n }\n\n public createProxyForClient({\n targetUrl,\n ...options\n }: TargetProxyOptions): https.Agent | http.Agent {\n const proxies = this.createProxy(options);\n let protocol: string;\n try {\n ({ protocol } = new URL(targetUrl));\n } catch (error) {\n throw new Error(\n `Invalid Target URL: '${targetUrl}'. Please contact support at support@brightsec.com`\n );\n }\n\n switch (protocol) {\n case 'http:':\n case 'ws:':\n return proxies.httpAgent;\n case 'https:':\n case 'wss:':\n return proxies.httpsAgent;\n default:\n throw new Error(\n `Proxy not supported for protocol '${protocol}'. Please contact support at support@brightsec.com`\n );\n }\n }\n\n private createHttpProxy(proxyUrl: string, rejectUnauthorized?: boolean) {\n return {\n httpsAgent: new PatchedHttpsProxyAgent(proxyUrl, {\n rejectUnauthorized\n }),\n httpAgent: new HttpProxyAgent(proxyUrl, {\n rejectUnauthorized\n })\n };\n }\n\n private createSocksProxy(proxyUrl: string) {\n const common = new SocksProxyAgent(proxyUrl);\n\n return { httpAgent: common, httpsAgent: common };\n }\n}\n","import { isAxiosError } from 'axios';\n\ntype GenericCommandErrorParams =\n | { command: string; error: any }\n | { message: string; error: unknown };\n\nexport class ErrorMessageFactory {\n public static genericCommandError(params: GenericCommandErrorParams): string {\n const message = this.getTitle(params);\n const details = this.extractErrorDetails(params);\n\n return this.formatFinalMessage(message, details);\n }\n\n private static formatFinalMessage(\n baseMessage: string,\n errorDetails?: string\n ): string {\n return errorDetails\n ? `${baseMessage}: ${errorDetails}.`\n : `${baseMessage}.`;\n }\n\n private static getTitle(params: GenericCommandErrorParams): string {\n return 'message' in params\n ? params.message\n : `Error during \"${params.command}\"`;\n }\n\n private static extractErrorDetails(\n params: GenericCommandErrorParams\n ): string | null {\n if (typeof params.error === 'string') {\n return params.error;\n }\n\n if (isAxiosError(params.error)) {\n switch (typeof params.error.response?.data) {\n case 'string':\n return params.error.response.data;\n }\n }\n\n return (params.error.error || params.error.message) ?? null;\n }\n}\n","import { ok } from 'node:assert';\nimport { ChildProcess, spawn } from 'node:child_process';\nimport { normalize } from 'node:path';\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace NodeJS {\n interface Process {\n pkg?: {\n entrypoint: string;\n };\n }\n }\n}\n\nexport interface CommandArgs {\n command: string;\n args: string[];\n shell: boolean;\n windowsVerbatimArguments: boolean;\n}\n\nexport interface ClusterArgs {\n cluster?: string;\n hostname?: string;\n}\n\nexport interface ClusterUrls {\n api: string;\n repeaterServer: string;\n}\n\nexport interface TlsError {\n code?: string;\n}\n\nexport class Helpers {\n private static readonly UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n private static readonly SHORT_UUID_PATTERN = /^[1-9a-z]{10,22}$/i;\n private static readonly META_CHARS_REGEXP = /([()\\][%!^\"`<>&|;, *?])/g;\n\n private static readonly OPENSSL_CODES = new Set([\n 'CERT_HAS_EXPIRED',\n 'CERT_NOT_YET_VALID',\n 'DEPTH_ZERO_SELF_SIGNED_CERT',\n 'SELF_SIGNED_CERT_IN_CHAIN',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\n 'UNABLE_TO_GET_ISSUER_CERT',\n 'HOSTNAME_MISMATCH',\n 'CERT_REJECTED',\n 'CERT_UNTRUSTED'\n ]);\n\n public static isUUID(value: string): boolean {\n ok(value, 'Value must be string');\n\n return this.UUID_PATTERN.test(value);\n }\n\n public static isShortUUID(value: string): boolean {\n ok(value, 'Value must be string');\n\n return this.SHORT_UUID_PATTERN.test(value);\n }\n\n public static getClusterUrls(args: ClusterArgs): ClusterUrls {\n let repeaterServer: string;\n let api: string;\n\n const hostname = args.cluster ?? args.hostname;\n\n if (hostname) {\n let host = hostname;\n\n try {\n ({ host } = new URL(hostname));\n } catch {\n // noop\n }\n\n if (['localhost', '127.0.0.1'].includes(host)) {\n api = `http://${host}:8000`;\n repeaterServer = `ws://${host}:8000/workstations`;\n } else {\n api = `https://${host}`;\n repeaterServer = `wss://${host}/workstations`;\n }\n } else {\n api = 'https://app.brightsec.com';\n repeaterServer = `wss://app.brightsec.com/workstations`;\n }\n\n return { api, repeaterServer };\n }\n\n public static spawn(\n options: {\n exclude?: string[];\n include?: string[];\n detached?: boolean;\n } = { detached: false }\n ): ChildProcess {\n const { command, args, windowsVerbatimArguments, shell } =\n Helpers.getExecArgs({\n spawn: true,\n excludeAll: true,\n include: options.include,\n exclude: options.exclude\n });\n\n return spawn(command, args, {\n shell,\n windowsVerbatimArguments,\n detached: !shell && options.detached,\n windowsHide: shell && options.detached\n });\n }\n\n public static getExecArgs(options?: {\n exclude?: string[];\n include?: string[];\n excludeAll?: boolean;\n escape?: boolean;\n spawn?: boolean;\n }): CommandArgs {\n options = {\n escape: true,\n excludeAll: false,\n spawn: false,\n ...(options ?? {})\n };\n\n let args: string[] = process.argv.slice(1);\n\n if (options.excludeAll) {\n args = args.slice(0, 1);\n }\n\n if (options.include) {\n args = [...args, ...options.include];\n }\n\n if (options.exclude) {\n args = args.filter((x: string) => !options.exclude.includes(x));\n }\n\n args = [...process.execArgv, ...args].filter((arg: string) =>\n process.pkg && !options.spawn\n ? !arg.startsWith(process.pkg.entrypoint)\n : true\n );\n\n let command = normalize(process.execPath);\n\n const shell = this.win();\n const windowsVerbatimArguments = shell && options.escape;\n\n if (windowsVerbatimArguments) {\n command = `\"${command}\"`;\n args = args.map(this.escapeShellArgument, this);\n }\n\n return {\n args,\n shell,\n command,\n windowsVerbatimArguments\n };\n }\n\n public static async pool<T, R>(\n poolLimit: number,\n items: Iterable<T>,\n iterator: (subject: T) => Promise<R>\n ): Promise<R[]> {\n const promises: Promise<R>[] = [];\n\n const poolPromises: Promise<void>[] = [];\n\n for (const item of items) {\n const promise = iterator(item);\n\n promises.push(promise);\n\n const poolMember: Promise<void> = promise.then(() => {\n poolPromises.splice(poolPromises.indexOf(poolMember), 1);\n });\n\n poolPromises.push(poolMember);\n\n if (poolPromises.length >= poolLimit) {\n await Promise.race(poolPromises);\n }\n }\n\n return Promise.all(promises);\n }\n\n public static wildcardToRegExp(s: string): RegExp {\n return new RegExp(`^${s.split(/\\*+/).map(this.regExpEscape).join('.*')}$`);\n }\n\n public static selectEnumValue(\n enumType: Record<string, string>,\n caseAgnosticValue: string\n ): string | undefined {\n return Object.values(enumType).find(\n (x: string) =>\n x.toLowerCase().trim() === caseAgnosticValue.toLowerCase().trim()\n );\n }\n\n public static omit<T, K extends keyof T>(data: T): Omit<T, undefined | null> {\n return (Object.entries(data) as [K, T[K]][]).reduce(\n (acc: Omit<T, undefined | null>, [k, v]: [K, T[K]]) =>\n v == null ? acc : { ...acc, [k]: v },\n {} as Omit<T, undefined | null>\n );\n }\n\n public static split<T extends R[], R>(array: T, count: number): R[][] {\n ok(Array.isArray(array), 'First argument must be an instance of Array.');\n\n const countItemInChunk: number = Math.ceil(array.length / count);\n\n return Array(countItemInChunk)\n .fill(null)\n .map(\n (_value: string, i: number) =>\n array.slice(i * count, i * count + count) as R[]\n );\n }\n\n public static toArray<T>(enumeration: unknown): T[] {\n return [...Object.values(enumeration)] as T[];\n }\n\n public static parseHeaders(headers: string[] = []): Record<string, string> {\n ok(Array.isArray(headers), 'First argument must be an instance of Array.');\n\n return headers.reduce((acc: Record<string, string>, value: string) => {\n const [key, header]: [string, string] = this.parseHeader(value);\n\n return { ...acc, [key]: header };\n }, {});\n }\n\n public static portFromURL(url: URL): string {\n return (\n url.port ||\n (url.protocol === 'http:' ? '80' : url.protocol === 'https:' ? '443' : '')\n );\n }\n\n public static isTlsCertError(error: Error) {\n const err = error as TlsError;\n\n if (!err.code) return false;\n\n if (\n typeof err.code === 'string' &&\n (err.code.startsWith('ERR_TLS_') || err.code === 'ECONNRESET')\n ) {\n return true;\n }\n\n if (Helpers.OPENSSL_CODES.has(err.code)) return true;\n\n return false;\n }\n\n // It's based on https://qntm.org/cmd\n private static escapeShellArgument(val: string): string {\n val = `${val}`;\n\n val = val.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n\n val = val.replace(/(\\\\*)$/, '$1$1');\n\n val = `\"${val}\"`;\n\n return val.replace(this.META_CHARS_REGEXP, '^$1');\n }\n\n private static parseHeader(header: string): [string, string] | undefined {\n ok(\n typeof header === 'string',\n 'First argument must be an instance of String.'\n );\n\n if (header) {\n const [key, ...values]: string[] = header.split(':');\n\n return [key, values.join(':')].map((item: string) =>\n decodeURIComponent(item.trim())\n ) as [string, string];\n }\n }\n\n private static win(): boolean {\n return process.platform === 'win32';\n }\n\n /**\n * RegExp-escapes all characters in the given string.\n */\n private static regExpEscape(s: string): string {\n return s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n }\n}\n","import chalk from 'chalk';\nimport { createStream } from 'rotating-file-stream';\nimport { format } from 'node:util';\nimport { mkdirSync, existsSync } from 'fs';\nimport { dirname } from 'path';\n\nexport enum LogLevel {\n SILENT,\n ERROR,\n WARN,\n NOTICE,\n VERBOSE,\n TRACE\n}\n\nexport interface LogFile {\n write(data: string): void;\n end?(): void;\n}\n\nexport interface LogOptions {\n // Size in bytes, default 10MB\n maxSize?: string;\n // Maximum number of rotated files to keep, default 5\n maxFiles?: number;\n // Interval to rotate the file even if size is not exceeded\n // Examples: '1d', '12h', '7d'\n interval?: string;\n // Compression for rotated files ('gzip' or undefined)\n compress?: 'gzip';\n}\n\nexport class Logger {\n private static instance: Logger;\n private readonly MAX_FORMATTED_LEVEL_LENGTH = Object.keys(LogLevel)\n .sort((a: string, b: string) => a.length - b.length)\n .slice(0)\n .pop().length;\n private _logLevel: LogLevel;\n private _logFile?: LogFile;\n private _logPath?: string;\n private _logOptions: LogOptions;\n\n constructor(\n logLevel: LogLevel = LogLevel.NOTICE,\n logFile?: string,\n options: LogOptions = {}\n ) {\n this._logLevel = logLevel;\n this._logOptions = {\n maxSize: options.maxSize || '10MB',\n maxFiles: options.maxFiles ?? 5,\n interval: options.interval || '1d',\n compress: options.compress ?? 'gzip'\n };\n if (logFile) {\n this.logFile = logFile;\n }\n }\n\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n\n return Logger.instance;\n }\n\n public static configure(\n logLevel: LogLevel = LogLevel.NOTICE,\n logFile?: string,\n options: LogOptions = {}\n ): Logger {\n const instance = Logger.getInstance();\n instance._logLevel = logLevel;\n instance._logOptions = {\n maxSize: options.maxSize || '10MB',\n maxFiles: options.maxFiles ?? 5,\n interval: options.interval || '1d',\n compress: options.compress ?? 'gzip'\n };\n if (logFile) {\n instance.logFile = logFile;\n }\n\n return instance;\n }\n\n get logLevel(): LogLevel {\n return this._logLevel;\n }\n\n set logLevel(value: LogLevel) {\n this._logLevel = value;\n }\n\n get logFile(): string | undefined {\n return this._logPath;\n }\n\n set logFile(filePath: string | undefined) {\n if (this._logFile && 'end' in this._logFile) {\n this._logFile.end();\n }\n this._logFile = undefined;\n this._logPath = undefined;\n\n if (filePath) {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Create a rotating write stream\n this._logFile = createStream(filePath, {\n size: this._logOptions.maxSize,\n interval: this._logOptions.interval,\n compress: this._logOptions.compress,\n maxFiles: this._logOptions.maxFiles,\n // Rotate file names with timestamp\n rotate: 1\n });\n this._logPath = filePath;\n }\n }\n\n public error(error: Error, message?: string, ...args: any[]): void;\n public error(message: string, ...args: any[]): void;\n public error(\n errorOrMessage: Error | string,\n messageOrArg: any,\n ...args: any[]\n ): void {\n if (this.logLevel < LogLevel.ERROR) {\n return;\n }\n\n let message: string;\n\n if (typeof errorOrMessage === 'string') {\n if (arguments.length > 1) {\n args.unshift(messageOrArg);\n }\n message = errorOrMessage;\n } else {\n const error = errorOrMessage as Error;\n message = messageOrArg || error.message;\n if (error.stack) {\n args.push(`\\n${error.stack}`);\n }\n }\n\n const formatted = this.formatMessage('ERROR', message, args);\n if (!this._logFile) {\n this.writeToStderr(chalk.red(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public warn(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.WARN) {\n return;\n }\n\n const formatted = this.formatMessage('WARN', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.yellow(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public log(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.NOTICE) {\n return;\n }\n\n const formatted = this.formatMessage('NOTICE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.green(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public debug(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.VERBOSE) {\n return;\n }\n\n const formatted = this.formatMessage('VERBOSE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.cyan(formatted));\n }\n this.writeToFile(formatted);\n }\n\n public trace(message: string, ...args: any[]): void {\n if (this.logLevel < LogLevel.TRACE) {\n return;\n }\n\n const formatted = this.formatMessage('TRACE', message, args);\n if (!this._logFile) {\n this.writeToStdout(chalk.cyan(formatted));\n }\n this.writeToFile(formatted);\n }\n\n private formatMessage(level: string, message: string, args: any[]): string {\n const formattedMessage = format(message, ...args);\n const formattedLevel = level\n .toUpperCase()\n .padEnd(this.MAX_FORMATTED_LEVEL_LENGTH, ' ');\n\n return `${new Date().toISOString()} [${formattedLevel}] ${formattedMessage}`;\n }\n\n private writeToFile(message: string): void {\n if (this._logFile) {\n try {\n this._logFile.write(`${message}\\n`);\n } catch (error) {\n // Silently handle write errors in tests\n }\n }\n }\n\n private writeToStdout(message: string): void {\n process.stdout.write(`${message}\\n`);\n }\n\n private writeToStderr(message: string): void {\n process.stderr.write(`${message}\\n`);\n }\n}\n\nexport const logger: Logger = Logger.getInstance();\n","import { Transform, TransformCallback } from 'node:stream';\n\nexport class NormalizeZlibDeflateTransformStream extends Transform {\n private hasCheckedHead = false;\n private readonly header = Buffer.from([0x78, 0x9c]);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public _transform(\n chunk: any,\n encoding: BufferEncoding,\n callback: TransformCallback\n ) {\n if (!this.hasCheckedHead && chunk.length !== 0) {\n // ADHOC: detects raw deflate: https://stackoverflow.com/a/37528114\n if (chunk.compare(this.header, 0, 1, 0, 1) !== 0) {\n this.push(this.header, encoding);\n }\n this.hasCheckedHead = true;\n }\n\n this.push(chunk, encoding);\n callback();\n }\n}\n","import {\n HttpsProxyAgent,\n type HttpsProxyAgentOptions\n} from 'https-proxy-agent';\nimport { type URL } from 'node:url';\nimport type http from 'node:http';\nimport type net from 'node:net';\n\nconst kTlsUpgradeOptions = Symbol('tlsUpgradeOptions');\n\n// ADHOC: This is a workaround for this issue: https://github.com/TooTallNate/node-https-proxy-agent/issues/89\nexport class PatchedHttpsProxyAgent<\n T extends string\n> extends HttpsProxyAgent<T> {\n private readonly [kTlsUpgradeOptions]?: HttpsProxyAgentOptions<T>;\n\n constructor(proxy: T | URL, opts?: HttpsProxyAgentOptions<T>) {\n super(proxy, opts);\n this[kTlsUpgradeOptions] = opts;\n }\n\n public override connect(\n req: http.ClientRequest,\n opts: Parameters<HttpsProxyAgent<T>['connect']>[1]\n ): Promise<net.Socket> {\n return super.connect(req, { ...this[kTlsUpgradeOptions], ...opts });\n }\n}\n","import https from 'node:https';\nimport http from 'node:http';\n\nexport interface ProxyOptions {\n proxyUrl: string;\n rejectUnauthorized?: boolean;\n}\n\nexport interface TargetProxyOptions extends ProxyOptions {\n targetUrl: string;\n}\n\nexport interface ProxyFactory {\n createProxy(options: ProxyOptions): {\n httpsAgent: https.Agent;\n httpAgent: http.Agent;\n };\n\n createProxyForClient(options: TargetProxyOptions): https.Agent | http.Agent;\n}\n\nexport const ProxyFactory: unique symbol = Symbol('ProxyFactory');\n","import { Helpers } from './Helpers';\nimport { logger } from './Logger';\nimport raw from '@neuralegion/raw-socket';\nimport dgram from 'node:dgram';\nimport { Resolver } from 'node:dns/promises';\nimport { EventEmitter, once } from 'node:events';\nimport { isIP } from 'node:net';\n\nexport { Protocol } from '@neuralegion/raw-socket';\n\nconst Stop: unique symbol = Symbol('Stop');\n\ninterface ReturnType {\n reached: boolean;\n}\n\nexport interface Options {\n amountProbes: number;\n maximumHops: number;\n timeoutInMillis: number;\n reverseLookup: boolean;\n protocol: number;\n packetSize: number;\n outStream: typeof process.stdout;\n}\n\nconst defaultOptions: Options = {\n amountProbes: 3,\n maximumHops: 64,\n timeoutInMillis: 3000,\n reverseLookup: true,\n protocol: raw.Protocol.ICMP,\n packetSize: 52,\n outStream: process.stdout\n};\n\nexport class Traceroute {\n private readonly icmpSocket = raw.createSocket({\n protocol: raw.Protocol.ICMP\n });\n private readonly resolver = new Resolver();\n private readonly options: Options;\n private readonly subject = new EventEmitter();\n private port = 33433;\n private ttl = 1;\n private startTime?: [number, number];\n private probes = 0;\n private timeout?: NodeJS.Timeout;\n private previousIP?: string;\n private udpSocket?: dgram.Socket;\n private destinationHostname: string;\n\n constructor(\n private destinationIp: string,\n userOptions: Partial<Options> = {}\n ) {\n const maximumHops = userOptions.maximumHops || defaultOptions.maximumHops;\n\n this.options = {\n ...defaultOptions,\n ...Helpers.omit(userOptions),\n ...(maximumHops > 255 || maximumHops < 1\n ? { maximumHops: defaultOptions.maximumHops }\n : { maximumHops })\n };\n\n this.destinationHostname = this.destinationIp;\n\n this.icmpSocket.on('error', (e) => this.emitError(e));\n\n this.icmpSocket.on('message', async (buffer: Buffer, ip: string) => {\n const port = this.parseIdFromIcmpMessage(buffer);\n\n logger.debug(\n 'Received ICMP %s bytes (message: %s) from %s:%s',\n buffer.length,\n buffer.toString('hex'),\n ip,\n port\n );\n\n if (port === this.port) {\n const hostName = await this.getHostName(ip);\n this.handleReply(ip, hostName);\n }\n });\n }\n\n public async execute(): Promise<ReturnType> {\n if (!isIP(this.destinationIp)) {\n try {\n this.destinationIp = (\n await this.resolver.resolve(this.destinationHostname, 'A')\n )[0];\n } catch (err) {\n logger.debug(\n 'Cannot resolve the following hostname: %s. Error: %s',\n this.destinationHostname,\n err\n );\n }\n }\n\n process.stdout.write(\n `traceroute to ${this.destinationHostname} (${this.destinationIp}), ${this.options.maximumHops} hops max, ${this.options.packetSize} byte packets`\n );\n\n if (this.options.protocol === raw.Protocol.UDP) {\n this.udpSocket = dgram.createSocket('udp4');\n\n this.udpSocket.on('error', (e) => this.emitError(e));\n\n this.udpSocket.bind(() => this.sendPacket());\n } else {\n setImmediate(() => this.sendPacket());\n }\n\n const [reached]: ReturnType[] = await once(this.subject, Stop);\n\n this.abort();\n\n return reached;\n }\n\n private abort(): void {\n if (this.udpSocket) {\n this.udpSocket.close();\n }\n this.icmpSocket.close();\n }\n\n private async getHostName(ip: string): Promise<string | undefined> {\n if (!this.options.reverseLookup) {\n return;\n }\n\n try {\n const [hostname]: string[] = await this.resolver.reverse(ip);\n\n return hostname;\n } catch (err) {\n logger.debug(\n 'Cannot reverse the following IP address: %s. Error: %s',\n ip,\n err\n );\n }\n }\n\n private sendPacket(): void {\n if (this.probes >= this.options.amountProbes) {\n this.probes = 0;\n this.ttl++;\n }\n\n this.probes++;\n\n const buffer = this.createPingRequest(\n 0,\n 0,\n ++this.port,\n this.options.packetSize\n );\n\n if (this.udpSocket) {\n try {\n this.udpSocket.setTTL(this.ttl);\n } catch (e) {\n this.emitError(e as Error);\n\n return;\n }\n this.udpSocket.send(\n buffer,\n 0,\n buffer.length,\n this.port,\n this.destinationIp,\n this.afterSend.bind(this)\n );\n } else {\n this.icmpSocket.setOption(\n raw.SocketLevel.IPPROTO_IP,\n raw.SocketOption.IP_TTL,\n this.ttl\n );\n this.icmpSocket.send(\n buffer,\n 0,\n buffer.length,\n this.destinationIp,\n this.afterSend.bind(this)\n );\n }\n }\n\n /**\n * For error type responses the sequence and ID cannot be\n * extracted, the data part contains the IP header from our request,\n * followed with at least 8 bytes from the echo request that generated the error.\n * In detail look up in https://en.wikipedia.org/wiki/Ping_(networking_utility)\n * and https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol\n */\n private parseIdFromIcmpMessage(msg: Buffer): number | undefined {\n let offset = 20;\n\n const type = msg.readUInt8(offset);\n\n if (type === 3 || type === 4 || type === 5 || type === 11) {\n const icmpIPOffset = offset + 8;\n\n // IPv4 takes no less 20 bytes in an IP header\n if (\n msg.length - icmpIPOffset < 20 ||\n // eslint-disable-next-line no-bitwise\n (msg.readUInt8(icmpIPOffset) & 0xf0) !== 0x40\n ) {\n return;\n }\n\n // eslint-disable-next-line no-bitwise\n const icmpIPLength = (msg.readUInt8(icmpIPOffset) & 0x0f) * 4;\n\n // ICMP message too short\n if (msg.length - icmpIPOffset - icmpIPLength < 8) {\n return;\n }\n\n offset = icmpIPOffset + icmpIPLength;\n }\n\n return msg.readUInt16BE(offset + 6);\n }\n\n private afterSend(error: Error | null) {\n if (error) {\n this.emitError(error);\n\n return;\n }\n\n this.timeout = setTimeout(\n () => this.handleReply(),\n this.options.timeoutInMillis\n );\n }\n\n private handleReply(ip?: string, symbolicAddress?: string): void {\n this.clearTimeout();\n\n const formattedTTL = this.ttl.toFixed().padStart(3, ' ');\n\n if (ip) {\n const elapsedTime = `${(\n process.hrtime(this.startTime)[1] / 1000000\n ).toFixed(3)} ms`;\n\n if (ip === this.previousIP) {\n process.stdout.write(` ${elapsedTime} `);\n } else if (this.probes === 1) {\n process.stdout.write(\n `\\n${formattedTTL} ${\n symbolicAddress ? symbolicAddress : ip\n } (${ip}) ${elapsedTime} `\n );\n } else {\n process.stdout.write(\n `\\n${Array(formattedTTL.length).fill(' ').join('')} ${\n symbolicAddress ? symbolicAddress : ip\n } (${ip}) ${elapsedTime} `\n );\n }\n } else {\n process.stdout.write(this.probes === 1 ? `\\n${formattedTTL} * ` : `* `);\n }\n\n if (\n this.probes === this.options.amountProbes &&\n (ip === this.destinationIp || this.ttl >= this.options.maximumHops)\n ) {\n process.stdout.write('\\n');\n this.subject.emit(Stop, {\n reached: ip === this.destinationIp\n });\n\n return;\n }\n\n this.previousIP = ip;\n\n setImmediate(() => this.sendPacket());\n }\n\n private createPingRequest(\n type: number,\n identifier: number,\n sequence: number,\n packetSize = 0\n ): Buffer {\n const header = [\n type || 0x08,\n 0x00,\n 0x00,\n 0x00,\n this.secondByte(identifier),\n this.firstByte(identifier),\n this.secondByte(sequence),\n this.firstByte(sequence)\n ];\n const req = [...header, ...Array(packetSize).fill(0xff)];\n\n const buffer = Buffer.from(req);\n raw.writeChecksum(buffer, 2, raw.createChecksum(buffer));\n\n return buffer;\n }\n\n private firstByte(value: number): number {\n // eslint-disable-next-line no-bitwise\n return value & 0xff;\n }\n\n private secondByte(value: number): number {\n // eslint-disable-next-line no-bitwise\n return (value & 0xff00) >> 8;\n }\n\n private clearTimeout(): void {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n }\n\n private emitError(error: Error): void {\n this.subject.emit('error', error);\n }\n}\n","export * from './Backoff';\nexport * from './DefaultProxyFactory';\nexport * from './ErrorMessageFactory';\nexport * from './Helpers';\nexport * from './Logger';\nexport * from './ProxyFactory';\nexport * from './Traceroute';\n","import { TestType } from '../TestType';\nimport { Connectivity } from './Connectivity';\nimport { logger } from '../../Utils';\nimport { Credentials } from '../Credentials';\nimport { Tokens } from '../Tokens';\nimport axios from 'axios';\nimport { inject, injectable } from 'tsyringe';\nimport { resolve } from 'node:url';\n\n@injectable()\nexport class AuthConnectivity implements Connectivity {\n public readonly type = TestType.AUTH;\n private readonly CONNECTION_TIMEOUT = 10 * 1000; // 10 seconds\n\n constructor(@inject(Tokens) private readonly tokens: Tokens) {}\n\n public async test(url: URL): Promise<boolean> {\n const { repeaterId, authToken }: Credentials | undefined =\n this.tokens.readTokens();\n\n try {\n const { data } = await axios.get<{ id: string }>(\n resolve(url.toString(), `/api/v1/repeaters/${repeaterId}`),\n {\n timeout: this.CONNECTION_TIMEOUT,\n headers: {\n Authorization: `api-key ${authToken}`\n }\n }\n );\n\n logger.debug(\n 'Authentication test successful with repeater ID: %s',\n data.id\n );\n\n return data.id === repeaterId;\n } catch (err) {\n if (\n axios.isAxiosError(err) &&\n (err.status === 401 || err.status === 403 || err.status === 404)\n ) {\n logger.debug(\n 'Authentication test failed with repeater ID: %s',\n repeaterId\n );\n } else {\n logger.debug('Authentication test failed: %s', err.message);\n }\n\n return false;\n }\n }\n}\n","import { TestType } from '../TestType';\nimport { Options } from '../Options';\n\nexport interface Connectivity {\n type: TestType;\n\n test(target: string | URL, opt?: Options): Promise<boolean>;\n}\n\nexport const Connectivity: unique symbol = Symbol('Connectivity');\n","import { TestType } from '../TestType';\n\nexport interface ConnectivityAnalyzer {\n verifyAccess(type: TestType, target?: string | URL): Promise<boolean>;\n}\n\nexport const ConnectivityAnalyzer: unique symbol = Symbol(\n 'ConnectivityAnalyzer'\n);\n","import { Connectivity } from './Connectivity';\nimport { ConnectivityAnalyzer } from './ConnectivityAnalyzer';\nimport { logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Options } from '../Options';\nimport { inject, injectable, injectAll } from 'tsyringe';\n\nexport const ConnectivityUrls = Symbol('ConnectivityUrls');\n\n@injectable()\nexport class DefaultConnectivityAnalyzer implements ConnectivityAnalyzer {\n constructor(\n @inject(ConnectivityUrls)\n private readonly urls: Map<TestType, string | URL>,\n @inject(Options) private readonly opt: Options,\n @injectAll(Connectivity)\n private readonly connectivityTestRegistry: Connectivity[]\n ) {}\n\n public async verifyAccess(\n type: TestType,\n target?: string | URL\n ): Promise<boolean> {\n logger.debug('Calling connectivity status test with type %s', type);\n\n const connectivity: Connectivity | undefined =\n this.connectivityTestRegistry.find((x: Connectivity) => x.type === type);\n\n if (!connectivity) {\n throw new Error('Selected test is not support.');\n }\n\n return connectivity.test(\n target ?? this.urls.get(connectivity.type),\n this.opt\n );\n }\n}\n","import { Connectivity } from './Connectivity';\nimport { logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { injectable } from 'tsyringe';\nimport https, { RequestOptions } from 'node:https';\nimport http, { ClientRequest } from 'node:http';\nimport { once } from 'node:events';\n\ninterface ReqFactory {\n request(options: RequestOptions): ClientRequest;\n}\n\n@injectable()\nexport class HTTPConnectivity implements Connectivity {\n public readonly type = TestType.HTTP;\n\n private readonly CONNECTION_TIMEOUT = 10 * 1000; // 10 seconds\n private readonly FACTORY_REGISTRY: ReadonlyMap<string, ReqFactory> = new Map<\n string,\n ReqFactory\n >([\n ['http:', http],\n ['https:', https]\n ]);\n\n public async test({ port, hostname, protocol }: URL): Promise<boolean> {\n const factory = this.FACTORY_REGISTRY.get(protocol);\n\n const req: ClientRequest = factory.request({\n port,\n hostname,\n method: 'GET',\n rejectUnauthorized: false,\n timeout: this.CONNECTION_TIMEOUT\n });\n\n try {\n req.once('timeout', () => req.destroy(new Error('Reached timeout.')));\n process.nextTick(() => req.end());\n\n await once(req, 'response');\n\n logger.debug('Http connectivity test. The connection is successful.');\n\n return true;\n } catch (err) {\n logger.debug(\n 'Http connectivity test. The connection failed: %s',\n err.message\n );\n\n return false;\n } finally {\n if (!req.aborted) {\n req.destroy();\n }\n }\n }\n}\n","import { Connectivity } from './Connectivity';\nimport { logger, Traceroute } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Options } from '../Options';\nimport { injectable } from 'tsyringe';\n\n@injectable()\nexport class TracerouteConnectivity implements Connectivity {\n public readonly type = TestType.TRACEROUTE;\n\n public async test(target: string, opt?: Options): Promise<boolean> {\n const trace = new Traceroute(target, {\n maximumHops: opt?.traceroute?.maxTTL,\n amountProbes: opt?.traceroute?.probes\n });\n\n try {\n const { reached } = await trace.execute();\n\n logger.debug('Traceroute test has been finished.');\n\n return reached;\n } catch (err) {\n logger.debug('Traceroute test has been failed: %s', err.stack);\n\n return false;\n }\n }\n}\n","export * from './AuthConnectivity';\nexport * from './Connectivity';\nexport * from './ConnectivityAnalyzer';\nexport * from './DefaultConnectivityAnalyzer';\nexport * from './HTTPConnectivity';\nexport * from './TracerouteConnectivity';\n","export const AUTH_TOKEN_VALIDATION_REGEXP =\n /^[A-Za-z0-9+/=]{7}\\.nex[ap]\\.[A-Za-z0-9+/=]{32}$/;\n\nexport interface Credentials {\n readonly authToken: string;\n readonly repeaterId: string;\n}\n","import { Credentials } from './Credentials';\nimport { logger } from '../Utils';\nimport { Tokens } from './Tokens';\nimport { injectable } from 'tsyringe';\nimport { homedir } from 'node:os';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n@injectable()\nexport class FSTokens implements Tokens {\n private readonly baseDir: string = homedir();\n\n public writeTokens(credentials: Credentials): void {\n logger.debug('Saving tokens to file %s', this.path);\n\n writeFileSync(this.path, JSON.stringify(credentials));\n }\n\n public readTokens(): Credentials | undefined {\n let result: Credentials;\n for (const path of [this.path, this.legacyPath]) {\n logger.debug('Reading saved tokens from file %s', path);\n if (existsSync(path)) {\n logger.debug('File found. Return the tokens.');\n const resultRaw: Buffer = readFileSync(path);\n\n return JSON.parse(resultRaw.toString('utf8')) as Credentials;\n }\n }\n if (!result) {\n logger.debug(\"File doesn't exist.\");\n }\n }\n\n private get path(): string {\n return join(this.baseDir, '.bright-cli');\n }\n\n /**\n * @deprecated `.nexploit-cli` path is deprecated, use .bright-cli. It's handled for backward compatibility.\n */\n private get legacyPath(): string {\n return join(this.baseDir, '.nexploit-cli');\n }\n}\n","export interface TracerouteOptions {\n maxTTL?: number;\n probes?: number;\n}\n\nexport interface Options {\n traceroute?: TracerouteOptions;\n}\n\nexport const Options: unique symbol = Symbol('Options');\n","export interface StartOptions {\n ping: boolean;\n traceroute: boolean;\n}\n\nexport interface Platform {\n start(options?: StartOptions): Promise<void>;\n\n stop(): Promise<void>;\n}\n\nexport const Platform: unique symbol = Symbol('Platform');\n","import { Platform, StartOptions } from '../Platform';\nimport { AUTH_TOKEN_VALIDATION_REGEXP } from '../Credentials';\nimport { ConnectivityAnalyzer, ConnectivityUrls } from '../Connectivity';\nimport { Helpers, logger } from '../../Utils';\nimport { TestType } from '../TestType';\nimport { Tokens } from '../Tokens';\nimport { inject, injectable } from 'tsyringe';\nimport readline from 'node:readline';\nimport { EOL } from 'node:os';\n\n@injectable()\nexport class ReadlinePlatform implements Platform {\n public static URLS_QUESTION =\n 'Please enter the target URLs to test (separated by commas)';\n public static HOST_OR_IP_QUESTION =\n 'Please enter the target hostname or IP to test';\n public static COMPELED_MESSAGE =\n 'Communication diagnostics done, close the terminal to exit.';\n public static INTERNAL_DIAGNOSTIC = `Starting INTERNAL communication diagnostics:${EOL}`;\n\n private rl: readline.Interface;\n private readonly delimiter = `${EOL}\\r--${EOL}`;\n\n constructor(\n @inject(ConnectivityUrls) private readonly urls: ReadonlyMap<TestType, URL>,\n @inject(Tokens) private readonly tokens: Tokens,\n @inject(ConnectivityAnalyzer)\n private readonly connectivityService: ConnectivityAnalyzer\n ) {}\n\n public async start(options?: StartOptions): Promise<void> {\n this.rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n if (options?.traceroute) {\n await this.processTraceroute();\n } else {\n await this.configure(options);\n }\n\n // eslint-disable-next-line no-console\n console.log(this.delimiter);\n\n // eslint-disable-next-line no-console\n console.log(ReadlinePlatform.COMPELED_MESSAGE);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n public async stop(): Promise<void> {\n this.rl.close();\n }\n\n private async configure(options?: StartOptions): Promise<void> {\n if (!options?.ping) {\n /* eslint-disable no-console */\n console.log(`Welcome to the Bright Network Testing wizard!${EOL}`);\n\n console.log(\n 'Note: To run the test, you will require a `Repeater ID` and an `Repeater Token` with the correct scopes.'\n );\n\n console.log(\n 'If you are running the configuration as part of a POC, both of these should have been sent to you via your sales contact.'\n );\n\n process.stdout.write(EOL);\n\n await this.requestTokens();\n\n console.log(this.delimiter);\n\n await this.processExternalCommunication();\n\n console.log(this.delimiter);\n /* eslint-enable no-console */\n }\n\n await this.processPing();\n }\n\n private async requestTokens(): Promise<void> {\n const repeaterId = await this.question('Please enter your Repeater ID');\n const authToken = await this.question(\n `Please enter your Repeater API Token`\n );\n\n process.stdout.write(EOL);\n\n if (!authToken || !AUTH_TOKEN_VALIDATION_REGEXP.test(authToken)) {\n // eslint-disable-next-line no-console\n console.error('Invalid value for authentication token');\n\n return;\n }\n\n if (!repeaterId) {\n // eslint-disable-next-line no-console\n console.error('Invalid value for repeater id');\n\n return;\n }\n\n await this.tokens.writeTokens({ repeaterId, authToken });\n }\n\n private processConnectivity(type: TestType): Promise<void> {\n const url = this.urls.get(type);\n\n return this.process(\n `Validating the ${type} connection to ${url.toString()}`,\n () => this.connectivityService.verifyAccess(type, url)\n );\n }\n\n private async processExternalCommunication(): Promise<void> {\n // eslint-disable-next-line no-console\n console.log(`Starting EXTERNAL communication diagnostics:${EOL}`);\n\n await this.processConnectivity(TestType.HTTP);\n\n await this.process('Verifying provided Token and Repeater ID', () =>\n this.connectivityService.verifyAccess(TestType.AUTH)\n );\n\n process.stdout.write(EOL);\n\n // eslint-disable-next-line no-console\n console.log('EXTERNAL communication diagnostics completed.');\n }\n\n private async processPing(): Promise<void> {\n /* eslint-disable no-console */\n console.log(\n `Next step is to validate the connection to your INTERNAL (local) target application(s).${EOL}`\n );\n const urls = this.getDelimitedInput(\n await this.question(ReadlinePlatform.URLS_QUESTION),\n ','\n );\n\n console.log(this.delimiter);\n\n console.log(ReadlinePlatform.INTERNAL_DIAGNOSTIC);\n\n let reachedCount = 0;\n\n await Helpers.pool(250, urls, (url: string) =>\n this.process(`Trying to reach ${url}`, async () => {\n const result = await this.connectivityService.verifyAccess(\n TestType.HTTP,\n new URL(url)\n );\n\n reachedCount += Number(result);\n\n return result;\n })\n );\n\n process.stdout.write(EOL);\n\n console.log('INTERNAL communication diagnostics completed.');\n console.log(\n `${urls.length - reachedCount} out of ${\n urls.length\n } URLs could not be reached.`\n );\n /* eslint-enable no-console */\n }\n\n private async processTraceroute(): Promise<void> {\n /* eslint-disable no-console */\n console.log(\n `Traceroute to your INTERNAL (local) target application.${EOL}`\n );\n\n if (process.platform === 'win32') {\n console.log(\n `Note: Some Windows users might need to allow the ICMP network traffic through a firewall to enable this functionality.\n For more information, see: https://docs.brightsec.com/docs/cli-testing-network-connectivity${EOL}`\n );\n }\n\n const target = await this.question(ReadlinePlatform.HOST_OR_IP_QUESTION);\n\n console.log(this.delimiter);\n\n console.log(ReadlinePlatform.INTERNAL_DIAGNOSTIC);\n\n const result = await this.connectivityService.verifyAccess(\n TestType.TRACEROUTE,\n target\n );\n\n process.stdout.write(EOL);\n\n console.log(`Traceroute ${result ? 'completed' : 'failed'}.`);\n /* eslint-enable no-console */\n }\n\n private async question(question: string): Promise<string> {\n return new Promise((resolve) => this.rl.question(`${question}: `, resolve));\n }\n\n private async process(\n text: string,\n handler?: () => Promise<boolean>\n ): Promise<void> {\n process.stdout.write(`${text}...`);\n readline.cursorTo(process.stdout, 0);\n\n let result: boolean;\n\n try {\n result = await handler();\n } catch (err) {\n logger.debug(err.message);\n result = false;\n }\n\n // eslint-disable-next-line no-console\n console.log(`${text}... ${result ? 'Success' : 'Failed'}`);\n }\n\n private getDelimitedInput(\n value: string,\n delimiter: string | RegExp\n ): string[] {\n const inputVal = (value ?? '').trim();\n\n return inputVal\n ? inputVal\n .split(delimiter)\n .map((x: string) => x.trim())\n .filter(Boolean)\n : [];\n }\n}\n","export * from './ReadlinePlatform';\n","export enum TestType {\n HTTP = 'http',\n AUTH = 'auth',\n TRACEROUTE = 'traceroute'\n}\n","import { Credentials } from './Credentials';\n\nexport interface Tokens {\n writeTokens(credentials: Credentials): void;\n\n readTokens(): Credentials | undefined;\n}\n\nexport const Tokens: unique symbol = Symbol('Tokens');\n","export * from './Connectivity';\nexport * from './Readline';\nexport * from './Credentials';\nexport * from './FSTokens';\nexport * from './Platform';\nexport * from './TestType';\nexport * from './Tokens';\nexport * from './Options';\n","import 'reflect-metadata';\nimport {\n Certificates,\n CertificatesLoader,\n CertificatesCache,\n CertificatesResolver,\n HttpRequestExecutor,\n RequestExecutor,\n WsRequestExecutor\n} from './RequestExecutor';\nimport {\n DefaultVirtualScripts,\n FSScriptLoader,\n ScriptLoader,\n VirtualScripts\n} from './Scripts';\nimport { DefaultStartupManager, StartupManager } from './StartupScripts';\nimport {\n AuthConnectivity,\n Connectivity,\n ConnectivityAnalyzer,\n DefaultConnectivityAnalyzer,\n FSTokens,\n HTTPConnectivity,\n Platform,\n ReadlinePlatform,\n TracerouteConnectivity,\n Tokens\n} from './Wizard';\nimport {\n BreakpointFactory,\n DefaultBreakpointFactory,\n DefaultPollingFactory,\n PollingFactory,\n RestScans,\n Scans\n} from './Scan';\nimport { EntryPoints, RestEntryPoints } from './EntryPoint';\nimport {\n Archives,\n DefaultParserFactory,\n ParserFactory,\n RestArchives\n} from './Archive';\nimport { ConfigReader } from './Config/ConfigReader';\nimport { DefaultConfigReader } from './Config/DefaultConfigReader';\nimport { CliInfo } from './Config/CliInfo';\nimport { CliBuilder } from './Config/CliBuilder';\nimport {\n RepeaterServer,\n DefaultRepeaterServer,\n RepeaterCommandHub,\n DefaultRepeaterCommandHub,\n RuntimeDetector,\n DefaultRuntimeDetector,\n RepeaterLauncher,\n ServerRepeaterLauncher\n} from './Repeater';\nimport { ProxyFactory, DefaultProxyFactory } from './Utils';\nimport {\n Discoveries,\n RestDiscoveries,\n DiscoveryPollingFactory as DiscoveryPollingFactory,\n DefaultDiscoveryPollingFactory as DefaultDiscoveryPollingFactory\n} from './Discovery';\nimport { DefaultHostUpdateJobStatusPollingFactory } from './EntryPoint/DefaultHostUpdateJobStatusPollingFactory';\nimport { HostUpdateJobStatusPollingFactory } from './EntryPoint/HostUpdateJobStatusPollingFactory';\nimport { DefaultCertificatesCache } from './RequestExecutor/DefaultCertificatesCache';\nimport { DefaultCertificatesResolver } from './RequestExecutor/DefaultCertificatesResolver';\nimport { container, Lifecycle } from 'tsyringe';\n\ncontainer\n .register('tsyringe', {\n useValue: container\n })\n .register<CliInfo>(CliInfo, {\n useValue: new CliInfo(__dirname)\n })\n .register(\n RequestExecutor,\n {\n useClass: HttpRequestExecutor\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Certificates,\n {\n useClass: CertificatesLoader\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n CertificatesCache,\n {\n useClass: DefaultCertificatesCache\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n CertificatesResolver,\n {\n useClass: DefaultCertificatesResolver\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RequestExecutor,\n {\n useClass: WsRequestExecutor\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n VirtualScripts,\n {\n useClass: DefaultVirtualScripts\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n StartupManager,\n {\n useClass: DefaultStartupManager\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RuntimeDetector,\n { useClass: DefaultRuntimeDetector },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RepeaterServer,\n {\n useClass: DefaultRepeaterServer\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n RepeaterCommandHub,\n {\n useClass: DefaultRepeaterCommandHub\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Tokens,\n {\n useClass: FSTokens\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n {\n useClass: HTTPConnectivity\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n { useClass: TracerouteConnectivity },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Connectivity,\n {\n useClass: AuthConnectivity\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n BreakpointFactory,\n {\n useClass: DefaultBreakpointFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n PollingFactory,\n {\n useClass: DefaultPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n DiscoveryPollingFactory,\n {\n useClass: DefaultDiscoveryPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n HostUpdateJobStatusPollingFactory,\n {\n useClass: DefaultHostUpdateJobStatusPollingFactory\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(Scans, { useClass: RestScans }, { lifecycle: Lifecycle.Singleton })\n .register(\n Discoveries,\n { useClass: RestDiscoveries },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n EntryPoints,\n { useClass: RestEntryPoints },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n Archives,\n { useClass: RestArchives },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ParserFactory,\n { useClass: DefaultParserFactory },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ScriptLoader,\n {\n useClass: FSScriptLoader\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register(\n ConnectivityAnalyzer,\n {\n useClass: DefaultConnectivityAnalyzer\n },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<Platform>(\n Platform,\n { useClass: ReadlinePlatform },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<ConfigReader>(\n ConfigReader,\n { useClass: DefaultConfigReader },\n { lifecycle: Lifecycle.Singleton }\n )\n .register<CliBuilder>(CliBuilder, {\n useFactory: (deps) =>\n new CliBuilder({\n info: deps.resolve(CliInfo),\n configReader: deps.resolve(ConfigReader)\n })\n })\n .register<ProxyFactory>(ProxyFactory, {\n useClass: DefaultProxyFactory\n })\n .register<RepeaterLauncher>(\n RepeaterLauncher,\n {\n useClass: ServerRepeaterLauncher\n },\n { lifecycle: Lifecycle.Singleton }\n );\n\nexport default container;\n","module.exports = require(\"@neuralegion/os-service\");","module.exports = require(\"@neuralegion/raw-socket\");","module.exports = require(\"@sentry/node\");","module.exports = require(\"ajv\");","module.exports = require(\"ajv/lib/compile/formats\");","module.exports = require(\"ajv/lib/refs/json-schema-draft-04.json\");","module.exports = require(\"ajv/lib/refs/json-schema-draft-07.json\");","module.exports = require(\"arch\");","module.exports = require(\"axios\");","module.exports = require(\"better-ajv-errors\");","module.exports = require(\"chalk\");","module.exports = require(\"ci-info\");","module.exports = require(\"fast-content-type-parse\");","module.exports = require(\"find-up\");","module.exports = require(\"form-data\");","module.exports = require(\"http-proxy-agent\");","module.exports = require(\"https-proxy-agent\");","module.exports = require(\"iconv-lite\");","module.exports = require(\"js-yaml\");","module.exports = require(\"ms\");","module.exports = require(\"reflect-metadata\");","module.exports = require(\"rotating-file-stream\");","module.exports = require(\"semver\");","module.exports = require(\"socket.io-client\");","module.exports = require(\"socket.io-msgpack-parser\");","module.exports = require(\"socks-proxy-agent\");","module.exports = require(\"tslib\");","module.exports = require(\"tsyringe\");","module.exports = require(\"win-ca\");","module.exports = require(\"ws\");","module.exports = require(\"yargs\");","module.exports = require(\"assert\");","module.exports = require(\"child_process\");","module.exports = require(\"fs\");","module.exports = require(\"node:assert\");","module.exports = require(\"node:child_process\");","module.exports = require(\"node:dgram\");","module.exports = require(\"node:dns/promises\");","module.exports = require(\"node:events\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:fs/promises\");","module.exports = require(\"node:http\");","module.exports = require(\"node:https\");","module.exports = require(\"node:module\");","module.exports = require(\"node:net\");","module.exports = require(\"node:os\");","module.exports = require(\"node:path\");","module.exports = require(\"node:process\");","module.exports = require(\"node:readline\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:timers/promises\");","module.exports = require(\"node:tls\");","module.exports = require(\"node:url\");","module.exports = require(\"node:util\");","module.exports = require(\"node:vm\");","module.exports = require(\"node:zlib\");","module.exports = require(\"path\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","process.env.UV_THREADPOOL_SIZE = String(1024);\nprocess.env.NODE_OPTIONS = `${\n process.env.NODE_OPTIONS ?? ''\n} --max-http-header-size=40960`.trim();\nimport 'reflect-metadata';\nimport {\n PollingScanStatus,\n RetestScan,\n RunRepeater,\n RunScan,\n StopScan,\n UploadArchive,\n VersionCommand,\n Configure,\n GetEntryPoints\n} from './Commands';\nimport { CliBuilder } from './Config';\nimport container from './container';\nimport { RunDiscovery } from './Commands/RunDiscovery';\nimport { StopDiscovery } from './Commands/StopDiscovery';\nimport { RerunDiscovery } from './Commands/RerunDiscovery';\nimport { PollingDiscoveryStatus } from './Commands/PollingDiscoveryStatus';\nimport { PollingHostUpdateJobStatus } from './Commands/PollingHostUpdateJobStatus';\nimport { EntryPointsUpdateHost } from './Commands/EntryPointsUpdateHost';\n\ncontainer.resolve(CliBuilder).build({\n commands: [\n new RunRepeater(),\n new VersionCommand(),\n new PollingScanStatus(),\n new RunScan(),\n new RetestScan(),\n new StopScan(),\n new RunDiscovery(),\n new StopDiscovery(),\n new RerunDiscovery(),\n new PollingDiscoveryStatus(),\n new PollingHostUpdateJobStatus(),\n new UploadArchive(),\n new Configure(),\n new GetEntryPoints(),\n new EntryPointsUpdateHost()\n ]\n}).argv;\n"],"names":["SpecType","Archives","Symbol","BaseParser","constructor","validator","FILE_SIZE_LIMIT","parse","path","this","access","stat","size","Error","content","readFile","ext","extname","data","deserialize","e","message","validate","filename","basename","contentType","file","_meta","JSON","ok","constants","F_OK","DefaultParserFactory","harValidator","oasValidator","postmanValidator","create","spec","HAR","OPENAPI","OasParser","POSTMAN","injectable","HarValidator","OasValidator","PostmanValidator","super","meta","load","ParserFactory","RestArchivesOptions","RestArchives","proxyFactory","baseURL","apiKey","proxyURL","insecure","timeout","ALLOWED_SPECS","httpAgent","Agent","httpsAgent","rejectUnauthorized","createProxy","proxyUrl","client","responseType","headers","authorization","upload","includes","type","discard","variables","projectId","castToFile","formData","append","value","options","stringify","post","params","id","Buffer","from","inject","ProxyFactory","ajv","allErrors","async","jsonPointers","extendRefs","addSchema","getSchema","logger","error","schema","errors","indent","entriesAreValid","log","entries","urls","map","parseEntry","filter","item","Set","length","entry","host","protocol","URL","request","url","MIN_ALLOWED_VERSION","VERSION_SCHEMA_MAP","Map","SCHEMAS","$data","schemaId","addFormat","full","addMetaSchema","_refs","forEach","x","version","getVersion","major","get","validateVersion","gte","openapi","swagger","trim","valid","startsWith","ALLOWED_SCHEMAS","META_SCHEMAS","concat","collection","info","dir","Configure","command","describe","getMapEntryOrThrow","input","err","builder","argv","option","TestType","HTTP","hidden","requiresArg","AUTH","boolean","number","default","alias","group","conflicts","middleware","args","register","Options","useValue","traceroute","maxTTL","isNaN","maxTtl","undefined","probes","ConnectivityUrls","api","handler","app","resolve","Platform","stop","process","exit","on","start","ping","ErrorMessageFactory","genericCommandError","EntryPointsUpdateHost","string","demandOption","array","container","RestProjectsOptions","token","proxyBright","proxy","entryPointsManager","EntryPoints","project","taskId","updateHost","entryPointIds","entrypointIds","newHostname","oldHostname","console","exitCode","GetEntryPoints","choices","entryPoints","entrypoints","limit","connectivity","status","ep","verbose","entryPoint","method","pretty","PollingDiscoveryStatus","positional","RestDiscoveryOptions","polling","DiscoveryPollingFactory","discoveryId","interval","PollingHostUpdateJobStatus","HostUpdateJobStatusPollingFactory","jobId","PollingScanStatus","Helpers","toArray","BreakpointType","ANY","RestScansOptions","PollingFactory","scanId","breakpoint","BreakpointException","RerunDiscovery","discoveryManager","Discoveries","newDiscoveryId","rerun","RetestScan","scanManager","Scans","retest","RunDiscovery","normalize","check","archive","crawler","warnings","name","authObjectId","auth","hostsFilter","hostFilter","crawlerUrls","fileId","repeaters","repeater","optimizedCrawler","smart","poolSize","concurrency","maxInteractionsChainLength","interactionsDepth","subdomainsCrawl","crawlParentSubdomains","header","warn","warning","join","RunRepeater","coerce","arg","Array","isArray","parseHeaders","deprecated","hostname","passphrase","port","split","env","NO_PROXY","domain","daemon","ntlm","Object","hasOwnProperty","call","exitProcess","isShortUUID","isUUID","proxyDomains","proxyDomainsBypass","RequestExecutorOptions","proxyTarget","certs","cert","maxBodySize","Infinity","maxContentLength","reuseConnection","experimentalConnectionReuse","whitelistMimes","allowTruncation","DefaultRepeaterServerOptions","uri","repeaterServer","connectTimeout","repeaterLauncher","RepeaterLauncher","cacert","loadCerts","scripts","loadScripts","remove","uninstall","install","event","close","run","captureException","RunScan","excludeEntryPoint","methods","patterns","nonEmptyPatterns","pattern","EOL","Module","DAST","defaultDescription","ATTACK_PARAM_LOCATIONS_DEFAULT","AttackParamLocation","entrypoint","tests","test","module","templateId","template","buckets","bucket","attackParamLocations","param","exclusions","requests","excludeParam","StopDiscovery","StopScan","UploadArchive","toLowerCase","parserFactory","archives","selectEnumValue","parser","variable","VersionCommand","executeCommand","Promise","reject","exec","stdout","stderr","localMatches","match","localNpmVersion","replace","globalMatches","globalNpmVersion","CliBuilder","_options","build","commands","configReader","cli","config","discovery","cwd","configParser","configPath","toJSON","keys","LogLevel","NOTICE","implies","description","PROXY","getClusterUrls","logFile","maxSize","maxFiles","compress","Logger","configure","logLevel","toString","toUpperCase","usage","pkgConf","example","reduce","acc","wrapWithSentry","recommendCommands","demandCommand","strict","help","wrap","bind","systemConfigManager","SystemConfigManager","systemConfig","read","runWithAsyncContext","initSentry","sentryDsn","setContext","enableBackgroundRotation","rotatedSystemConfig","dsn","init","attachStacktrace","release","VERSION","beforeSend","contexts","t","CliInfo","packagePath","getPackagePath","packageData","getPackageData","dirname","distribution","brightCli","pkg","readFileSync","sync","BRIGHT_CWD","ConfigReader","DefaultConfigReader","rcOptions","rcPath","rcExt","loadCommonJsModule","key","has","code","encoding","script","Script","vmModule","exports","context","createContext","runInNewContext","omit","set","rotationInterval","homedir","backgroundRotationEnabled","transitional","clarifyTimeoutError","rotateIfNecessary","getConfigFile","onRotation","runBackgroundRotation","catch","debug","disableBackgroundRotation","setTimeout","ref","needsRotation","configFile","Date","now","updatedAt","getTime","newConfig","fetchNewConfig","updateConfigFile","defaultConfigFile","fileConfig","writeFile","DefaultDiscoveryPollingFactory","discoveries","DiscoveryPolling","DiscoveryType","SourceType","defaultInterval","DEFAULT_RECONNECT_TIMES","abortController","AbortController","initializePolling","runPollingLoop","handleError","abort","clearTimeout","timeoutDescriptor","poll","processDiscoveryView","signal","aborted","backoff","createBackoff","view","execute","delay","isFinished","DiscoveryStatus","DONE","STOPPED","DISRUPTED","FAILED","Backoff","isAxiosError","handleDiscoveryStatus","RUNNING","PENDING","SCHEDULED","QUEUED","RestDiscoveries","preparedConfig","prepareConfig","put","action","delete","rest","applyDefaultSettings","source","mergeStrategy","discoveryConfig","discoveryTypes","exploreDiscovery","body","push","CRAWLER","ARCHIVE","OAS","DefaultHostUpdateJobStatusPollingFactory","HostUpdateJobStatusPolling","JobStatus","jobView","processJobView","getHostUpdateJobStatus","COMPLETED","handleJobStatus","PROCESSING","job","RestEntryPoints","entrypointsPaginationBatchSize","filters","remaining","nextId","nextCreatedAt","items","Math","min","createdAt","DefaultRepeaterCommandHub","virtualScripts","requestExecutors","compileScripts","clear","VirtualScriptType","REMOTE","wildcard","sendRequest","requestExecutor","find","testNetwork","child","spawn","include","exclude","unref","chunk","lines","line","first","indexOf","ReadlinePlatform","URLS_QUESTION","stdin","write","HOST_OR_IP_QUESTION","COMPELED_MESSAGE","end","once","msg","processOutput","element","index","arr","endsWith","VirtualScripts","injectAll","RequestExecutor","DefaultRepeaterServer","MAX_DEPLOYMENT_TIMEOUT","MIN_RECONNECTION_DELAY","MAX_RECONNECTION_DELAY","events","EventEmitter","handlerMap","WeakMap","connectionAttempts","handleConnectionError","suppressConnectionError","emit","scheduleReconnection","handleConnect","clearConnectionTimer","handleDisconnect","reason","socket","connect","_socket","disconnect","removeAllListeners","deploy","runtime","nextTick","result","race","_","transports","reconnectionDelayMax","reconnectionDelay","agent","createProxyForClient","targetUrl","listenToReservedEvents","listenToApplicationEvents","off","wrappedHandler","wrapEventListener","callback","captureMessage","io","latestReconnectionError","attempt","RepeaterErrorCodes","REPEATER_UNAUTHORIZED","REPEATER_NOT_PERMITTED","max","random","connectionTimer","extractLastArgument","response","handleEventError","lastArg","pop","DefaultRuntimeDetector","cliInfo","isInsideDocker","nodeVersion","ci","arch","os","platform","detectMacosVersion","detectLinuxVersion","detectWindowsVersion","execSync","osRelease","extractValue","RegExp","prettyName","NetworkTestType","RepeaterCommandHub","RepeaterServer","RuntimeDetector","ServerRepeaterLauncher","runtimeDetector","startupManager","commandHub","certificates","scriptLoader","requestExecutorOptions","repeaterRunning","remediation","normalizedMessage","normalizeMessage","normalizedRemediation","isCriticalError","handleCriticalError","deployRepeater","repeaterId","getRuntime","reconnectionFailed","testingNetwork","output","limitsReceived","requestReceived","Request","statusCode","errorCode","execArgs","getExecArgs","escape","SERVICE_NAME","displayName","asDaemon","setTag","subscribeToEvents","scriptsLoaded","docker","payload","yellow","REPEATER_DEACTIVATED","REPEATER_NO_LONGER_SUPPORTED","REPEATER_ALREADY_STARTED","UNEXPECTED_ERROR","red","StartupManager","Certificates","ScriptLoader","CertificatesCache","CertificatesLoader","CERT_FILES","win","loadCertsFromFile","discoveryDefaultLocations","ca","globalAgent","CertificatesResolver","DefaultCertificatesCache","cache","add","certificateCacheKeyFromRequest","requestUrl","portFromURL","DefaultCertificatesResolver","certificatesCache","registeredCerts","cachedCertificate","matchHostnameAndPort","wildcardToRegExp","HttpRequestExecutor","certificatesResolver","DEFAULT_SCRIPT_ENTRYPOINT","httpsProxyAgent","httpProxyAgent","agentOptions","keepAlive","maxSockets","Protocol","setHeaders","transformScript","targetCerts","executeRequest","tryRequestWithCertificates","cause","syscall","Response","timer","res","req","createRequest","encode","truncateResponse","outgoingMessage","secureEndpoint","createRequestOptions","hasHeader","setHeader","destroy","assign","hash","pathname","search","getRequestAgent","pfx","some","decompress","maxContentSize","responseHasNoBody","parseContentType","whiteListedMimeType","mime","transform","parseBody","byteLength","toFixed","decode","parameters","charset","safeParse","encodingExists","unzipBody","contentEncoding","zlibOptions","flush","Z_SYNC_FLUSH","finishFlush","pipe","createGunzip","NormalizeZlibDeflateTransformStream","createInflate","createBrotliDecompress","chunks","stream","chuck","truncateBody","subarray","alloc","headersSymbol","getOwnPropertySymbols","headersSent","vm","trace","slice","requestsWithCerts","loadCert","isTlsCertError","any","correlationIdRegex","_method","validateUrl","precheckBody","normalizeCorrelationIdRegex","_pfx","_ca","_passphrase","_headers","mergedHeaders","field","SINGLE_VALUE_HEADERS","assertPassphrase","createSecureContext","WsRequestExecutor","WS","consume","matcher","waitForResponse","dataString","String","upgrading","all","normalizeHeaders","headerName","FORBIDDEN_HEADERS","handshakeTimeout","promisify","send","readyState","OPEN","BasePolling","_active","active","state","isRedundant","ScanStatus","Breakpoint","scanIssues","isExcepted","breakOn","BreakpointFactory","setPrototypeOf","prototype","OnSeverity","severity","breakSeverities","severityRanges","stats","DefaultBreakpointFactory","Severity","LOW","HIGH_ISSUE","HIGH","MEDIUM_ISSUE","MEDIUM","CRITICAL_ISSUE","CRITICAL","DefaultPollingFactory","scans","breakpointFactory","RestScans","scanConfig","prepareScanConfig","replaceDeprecatedAttackParamLocations","Discovery","ARTIFICAL_FRAGMENT","loc","ARTIFICIAL_FRAGMENT","ARTIFICAL_QUERY","ARTIFICIAL_QUERY","BODY","FRAGMENT","QUERY","values","DefaultVirtualScripts","store","iterator","VirtualScript","compile","FSScriptLoader","loadScript","LOCAL","MODULE_EXEC_ARGS","wrapScriptCode","__filename","__dirname","functionName","functionArgs","runInContext","func","decoratedModule","DefaultStartupManager","enable","dispose","disable","maxDepth","shouldRetry","depth","task","retry","round","DefaultProxyFactory","createHttpProxy","createSocksProxy","proxies","PatchedHttpsProxyAgent","HttpProxyAgent","common","SocksProxyAgent","getTitle","details","extractErrorDetails","formatFinalMessage","baseMessage","errorDetails","UUID_PATTERN","SHORT_UUID_PATTERN","cluster","detached","windowsVerbatimArguments","shell","excludeAll","windowsHide","execArgv","execPath","escapeShellArgument","pool","poolLimit","promises","poolPromises","promise","poolMember","then","splice","s","regExpEscape","enumType","caseAgnosticValue","k","v","count","countItemInChunk","ceil","fill","_value","i","enumeration","parseHeader","OPENSSL_CODES","val","META_CHARS_REGEXP","decodeURIComponent","MAX_FORMATTED_LEVEL_LENGTH","sort","a","b","_logLevel","_logOptions","getInstance","instance","_logPath","filePath","_logFile","existsSync","mkdirSync","recursive","createStream","rotate","errorOrMessage","messageOrArg","ERROR","arguments","unshift","stack","formatted","formatMessage","writeToStderr","writeToFile","WARN","writeToStdout","green","VERBOSE","cyan","TRACE","level","formattedMessage","format","formattedLevel","padEnd","toISOString","Transform","hasCheckedHead","_transform","compare","kTlsUpgradeOptions","HttpsProxyAgent","opts","Stop","defaultOptions","amountProbes","maximumHops","timeoutInMillis","reverseLookup","ICMP","packetSize","outStream","Traceroute","destinationIp","userOptions","icmpSocket","createSocket","resolver","Resolver","subject","ttl","destinationHostname","emitError","buffer","ip","parseIdFromIcmpMessage","hostName","getHostName","handleReply","isIP","UDP","udpSocket","sendPacket","setImmediate","reached","reverse","createPingRequest","setTTL","afterSend","setOption","SocketLevel","IPPROTO_IP","SocketOption","IP_TTL","offset","readUInt8","icmpIPOffset","icmpIPLength","readUInt16BE","symbolicAddress","formattedTTL","padStart","elapsedTime","hrtime","startTime","previousIP","identifier","sequence","secondByte","firstByte","writeChecksum","createChecksum","AuthConnectivity","tokens","CONNECTION_TIMEOUT","authToken","readTokens","Authorization","Tokens","Connectivity","ConnectivityAnalyzer","DefaultConnectivityAnalyzer","opt","connectivityTestRegistry","verifyAccess","target","HTTPConnectivity","FACTORY_REGISTRY","TracerouteConnectivity","TRACEROUTE","AUTH_TOKEN_VALIDATION_REGEXP","FSTokens","baseDir","writeTokens","credentials","writeFileSync","legacyPath","resultRaw","connectivityService","delimiter","rl","createInterface","processTraceroute","requestTokens","processExternalCommunication","processPing","question","processConnectivity","getDelimitedInput","INTERNAL_DIAGNOSTIC","reachedCount","Number","text","cursorTo","inputVal","Boolean","useClass","lifecycle","Lifecycle","Singleton","useFactory","deps","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","UV_THREADPOOL_SIZE","NODE_OPTIONS"],"sourceRoot":""}