insa-check-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +24 -0
- package/dist/annex-b.d.ts +6 -0
- package/dist/annex-b.d.ts.map +1 -0
- package/dist/annex-b.js +152 -0
- package/dist/annex-b.js.map +1 -0
- package/dist/checks/content/page.d.ts +7 -0
- package/dist/checks/content/page.d.ts.map +1 -0
- package/dist/checks/content/page.js +133 -0
- package/dist/checks/content/page.js.map +1 -0
- package/dist/checks/cookies/cookie-flags.d.ts +3 -0
- package/dist/checks/cookies/cookie-flags.d.ts.map +1 -0
- package/dist/checks/cookies/cookie-flags.js +41 -0
- package/dist/checks/cookies/cookie-flags.js.map +1 -0
- package/dist/checks/cookies/cookie-scope.d.ts +6 -0
- package/dist/checks/cookies/cookie-scope.d.ts.map +1 -0
- package/dist/checks/cookies/cookie-scope.js +60 -0
- package/dist/checks/cookies/cookie-scope.js.map +1 -0
- package/dist/checks/deployment/server-banner.d.ts +4 -0
- package/dist/checks/deployment/server-banner.d.ts.map +1 -0
- package/dist/checks/deployment/server-banner.js +60 -0
- package/dist/checks/deployment/server-banner.js.map +1 -0
- package/dist/checks/deployment/trace.d.ts +3 -0
- package/dist/checks/deployment/trace.d.ts.map +1 -0
- package/dist/checks/deployment/trace.js +30 -0
- package/dist/checks/deployment/trace.js.map +1 -0
- package/dist/checks/headers/clickjacking.d.ts +5 -0
- package/dist/checks/headers/clickjacking.d.ts.map +1 -0
- package/dist/checks/headers/clickjacking.js +57 -0
- package/dist/checks/headers/clickjacking.js.map +1 -0
- package/dist/checks/headers/content-type-options.d.ts +3 -0
- package/dist/checks/headers/content-type-options.d.ts.map +1 -0
- package/dist/checks/headers/content-type-options.js +17 -0
- package/dist/checks/headers/content-type-options.js.map +1 -0
- package/dist/checks/headers/cors.d.ts +4 -0
- package/dist/checks/headers/cors.d.ts.map +1 -0
- package/dist/checks/headers/cors.js +38 -0
- package/dist/checks/headers/cors.js.map +1 -0
- package/dist/checks/html.d.ts +11 -0
- package/dist/checks/html.d.ts.map +1 -0
- package/dist/checks/html.js +30 -0
- package/dist/checks/html.js.map +1 -0
- package/dist/checks/index.d.ts +7 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +48 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/info-disclosure/directory-listing.d.ts +6 -0
- package/dist/checks/info-disclosure/directory-listing.d.ts.map +1 -0
- package/dist/checks/info-disclosure/directory-listing.js +60 -0
- package/dist/checks/info-disclosure/directory-listing.js.map +1 -0
- package/dist/checks/info-disclosure/exposed-files.d.ts +4 -0
- package/dist/checks/info-disclosure/exposed-files.d.ts.map +1 -0
- package/dist/checks/info-disclosure/exposed-files.js +56 -0
- package/dist/checks/info-disclosure/exposed-files.js.map +1 -0
- package/dist/checks/info-disclosure/more.d.ts +8 -0
- package/dist/checks/info-disclosure/more.d.ts.map +1 -0
- package/dist/checks/info-disclosure/more.js +186 -0
- package/dist/checks/info-disclosure/more.js.map +1 -0
- package/dist/checks/tls/certificate.d.ts +3 -0
- package/dist/checks/tls/certificate.d.ts.map +1 -0
- package/dist/checks/tls/certificate.js +49 -0
- package/dist/checks/tls/certificate.js.map +1 -0
- package/dist/checks/tls/hsts.d.ts +5 -0
- package/dist/checks/tls/hsts.d.ts.map +1 -0
- package/dist/checks/tls/hsts.js +35 -0
- package/dist/checks/tls/hsts.js.map +1 -0
- package/dist/checks/tls/https-redirect.d.ts +3 -0
- package/dist/checks/tls/https-redirect.d.ts.map +1 -0
- package/dist/checks/tls/https-redirect.js +46 -0
- package/dist/checks/tls/https-redirect.js.map +1 -0
- package/dist/checks/tls/legacy-protocols.d.ts +3 -0
- package/dist/checks/tls/legacy-protocols.d.ts.map +1 -0
- package/dist/checks/tls/legacy-protocols.js +27 -0
- package/dist/checks/tls/legacy-protocols.js.map +1 -0
- package/dist/checks/util.d.ts +22 -0
- package/dist/checks/util.d.ts.map +1 -0
- package/dist/checks/util.js +63 -0
- package/dist/checks/util.js.map +1 -0
- package/dist/code/checks/crypto.d.ts +5 -0
- package/dist/code/checks/crypto.d.ts.map +1 -0
- package/dist/code/checks/crypto.js +100 -0
- package/dist/code/checks/crypto.js.map +1 -0
- package/dist/code/checks/django.d.ts +14 -0
- package/dist/code/checks/django.d.ts.map +1 -0
- package/dist/code/checks/django.js +313 -0
- package/dist/code/checks/django.js.map +1 -0
- package/dist/code/checks/flask.d.ts +6 -0
- package/dist/code/checks/flask.d.ts.map +1 -0
- package/dist/code/checks/flask.js +100 -0
- package/dist/code/checks/flask.js.map +1 -0
- package/dist/code/checks/index.d.ts +9 -0
- package/dist/code/checks/index.d.ts.map +1 -0
- package/dist/code/checks/index.js +126 -0
- package/dist/code/checks/index.js.map +1 -0
- package/dist/code/checks/injection.d.ts +27 -0
- package/dist/code/checks/injection.d.ts.map +1 -0
- package/dist/code/checks/injection.js +189 -0
- package/dist/code/checks/injection.js.map +1 -0
- package/dist/code/checks/javascript-config.d.ts +14 -0
- package/dist/code/checks/javascript-config.d.ts.map +1 -0
- package/dist/code/checks/javascript-config.js +251 -0
- package/dist/code/checks/javascript-config.js.map +1 -0
- package/dist/code/checks/javascript.d.ts +34 -0
- package/dist/code/checks/javascript.d.ts.map +1 -0
- package/dist/code/checks/javascript.js +333 -0
- package/dist/code/checks/javascript.js.map +1 -0
- package/dist/code/checks/php.d.ts +27 -0
- package/dist/code/checks/php.d.ts.map +1 -0
- package/dist/code/checks/php.js +433 -0
- package/dist/code/checks/php.js.map +1 -0
- package/dist/code/checks/secrets.d.ts +10 -0
- package/dist/code/checks/secrets.d.ts.map +1 -0
- package/dist/code/checks/secrets.js +140 -0
- package/dist/code/checks/secrets.js.map +1 -0
- package/dist/code/checks/shared.d.ts +25 -0
- package/dist/code/checks/shared.d.ts.map +1 -0
- package/dist/code/checks/shared.js +57 -0
- package/dist/code/checks/shared.js.map +1 -0
- package/dist/code/checks/treesitter.d.ts +15 -0
- package/dist/code/checks/treesitter.d.ts.map +1 -0
- package/dist/code/checks/treesitter.js +322 -0
- package/dist/code/checks/treesitter.js.map +1 -0
- package/dist/code/checks/xml.d.ts +9 -0
- package/dist/code/checks/xml.d.ts.map +1 -0
- package/dist/code/checks/xml.js +78 -0
- package/dist/code/checks/xml.js.map +1 -0
- package/dist/code/context.d.ts +6 -0
- package/dist/code/context.d.ts.map +1 -0
- package/dist/code/context.js +92 -0
- package/dist/code/context.js.map +1 -0
- package/dist/code/detect.d.ts +3 -0
- package/dist/code/detect.d.ts.map +1 -0
- package/dist/code/detect.js +118 -0
- package/dist/code/detect.js.map +1 -0
- package/dist/code/django/settings.d.ts +46 -0
- package/dist/code/django/settings.d.ts.map +1 -0
- package/dist/code/django/settings.js +154 -0
- package/dist/code/django/settings.js.map +1 -0
- package/dist/code/findings.d.ts +18 -0
- package/dist/code/findings.d.ts.map +1 -0
- package/dist/code/findings.js +63 -0
- package/dist/code/findings.js.map +1 -0
- package/dist/code/javascript/ast.d.ts +46 -0
- package/dist/code/javascript/ast.d.ts.map +1 -0
- package/dist/code/javascript/ast.js +166 -0
- package/dist/code/javascript/ast.js.map +1 -0
- package/dist/code/javascript/index.d.ts +3 -0
- package/dist/code/javascript/index.d.ts.map +1 -0
- package/dist/code/javascript/index.js +3 -0
- package/dist/code/javascript/index.js.map +1 -0
- package/dist/code/javascript/module.d.ts +59 -0
- package/dist/code/javascript/module.d.ts.map +1 -0
- package/dist/code/javascript/module.js +250 -0
- package/dist/code/javascript/module.js.map +1 -0
- package/dist/code/php/index.d.ts +92 -0
- package/dist/code/php/index.d.ts.map +1 -0
- package/dist/code/php/index.js +316 -0
- package/dist/code/php/index.js.map +1 -0
- package/dist/code/project.d.ts +13 -0
- package/dist/code/project.d.ts.map +1 -0
- package/dist/code/project.js +69 -0
- package/dist/code/project.js.map +1 -0
- package/dist/code/python/ast.d.ts +47 -0
- package/dist/code/python/ast.d.ts.map +1 -0
- package/dist/code/python/ast.js +193 -0
- package/dist/code/python/ast.js.map +1 -0
- package/dist/code/python/index.d.ts +3 -0
- package/dist/code/python/index.d.ts.map +1 -0
- package/dist/code/python/index.js +3 -0
- package/dist/code/python/index.js.map +1 -0
- package/dist/code/python/module.d.ts +55 -0
- package/dist/code/python/module.d.ts.map +1 -0
- package/dist/code/python/module.js +215 -0
- package/dist/code/python/module.js.map +1 -0
- package/dist/code/scan.d.ts +24 -0
- package/dist/code/scan.d.ts.map +1 -0
- package/dist/code/scan.js +159 -0
- package/dist/code/scan.js.map +1 -0
- package/dist/code/treesitter/index.d.ts +83 -0
- package/dist/code/treesitter/index.d.ts.map +1 -0
- package/dist/code/treesitter/index.js +243 -0
- package/dist/code/treesitter/index.js.map +1 -0
- package/dist/code/types.d.ts +48 -0
- package/dist/code/types.d.ts.map +1 -0
- package/dist/code/types.js +2 -0
- package/dist/code/types.js.map +1 -0
- package/dist/content/en.d.ts +3 -0
- package/dist/content/en.d.ts.map +1 -0
- package/dist/content/en.js +722 -0
- package/dist/content/en.js.map +1 -0
- package/dist/content/index.d.ts +15 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +21 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/types.d.ts +87 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +2 -0
- package/dist/content/types.js.map +1 -0
- package/dist/engine.d.ts +52 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +120 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/meta.d.ts +4 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +4 -0
- package/dist/meta.js.map +1 -0
- package/dist/net/context.d.ts +9 -0
- package/dist/net/context.d.ts.map +1 -0
- package/dist/net/context.js +62 -0
- package/dist/net/context.js.map +1 -0
- package/dist/net/guard.d.ts +16 -0
- package/dist/net/guard.d.ts.map +1 -0
- package/dist/net/guard.js +70 -0
- package/dist/net/guard.js.map +1 -0
- package/dist/net/http.d.ts +22 -0
- package/dist/net/http.d.ts.map +1 -0
- package/dist/net/http.js +114 -0
- package/dist/net/http.js.map +1 -0
- package/dist/net/tls.d.ts +15 -0
- package/dist/net/tls.d.ts.map +1 -0
- package/dist/net/tls.js +103 -0
- package/dist/net/tls.js.map +1 -0
- package/dist/report/html.d.ts +14 -0
- package/dist/report/html.d.ts.map +1 -0
- package/dist/report/html.js +210 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/index.d.ts +10 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +10 -0
- package/dist/report/index.js.map +1 -0
- package/dist/report/manual.d.ts +62 -0
- package/dist/report/manual.d.ts.map +1 -0
- package/dist/report/manual.js +190 -0
- package/dist/report/manual.js.map +1 -0
- package/dist/report/merge.d.ts +8 -0
- package/dist/report/merge.d.ts.map +1 -0
- package/dist/report/merge.js +135 -0
- package/dist/report/merge.js.map +1 -0
- package/dist/report/summary.d.ts +10 -0
- package/dist/report/summary.d.ts.map +1 -0
- package/dist/report/summary.js +27 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/validate.d.ts +3 -0
- package/dist/report/validate.d.ts.map +1 -0
- package/dist/report/validate.js +78 -0
- package/dist/report/validate.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +4 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +24 -0
- package/dist/validate.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/content/en.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AnnexItem } from "../types.js";
|
|
2
|
+
import type { GuidanceCatalog, ItemGuidance } from "./types.js";
|
|
3
|
+
export type { GuidanceCatalog, ItemGuidance, UiStrings } from "./types.js";
|
|
4
|
+
/** Available catalogs. Add a translation (e.g. am.ts) and register it here. */
|
|
5
|
+
export declare const CATALOGS: Readonly<Record<string, GuidanceCatalog>>;
|
|
6
|
+
export declare const DEFAULT_LOCALE = "en";
|
|
7
|
+
/** Catalog for a locale, falling back to English for unknown locales. */
|
|
8
|
+
export declare function catalog(locale?: string): GuidanceCatalog;
|
|
9
|
+
/** Guidance for an item in a locale; missing fields fall back to English. */
|
|
10
|
+
export declare function guidanceFor(id: string, locale?: string): ItemGuidance;
|
|
11
|
+
/** Item with its guided-review content applied for a locale. */
|
|
12
|
+
export declare function localizeItem(item: AnnexItem, locale?: string): AnnexItem;
|
|
13
|
+
/** Fills {name} placeholders. Unknown placeholders are left as-is. */
|
|
14
|
+
export declare function formatText(template: string, vars: Record<string, string | number>): string;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE3E,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAc,CAAC;AAC9E,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,MAAM,GAAE,MAAuB,GAAG,eAAe,CAExE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAuB,GAAG,YAAY,CAErF;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,GAAE,MAAuB,GAAG,SAAS,CAExF;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAE1F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { EN } from "./en.js";
|
|
2
|
+
/** Available catalogs. Add a translation (e.g. am.ts) and register it here. */
|
|
3
|
+
export const CATALOGS = { en: EN };
|
|
4
|
+
export const DEFAULT_LOCALE = "en";
|
|
5
|
+
/** Catalog for a locale, falling back to English for unknown locales. */
|
|
6
|
+
export function catalog(locale = DEFAULT_LOCALE) {
|
|
7
|
+
return CATALOGS[locale] ?? EN;
|
|
8
|
+
}
|
|
9
|
+
/** Guidance for an item in a locale; missing fields fall back to English. */
|
|
10
|
+
export function guidanceFor(id, locale = DEFAULT_LOCALE) {
|
|
11
|
+
return { ...EN.items[id], ...catalog(locale).items[id] };
|
|
12
|
+
}
|
|
13
|
+
/** Item with its guided-review content applied for a locale. */
|
|
14
|
+
export function localizeItem(item, locale = DEFAULT_LOCALE) {
|
|
15
|
+
return { ...item, ...guidanceFor(item.id, locale) };
|
|
16
|
+
}
|
|
17
|
+
/** Fills {name} placeholders. Unknown placeholders are left as-is. */
|
|
18
|
+
export function formatText(template, vars) {
|
|
19
|
+
return template.replace(/\{(\w+)\}/g, (m, k) => (k in vars ? String(vars[k]) : m));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAK7B,+EAA+E;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAA8C,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,yEAAyE;AACzE,MAAM,UAAU,OAAO,CAAC,MAAM,GAAW,cAAc;IACrD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,MAAM,GAAW,cAAc;IACrE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,IAAe,EAAE,MAAM,GAAW,cAAc;IAC3E,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAqC;IAChF,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ManualVerdict, TermExplanation } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Guided-review content for one Annex B item. Authored per item; never generated at runtime.
|
|
4
|
+
* Every field is optional: items without authored guidance fall back to the registry's manualNote.
|
|
5
|
+
*/
|
|
6
|
+
export interface ItemGuidance {
|
|
7
|
+
/** What to check and why it matters (1–3 sentences). */
|
|
8
|
+
guidance?: string;
|
|
9
|
+
/** 2–5 concrete test steps. */
|
|
10
|
+
howToTest?: string[];
|
|
11
|
+
/** What the reviewer should record. */
|
|
12
|
+
evidencePrompt?: string;
|
|
13
|
+
/** Plain-language explanations of technical terms used above. */
|
|
14
|
+
terms?: TermExplanation[];
|
|
15
|
+
/** Related requirements in INSA documents, cited by clause. */
|
|
16
|
+
references?: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* All user-facing strings for the manual-review flow (dashboard and CLI) and readiness summary.
|
|
20
|
+
* Placeholders use {name} and are filled with formatText().
|
|
21
|
+
*/
|
|
22
|
+
export interface UiStrings {
|
|
23
|
+
manualReviewTitle: string;
|
|
24
|
+
authorizationWarning: string;
|
|
25
|
+
progress: string;
|
|
26
|
+
verdict: Record<ManualVerdict, string>;
|
|
27
|
+
whatToCheck: string;
|
|
28
|
+
howToTest: string;
|
|
29
|
+
evidenceToRecord: string;
|
|
30
|
+
terms: string;
|
|
31
|
+
references: string;
|
|
32
|
+
automatedResult: string;
|
|
33
|
+
verdictLabel: string;
|
|
34
|
+
note: string;
|
|
35
|
+
evidenceText: string;
|
|
36
|
+
screenshots: string;
|
|
37
|
+
addScreenshot: string;
|
|
38
|
+
removeScreenshot: string;
|
|
39
|
+
screenshotTooLarge: string;
|
|
40
|
+
screenshotWrongType: string;
|
|
41
|
+
saved: string;
|
|
42
|
+
saving: string;
|
|
43
|
+
filterAll: string;
|
|
44
|
+
filterPending: string;
|
|
45
|
+
filterReviewed: string;
|
|
46
|
+
backToReport: string;
|
|
47
|
+
startReview: string;
|
|
48
|
+
reviewer: string;
|
|
49
|
+
reviewedAt: string;
|
|
50
|
+
evidenceAttached: string;
|
|
51
|
+
evidenceTextAttached: string;
|
|
52
|
+
noManualItems: string;
|
|
53
|
+
storageNotice: string;
|
|
54
|
+
readinessIncomplete: string;
|
|
55
|
+
readinessErrors: string;
|
|
56
|
+
readinessFailures: string;
|
|
57
|
+
readinessClean: string;
|
|
58
|
+
readinessPendingLine: string;
|
|
59
|
+
readinessNonePending: string;
|
|
60
|
+
readinessNeedsNote: string;
|
|
61
|
+
readinessNeedsNoteLine: string;
|
|
62
|
+
readinessCarriedLine: string;
|
|
63
|
+
carriedFrom: string;
|
|
64
|
+
historyCount: string;
|
|
65
|
+
cliIntro: string;
|
|
66
|
+
cliConfirmAuthorization: string;
|
|
67
|
+
cliItemHeader: string;
|
|
68
|
+
cliVerdictPrompt: string;
|
|
69
|
+
cliKeepCurrent: string;
|
|
70
|
+
cliNotePrompt: string;
|
|
71
|
+
cliEvidencePrompt: string;
|
|
72
|
+
cliScreenshotPrompt: string;
|
|
73
|
+
cliSavedTo: string;
|
|
74
|
+
cliStopped: string;
|
|
75
|
+
cliFinished: string;
|
|
76
|
+
cliNothingToReview: string;
|
|
77
|
+
}
|
|
78
|
+
export interface GuidanceCatalog {
|
|
79
|
+
/** BCP 47 tag, e.g. "en", "am". */
|
|
80
|
+
locale: string;
|
|
81
|
+
/** Name of the language in that language, e.g. "English", "አማርኛ". */
|
|
82
|
+
language: string;
|
|
83
|
+
/** Keyed by Annex B item number. */
|
|
84
|
+
items: Record<string, ItemGuidance>;
|
|
85
|
+
ui: UiStrings;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/content/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/content/types.ts"],"names":[],"mappings":""}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AnnexItem, Check, CheckKind, CheckOutcome, CheckResult, Report, ScanContext } from "./types.js";
|
|
2
|
+
import { TOOL_NAME, TOOL_VERSION } from "./meta.js";
|
|
3
|
+
export { TOOL_NAME, TOOL_VERSION };
|
|
4
|
+
export declare const USER_AGENT = "insa-check/0.1.0 (passive INSA Annex B audit; authorized testing only)";
|
|
5
|
+
export interface ScanOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Caller asserts the operator owns or is authorized to test the target.
|
|
8
|
+
* Required so that every wrapper (CLI, server, library user) must make this explicit.
|
|
9
|
+
*/
|
|
10
|
+
permissionConfirmed: true;
|
|
11
|
+
/** Per-request timeout. Default 10 s. */
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
/** Per-check time budget. Default 45 s. */
|
|
14
|
+
checkTimeoutMs?: number;
|
|
15
|
+
/** Max concurrent requests to the target. Default 4. */
|
|
16
|
+
concurrency?: number;
|
|
17
|
+
userAgent?: string;
|
|
18
|
+
/** Refuse loopback/private/reserved targets (SSRF protection). Default false; servers should enable it. */
|
|
19
|
+
blockPrivateNetworks?: boolean;
|
|
20
|
+
/** Overrides for tests / extensions. */
|
|
21
|
+
registry?: readonly AnnexItem[];
|
|
22
|
+
checks?: ReadonlyMap<string, Check>;
|
|
23
|
+
context?: ScanContext;
|
|
24
|
+
/** Called as each item completes, e.g. for progress output. */
|
|
25
|
+
onResult?: (result: CheckResult) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare class TargetError extends Error {
|
|
28
|
+
name: string;
|
|
29
|
+
}
|
|
30
|
+
/** Accepts "example.com" or a full http(s) URL. Strips credentials and fragments. */
|
|
31
|
+
export declare function normalizeTarget(input: string): URL;
|
|
32
|
+
export declare function runScan(input: string, options: ScanOptions): Promise<Report>;
|
|
33
|
+
/** Anything the engine can run against a context: a UrlCheck or a CodeCheck. */
|
|
34
|
+
export interface RunnableCheck<C> {
|
|
35
|
+
key: string;
|
|
36
|
+
run(ctx: C): Promise<CheckOutcome>;
|
|
37
|
+
}
|
|
38
|
+
export interface EvaluateOptions<C> {
|
|
39
|
+
registry: readonly AnnexItem[];
|
|
40
|
+
kind: CheckKind;
|
|
41
|
+
ctx: C;
|
|
42
|
+
checkTimeoutMs: number;
|
|
43
|
+
/** The check deciding an item, a string to report the item as manual with that note, or undefined for its manualNote. */
|
|
44
|
+
resolve: (item: AnnexItem) => RunnableCheck<C> | string | undefined;
|
|
45
|
+
onResult?: (result: CheckResult) => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Shared engine loop for every scan kind: one row per registry item, in order.
|
|
49
|
+
* A check that decides several items runs once; failures become "error" rows.
|
|
50
|
+
*/
|
|
51
|
+
export declare function evaluateRegistry<C>(opts: EvaluateOptions<C>): Promise<CheckResult[]>;
|
|
52
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3H,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACnC,eAAO,MAAM,UAAU,2EAAuF,CAAC;AAE/G,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,mBAAmB,EAAE,IAAI,CAAC;IAC1B,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;CAC/B;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAelD;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAuClF;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,CAAC,CAAC;IACP,cAAc,EAAE,MAAM,CAAC;IACvB,yHAAyH;IACzH,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgC1F"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { ANNEX_B, STANDARD } from "./annex-b.js";
|
|
2
|
+
import { CHECKS } from "./checks/index.js";
|
|
3
|
+
import { createScanContext } from "./net/context.js";
|
|
4
|
+
import { summarize } from "./report/summary.js";
|
|
5
|
+
import { TOOL_NAME, TOOL_VERSION } from "./meta.js";
|
|
6
|
+
export { TOOL_NAME, TOOL_VERSION };
|
|
7
|
+
export const USER_AGENT = `${TOOL_NAME}/${TOOL_VERSION} (passive INSA Annex B audit; authorized testing only)`;
|
|
8
|
+
export class TargetError extends Error {
|
|
9
|
+
name = "TargetError";
|
|
10
|
+
}
|
|
11
|
+
/** Accepts "example.com" or a full http(s) URL. Strips credentials and fragments. */
|
|
12
|
+
export function normalizeTarget(input) {
|
|
13
|
+
const trimmed = input.trim();
|
|
14
|
+
let url;
|
|
15
|
+
try {
|
|
16
|
+
url = new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new TargetError(`Not a valid URL: ${input}`);
|
|
20
|
+
}
|
|
21
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
22
|
+
throw new TargetError(`Only http and https URLs can be scanned (got ${url.protocol}).`);
|
|
23
|
+
}
|
|
24
|
+
url.username = "";
|
|
25
|
+
url.password = "";
|
|
26
|
+
url.hash = "";
|
|
27
|
+
return url;
|
|
28
|
+
}
|
|
29
|
+
export async function runScan(input, options) {
|
|
30
|
+
if (options.permissionConfirmed !== true) {
|
|
31
|
+
throw new Error("Refusing to scan: permission to test the target was not confirmed.");
|
|
32
|
+
}
|
|
33
|
+
const target = normalizeTarget(input);
|
|
34
|
+
const registry = options.registry ?? ANNEX_B;
|
|
35
|
+
const checks = options.checks ?? CHECKS;
|
|
36
|
+
const ctx = options.context ??
|
|
37
|
+
createScanContext(target, {
|
|
38
|
+
timeoutMs: options.timeoutMs ?? 10_000,
|
|
39
|
+
maxRedirects: 5,
|
|
40
|
+
maxBodyBytes: 1_000_000,
|
|
41
|
+
userAgent: options.userAgent ?? USER_AGENT,
|
|
42
|
+
concurrency: options.concurrency ?? 4,
|
|
43
|
+
blockPrivateNetworks: options.blockPrivateNetworks ?? false,
|
|
44
|
+
});
|
|
45
|
+
const checkTimeoutMs = options.checkTimeoutMs ?? 45_000;
|
|
46
|
+
const startedAt = new Date().toISOString();
|
|
47
|
+
const results = await evaluateRegistry({
|
|
48
|
+
registry,
|
|
49
|
+
kind: "url",
|
|
50
|
+
ctx,
|
|
51
|
+
checkTimeoutMs,
|
|
52
|
+
resolve: (item) => (item.checks?.url ? checks.get(item.checks.url) : undefined),
|
|
53
|
+
onResult: options.onResult,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
tool: { name: TOOL_NAME, version: TOOL_VERSION },
|
|
57
|
+
standard: STANDARD,
|
|
58
|
+
target: target.href,
|
|
59
|
+
sources: { url: target.href },
|
|
60
|
+
startedAt,
|
|
61
|
+
finishedAt: new Date().toISOString(),
|
|
62
|
+
summary: summarize(results),
|
|
63
|
+
results,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Shared engine loop for every scan kind: one row per registry item, in order.
|
|
68
|
+
* A check that decides several items runs once; failures become "error" rows.
|
|
69
|
+
*/
|
|
70
|
+
export async function evaluateRegistry(opts) {
|
|
71
|
+
const outcomes = new Map();
|
|
72
|
+
return Promise.all(opts.registry.map(async (item) => {
|
|
73
|
+
const check = opts.resolve(item);
|
|
74
|
+
let outcome;
|
|
75
|
+
let evaluatedBy = "manual";
|
|
76
|
+
if (check === undefined || typeof check === "string") {
|
|
77
|
+
outcome = { status: "manual", detail: check ?? item.manualNote };
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
let pending = outcomes.get(check.key);
|
|
81
|
+
if (!pending) {
|
|
82
|
+
pending = runCheck(check, opts.ctx, opts.checkTimeoutMs);
|
|
83
|
+
outcomes.set(check.key, pending);
|
|
84
|
+
}
|
|
85
|
+
outcome = await pending;
|
|
86
|
+
evaluatedBy = opts.kind;
|
|
87
|
+
}
|
|
88
|
+
const { findings, ...rest } = outcome;
|
|
89
|
+
const result = {
|
|
90
|
+
id: item.id,
|
|
91
|
+
section: item.section,
|
|
92
|
+
title: item.title,
|
|
93
|
+
tier: item.tier,
|
|
94
|
+
evaluatedBy,
|
|
95
|
+
...rest,
|
|
96
|
+
...(findings?.length ? { findings: findings.map((f) => ({ ...f, item: item.id })) } : {}),
|
|
97
|
+
};
|
|
98
|
+
opts.onResult?.(result);
|
|
99
|
+
return result;
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
async function runCheck(check, ctx, timeoutMs) {
|
|
103
|
+
let timer;
|
|
104
|
+
try {
|
|
105
|
+
return await Promise.race([
|
|
106
|
+
check.run(ctx),
|
|
107
|
+
new Promise((_, reject) => {
|
|
108
|
+
timer = setTimeout(() => reject(new Error(`Check timed out after ${timeoutMs / 1000}s`)), timeoutMs);
|
|
109
|
+
}),
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const e = err;
|
|
114
|
+
return { status: "error", detail: `Could not complete: ${e.message ?? String(err)}${e.code ? ` (${e.code})` : ""}` };
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { ANNEX_B, STANDARD } from "./annex-b.js";
|
|
3
|
+
export { CHECKS } from "./checks/index.js";
|
|
4
|
+
export { runScan, normalizeTarget, evaluateRegistry, TargetError, TOOL_NAME, TOOL_VERSION, USER_AGENT, type ScanOptions, type RunnableCheck, } from "./engine.js";
|
|
5
|
+
export { validateRegistry } from "./validate.js";
|
|
6
|
+
export { CODE_CHECKS } from "./code/checks/index.js";
|
|
7
|
+
export { runCodeScan, CodeScanError, type CodeScanOptions } from "./code/scan.js";
|
|
8
|
+
export { detectProject } from "./code/detect.js";
|
|
9
|
+
export type * from "./code/types.js";
|
|
10
|
+
export { isPrivateAddress, PrivateTargetError } from "./net/guard.js";
|
|
11
|
+
export * from "./report/index.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,mBAAmB,iBAAiB,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { ANNEX_B, STANDARD } from "./annex-b.js";
|
|
3
|
+
export { CHECKS } from "./checks/index.js";
|
|
4
|
+
export { runScan, normalizeTarget, evaluateRegistry, TargetError, TOOL_NAME, TOOL_VERSION, USER_AGENT, } from "./engine.js";
|
|
5
|
+
export { validateRegistry } from "./validate.js";
|
|
6
|
+
export { CODE_CHECKS } from "./code/checks/index.js";
|
|
7
|
+
export { runCodeScan, CodeScanError } from "./code/scan.js";
|
|
8
|
+
export { detectProject } from "./code/detect.js";
|
|
9
|
+
export { isPrivateAddress, PrivateTargetError } from "./net/guard.js";
|
|
10
|
+
export * from "./report/index.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,GAGX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAwB,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtE,cAAc,mBAAmB,CAAC"}
|
package/dist/meta.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,eAAO,MAAM,SAAS,eAAe,CAAC;AACtC,eAAO,MAAM,YAAY,UAAU,CAAC"}
|
package/dist/meta.js
ADDED
package/dist/meta.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ScanContext } from "../types.js";
|
|
2
|
+
import { type HttpClientOptions } from "./http.js";
|
|
3
|
+
export interface ContextOptions extends HttpClientOptions {
|
|
4
|
+
/** Max requests in flight against the target at once. */
|
|
5
|
+
concurrency: number;
|
|
6
|
+
}
|
|
7
|
+
/** Real network-backed ScanContext with per-scan caching and a concurrency cap. */
|
|
8
|
+
export declare function createScanContext(target: URL, options: ContextOptions): ScanContext;
|
|
9
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/net/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkD,WAAW,EAAW,MAAM,aAAa,CAAC;AACxG,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGhE,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,WAAW,CAsCnF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { httpRequest } from "./http.js";
|
|
2
|
+
import { getTlsInfo, probeLegacyTls } from "./tls.js";
|
|
3
|
+
/** Real network-backed ScanContext with per-scan caching and a concurrency cap. */
|
|
4
|
+
export function createScanContext(target, options) {
|
|
5
|
+
const responses = new Map();
|
|
6
|
+
const legacy = new Map();
|
|
7
|
+
let tlsInfo;
|
|
8
|
+
const limit = createLimiter(options.concurrency);
|
|
9
|
+
const tlsTarget = {
|
|
10
|
+
host: target.hostname.replace(/^\[|\]$/g, ""),
|
|
11
|
+
port: target.protocol === "https:" && target.port ? Number(target.port) : 443,
|
|
12
|
+
timeoutMs: options.timeoutMs,
|
|
13
|
+
blockPrivateNetworks: options.blockPrivateNetworks,
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
target,
|
|
17
|
+
request(pathOrUrl, opts = {}) {
|
|
18
|
+
const url = new URL(pathOrUrl, target).href;
|
|
19
|
+
const key = `${opts.method ?? "GET"} ${url} ${opts.followRedirects ?? true} ${JSON.stringify(opts.headers ?? {})}`;
|
|
20
|
+
let pending = responses.get(key);
|
|
21
|
+
if (!pending) {
|
|
22
|
+
pending = limit(() => httpRequest(url, opts, options));
|
|
23
|
+
responses.set(key, pending);
|
|
24
|
+
}
|
|
25
|
+
return pending;
|
|
26
|
+
},
|
|
27
|
+
tlsInfo() {
|
|
28
|
+
tlsInfo ??= limit(() => getTlsInfo(tlsTarget));
|
|
29
|
+
return tlsInfo;
|
|
30
|
+
},
|
|
31
|
+
probeTls(version) {
|
|
32
|
+
let pending = legacy.get(version);
|
|
33
|
+
if (!pending) {
|
|
34
|
+
pending = limit(() => probeLegacyTls(tlsTarget, version));
|
|
35
|
+
legacy.set(version, pending);
|
|
36
|
+
}
|
|
37
|
+
return pending;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function createLimiter(max) {
|
|
42
|
+
let active = 0;
|
|
43
|
+
const queue = [];
|
|
44
|
+
return function limit(task) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const run = () => {
|
|
47
|
+
active++;
|
|
48
|
+
task()
|
|
49
|
+
.then(resolve, reject)
|
|
50
|
+
.finally(() => {
|
|
51
|
+
active--;
|
|
52
|
+
queue.shift()?.();
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
if (active < max)
|
|
56
|
+
run();
|
|
57
|
+
else
|
|
58
|
+
queue.push(run);
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/net/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import dns from "node:dns";
|
|
2
|
+
export declare function isPrivateAddress(ip: string): boolean;
|
|
3
|
+
export declare class PrivateTargetError extends Error {
|
|
4
|
+
readonly code = "EPRIVATETARGET";
|
|
5
|
+
constructor(host: string, ip: string);
|
|
6
|
+
}
|
|
7
|
+
/** Node skips `lookup` for IP-literal hosts, so those must be checked up front. */
|
|
8
|
+
export declare function assertAllowedLiteral(host: string): void;
|
|
9
|
+
type LookupCallback = (err: NodeJS.ErrnoException | null, address: string | dns.LookupAddress[], family?: number) => void;
|
|
10
|
+
/**
|
|
11
|
+
* dns.lookup replacement for http/tls `lookup` options. Validates the address
|
|
12
|
+
* actually connected to, so DNS rebinding cannot bypass the check.
|
|
13
|
+
*/
|
|
14
|
+
export declare function guardedLookup(hostname: string, options: dns.LookupOptions, callback: LookupCallback): void;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/net/guard.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AA8B3B,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,oBAAoB;IACjC,YAAY,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAGnC;CACF;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,KAAK,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1H;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAU1G"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import dns from "node:dns";
|
|
2
|
+
import net from "node:net";
|
|
3
|
+
/** Loopback, private, link-local, CGNAT, multicast and reserved ranges. */
|
|
4
|
+
const BLOCKED = new net.BlockList();
|
|
5
|
+
for (const [addr, prefix] of [
|
|
6
|
+
["0.0.0.0", 8],
|
|
7
|
+
["10.0.0.0", 8],
|
|
8
|
+
["100.64.0.0", 10],
|
|
9
|
+
["127.0.0.0", 8],
|
|
10
|
+
["169.254.0.0", 16],
|
|
11
|
+
["172.16.0.0", 12],
|
|
12
|
+
["192.0.0.0", 24],
|
|
13
|
+
["192.168.0.0", 16],
|
|
14
|
+
["198.18.0.0", 15],
|
|
15
|
+
["224.0.0.0", 4],
|
|
16
|
+
["240.0.0.0", 4],
|
|
17
|
+
]) {
|
|
18
|
+
BLOCKED.addSubnet(addr, prefix, "ipv4");
|
|
19
|
+
}
|
|
20
|
+
for (const [addr, prefix] of [
|
|
21
|
+
["::", 128],
|
|
22
|
+
["::1", 128],
|
|
23
|
+
["fc00::", 7],
|
|
24
|
+
["fe80::", 10],
|
|
25
|
+
["ff00::", 8],
|
|
26
|
+
]) {
|
|
27
|
+
BLOCKED.addSubnet(addr, prefix, "ipv6");
|
|
28
|
+
}
|
|
29
|
+
export function isPrivateAddress(ip) {
|
|
30
|
+
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(ip);
|
|
31
|
+
if (mapped)
|
|
32
|
+
return BLOCKED.check(mapped[1], "ipv4");
|
|
33
|
+
const family = net.isIP(ip);
|
|
34
|
+
if (family === 0)
|
|
35
|
+
return true;
|
|
36
|
+
return BLOCKED.check(ip, family === 4 ? "ipv4" : "ipv6");
|
|
37
|
+
}
|
|
38
|
+
export class PrivateTargetError extends Error {
|
|
39
|
+
code = "EPRIVATETARGET";
|
|
40
|
+
constructor(host, ip) {
|
|
41
|
+
super(`${host} resolves to a private or reserved address (${ip}); scanning it is disabled on this server`);
|
|
42
|
+
this.name = "PrivateTargetError";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Node skips `lookup` for IP-literal hosts, so those must be checked up front. */
|
|
46
|
+
export function assertAllowedLiteral(host) {
|
|
47
|
+
const bare = host.replace(/^\[|\]$/g, "");
|
|
48
|
+
if (net.isIP(bare) !== 0 && isPrivateAddress(bare))
|
|
49
|
+
throw new PrivateTargetError(host, bare);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* dns.lookup replacement for http/tls `lookup` options. Validates the address
|
|
53
|
+
* actually connected to, so DNS rebinding cannot bypass the check.
|
|
54
|
+
*/
|
|
55
|
+
export function guardedLookup(hostname, options, callback) {
|
|
56
|
+
dns.lookup(hostname, { ...options, all: true }, (err, addresses) => {
|
|
57
|
+
if (err)
|
|
58
|
+
return callback(err, []);
|
|
59
|
+
const blocked = addresses.find((a) => isPrivateAddress(a.address));
|
|
60
|
+
if (blocked)
|
|
61
|
+
return callback(new PrivateTargetError(hostname, blocked.address), []);
|
|
62
|
+
if (options.all)
|
|
63
|
+
return callback(null, addresses);
|
|
64
|
+
const first = addresses[0];
|
|
65
|
+
if (!first)
|
|
66
|
+
return callback(Object.assign(new Error(`No address for ${hostname}`), { code: "ENOTFOUND" }), []);
|
|
67
|
+
callback(null, first.address, first.family);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/net/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HttpResponse, RequestOptions } from "../types.js";
|
|
2
|
+
export interface HttpClientOptions {
|
|
3
|
+
timeoutMs: number;
|
|
4
|
+
maxRedirects: number;
|
|
5
|
+
maxBodyBytes: number;
|
|
6
|
+
userAgent: string;
|
|
7
|
+
/** Refuse to connect to loopback/private/reserved addresses (SSRF protection). */
|
|
8
|
+
blockPrivateNetworks: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class HttpError extends Error {
|
|
11
|
+
readonly code: string | undefined;
|
|
12
|
+
readonly url: string;
|
|
13
|
+
constructor(message: string, code: string | undefined, url: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Minimal HTTP(S) client on node:http. We avoid fetch() because it refuses
|
|
17
|
+
* TRACE/TRACK and hides TLS details. Certificate errors are deliberately not
|
|
18
|
+
* fatal here: the certificate check reports them; other checks still need a
|
|
19
|
+
* response from misconfigured hosts.
|
|
20
|
+
*/
|
|
21
|
+
export declare function httpRequest(url: string, opts: RequestOptions, client: HttpClientOptions): Promise<HttpResponse>;
|
|
22
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/net/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,SAAU,SAAQ,KAAK;IAGhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAHtB,YACE,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,EAAE,MAAM,EAIrB;CACF;AAID;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,YAAY,CAAC,CAqBvB"}
|