@mridang/webhint-hint-plumbline 0.14.0 → 0.15.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/dist/hints/email/mail-rpki.js +16 -9
- package/dist/hints/email/mail-rpki.js.map +1 -1
- package/dist/hints/email/on-mail-tls.d.ts +0 -1
- package/dist/hints/email/on-mail-tls.js +14 -4
- package/dist/hints/email/on-mail-tls.js.map +1 -1
- package/dist/lib/network/rpki.d.ts +0 -1
- package/dist/lib/network/rpki.js +10 -13
- package/dist/lib/network/rpki.js.map +1 -1
- package/package.json +1 -1
|
@@ -32,7 +32,10 @@ export default defineHint({
|
|
|
32
32
|
onMailDomain(context, async (mail) => {
|
|
33
33
|
const notFound = [];
|
|
34
34
|
const invalid = [];
|
|
35
|
-
|
|
35
|
+
// Every mail server is looked up at once, and so is every one of its
|
|
36
|
+
// addresses: each lookup is two round trips to a web service. The lines
|
|
37
|
+
// keep the order of the servers and addresses.
|
|
38
|
+
const lines = await Promise.all(mail.hosts.map(async (host) => {
|
|
36
39
|
const addresses = new Set();
|
|
37
40
|
for (const type of ['A', 'AAAA']) {
|
|
38
41
|
try {
|
|
@@ -47,24 +50,28 @@ export default defineHint({
|
|
|
47
50
|
// A failed lookup leaves that family unchecked.
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
|
-
|
|
53
|
+
return Promise.all([...addresses].map(async (ip) => {
|
|
51
54
|
try {
|
|
52
55
|
const result = await rpki.client.check(ip);
|
|
53
56
|
if (result.asn === null) {
|
|
54
57
|
// Not routed: there is nothing to validate.
|
|
55
|
-
|
|
58
|
+
return null;
|
|
56
59
|
}
|
|
57
60
|
const line = `${host} ${ip} ${result.prefix ?? ''} AS${result.asn}`.replace(/ +/gu, ' ');
|
|
58
|
-
|
|
59
|
-
invalid.push(line);
|
|
60
|
-
}
|
|
61
|
-
else if (result.status === 'unknown') {
|
|
62
|
-
notFound.push(line);
|
|
63
|
-
}
|
|
61
|
+
return { line, status: result.status };
|
|
64
62
|
}
|
|
65
63
|
catch {
|
|
66
64
|
// The validation service is unavailable for this address.
|
|
65
|
+
return null;
|
|
67
66
|
}
|
|
67
|
+
}));
|
|
68
|
+
}));
|
|
69
|
+
for (const found of lines.flat()) {
|
|
70
|
+
if (found?.status === 'invalid') {
|
|
71
|
+
invalid.push(found.line);
|
|
72
|
+
}
|
|
73
|
+
else if (found?.status === 'unknown') {
|
|
74
|
+
notFound.push(found.line);
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
if (notFound.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail-rpki.js","sourceRoot":"","sources":["../../../src/hints/email/mail-rpki.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAE3C,qDAAqD;AACrD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvC;;;;;;;;GAQG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,oCAAoC;IAC1C,WAAW,EACT,2HAA2H;IAC7H,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;IACtC,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE;QACN;YACE,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE,oBAAoB;SACjC;KACF;IACD,KAAK,CAAC,OAAO;QACX,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"mail-rpki.js","sourceRoot":"","sources":["../../../src/hints/email/mail-rpki.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAE3C,qDAAqD;AACrD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvC;;;;;;;;GAQG;AACH,eAAe,UAAU,CAAC;IACxB,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,oCAAoC;IAC1C,WAAW,EACT,2HAA2H;IAC7H,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;IACtC,SAAS,EAAE,sBAAsB;IACjC,MAAM,EAAE;QACN;YACE,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE,oBAAoB;SACjC;KACF;IACD,KAAK,CAAC,OAAO;QACX,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,qEAAqE;YACrE,wEAAwE;YACxE,+CAA+C;YAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAU,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;4BACtC,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gCACnC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,gDAAgD;oBAClD,CAAC;gBACH,CAAC;gBACD,OAAO,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC9B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBAC3C,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;4BACxB,4CAA4C;4BAC5C,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,MAAM,IAAI,GACR,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAC5D,MAAM,EACN,GAAG,CACJ,CAAC;wBACJ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;oBACzC,CAAC;oBAAC,MAAM,CAAC;wBACP,0DAA0D;wBAC1D,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjC,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;qBAAM,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;oBACvC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CACT,0NAA0N,EAC1N,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/D,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CACT,0sBAA0sB,EAC1sB,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -13,17 +13,27 @@ import { MAIL_SUBJECT } from '../tls/on-tls-site.js';
|
|
|
13
13
|
*/
|
|
14
14
|
function onMailTls(context, check) {
|
|
15
15
|
onMailDomain(context, async (mail) => {
|
|
16
|
-
|
|
16
|
+
// The mail servers are tested at once, not one after another: a session with a mail
|
|
17
|
+
// server takes seconds to open and a check opens many. What each says is kept and
|
|
18
|
+
// reported in the order of the servers.
|
|
19
|
+
const said = await Promise.all(mail.hosts.map(async (host) => {
|
|
17
20
|
const target = mailTargetFor(host);
|
|
21
|
+
const reports = [];
|
|
18
22
|
await check({
|
|
19
23
|
target,
|
|
20
24
|
subject: MAIL_SUBJECT,
|
|
21
|
-
report: (message, codeSnippet, severity = Severity.error) => mail.report(`${host}: ${message}`, { severity, codeSnippet }),
|
|
22
|
-
couldNotTest: (reason) => mail.report(`${host}: Could not test: ${reason}.`, {
|
|
25
|
+
report: (message, codeSnippet, severity = Severity.error) => reports.push(() => mail.report(`${host}: ${message}`, { severity, codeSnippet })),
|
|
26
|
+
couldNotTest: (reason) => reports.push(() => mail.report(`${host}: Could not test: ${reason}.`, {
|
|
23
27
|
severity: Severity.hint,
|
|
24
28
|
codeSnippet: `${target.host}:${target.port}`,
|
|
25
|
-
}),
|
|
29
|
+
})),
|
|
26
30
|
});
|
|
31
|
+
return reports;
|
|
32
|
+
}));
|
|
33
|
+
for (const reports of said) {
|
|
34
|
+
for (const report of reports) {
|
|
35
|
+
report();
|
|
36
|
+
}
|
|
27
37
|
}
|
|
28
38
|
});
|
|
29
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-mail-tls.js","sourceRoot":"","sources":["../../../src/hints/email/on-mail-tls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,QAAQ,EACR,UAAU,GAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAC;AAEnE;;;;;;;GAOG;AACH,SAAS,SAAS,CAChB,OAAoB,EACpB,KAA8C;IAE9C,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACnC,
|
|
1
|
+
{"version":3,"file":"on-mail-tls.js","sourceRoot":"","sources":["../../../src/hints/email/on-mail-tls.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,QAAQ,EACR,UAAU,GAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAgB,MAAM,uBAAuB,CAAC;AAEnE;;;;;;;GAOG;AACH,SAAS,SAAS,CAChB,OAAoB,EACpB,KAA8C;IAE9C,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACnC,oFAAoF;QACpF,kFAAkF;QAClF,wCAAwC;QACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;gBACV,MAAM;gBACN,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAChB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAC9D;gBACH,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CACvB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAChB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,qBAAqB,MAAM,GAAG,EAAE;oBACjD,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;iBAC7C,CAAC,CACH;aACJ,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CACH,CAAC;QACF,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,OAAO,UAAU,CAAC;QAChB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC;QACtC,SAAS,EAAE,sBAAsB;QACjC,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE,oBAAoB;aACjC;SACF;QACD,KAAK,CAAC,OAAO;YACX,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -11,7 +11,6 @@ export interface IpRpki {
|
|
|
11
11
|
}
|
|
12
12
|
/** Every A and AAAA address of the given hosts with its RPKI result. */
|
|
13
13
|
export declare function collectRpki(hosts: string[]): Promise<IpRpki[]>;
|
|
14
|
-
/** The addresses of the site's own web server. */
|
|
15
14
|
export declare const webRpki: (host: string) => Promise<IpRpki[]>;
|
|
16
15
|
/** The addresses of the site's name servers. */
|
|
17
16
|
export declare function nsRpki(host: string): Promise<IpRpki[]>;
|
package/dist/lib/network/rpki.js
CHANGED
|
@@ -7,24 +7,21 @@ import { rpki } from '../../core/rpki.js';
|
|
|
7
7
|
import { findNameservers, ipv4Addresses, ipv6Addresses } from './dns-util.js';
|
|
8
8
|
/** Every A and AAAA address of the given hosts with its RPKI result. */
|
|
9
9
|
export async function collectRpki(hosts) {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
// Every host is looked up at once, and so is every one of its addresses: the
|
|
11
|
+
// validator is a web service, a lookup is two round trips, and a mail setup
|
|
12
|
+
// has a dozen addresses, so one after another is the slowest part of a scan.
|
|
13
|
+
// The answers keep the order of the hosts and addresses.
|
|
14
|
+
const perHost = await Promise.all(hosts.map(async (host) => {
|
|
12
15
|
const ips = [
|
|
13
16
|
...(await ipv4Addresses(host)),
|
|
14
17
|
...(await ipv6Addresses(host)),
|
|
15
18
|
];
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// A validator that is down is not the site's fault: skip the address.
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return out;
|
|
19
|
+
return Promise.all(ips.map((ip) => rpki.client.check(ip).then((result) => ({ host, ip, result }),
|
|
20
|
+
// A validator that is down is not the site's fault: skip the address.
|
|
21
|
+
() => null)));
|
|
22
|
+
}));
|
|
23
|
+
return perHost.flat().filter((entry) => entry !== null);
|
|
26
24
|
}
|
|
27
|
-
/** The addresses of the site's own web server. */
|
|
28
25
|
export const webRpki = (host) => collectRpki([host]);
|
|
29
26
|
/** The addresses of the site's name servers. */
|
|
30
27
|
export async function nsRpki(host) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpki.js","sourceRoot":"","sources":["../../../src/lib/network/rpki.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAmB,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQ9E,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAe;IAC/C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"rpki.js","sourceRoot":"","sources":["../../../src/lib/network/rpki.ts"],"names":[],"mappings":"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"}
|