@guardbee/mcp-reverse-shield 0.0.0-stage → 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 +21 -0
- package/README.md +117 -2
- package/TR.md +114 -0
- package/ZH.md +61 -0
- package/dist/__tests__/android.test.d.ts +2 -0
- package/dist/__tests__/android.test.d.ts.map +1 -0
- package/dist/__tests__/android.test.js +114 -0
- package/dist/__tests__/android.test.js.map +1 -0
- package/dist/__tests__/electron.test.d.ts +2 -0
- package/dist/__tests__/electron.test.d.ts.map +1 -0
- package/dist/__tests__/electron.test.js +128 -0
- package/dist/__tests__/electron.test.js.map +1 -0
- package/dist/__tests__/live.test.d.ts +2 -0
- package/dist/__tests__/live.test.d.ts.map +1 -0
- package/dist/__tests__/live.test.js +67 -0
- package/dist/__tests__/live.test.js.map +1 -0
- package/dist/__tests__/native.test.d.ts +2 -0
- package/dist/__tests__/native.test.d.ts.map +1 -0
- package/dist/__tests__/native.test.js +111 -0
- package/dist/__tests__/native.test.js.map +1 -0
- package/dist/__tests__/scanner.test.d.ts +2 -0
- package/dist/__tests__/scanner.test.d.ts.map +1 -0
- package/dist/__tests__/scanner.test.js +127 -0
- package/dist/__tests__/scanner.test.js.map +1 -0
- package/dist/__tests__/testFixtures.d.ts +61 -0
- package/dist/__tests__/testFixtures.d.ts.map +1 -0
- package/dist/__tests__/testFixtures.js +416 -0
- package/dist/__tests__/testFixtures.js.map +1 -0
- package/dist/__tests__/web.test.d.ts +2 -0
- package/dist/__tests__/web.test.d.ts.map +1 -0
- package/dist/__tests__/web.test.js +156 -0
- package/dist/__tests__/web.test.js.map +1 -0
- package/dist/apk.d.ts +9 -0
- package/dist/apk.d.ts.map +1 -0
- package/dist/apk.js +132 -0
- package/dist/apk.js.map +1 -0
- package/dist/asar.d.ts +10 -0
- package/dist/asar.d.ts.map +1 -0
- package/dist/asar.js +73 -0
- package/dist/asar.js.map +1 -0
- package/dist/axml.d.ts +20 -0
- package/dist/axml.d.ts.map +1 -0
- package/dist/axml.js +104 -0
- package/dist/axml.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +172 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/dex.d.ts +16 -0
- package/dist/dex.d.ts.map +1 -0
- package/dist/dex.js +63 -0
- package/dist/dex.js.map +1 -0
- package/dist/electron.d.ts +26 -0
- package/dist/electron.d.ts.map +1 -0
- package/dist/electron.js +146 -0
- package/dist/electron.js.map +1 -0
- package/dist/finding.d.ts +30 -0
- package/dist/finding.d.ts.map +1 -0
- package/dist/finding.js +38 -0
- package/dist/finding.js.map +1 -0
- package/dist/fsutil.d.ts +20 -0
- package/dist/fsutil.d.ts.map +1 -0
- package/dist/fsutil.js +80 -0
- package/dist/fsutil.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/live.d.ts +14 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +144 -0
- package/dist/live.js.map +1 -0
- package/dist/native.d.ts +18 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +411 -0
- package/dist/native.js.map +1 -0
- package/dist/rules.d.ts +22 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +354 -0
- package/dist/rules.js.map +1 -0
- package/dist/sarif.d.ts +3 -0
- package/dist/sarif.d.ts.map +1 -0
- package/dist/sarif.js +60 -0
- package/dist/sarif.js.map +1 -0
- package/dist/scanner.d.ts +27 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +169 -0
- package/dist/scanner.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +88 -0
- package/dist/server.js.map +1 -0
- package/dist/web.d.ts +56 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +301 -0
- package/dist/web.js.map +1 -0
- package/dist/zip.d.ts +21 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +112 -0
- package/dist/zip.js.map +1 -0
- package/package.json +52 -3
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
import { deflateRawSync } from "zlib";
|
|
2
|
+
import { FUSE_SENTINEL } from "../electron.js";
|
|
3
|
+
// ── ZIP / APK ───────────────────────────────────────────────────────────────
|
|
4
|
+
/** Multi-entry ZIP (no CRC, which zip.ts does not check). `beforeCentralDir` is spliced in where an APK Signing Block lives. */
|
|
5
|
+
export function buildZip(entries, beforeCentralDir = Buffer.alloc(0)) {
|
|
6
|
+
const locals = [];
|
|
7
|
+
const centrals = [];
|
|
8
|
+
let offset = 0;
|
|
9
|
+
for (const e of entries) {
|
|
10
|
+
const content = e.deflate ? deflateRawSync(e.data) : e.data;
|
|
11
|
+
const method = e.deflate ? 8 : 0;
|
|
12
|
+
const name = Buffer.from(e.name, "utf8");
|
|
13
|
+
const lfh = Buffer.alloc(30);
|
|
14
|
+
lfh.writeUInt32LE(0x04034b50, 0);
|
|
15
|
+
lfh.writeUInt16LE(20, 4);
|
|
16
|
+
lfh.writeUInt16LE(method, 8);
|
|
17
|
+
lfh.writeUInt32LE(content.length, 18);
|
|
18
|
+
lfh.writeUInt32LE(e.data.length, 22);
|
|
19
|
+
lfh.writeUInt16LE(name.length, 26);
|
|
20
|
+
const cdh = Buffer.alloc(46);
|
|
21
|
+
cdh.writeUInt32LE(0x02014b50, 0);
|
|
22
|
+
cdh.writeUInt16LE(20, 4);
|
|
23
|
+
cdh.writeUInt16LE(20, 6);
|
|
24
|
+
cdh.writeUInt16LE(method, 10);
|
|
25
|
+
cdh.writeUInt32LE(content.length, 20);
|
|
26
|
+
cdh.writeUInt32LE(e.data.length, 24);
|
|
27
|
+
cdh.writeUInt16LE(name.length, 28);
|
|
28
|
+
cdh.writeUInt32LE(offset, 42);
|
|
29
|
+
locals.push(lfh, name, content);
|
|
30
|
+
centrals.push(cdh, name);
|
|
31
|
+
offset += 30 + name.length + content.length;
|
|
32
|
+
}
|
|
33
|
+
const cdOffset = offset + beforeCentralDir.length;
|
|
34
|
+
const cd = Buffer.concat(centrals);
|
|
35
|
+
const eocd = Buffer.alloc(22);
|
|
36
|
+
eocd.writeUInt32LE(0x06054b50, 0);
|
|
37
|
+
eocd.writeUInt16LE(entries.length, 8);
|
|
38
|
+
eocd.writeUInt16LE(entries.length, 10);
|
|
39
|
+
eocd.writeUInt32LE(cd.length, 12);
|
|
40
|
+
eocd.writeUInt32LE(cdOffset, 16);
|
|
41
|
+
return Buffer.concat([...locals, beforeCentralDir, cd, eocd]);
|
|
42
|
+
}
|
|
43
|
+
/** Enough of an APK Signing Block for detection: the magic sits in the 16 bytes before the central directory. */
|
|
44
|
+
export function apkSigningBlock() {
|
|
45
|
+
return Buffer.concat([Buffer.alloc(32), Buffer.from("APK Sig Block 42", "latin1")]);
|
|
46
|
+
}
|
|
47
|
+
export function buildAxml(elements) {
|
|
48
|
+
const strings = [];
|
|
49
|
+
const intern = (s) => {
|
|
50
|
+
let i = strings.indexOf(s);
|
|
51
|
+
if (i === -1)
|
|
52
|
+
i = strings.push(s) - 1;
|
|
53
|
+
return i;
|
|
54
|
+
};
|
|
55
|
+
// Attribute names with resource ids must come first so the resource map indexes line up.
|
|
56
|
+
const withIds = elements.flatMap((e) => e.attrs).filter((a) => a.resourceId !== undefined);
|
|
57
|
+
const ids = [];
|
|
58
|
+
for (const a of withIds) {
|
|
59
|
+
if (!strings.includes(a.name)) {
|
|
60
|
+
intern(a.name);
|
|
61
|
+
ids.push(a.resourceId);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const e of elements) {
|
|
65
|
+
intern(e.name);
|
|
66
|
+
for (const a of e.attrs) {
|
|
67
|
+
intern(a.name);
|
|
68
|
+
if (a.string !== undefined)
|
|
69
|
+
intern(a.string);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// UTF-16 string pool
|
|
73
|
+
const data = Buffer.concat(strings.map((s) => {
|
|
74
|
+
const b = Buffer.alloc(2 + s.length * 2 + 2);
|
|
75
|
+
b.writeUInt16LE(s.length, 0);
|
|
76
|
+
b.write(s, 2, "utf16le");
|
|
77
|
+
return b;
|
|
78
|
+
}));
|
|
79
|
+
const padded = Buffer.concat([data, Buffer.alloc((4 - (data.length % 4)) % 4)]);
|
|
80
|
+
const offsets = Buffer.alloc(strings.length * 4);
|
|
81
|
+
let o = 0;
|
|
82
|
+
strings.forEach((s, i) => {
|
|
83
|
+
offsets.writeUInt32LE(o, i * 4);
|
|
84
|
+
o += 2 + s.length * 2 + 2;
|
|
85
|
+
});
|
|
86
|
+
const spHeader = Buffer.alloc(28);
|
|
87
|
+
spHeader.writeUInt16LE(0x0001, 0);
|
|
88
|
+
spHeader.writeUInt16LE(28, 2);
|
|
89
|
+
spHeader.writeUInt32LE(28 + offsets.length + padded.length, 4);
|
|
90
|
+
spHeader.writeUInt32LE(strings.length, 8);
|
|
91
|
+
spHeader.writeUInt32LE(0, 16);
|
|
92
|
+
spHeader.writeUInt32LE(28 + offsets.length, 20);
|
|
93
|
+
const pool = Buffer.concat([spHeader, offsets, padded]);
|
|
94
|
+
const resMap = Buffer.alloc(8 + ids.length * 4);
|
|
95
|
+
resMap.writeUInt16LE(0x0180, 0);
|
|
96
|
+
resMap.writeUInt16LE(8, 2);
|
|
97
|
+
resMap.writeUInt32LE(resMap.length, 4);
|
|
98
|
+
ids.forEach((id, i) => resMap.writeUInt32LE(id, 8 + i * 4));
|
|
99
|
+
const chunks = elements.map((e) => {
|
|
100
|
+
const attrs = Buffer.alloc(e.attrs.length * 20);
|
|
101
|
+
e.attrs.forEach((a, i) => {
|
|
102
|
+
const p = i * 20;
|
|
103
|
+
attrs.writeUInt32LE(0xffffffff, p);
|
|
104
|
+
attrs.writeUInt32LE(strings.indexOf(a.name), p + 4);
|
|
105
|
+
attrs.writeUInt16LE(8, p + 12);
|
|
106
|
+
if (a.bool !== undefined) {
|
|
107
|
+
attrs.writeUInt32LE(0xffffffff, p + 8);
|
|
108
|
+
attrs[p + 15] = 0x12;
|
|
109
|
+
attrs.writeUInt32LE(a.bool ? 0xffffffff : 0, p + 16);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const idx = strings.indexOf(a.string ?? "");
|
|
113
|
+
attrs.writeUInt32LE(idx, p + 8);
|
|
114
|
+
attrs[p + 15] = 0x03;
|
|
115
|
+
attrs.writeUInt32LE(idx, p + 16);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const head = Buffer.alloc(16 + 20);
|
|
119
|
+
head.writeUInt16LE(0x0102, 0);
|
|
120
|
+
head.writeUInt16LE(16, 2);
|
|
121
|
+
head.writeUInt32LE(36 + attrs.length, 4);
|
|
122
|
+
head.writeUInt32LE(0xffffffff, 16);
|
|
123
|
+
head.writeUInt32LE(strings.indexOf(e.name), 20);
|
|
124
|
+
head.writeUInt16LE(20, 24);
|
|
125
|
+
head.writeUInt16LE(20, 26);
|
|
126
|
+
head.writeUInt16LE(e.attrs.length, 28);
|
|
127
|
+
return Buffer.concat([head, attrs]);
|
|
128
|
+
});
|
|
129
|
+
const body = Buffer.concat([pool, resMap, ...chunks]);
|
|
130
|
+
const header = Buffer.alloc(8);
|
|
131
|
+
header.writeUInt16LE(0x0003, 0);
|
|
132
|
+
header.writeUInt16LE(8, 2);
|
|
133
|
+
header.writeUInt32LE(8 + body.length, 4);
|
|
134
|
+
return Buffer.concat([header, body]);
|
|
135
|
+
}
|
|
136
|
+
// ── DEX ─────────────────────────────────────────────────────────────────────
|
|
137
|
+
export function buildDex(descriptors) {
|
|
138
|
+
const headerSize = 0x70;
|
|
139
|
+
const n = descriptors.length;
|
|
140
|
+
const stringIdsOff = headerSize;
|
|
141
|
+
const typeIdsOff = stringIdsOff + n * 4;
|
|
142
|
+
let dataOff = typeIdsOff + n * 4;
|
|
143
|
+
const stringIds = Buffer.alloc(n * 4);
|
|
144
|
+
const typeIds = Buffer.alloc(n * 4);
|
|
145
|
+
const data = [];
|
|
146
|
+
descriptors.forEach((d, i) => {
|
|
147
|
+
stringIds.writeUInt32LE(dataOff, i * 4);
|
|
148
|
+
typeIds.writeUInt32LE(i, i * 4);
|
|
149
|
+
const bytes = Buffer.from(d, "utf8");
|
|
150
|
+
const entry = Buffer.concat([Buffer.from([d.length]), bytes, Buffer.from([0])]);
|
|
151
|
+
data.push(entry);
|
|
152
|
+
dataOff += entry.length;
|
|
153
|
+
});
|
|
154
|
+
const header = Buffer.alloc(headerSize);
|
|
155
|
+
header.write("dex\n035\0", 0, "latin1");
|
|
156
|
+
header.writeUInt32LE(n, 0x38);
|
|
157
|
+
header.writeUInt32LE(stringIdsOff, 0x3c);
|
|
158
|
+
header.writeUInt32LE(n, 0x40);
|
|
159
|
+
header.writeUInt32LE(typeIdsOff, 0x44);
|
|
160
|
+
return Buffer.concat([header, stringIds, typeIds, ...data]);
|
|
161
|
+
}
|
|
162
|
+
// ── ASAR / Electron ─────────────────────────────────────────────────────────
|
|
163
|
+
export function buildAsar(files) {
|
|
164
|
+
const index = { files: {} };
|
|
165
|
+
const contents = [];
|
|
166
|
+
let offset = 0;
|
|
167
|
+
for (const [path, text] of Object.entries(files)) {
|
|
168
|
+
const parts = path.split("/");
|
|
169
|
+
let node = index;
|
|
170
|
+
for (const dir of parts.slice(0, -1)) {
|
|
171
|
+
node.files[dir] ??= { files: {} };
|
|
172
|
+
node = node.files[dir];
|
|
173
|
+
}
|
|
174
|
+
const buf = Buffer.from(text, "utf8");
|
|
175
|
+
node.files[parts[parts.length - 1]] = { size: buf.length, offset: String(offset) };
|
|
176
|
+
contents.push(buf);
|
|
177
|
+
offset += buf.length;
|
|
178
|
+
}
|
|
179
|
+
const json = Buffer.from(JSON.stringify(index), "utf8");
|
|
180
|
+
const jsonPadded = Buffer.concat([json, Buffer.alloc((4 - (json.length % 4)) % 4)]);
|
|
181
|
+
const headerPickle = Buffer.alloc(8);
|
|
182
|
+
headerPickle.writeUInt32LE(4 + jsonPadded.length, 0);
|
|
183
|
+
headerPickle.writeUInt32LE(json.length, 4);
|
|
184
|
+
const sizePickle = Buffer.alloc(8);
|
|
185
|
+
sizePickle.writeUInt32LE(4, 0);
|
|
186
|
+
sizePickle.writeUInt32LE(8 + jsonPadded.length, 4);
|
|
187
|
+
return Buffer.concat([sizePickle, headerPickle, jsonPadded, ...contents]);
|
|
188
|
+
}
|
|
189
|
+
/** A stand-in Electron binary: padding, the fuse sentinel, version 1, then the fuse states. */
|
|
190
|
+
export function buildFuseBinary(states, padding = 4096) {
|
|
191
|
+
return Buffer.concat([Buffer.alloc(padding, 0x90), FUSE_SENTINEL, Buffer.from([1, states.length]), Buffer.from(states, "latin1"), Buffer.alloc(64)]);
|
|
192
|
+
}
|
|
193
|
+
export function buildElf64(spec) {
|
|
194
|
+
const names = ["", ".shstrtab", ...spec.sections.map((s) => s.name)];
|
|
195
|
+
const shstrtab = Buffer.from(names.join("\0") + "\0", "latin1");
|
|
196
|
+
const phdrs = [];
|
|
197
|
+
if (spec.type !== "shared")
|
|
198
|
+
phdrs.push({ type: 3, flags: 4 });
|
|
199
|
+
if (spec.stackFlags !== null)
|
|
200
|
+
phdrs.push({ type: 0x6474e551, flags: spec.stackFlags ?? 6 });
|
|
201
|
+
if (spec.relro !== false)
|
|
202
|
+
phdrs.push({ type: 0x6474e552, flags: 4 });
|
|
203
|
+
const phoff = 64;
|
|
204
|
+
const extra = Buffer.from(spec.extra ?? "", "latin1");
|
|
205
|
+
const strOff = phoff + phdrs.length * 56;
|
|
206
|
+
const extraOff = strOff + shstrtab.length;
|
|
207
|
+
const shoff = Math.ceil((extraOff + extra.length) / 8) * 8;
|
|
208
|
+
const shnum = names.length;
|
|
209
|
+
const buf = Buffer.alloc(shoff + shnum * 64);
|
|
210
|
+
buf[0] = 0x7f;
|
|
211
|
+
buf.write("ELF", 1, "latin1");
|
|
212
|
+
buf[4] = 2;
|
|
213
|
+
buf[5] = 1;
|
|
214
|
+
buf[6] = 1;
|
|
215
|
+
buf.writeUInt16LE(spec.type === "exec" ? 2 : 3, 16);
|
|
216
|
+
buf.writeUInt16LE(0x3e, 18);
|
|
217
|
+
buf.writeBigUInt64LE(BigInt(phoff), 32);
|
|
218
|
+
buf.writeBigUInt64LE(BigInt(shoff), 40);
|
|
219
|
+
buf.writeUInt16LE(56, 54);
|
|
220
|
+
buf.writeUInt16LE(phdrs.length, 56);
|
|
221
|
+
buf.writeUInt16LE(64, 58);
|
|
222
|
+
buf.writeUInt16LE(shnum, 60);
|
|
223
|
+
buf.writeUInt16LE(1, 62);
|
|
224
|
+
phdrs.forEach((p, i) => {
|
|
225
|
+
buf.writeUInt32LE(p.type, phoff + i * 56);
|
|
226
|
+
buf.writeUInt32LE(p.flags, phoff + i * 56 + 4);
|
|
227
|
+
});
|
|
228
|
+
shstrtab.copy(buf, strOff);
|
|
229
|
+
extra.copy(buf, extraOff);
|
|
230
|
+
let nameOff = 1;
|
|
231
|
+
const sections = [{ name: ".shstrtab", type: 3, size: shstrtab.length, entsize: 0, offset: strOff }, ...spec.sections.map((s) => ({ ...s, offset: 0 }))];
|
|
232
|
+
sections.forEach((s, i) => {
|
|
233
|
+
const o = shoff + (i + 1) * 64;
|
|
234
|
+
buf.writeUInt32LE(nameOff, o);
|
|
235
|
+
buf.writeUInt32LE(s.type ?? 1, o + 4);
|
|
236
|
+
buf.writeBigUInt64LE(BigInt(s.offset), o + 24);
|
|
237
|
+
buf.writeBigUInt64LE(BigInt(s.size ?? 0), o + 32);
|
|
238
|
+
buf.writeBigUInt64LE(BigInt(s.entsize ?? 0), o + 56);
|
|
239
|
+
nameOff += s.name.length + 1;
|
|
240
|
+
});
|
|
241
|
+
return buf;
|
|
242
|
+
}
|
|
243
|
+
export function buildMachO64(spec) {
|
|
244
|
+
const cmds = [];
|
|
245
|
+
const symbols = spec.symbols ?? [];
|
|
246
|
+
const headerSize = 32;
|
|
247
|
+
const symtabCmd = Buffer.alloc(24);
|
|
248
|
+
const sigCmd = Buffer.alloc(16);
|
|
249
|
+
const cmdsSize = (symbols.length > 0 ? 24 : 0) + (spec.signature ? 16 : 0);
|
|
250
|
+
let tail = headerSize + cmdsSize;
|
|
251
|
+
const symOff = tail;
|
|
252
|
+
const nlist = Buffer.alloc(symbols.length * 16);
|
|
253
|
+
symbols.forEach((t, i) => {
|
|
254
|
+
nlist.writeUInt32LE(1, i * 16);
|
|
255
|
+
nlist[i * 16 + 4] = t;
|
|
256
|
+
});
|
|
257
|
+
const strtab = Buffer.from("\0_sym\0", "latin1");
|
|
258
|
+
tail += nlist.length;
|
|
259
|
+
const strOff = tail;
|
|
260
|
+
tail += strtab.length;
|
|
261
|
+
if (symbols.length > 0) {
|
|
262
|
+
symtabCmd.writeUInt32LE(0x2, 0);
|
|
263
|
+
symtabCmd.writeUInt32LE(24, 4);
|
|
264
|
+
symtabCmd.writeUInt32LE(symOff, 8);
|
|
265
|
+
symtabCmd.writeUInt32LE(symbols.length, 12);
|
|
266
|
+
symtabCmd.writeUInt32LE(strOff, 16);
|
|
267
|
+
symtabCmd.writeUInt32LE(strtab.length, 20);
|
|
268
|
+
cmds.push(symtabCmd);
|
|
269
|
+
}
|
|
270
|
+
let sigBlob = Buffer.alloc(0);
|
|
271
|
+
if (spec.signature) {
|
|
272
|
+
const cd = Buffer.alloc(44);
|
|
273
|
+
cd.writeUInt32BE(0xfade0c02, 0);
|
|
274
|
+
cd.writeUInt32BE(44, 4);
|
|
275
|
+
cd.writeUInt32BE(0x20400, 8);
|
|
276
|
+
cd.writeUInt32BE(spec.signature.flags, 12);
|
|
277
|
+
cd[38] = spec.signature.platform ?? 0;
|
|
278
|
+
const blobs = [{ type: 0, data: cd }];
|
|
279
|
+
if (spec.signature.entitlements) {
|
|
280
|
+
const xml = Buffer.from(spec.signature.entitlements, "utf8");
|
|
281
|
+
const ent = Buffer.alloc(8);
|
|
282
|
+
ent.writeUInt32BE(0xfade7171, 0);
|
|
283
|
+
ent.writeUInt32BE(8 + xml.length, 4);
|
|
284
|
+
blobs.push({ type: 5, data: Buffer.concat([ent, xml]) });
|
|
285
|
+
}
|
|
286
|
+
const index = Buffer.alloc(12 + blobs.length * 8);
|
|
287
|
+
index.writeUInt32BE(0xfade0cc0, 0);
|
|
288
|
+
index.writeUInt32BE(blobs.length, 8);
|
|
289
|
+
let off = index.length;
|
|
290
|
+
blobs.forEach((b, i) => {
|
|
291
|
+
index.writeUInt32BE(b.type, 12 + i * 8);
|
|
292
|
+
index.writeUInt32BE(off, 12 + i * 8 + 4);
|
|
293
|
+
off += b.data.length;
|
|
294
|
+
});
|
|
295
|
+
sigBlob = Buffer.concat([index, ...blobs.map((b) => b.data)]);
|
|
296
|
+
sigBlob.writeUInt32BE(sigBlob.length, 4);
|
|
297
|
+
sigCmd.writeUInt32LE(0x1d, 0);
|
|
298
|
+
sigCmd.writeUInt32LE(16, 4);
|
|
299
|
+
sigCmd.writeUInt32LE(tail, 8);
|
|
300
|
+
sigCmd.writeUInt32LE(sigBlob.length, 12);
|
|
301
|
+
cmds.push(sigCmd);
|
|
302
|
+
}
|
|
303
|
+
const header = Buffer.alloc(headerSize);
|
|
304
|
+
header.writeUInt32LE(0xfeedfacf, 0);
|
|
305
|
+
header.writeUInt32LE(0x0100000c, 4);
|
|
306
|
+
header.writeUInt32LE(spec.filetype ?? 2, 12);
|
|
307
|
+
header.writeUInt32LE(cmds.length, 16);
|
|
308
|
+
header.writeUInt32LE(cmdsSize, 20);
|
|
309
|
+
header.writeUInt32LE(spec.pie === false ? 0 : 0x200000, 24);
|
|
310
|
+
return Buffer.concat([header, ...cmds, nlist, strtab, sigBlob]);
|
|
311
|
+
}
|
|
312
|
+
export function entitlementsPlist(keys) {
|
|
313
|
+
return `<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict>${keys.map((k) => `<key>${k}</key><true/>`).join("")}</dict></plist>`;
|
|
314
|
+
}
|
|
315
|
+
export function buildPe(spec) {
|
|
316
|
+
const fileAlign = 0x200;
|
|
317
|
+
const sectionVA = 0x1000;
|
|
318
|
+
const sectionRaw = 0x400;
|
|
319
|
+
// Section contents: debug directory, CodeView record, CLR header, metadata.
|
|
320
|
+
const section = [];
|
|
321
|
+
let cursor = 0;
|
|
322
|
+
const place = (b) => {
|
|
323
|
+
const at = cursor;
|
|
324
|
+
section.push(b);
|
|
325
|
+
cursor += b.length;
|
|
326
|
+
return at;
|
|
327
|
+
};
|
|
328
|
+
const debugEntries = [];
|
|
329
|
+
if (spec.pdbPath !== undefined) {
|
|
330
|
+
const cv = Buffer.concat([Buffer.from("RSDS", "latin1"), Buffer.alloc(20), Buffer.from(spec.pdbPath + "\0", "utf8")]);
|
|
331
|
+
debugEntries.push({ type: 2, data: cv });
|
|
332
|
+
}
|
|
333
|
+
if (spec.embeddedPdb)
|
|
334
|
+
debugEntries.push({ type: 17, data: Buffer.from("MPDB....", "latin1") });
|
|
335
|
+
const debugDirAt = place(Buffer.alloc(debugEntries.length * 28));
|
|
336
|
+
const dataAts = debugEntries.map((e) => place(e.data));
|
|
337
|
+
debugEntries.forEach((e, i) => {
|
|
338
|
+
const d = section[0];
|
|
339
|
+
d.writeUInt32LE(e.type, i * 28 + 12);
|
|
340
|
+
d.writeUInt32LE(e.data.length, i * 28 + 16);
|
|
341
|
+
d.writeUInt32LE(sectionVA + dataAts[i], i * 28 + 20);
|
|
342
|
+
d.writeUInt32LE(sectionRaw + dataAts[i], i * 28 + 24);
|
|
343
|
+
});
|
|
344
|
+
let clrAt = -1;
|
|
345
|
+
if (spec.dotnetNames) {
|
|
346
|
+
const strings = Buffer.from("\0" + spec.dotnetNames.join("\0") + "\0", "utf8");
|
|
347
|
+
const stringsPadded = Buffer.concat([strings, Buffer.alloc((4 - (strings.length % 4)) % 4)]);
|
|
348
|
+
const version = Buffer.from("v4.0.30319\0\0", "latin1");
|
|
349
|
+
const root = Buffer.alloc(16);
|
|
350
|
+
root.write("BSJB", 0, "latin1");
|
|
351
|
+
root.writeUInt32LE(version.length, 12);
|
|
352
|
+
const streamsHead = Buffer.alloc(4);
|
|
353
|
+
streamsHead.writeUInt16LE(1, 2);
|
|
354
|
+
const streamHdr = Buffer.concat([Buffer.alloc(8), Buffer.from("#Strings\0\0\0\0", "latin1")]);
|
|
355
|
+
const metaLen = root.length + version.length + streamsHead.length + streamHdr.length;
|
|
356
|
+
streamHdr.writeUInt32LE(metaLen, 0);
|
|
357
|
+
streamHdr.writeUInt32LE(stringsPadded.length, 4);
|
|
358
|
+
const meta = Buffer.concat([root, version, streamsHead, streamHdr, stringsPadded]);
|
|
359
|
+
const clr = Buffer.alloc(72);
|
|
360
|
+
clrAt = place(clr);
|
|
361
|
+
const metaAt = place(meta);
|
|
362
|
+
clr.writeUInt32LE(72, 0);
|
|
363
|
+
clr.writeUInt32LE(sectionVA + metaAt, 8);
|
|
364
|
+
clr.writeUInt32LE(meta.length, 12);
|
|
365
|
+
}
|
|
366
|
+
const sectionData = Buffer.concat(section);
|
|
367
|
+
const sectionSize = Math.ceil(Math.max(sectionData.length, 1) / fileAlign) * fileAlign;
|
|
368
|
+
const certAt = sectionRaw + sectionSize;
|
|
369
|
+
const cert = spec.signed ? Buffer.alloc(16, 1) : Buffer.alloc(0);
|
|
370
|
+
const buf = Buffer.alloc(certAt + cert.length);
|
|
371
|
+
buf.write("MZ", 0, "latin1");
|
|
372
|
+
const peOff = 0x80;
|
|
373
|
+
buf.writeUInt32LE(peOff, 0x3c);
|
|
374
|
+
buf.write("PE\0\0", peOff, "latin1");
|
|
375
|
+
const coff = peOff + 4;
|
|
376
|
+
buf.writeUInt16LE(0x8664, coff);
|
|
377
|
+
buf.writeUInt16LE(1, coff + 2);
|
|
378
|
+
buf.writeUInt16LE(240, coff + 16);
|
|
379
|
+
buf.writeUInt16LE(0x0022 | (spec.dll ? 0x2000 : 0), coff + 18);
|
|
380
|
+
const opt = coff + 20;
|
|
381
|
+
buf.writeUInt16LE(0x20b, opt);
|
|
382
|
+
buf.writeUInt16LE(spec.dllCharacteristics ?? 0x8160, opt + 70);
|
|
383
|
+
buf.writeUInt32LE(16, opt + 108);
|
|
384
|
+
const dirs = opt + 112;
|
|
385
|
+
if (spec.signed) {
|
|
386
|
+
buf.writeUInt32LE(certAt, dirs + 4 * 8);
|
|
387
|
+
buf.writeUInt32LE(cert.length, dirs + 4 * 8 + 4);
|
|
388
|
+
}
|
|
389
|
+
if (debugEntries.length > 0) {
|
|
390
|
+
buf.writeUInt32LE(sectionVA + debugDirAt, dirs + 6 * 8);
|
|
391
|
+
buf.writeUInt32LE(debugEntries.length * 28, dirs + 6 * 8 + 4);
|
|
392
|
+
}
|
|
393
|
+
if (clrAt >= 0) {
|
|
394
|
+
buf.writeUInt32LE(sectionVA + clrAt, dirs + 14 * 8);
|
|
395
|
+
buf.writeUInt32LE(72, dirs + 14 * 8 + 4);
|
|
396
|
+
}
|
|
397
|
+
const sec = opt + 240;
|
|
398
|
+
buf.write(".text", sec, "latin1");
|
|
399
|
+
buf.writeUInt32LE(sectionSize, sec + 8);
|
|
400
|
+
buf.writeUInt32LE(sectionVA, sec + 12);
|
|
401
|
+
buf.writeUInt32LE(sectionSize, sec + 16);
|
|
402
|
+
buf.writeUInt32LE(sectionRaw, sec + 20);
|
|
403
|
+
sectionData.copy(buf, sectionRaw);
|
|
404
|
+
cert.copy(buf, certAt);
|
|
405
|
+
return buf;
|
|
406
|
+
}
|
|
407
|
+
/** Plain, descriptive identifiers like an unobfuscated assembly's metadata. */
|
|
408
|
+
export const READABLE_DOTNET_NAMES = [
|
|
409
|
+
"LicenseValidator", "ValidateLicenseKey", "ComputeChecksum", "SubscriptionManager", "UpgradeToPremium", "CancelSubscription",
|
|
410
|
+
"FeatureFlags", "EnableExperimentalScanner", "MaximumConcurrentScans", "Program", "Main", "Object", "String", "Console",
|
|
411
|
+
"WriteLine", "StartsWith", "IsNullOrEmpty", "get_CurrentPlan", "set_CurrentPlan", "CurrentPlan", "paymentToken", "key",
|
|
412
|
+
"args", "value", "validator", "manager", "DebuggableAttribute", "CompilationRelaxationsAttribute", "RuntimeCompatibilityAttribute",
|
|
413
|
+
"TargetFrameworkAttribute", "AssemblyCompanyAttribute", "AssemblyProductAttribute", "AssemblyTitleAttribute", "LicenseApp",
|
|
414
|
+
"System.Runtime", "System.Console", "<Module>", "<CurrentPlan>k__BackingField",
|
|
415
|
+
];
|
|
416
|
+
//# sourceMappingURL=testFixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testFixtures.js","sourceRoot":"","sources":["../../src/__tests__/testFixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/web.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { analyzeJavaScript, analyzeWebFiles, collapseRepeats, looksUnminified, parseSourceMap, sourceMappingUrl } from "../web.js";
|
|
3
|
+
const ids = (fs) => fs.map((f) => f.patternId).sort();
|
|
4
|
+
function unminifiedSource(lines = 80) {
|
|
5
|
+
const out = ["export class LicenseValidator {"];
|
|
6
|
+
for (let i = 0; i < lines; i++)
|
|
7
|
+
out.push(` validateLicenseKey${i}(key) {`, " return key.startsWith('GB-');", " }");
|
|
8
|
+
out.push("}");
|
|
9
|
+
return out.join("\n");
|
|
10
|
+
}
|
|
11
|
+
function minifiedSource() {
|
|
12
|
+
return Array.from({ length: 300 }, (_, i) => `function a${i}(b){return b+${i}}`).join(";") + "\n";
|
|
13
|
+
}
|
|
14
|
+
const file = (key, text) => ({ key, display: `dist/${key}`, size: Buffer.byteLength(text), read: () => Buffer.from(text) });
|
|
15
|
+
describe("parseSourceMap", () => {
|
|
16
|
+
it("counts sources and embedded sourcesContent, preferring app paths for the sample", () => {
|
|
17
|
+
const info = parseSourceMap(JSON.stringify({
|
|
18
|
+
version: 3,
|
|
19
|
+
mappings: "AAAA",
|
|
20
|
+
sources: ["webpack://app/node_modules/react/index.js", "webpack://app/src/billing/LicenseValidator.ts"],
|
|
21
|
+
sourcesContent: ["module.exports = 1", "export class LicenseValidator {}"],
|
|
22
|
+
}));
|
|
23
|
+
expect(info).toEqual({ sources: 2, embedded: 2, samplePaths: ["webpack://app/src/billing/LicenseValidator.ts"] });
|
|
24
|
+
});
|
|
25
|
+
it("rejects JSON that is not a source map", () => {
|
|
26
|
+
expect(parseSourceMap('{"name":"pkg"}')).toBeNull();
|
|
27
|
+
expect(parseSourceMap("not json")).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("analyzeJavaScript", () => {
|
|
31
|
+
it("flags an inline source map that embeds the original source as critical", () => {
|
|
32
|
+
const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/app.ts"], sourcesContent: ["const secretSauce = 1"] })).toString("base64");
|
|
33
|
+
const findings = analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=data:application/json;base64,${map}`, "app.js");
|
|
34
|
+
expect(findings).toHaveLength(1);
|
|
35
|
+
expect(findings[0]).toMatchObject({ patternId: "sourcemap_embeds_source", severity: "critical" });
|
|
36
|
+
expect(findings[0].match).toContain("src/app.ts");
|
|
37
|
+
});
|
|
38
|
+
it("finds an inline map much longer than the file's tail", () => {
|
|
39
|
+
const source = "x".repeat(200_000);
|
|
40
|
+
const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/big.ts"], sourcesContent: [source] })).toString("base64");
|
|
41
|
+
expect(ids(analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=data:application/json;base64,${map}\n`, "big.js"))).toEqual(["sourcemap_embeds_source"]);
|
|
42
|
+
});
|
|
43
|
+
it("uses the last mapping comment and ignores the key inside code or strings", () => {
|
|
44
|
+
expect(sourceMappingUrl('var s="//# sourceMappingURL=fake.map";\n//# sourceMappingURL=real.js.map\n')).toBe("real.js.map");
|
|
45
|
+
expect(sourceMappingUrl('x.sourceMappingURL=y;')).toBeNull();
|
|
46
|
+
expect(sourceMappingUrl("//@ sourceMappingURL=old.map \r\n")).toBe("old.map");
|
|
47
|
+
});
|
|
48
|
+
it("stays linear on adversarial input", () => {
|
|
49
|
+
const hostile = "//#sourceMappingURL=".repeat(50_000) + "x y";
|
|
50
|
+
const t = Date.now();
|
|
51
|
+
expect(sourceMappingUrl(hostile)).toBeNull();
|
|
52
|
+
expect(Date.now() - t).toBeLessThan(500);
|
|
53
|
+
});
|
|
54
|
+
it("flags an inline map without sources as sourcemap_inline", () => {
|
|
55
|
+
const map = Buffer.from(JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/app.ts"] })).toString("base64");
|
|
56
|
+
expect(ids(analyzeJavaScript(`x()\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${map}`, "app.js"))).toEqual(["sourcemap_inline"]);
|
|
57
|
+
});
|
|
58
|
+
it("reports an external sourceMappingURL as a low-severity reference", () => {
|
|
59
|
+
const [f] = analyzeJavaScript(`${minifiedSource()}//# sourceMappingURL=app.js.map\n`, "app.js");
|
|
60
|
+
expect(f).toMatchObject({ patternId: "sourcemap_reference", severity: "low", match: "//# sourceMappingURL=app.js.map" });
|
|
61
|
+
});
|
|
62
|
+
it("detects webpack eval-devtool bundles and does not also call them unminified", () => {
|
|
63
|
+
const text = `${unminifiedSource()}\neval("const a = 1;\\n\\n//# sourceURL=webpack://app/./src/index.js?");`;
|
|
64
|
+
expect(ids(analyzeJavaScript(text, "main.js"))).toEqual(["eval_devtool_bundle"]);
|
|
65
|
+
});
|
|
66
|
+
it("separates unminified from minified output", () => {
|
|
67
|
+
expect(looksUnminified(unminifiedSource()).unminified).toBe(true);
|
|
68
|
+
expect(looksUnminified(minifiedSource()).unminified).toBe(false);
|
|
69
|
+
expect(ids(analyzeJavaScript(unminifiedSource(), "app.js"))).toEqual(["unminified_bundle"]);
|
|
70
|
+
expect(analyzeJavaScript(minifiedSource(), "app.js")).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
it("skips the minification check for small files", () => {
|
|
73
|
+
expect(analyzeJavaScript(unminifiedSource(5), "small.js")).toEqual([]);
|
|
74
|
+
});
|
|
75
|
+
it("detects framework development builds", () => {
|
|
76
|
+
const [f] = analyzeJavaScript('var x=1;/** @license React\n * react-dom.development.js */', "vendor.js");
|
|
77
|
+
expect(f).toMatchObject({ patternId: "dev_build_framework" });
|
|
78
|
+
expect(f.match).toMatch(/^React:/);
|
|
79
|
+
});
|
|
80
|
+
it("finds fixed-format credentials and masks them", () => {
|
|
81
|
+
const [f] = analyzeJavaScript('const s3={accessKeyId:"AKIAQ7XKZP3LMNB2RTUV"};', "app.js");
|
|
82
|
+
expect(f).toMatchObject({ patternId: "bundle_secret", severity: "critical" });
|
|
83
|
+
expect(f.match).not.toContain("AKIAQ7XKZP3LMNB2RTUV");
|
|
84
|
+
expect(f.match).toContain("AKIA…");
|
|
85
|
+
});
|
|
86
|
+
it("ignores a PEM header that a crypto library keeps as a string constant", () => {
|
|
87
|
+
const text = 'const H="-----BEGIN RSA PRIVATE KEY-----",F="-----END RSA PRIVATE KEY-----";function p(t){return t.indexOf(H)}';
|
|
88
|
+
expect(analyzeJavaScript(text, "crypto.js")).toEqual([]);
|
|
89
|
+
});
|
|
90
|
+
it("flags a private key whose base64 body follows the header, also inside an escaped string", () => {
|
|
91
|
+
const body = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJTUt9Us8cKjMzEfYyjiWA4R4";
|
|
92
|
+
expect(ids(analyzeJavaScript(`const k="-----BEGIN RSA PRIVATE KEY-----\\n${body}\\n-----END RSA PRIVATE KEY-----";`, "a.js"))).toEqual(["bundle_secret"]);
|
|
93
|
+
expect(ids(analyzeJavaScript(`const k=\`-----BEGIN PRIVATE KEY-----\n${body}\n-----END PRIVATE KEY-----\`;`, "b.js"))).toEqual(["bundle_secret"]);
|
|
94
|
+
});
|
|
95
|
+
it("skips connection-string placeholders shown in UI hints, in any language", () => {
|
|
96
|
+
const text = 'const t={en:"postgresql://user:password@host:5432/mydb",tr:"postgresql://kullanici:sifre@host:5432/veritabani",m:"mongodb://admin:***@db.example.net/app"}';
|
|
97
|
+
expect(analyzeJavaScript(text, "i18n.js")).toEqual([]);
|
|
98
|
+
});
|
|
99
|
+
it("still flags a connection string with a real-looking password and host", () => {
|
|
100
|
+
// Assembled at runtime so the repository's own secretlint hook does not read it as a leak.
|
|
101
|
+
const url = ["postgresql://shop", "Zx81kqL2vT@db-prod.shop-internal.net:5432/orders"].join(":");
|
|
102
|
+
const [f] = analyzeJavaScript(`const db="${url}";`, "app.js");
|
|
103
|
+
expect(f).toMatchObject({ patternId: "bundle_secret", severity: "critical" });
|
|
104
|
+
});
|
|
105
|
+
it("skips documented example keys", () => {
|
|
106
|
+
expect(analyzeJavaScript('const k="AKIAIOSFODNN7EXAMPLE";', "docs.js")).toEqual([]);
|
|
107
|
+
});
|
|
108
|
+
it("lists internal and non-production hosts but not look-alike public ones", () => {
|
|
109
|
+
const text = 'fetch("http://localhost:3000/api");fetch("https://api.staging.example.com");fetch("http://10.0.4.12:8080");fetch("https://developer.mozilla.org/docs");fetch("https://devtools.example.com")';
|
|
110
|
+
const [f] = analyzeJavaScript(text, "app.js");
|
|
111
|
+
expect(f.patternId).toBe("internal_endpoint");
|
|
112
|
+
expect(f.match).toBe("http://localhost:3000, https://api.staging.example.com, http://10.0.4.12:8080");
|
|
113
|
+
});
|
|
114
|
+
it("returns nothing for a clean production bundle", () => {
|
|
115
|
+
expect(analyzeJavaScript(minifiedSource(), "app.js")).toEqual([]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("analyzeWebFiles", () => {
|
|
119
|
+
it("reports a shipped map once, through the map file, instead of also as a reference", () => {
|
|
120
|
+
const map = JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/a.ts"], sourcesContent: ["x"] });
|
|
121
|
+
const findings = analyzeWebFiles([
|
|
122
|
+
file("assets/app.js", `${minifiedSource()}//# sourceMappingURL=app.js.map`),
|
|
123
|
+
file("assets/app.js.map", map),
|
|
124
|
+
]);
|
|
125
|
+
expect(ids(findings)).toEqual(["sourcemap_embeds_source"]);
|
|
126
|
+
expect(findings[0].file).toBe("dist/assets/app.js.map");
|
|
127
|
+
});
|
|
128
|
+
it("resolves ../ references when matching maps", () => {
|
|
129
|
+
const map = JSON.stringify({ version: 3, mappings: "AAAA", sources: ["src/a.ts"] });
|
|
130
|
+
const findings = analyzeWebFiles([file("js/app.js", `${minifiedSource()}//# sourceMappingURL=../maps/app.js.map`), file("maps/app.js.map", map)]);
|
|
131
|
+
expect(ids(findings)).toEqual(["sourcemap_shipped"]);
|
|
132
|
+
});
|
|
133
|
+
it("keeps the reference when the map is not part of the artifact", () => {
|
|
134
|
+
expect(ids(analyzeWebFiles([file("app.js", `${minifiedSource()}//# sourceMappingURL=app.js.map`)]))).toEqual(["sourcemap_reference"]);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe("collapseRepeats", () => {
|
|
138
|
+
it("reports one finding per distinct secret and says how far it spreads", () => {
|
|
139
|
+
const chunk = 'const k="AKIAQ7XKZP3LMNB2RTUV";';
|
|
140
|
+
const findings = analyzeWebFiles([file("a.js", chunk), file("b.js", chunk), file("c.js", chunk)]);
|
|
141
|
+
expect(findings).toHaveLength(1);
|
|
142
|
+
expect(findings[0].match).toContain("also in 2 other file(s)");
|
|
143
|
+
});
|
|
144
|
+
it("merges internal hosts across files and collapses long lists of unminified files", () => {
|
|
145
|
+
const files = Array.from({ length: 7 }, (_, i) => file(`chunk${i}.js`, `${unminifiedSource()}\nfetch("http://localhost:${3000 + i}")`));
|
|
146
|
+
const findings = analyzeWebFiles(files);
|
|
147
|
+
expect(ids(findings)).toEqual(["internal_endpoint", "unminified_bundle"]);
|
|
148
|
+
expect(findings.find((f) => f.patternId === "unminified_bundle").match).toBe("7 files, e.g. chunk0.js, chunk1.js, chunk2.js");
|
|
149
|
+
expect(findings.find((f) => f.patternId === "internal_endpoint").match).toContain("— in 7 files");
|
|
150
|
+
});
|
|
151
|
+
it("leaves short lists alone", () => {
|
|
152
|
+
const one = analyzeJavaScript(unminifiedSource(), "x.js");
|
|
153
|
+
expect(collapseRepeats([...one, ...one])).toHaveLength(2);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=web.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.test.js","sourceRoot":"","sources":["../../src/__tests__/web.test.ts"],"names":[],"mappings":"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"}
|