@extenshi/cli 0.0.8 → 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/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +92 -3
- package/dist/cli.js.map +1 -1
- package/dist/html-report.d.ts +44 -0
- package/dist/html-report.d.ts.map +1 -0
- package/dist/html-report.js +527 -0
- package/dist/html-report.js.map +1 -0
- package/dist/render.d.ts +22 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +82 -2
- package/dist/render.js.map +1 -1
- package/dist/report.d.ts +30 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +130 -0
- package/dist/report.js.map +1 -0
- package/dist/review-archive.d.ts +29 -0
- package/dist/review-archive.d.ts.map +1 -0
- package/dist/review-archive.js +106 -0
- package/dist/review-archive.js.map +1 -0
- package/dist/review-catalog.d.ts +43 -0
- package/dist/review-catalog.d.ts.map +1 -0
- package/dist/review-catalog.js +82 -0
- package/dist/review-catalog.js.map +1 -0
- package/dist/review-checks.d.ts +139 -0
- package/dist/review-checks.d.ts.map +1 -0
- package/dist/review-checks.js +560 -0
- package/dist/review-checks.js.map +1 -0
- package/dist/review-render.d.ts +10 -0
- package/dist/review-render.d.ts.map +1 -0
- package/dist/review-render.js +94 -0
- package/dist/review-render.js.map +1 -0
- package/dist/review-risk.d.ts +29 -0
- package/dist/review-risk.d.ts.map +1 -0
- package/dist/review-risk.js +85 -0
- package/dist/review-risk.js.map +1 -0
- package/dist/scan.d.ts +82 -2
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +164 -17
- package/dist/scan.js.map +1 -1
- package/package.json +2 -1
package/dist/render.js
CHANGED
|
@@ -104,7 +104,7 @@ const SEVERITY_ORDER = {
|
|
|
104
104
|
LOW: 3,
|
|
105
105
|
INFO: 4,
|
|
106
106
|
};
|
|
107
|
-
function severityRank(s) {
|
|
107
|
+
export function severityRank(s) {
|
|
108
108
|
return SEVERITY_ORDER[s?.toUpperCase() ?? ''] ?? 99;
|
|
109
109
|
}
|
|
110
110
|
function severityColour(s) {
|
|
@@ -171,13 +171,71 @@ export function summarizeReport(body) {
|
|
|
171
171
|
issues,
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
|
+
const STORE_IMPACT_RANK = {
|
|
175
|
+
REJECTION_LIKELY: 0,
|
|
176
|
+
REVIEW_FLAG: 1,
|
|
177
|
+
POLICY_RISK: 2,
|
|
178
|
+
INFO: 3,
|
|
179
|
+
};
|
|
180
|
+
export const STORE_IMPACT_SHORT = {
|
|
181
|
+
REJECTION_LIKELY: 'REJECTION RISK',
|
|
182
|
+
REVIEW_FLAG: 'REVIEW FLAG',
|
|
183
|
+
POLICY_RISK: 'POLICY RISK',
|
|
184
|
+
INFO: 'INFO',
|
|
185
|
+
};
|
|
186
|
+
function storeImpactRank(impact) {
|
|
187
|
+
return STORE_IMPACT_RANK[impact] ?? 99;
|
|
188
|
+
}
|
|
189
|
+
/** Reduce the additive `compliance` payload key to a render-ready summary. Pure. */
|
|
190
|
+
export function summarizeCompliance(body) {
|
|
191
|
+
const c = body.compliance;
|
|
192
|
+
if (!c || typeof c !== 'object') {
|
|
193
|
+
return { present: false, status: 'unavailable', manifestRiskScore: 0, findings: [], flags: [] };
|
|
194
|
+
}
|
|
195
|
+
const obj = c;
|
|
196
|
+
const findings = [];
|
|
197
|
+
for (const raw of Array.isArray(obj.findings) ? obj.findings : []) {
|
|
198
|
+
if (!raw || typeof raw !== 'object')
|
|
199
|
+
continue;
|
|
200
|
+
const f = raw;
|
|
201
|
+
const ruleId = typeof f.ruleId === 'string' ? f.ruleId : null;
|
|
202
|
+
if (!ruleId)
|
|
203
|
+
continue;
|
|
204
|
+
findings.push({
|
|
205
|
+
ruleId,
|
|
206
|
+
severity: typeof f.severity === 'string' ? f.severity.toUpperCase() : 'UNKNOWN',
|
|
207
|
+
label: typeof f.label === 'string' ? f.label : ruleId,
|
|
208
|
+
summary: typeof f.summary === 'string' ? f.summary : '',
|
|
209
|
+
remediation: typeof f.remediation === 'string' ? f.remediation : '',
|
|
210
|
+
storeImpact: typeof f.storeImpact === 'string' ? f.storeImpact : 'INFO',
|
|
211
|
+
stores: Array.isArray(f.stores) ? f.stores.filter((s) => typeof s === 'string') : [],
|
|
212
|
+
evidence: Array.isArray(f.evidence) ? f.evidence.filter((s) => typeof s === 'string') : [],
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
findings.sort((a, b) => storeImpactRank(a.storeImpact) - storeImpactRank(b.storeImpact) ||
|
|
216
|
+
severityRank(a.severity) - severityRank(b.severity) ||
|
|
217
|
+
a.ruleId.localeCompare(b.ruleId));
|
|
218
|
+
const flagsObj = obj.flags && typeof obj.flags === 'object' ? obj.flags : {};
|
|
219
|
+
return {
|
|
220
|
+
present: true,
|
|
221
|
+
status: typeof obj.status === 'string' ? obj.status : 'unknown',
|
|
222
|
+
manifestRiskScore: typeof obj.manifestRiskScore === 'number' ? obj.manifestRiskScore : 0,
|
|
223
|
+
findings,
|
|
224
|
+
flags: Object.entries(flagsObj)
|
|
225
|
+
.filter(([, v]) => v)
|
|
226
|
+
.map(([k]) => k),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
174
229
|
// ── Main render function ───────────────────────────────────────────────────────
|
|
175
230
|
export function renderReport(body) {
|
|
176
231
|
const { total, critHigh, scannersRun, scannersOk, jobId, findings, issues } = summarizeReport(body);
|
|
177
232
|
// Header
|
|
178
233
|
console.log();
|
|
179
234
|
if (total === 0) {
|
|
180
|
-
|
|
235
|
+
// "No findings" is not "no risk": our scanners are automated heuristics
|
|
236
|
+
// that may miss or over-flag, so we avoid asserting the extension is
|
|
237
|
+
// clean/safe. See the security-risk disclaimer linked at the end.
|
|
238
|
+
console.log(chalk.green.bold('✓ No findings raised by the automated scanners.'));
|
|
181
239
|
}
|
|
182
240
|
else {
|
|
183
241
|
const noun = `${total} finding${total !== 1 ? 's' : ''}`;
|
|
@@ -190,6 +248,24 @@ export function renderReport(body) {
|
|
|
190
248
|
console.log(chalk.dim(`Job: ${jobId}`));
|
|
191
249
|
}
|
|
192
250
|
console.log();
|
|
251
|
+
// Store-compliance signals (additive `compliance` payload key).
|
|
252
|
+
const compliance = summarizeCompliance(body);
|
|
253
|
+
if (compliance.present && compliance.findings.length > 0) {
|
|
254
|
+
console.log(chalk.bold('── Store compliance ──────────────────────────'));
|
|
255
|
+
for (const f of compliance.findings) {
|
|
256
|
+
const short = STORE_IMPACT_SHORT[f.storeImpact] ?? f.storeImpact;
|
|
257
|
+
const tag = f.storeImpact === 'REJECTION_LIKELY' ? chalk.red(short) : chalk.yellow(short);
|
|
258
|
+
const stores = f.stores.length ? chalk.dim(` [${f.stores.join(', ')}]`) : '';
|
|
259
|
+
console.log(` ${tag} ${chalk.bold(f.label)}${stores}`);
|
|
260
|
+
if (f.remediation) {
|
|
261
|
+
for (const line of wrap(f.remediation, 78)) {
|
|
262
|
+
console.log(chalk.dim(` ${line}`));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
console.log(chalk.dim(` Manifest risk score: ${compliance.manifestRiskScore}/100`));
|
|
267
|
+
console.log();
|
|
268
|
+
}
|
|
193
269
|
// Findings grouped by severity (already sorted)
|
|
194
270
|
let lastSeverity = '';
|
|
195
271
|
for (const f of findings) {
|
|
@@ -222,6 +298,10 @@ export function renderReport(body) {
|
|
|
222
298
|
if (critHigh > 0) {
|
|
223
299
|
console.log(chalk.red('⚠ Critical/high findings detected. Review before publishing.'));
|
|
224
300
|
}
|
|
301
|
+
// Accuracy disclaimer — always shown. The scanners are automated heuristics
|
|
302
|
+
// that may miss real issues or over-flag benign code; results are not a
|
|
303
|
+
// guarantee of safety or approval.
|
|
304
|
+
console.log(chalk.dim('Automated scan — heuristics may miss or over-flag; not a guarantee of safety. https://catalog.extenshi.io/disclaimers/security-risk'));
|
|
225
305
|
}
|
|
226
306
|
/** Greedy word-wrap to `width` columns. */
|
|
227
307
|
function wrap(text, width) {
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown store-compliance report renderer for `extenshi scan --report`.
|
|
3
|
+
*
|
|
4
|
+
* Pure (no I/O) so it is snapshot-testable. Schema-tolerant: reads whatever the
|
|
5
|
+
* scan server returns. The store-compliance metadata (label / storeImpact /
|
|
6
|
+
* remediation) is SERVER-DRIVEN — embedded in the `compliance` payload key — so
|
|
7
|
+
* the published CLI does not need to vendor the rule registry. When the server
|
|
8
|
+
* has not been updated to emit `compliance` yet, the report degrades to a note.
|
|
9
|
+
*/
|
|
10
|
+
import { type ComplianceSummary, type ReportSummary } from './render.js';
|
|
11
|
+
export interface ReportMeta {
|
|
12
|
+
artifactName: string;
|
|
13
|
+
cliVersion: string;
|
|
14
|
+
generatedAt: Date;
|
|
15
|
+
}
|
|
16
|
+
/** Verdict severity tier — drives banner colour in the HTML report. */
|
|
17
|
+
export type VerdictLevel = 'fail' | 'review' | 'pass';
|
|
18
|
+
export interface Verdict {
|
|
19
|
+
level: VerdictLevel;
|
|
20
|
+
headline: string;
|
|
21
|
+
detail: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Derive the top-line verdict from the compliance + security summaries.
|
|
25
|
+
* Shared by the Markdown and HTML renderers so the two never drift. Exported
|
|
26
|
+
* for the HTML renderer (and unit tests).
|
|
27
|
+
*/
|
|
28
|
+
export declare function computeVerdict(compliance: ComplianceSummary, summary: ReportSummary): Verdict;
|
|
29
|
+
export declare function renderMarkdownReport(body: Record<string, unknown>, meta: ReportMeta): string;
|
|
30
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAIlB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,UAAU;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,IAAI,CAAA;CACjB;AASD,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,OAAO;IACvB,KAAK,EAAE,YAAY,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CA0B7F;AAqED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CA2C5F"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown store-compliance report renderer for `extenshi scan --report`.
|
|
3
|
+
*
|
|
4
|
+
* Pure (no I/O) so it is snapshot-testable. Schema-tolerant: reads whatever the
|
|
5
|
+
* scan server returns. The store-compliance metadata (label / storeImpact /
|
|
6
|
+
* remediation) is SERVER-DRIVEN — embedded in the `compliance` payload key — so
|
|
7
|
+
* the published CLI does not need to vendor the rule registry. When the server
|
|
8
|
+
* has not been updated to emit `compliance` yet, the report degrades to a note.
|
|
9
|
+
*/
|
|
10
|
+
import { STORE_IMPACT_SHORT, summarizeCompliance, summarizeReport, } from './render.js';
|
|
11
|
+
/** Escape characters that would break a markdown table cell. */
|
|
12
|
+
function cell(s) {
|
|
13
|
+
return s.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ').trim();
|
|
14
|
+
}
|
|
15
|
+
const SEVERITY_ORDER = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO', 'UNKNOWN'];
|
|
16
|
+
/**
|
|
17
|
+
* Derive the top-line verdict from the compliance + security summaries.
|
|
18
|
+
* Shared by the Markdown and HTML renderers so the two never drift. Exported
|
|
19
|
+
* for the HTML renderer (and unit tests).
|
|
20
|
+
*/
|
|
21
|
+
export function computeVerdict(compliance, summary) {
|
|
22
|
+
const active = compliance.findings;
|
|
23
|
+
const hasRejection = active.some((f) => f.storeImpact === 'REJECTION_LIKELY');
|
|
24
|
+
const critHighSecurity = summary.critHigh > 0;
|
|
25
|
+
if (hasRejection) {
|
|
26
|
+
return {
|
|
27
|
+
level: 'fail',
|
|
28
|
+
headline: 'HIGH RISK of store rejection or delisting',
|
|
29
|
+
detail: 'This build has a manifest signal that stores commonly reject or delist for. Fix the high-impact items below before you submit.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (active.length > 0 || critHighSecurity) {
|
|
33
|
+
return {
|
|
34
|
+
level: 'review',
|
|
35
|
+
headline: 'Review before submitting',
|
|
36
|
+
detail: 'Nothing here is an automatic rejection, but the items below commonly draw extra store scrutiny. Make sure each is justified in your listing.',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
level: 'pass',
|
|
41
|
+
headline: 'No store-compliance blockers detected',
|
|
42
|
+
detail: 'Based on this scan, we did not find manifest signals that typically fail store review. This is not a guarantee of approval.',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function renderComplianceSection(compliance) {
|
|
46
|
+
const out = ['## Store-compliance risks (ranked by review danger)', ''];
|
|
47
|
+
if (!compliance.present) {
|
|
48
|
+
out.push('_Store-compliance analysis is unavailable — the scan server has not been updated yet. Re-run after the next server rollout (no CLI action needed)._', '');
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
if (compliance.findings.length === 0) {
|
|
52
|
+
out.push('_No store-compliance signals detected in the manifest._', '');
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
out.push('| # | Risk | Severity | Store impact | Stores |', '|---|------|----------|--------------|--------|');
|
|
56
|
+
compliance.findings.forEach((f, i) => {
|
|
57
|
+
const impact = STORE_IMPACT_SHORT[f.storeImpact] ?? f.storeImpact;
|
|
58
|
+
out.push(`| ${i + 1} | ${cell(f.label)} | ${cell(f.severity)} | ${cell(impact)} | ${cell(f.stores.join(', '))} |`);
|
|
59
|
+
});
|
|
60
|
+
out.push('');
|
|
61
|
+
compliance.findings.forEach((f, i) => {
|
|
62
|
+
out.push(`### ${i + 1}. ${f.label}`);
|
|
63
|
+
if (f.summary)
|
|
64
|
+
out.push('', `**Why stores care:** ${f.summary}`);
|
|
65
|
+
if (f.evidence.length > 0) {
|
|
66
|
+
out.push('', '**Evidence:**', '', '```', ...f.evidence.slice(0, 10), '```');
|
|
67
|
+
}
|
|
68
|
+
if (f.remediation)
|
|
69
|
+
out.push('', `**How to fix:** ${f.remediation}`);
|
|
70
|
+
out.push('');
|
|
71
|
+
});
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function renderSecuritySection(summary) {
|
|
75
|
+
const out = ['## Security findings', ''];
|
|
76
|
+
if (summary.findings.length === 0) {
|
|
77
|
+
out.push('_No code-analysis findings._', '');
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
const bySeverity = new Map();
|
|
81
|
+
for (const f of summary.findings) {
|
|
82
|
+
const arr = bySeverity.get(f.severity) ?? [];
|
|
83
|
+
arr.push(f);
|
|
84
|
+
bySeverity.set(f.severity, arr);
|
|
85
|
+
}
|
|
86
|
+
for (const sev of SEVERITY_ORDER) {
|
|
87
|
+
const group = bySeverity.get(sev);
|
|
88
|
+
if (!group || group.length === 0)
|
|
89
|
+
continue;
|
|
90
|
+
out.push(`### ${sev} (${group.length})`, '', '| Finding | Scanner | Location |', '|---------|---------|----------|');
|
|
91
|
+
for (const f of group) {
|
|
92
|
+
out.push(`| ${cell(f.headline)} | ${cell(f.scanner)} | ${cell(f.location)} |`);
|
|
93
|
+
}
|
|
94
|
+
out.push('');
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
export function renderMarkdownReport(body, meta) {
|
|
99
|
+
const summary = summarizeReport(body);
|
|
100
|
+
const compliance = summarizeCompliance(body);
|
|
101
|
+
const lines = [];
|
|
102
|
+
lines.push(`# Extenshi scan report — ${meta.artifactName}`);
|
|
103
|
+
const job = summary.jobId ? ` · Job \`${summary.jobId}\`` : '';
|
|
104
|
+
lines.push(`> Generated by @extenshi/cli v${meta.cliVersion} · ${meta.generatedAt.toISOString()}${job}`, '');
|
|
105
|
+
const verdict = computeVerdict(compliance, summary);
|
|
106
|
+
lines.push('## Verdict', '', `**${verdict.headline}**`, '', verdict.detail, '');
|
|
107
|
+
lines.push(...renderComplianceSection(compliance));
|
|
108
|
+
if (compliance.present) {
|
|
109
|
+
lines.push('## Manifest risk score', '', `**${compliance.manifestRiskScore}/100**`, '');
|
|
110
|
+
if (compliance.flags.length > 0) {
|
|
111
|
+
lines.push(`Flags set: ${compliance.flags.map((f) => `\`${f}\``).join(', ')}`, '');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
lines.push(...renderSecuritySection(summary));
|
|
115
|
+
lines.push('## Scanner status', '');
|
|
116
|
+
lines.push(`${summary.scannersOk}/${summary.scannersRun} scanners succeeded.`, '');
|
|
117
|
+
if (summary.issues.length > 0) {
|
|
118
|
+
lines.push('| Scanner | Status | Detail |', '|---------|--------|--------|');
|
|
119
|
+
for (const i of summary.issues) {
|
|
120
|
+
lines.push(`| ${cell(i.scanner)} | ${cell(i.status)} | ${cell(i.error ?? '')} |`);
|
|
121
|
+
}
|
|
122
|
+
lines.push('');
|
|
123
|
+
}
|
|
124
|
+
lines.push('## Notes', '');
|
|
125
|
+
if (summary.jobId)
|
|
126
|
+
lines.push(`- Scan job: \`${summary.jobId}\``);
|
|
127
|
+
lines.push('- This scan is automated. The scanners are heuristics that may miss real issues or over-flag benign code — a clean result is not a guarantee of safety or store approval. See the [security-risk disclaimer](https://catalog.extenshi.io/disclaimers/security-risk).', '- If a credit was charged for a failed scan it auto-refunds within a minute.', '- Manage claims and respond to findings at https://dojo.extenshi.io', '');
|
|
128
|
+
return `${lines.join('\n')}\n`;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-risk — pull the manifest and inspectable text files out of a packaged
|
|
3
|
+
* extension artifact.
|
|
4
|
+
*
|
|
5
|
+
* Accepts the same artifacts as `extenshi scan`:
|
|
6
|
+
* .zip / .xpi → a plain ZIP
|
|
7
|
+
* .crx → a ZIP behind a CRX2 or CRX3 header (stripped here)
|
|
8
|
+
*
|
|
9
|
+
* Only text entries the checks read (.js/.mjs/.cjs/.html/.json) are decoded,
|
|
10
|
+
* each capped in size, with a global byte budget — a malicious or huge package
|
|
11
|
+
* can't blow up memory. Binary assets (images, wasm) are skipped.
|
|
12
|
+
*/
|
|
13
|
+
import type { FileMap, Manifest } from './review-checks.js';
|
|
14
|
+
export interface LoadedArtifact {
|
|
15
|
+
manifest: Manifest;
|
|
16
|
+
files: FileMap;
|
|
17
|
+
/** Non-fatal notes (e.g. byte budget hit, files skipped). */
|
|
18
|
+
warnings: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Strip a CRX header if present and return the inner ZIP bytes.
|
|
22
|
+
*
|
|
23
|
+
* CRX3: "Cr24" | version(4 LE)=3 | headerLen(4 LE) | header | ZIP
|
|
24
|
+
* CRX2: "Cr24" | version(4 LE)=2 | pubKeyLen(4 LE) | sigLen(4 LE) | pubKey | sig | ZIP
|
|
25
|
+
* Anything else is assumed to already be a ZIP.
|
|
26
|
+
*/
|
|
27
|
+
export declare function stripCrxHeader(buf: Buffer): Buffer;
|
|
28
|
+
export declare function loadArtifact(buf: Buffer): Promise<LoadedArtifact>;
|
|
29
|
+
//# sourceMappingURL=review-archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-archive.d.ts","sourceRoot":"","sources":["../src/review-archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAS3D,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAelD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuDvE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-risk — pull the manifest and inspectable text files out of a packaged
|
|
3
|
+
* extension artifact.
|
|
4
|
+
*
|
|
5
|
+
* Accepts the same artifacts as `extenshi scan`:
|
|
6
|
+
* .zip / .xpi → a plain ZIP
|
|
7
|
+
* .crx → a ZIP behind a CRX2 or CRX3 header (stripped here)
|
|
8
|
+
*
|
|
9
|
+
* Only text entries the checks read (.js/.mjs/.cjs/.html/.json) are decoded,
|
|
10
|
+
* each capped in size, with a global byte budget — a malicious or huge package
|
|
11
|
+
* can't blow up memory. Binary assets (images, wasm) are skipped.
|
|
12
|
+
*/
|
|
13
|
+
import JSZip from 'jszip';
|
|
14
|
+
/** Skip any single entry larger than this — source files are never this big. */
|
|
15
|
+
const MAX_ENTRY_BYTES = 4 * 1024 * 1024; // 4 MB
|
|
16
|
+
/** Stop decoding once the cumulative decoded text passes this. */
|
|
17
|
+
const MAX_TOTAL_BYTES = 40 * 1024 * 1024; // 40 MB
|
|
18
|
+
const TEXT_ENTRY_RE = /\.(?:m?js|cjs|html?|json)$/i;
|
|
19
|
+
/**
|
|
20
|
+
* Strip a CRX header if present and return the inner ZIP bytes.
|
|
21
|
+
*
|
|
22
|
+
* CRX3: "Cr24" | version(4 LE)=3 | headerLen(4 LE) | header | ZIP
|
|
23
|
+
* CRX2: "Cr24" | version(4 LE)=2 | pubKeyLen(4 LE) | sigLen(4 LE) | pubKey | sig | ZIP
|
|
24
|
+
* Anything else is assumed to already be a ZIP.
|
|
25
|
+
*/
|
|
26
|
+
export function stripCrxHeader(buf) {
|
|
27
|
+
if (buf.length < 16 || buf.toString('ascii', 0, 4) !== 'Cr24')
|
|
28
|
+
return buf;
|
|
29
|
+
const version = buf.readUInt32LE(4);
|
|
30
|
+
if (version === 3) {
|
|
31
|
+
const headerLen = buf.readUInt32LE(8);
|
|
32
|
+
const start = 12 + headerLen;
|
|
33
|
+
return start <= buf.length ? buf.subarray(start) : buf;
|
|
34
|
+
}
|
|
35
|
+
if (version === 2) {
|
|
36
|
+
const pubKeyLen = buf.readUInt32LE(8);
|
|
37
|
+
const sigLen = buf.readUInt32LE(12);
|
|
38
|
+
const start = 16 + pubKeyLen + sigLen;
|
|
39
|
+
return start <= buf.length ? buf.subarray(start) : buf;
|
|
40
|
+
}
|
|
41
|
+
return buf;
|
|
42
|
+
}
|
|
43
|
+
export async function loadArtifact(buf) {
|
|
44
|
+
const zip = await JSZip.loadAsync(stripCrxHeader(buf));
|
|
45
|
+
const manifestEntry = findManifestEntry(zip);
|
|
46
|
+
if (!manifestEntry) {
|
|
47
|
+
throw new Error('No manifest.json found in the artifact — is this a packaged extension (.zip/.crx/.xpi)?');
|
|
48
|
+
}
|
|
49
|
+
let manifest;
|
|
50
|
+
try {
|
|
51
|
+
manifest = JSON.parse(await manifestEntry.async('string'));
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new Error(`manifest.json is not valid JSON: ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
const files = new Map();
|
|
57
|
+
const warnings = [];
|
|
58
|
+
let totalBytes = 0;
|
|
59
|
+
let skippedLarge = 0;
|
|
60
|
+
let budgetHit = false;
|
|
61
|
+
for (const entry of Object.values(zip.files)) {
|
|
62
|
+
if (entry.dir)
|
|
63
|
+
continue;
|
|
64
|
+
if (!TEXT_ENTRY_RE.test(entry.name))
|
|
65
|
+
continue;
|
|
66
|
+
// jszip exposes the uncompressed size on the internal `_data` record; guard
|
|
67
|
+
// on it when available so we never decode a giant entry. This reaches into
|
|
68
|
+
// a private field — verified against jszip 3.10.x (the pinned `^3.10.1`).
|
|
69
|
+
// If you bump jszip, re-check that `_data.uncompressedSize` still exists;
|
|
70
|
+
// the text-length fallback below is the safety net if it ever disappears.
|
|
71
|
+
const declaredSize = entry._data
|
|
72
|
+
?.uncompressedSize;
|
|
73
|
+
if (typeof declaredSize === 'number' && declaredSize > MAX_ENTRY_BYTES) {
|
|
74
|
+
skippedLarge++;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (totalBytes >= MAX_TOTAL_BYTES) {
|
|
78
|
+
budgetHit = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
const text = await entry.async('string');
|
|
82
|
+
if (text.length > MAX_ENTRY_BYTES) {
|
|
83
|
+
skippedLarge++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
totalBytes += text.length;
|
|
87
|
+
files.set(entry.name, text);
|
|
88
|
+
}
|
|
89
|
+
if (skippedLarge > 0)
|
|
90
|
+
warnings.push(`${skippedLarge} oversized file(s) skipped (>4 MB)`);
|
|
91
|
+
if (budgetHit)
|
|
92
|
+
warnings.push('file scan stopped early at the 40 MB decode budget — some files were not inspected');
|
|
93
|
+
return { manifest, files, warnings };
|
|
94
|
+
}
|
|
95
|
+
/** manifest.json lives at the package root; tolerate a stray leading folder just in case. */
|
|
96
|
+
function findManifestEntry(zip) {
|
|
97
|
+
const direct = zip.file('manifest.json');
|
|
98
|
+
if (direct)
|
|
99
|
+
return direct;
|
|
100
|
+
for (const entry of Object.values(zip.files)) {
|
|
101
|
+
if (!entry.dir && /(^|\/)manifest\.json$/i.test(entry.name))
|
|
102
|
+
return entry;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=review-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-archive.js","sourceRoot":"","sources":["../src/review-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-risk — fetch the last-published manifest for an extension from the
|
|
3
|
+
* Extenshi catalog so check 3 can diff against it. This is the part that is
|
|
4
|
+
* unique to us: we keep per-extension manifest snapshots, so we can tell you
|
|
5
|
+
* whether *this* update adds an auto-disabling permission versus what's live.
|
|
6
|
+
*
|
|
7
|
+
* Talks to the public BFF tRPC gateway:
|
|
8
|
+
* GET {bffUrl}/api/trpc/store.getLatestPublishedManifest?input=<json>
|
|
9
|
+
*
|
|
10
|
+
* The BFF read path may be gated behind a developer API key, so we send the
|
|
11
|
+
* `ek_` key when the caller has one. Everything here is fail-soft: any problem
|
|
12
|
+
* (key required, extension unknown, catalog older than this CLI, network error)
|
|
13
|
+
* resolves to `{ manifest: null, reason }` — the command then runs every other
|
|
14
|
+
* check and prints why the diff was skipped, rather than failing the run.
|
|
15
|
+
*/
|
|
16
|
+
export interface PriorManifestResult {
|
|
17
|
+
/** The parsed last-published manifest, or null when it could not be obtained. */
|
|
18
|
+
manifest: Record<string, unknown> | null;
|
|
19
|
+
/** Present when manifest is null: a human-readable reason to print. */
|
|
20
|
+
reason?: string;
|
|
21
|
+
/** Snapshot metadata, when found. */
|
|
22
|
+
meta?: {
|
|
23
|
+
store?: string;
|
|
24
|
+
version?: string;
|
|
25
|
+
fetchedAt?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface FetchPriorManifestOptions {
|
|
29
|
+
/** BFF base URL, e.g. https://bff.extenshi.io (no trailing slash). */
|
|
30
|
+
bffUrl: string;
|
|
31
|
+
/** Numeric catalog extension ID. */
|
|
32
|
+
extensionId: string;
|
|
33
|
+
/** Optional `ek_` developer key — sent when the read path is gated. */
|
|
34
|
+
apiKey?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Which store's snapshot to diff against. Permission sets differ per store, so
|
|
37
|
+
* pinning this avoids comparing a Chrome upload against, say, a Firefox
|
|
38
|
+
* snapshot. Omitted → the catalog returns the latest snapshot of any store.
|
|
39
|
+
*/
|
|
40
|
+
store?: 'CHROME' | 'FIREFOX' | 'EDGE';
|
|
41
|
+
}
|
|
42
|
+
export declare function fetchPriorManifest(opts: FetchPriorManifestOptions): Promise<PriorManifestResult>;
|
|
43
|
+
//# sourceMappingURL=review-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-catalog.d.ts","sourceRoot":"","sources":["../src/review-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,mBAAmB;IACnC,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACxC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/D;AAED,MAAM,WAAW,yBAAyB;IACzC,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;CACrC;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiFtG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review-risk — fetch the last-published manifest for an extension from the
|
|
3
|
+
* Extenshi catalog so check 3 can diff against it. This is the part that is
|
|
4
|
+
* unique to us: we keep per-extension manifest snapshots, so we can tell you
|
|
5
|
+
* whether *this* update adds an auto-disabling permission versus what's live.
|
|
6
|
+
*
|
|
7
|
+
* Talks to the public BFF tRPC gateway:
|
|
8
|
+
* GET {bffUrl}/api/trpc/store.getLatestPublishedManifest?input=<json>
|
|
9
|
+
*
|
|
10
|
+
* The BFF read path may be gated behind a developer API key, so we send the
|
|
11
|
+
* `ek_` key when the caller has one. Everything here is fail-soft: any problem
|
|
12
|
+
* (key required, extension unknown, catalog older than this CLI, network error)
|
|
13
|
+
* resolves to `{ manifest: null, reason }` — the command then runs every other
|
|
14
|
+
* check and prints why the diff was skipped, rather than failing the run.
|
|
15
|
+
*/
|
|
16
|
+
import { fetch } from 'undici';
|
|
17
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
18
|
+
export async function fetchPriorManifest(opts) {
|
|
19
|
+
const id = Number(opts.extensionId);
|
|
20
|
+
if (!Number.isInteger(id) || id <= 0) {
|
|
21
|
+
return {
|
|
22
|
+
manifest: null,
|
|
23
|
+
reason: `invalid --extension-id "${opts.extensionId}" (expected a positive number)`,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const query = opts.store ? { extensionId: id, store: opts.store } : { extensionId: id };
|
|
27
|
+
const input = encodeURIComponent(JSON.stringify(query));
|
|
28
|
+
const url = `${opts.bffUrl}/api/trpc/store.getLatestPublishedManifest?input=${input}`;
|
|
29
|
+
let res;
|
|
30
|
+
try {
|
|
31
|
+
res = await fetch(url, {
|
|
32
|
+
headers: opts.apiKey ? { authorization: `Bearer ${opts.apiKey}` } : {},
|
|
33
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const e = err;
|
|
38
|
+
const why = e.name === 'TimeoutError' ? `timed out after ${FETCH_TIMEOUT_MS / 1000}s` : e.message;
|
|
39
|
+
return { manifest: null, reason: `could not reach the catalog (${why})` };
|
|
40
|
+
}
|
|
41
|
+
if (res.status === 401) {
|
|
42
|
+
return {
|
|
43
|
+
manifest: null,
|
|
44
|
+
reason: 'the catalog manifest read is gated — set EXTENSHI_API_KEY (run `extenshi login`) to enable the diff',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (res.status === 404) {
|
|
48
|
+
return {
|
|
49
|
+
manifest: null,
|
|
50
|
+
reason: 'the deployed catalog API predates this feature (no getLatestPublishedManifest) — update once it ships',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
return { manifest: null, reason: `catalog returned HTTP ${res.status}` };
|
|
55
|
+
}
|
|
56
|
+
let body;
|
|
57
|
+
try {
|
|
58
|
+
body = await res.json();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return { manifest: null, reason: 'catalog returned a non-JSON response' };
|
|
62
|
+
}
|
|
63
|
+
// tRPC (no transformer): { result: { data: <payload> } }, or { error: {...} }.
|
|
64
|
+
const error = body.error;
|
|
65
|
+
if (error) {
|
|
66
|
+
return { manifest: null, reason: `catalog error: ${error.message ?? 'unknown'}` };
|
|
67
|
+
}
|
|
68
|
+
const data = body.result?.data;
|
|
69
|
+
if (!data || data.manifest == null || typeof data.manifest !== 'object') {
|
|
70
|
+
const reason = data?.reason === 'no_snapshot'
|
|
71
|
+
? 'no published manifest on record for this extension yet'
|
|
72
|
+
: data?.reason === 'manifest_unresolved'
|
|
73
|
+
? 'the last snapshot could not be resolved to a manifest'
|
|
74
|
+
: 'the catalog returned no manifest for this extension';
|
|
75
|
+
return { manifest: null, reason };
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
manifest: data.manifest,
|
|
79
|
+
meta: { store: data.store, version: data.version, fetchedAt: data.fetchedAt },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=review-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-catalog.js","sourceRoot":"","sources":["../src/review-catalog.ts"],"names":[],"mappings":"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"}
|