@zip.js/zip.js 2.15.0 → 2.16.1
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/BENCHMARKS.md +4 -2
- package/deno.json +1 -1
- package/dist/zip-core-external.js +410 -227
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +234 -109
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +552 -237
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +377 -118
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +552 -237
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +379 -120
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +554 -237
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +236 -111
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +236 -111
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +411 -228
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +1 -1
- package/index-native.cjs +379 -120
- package/index-native.min.js +1 -1
- package/index.cjs +554 -237
- package/index.d.cts +143 -16
- package/index.d.ts +143 -16
- package/index.min.js +1 -1
- package/lib/core/io.js +3 -2
- package/lib/core/streams/aes-crypto-stream.js +60 -17
- package/lib/core/streams/zip-crypto-stream.js +7 -7
- package/lib/core/streams/zip-entry-stream.js +146 -73
- package/lib/core/streams/zlib-wasm/zlib-streams.js +176 -118
- package/lib/core/util/compatible-streams.js +10 -5
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +144 -10
- package/lib/core/zip-reader.js +5 -5
- package/lib/core/zip-writer.js +4 -2
- package/package.json +3 -2
package/dist/zip-fs-native.js
CHANGED
|
@@ -223,7 +223,7 @@
|
|
|
223
223
|
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
224
224
|
const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
|
|
225
225
|
const ERR_ABORTED = "The operation was aborted";
|
|
226
|
-
const ABORT_ERROR_NAME = "AbortError";
|
|
226
|
+
const ABORT_ERROR_NAME$1 = "AbortError";
|
|
227
227
|
|
|
228
228
|
function checkFunctionOption(value) {
|
|
229
229
|
if (value && typeof value != FUNCTION_TYPE) {
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
|
|
242
242
|
function throwIfAborted(signal) {
|
|
243
243
|
if (signal && signal.aborted) {
|
|
244
|
-
throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
|
|
244
|
+
throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME$1) : signal.reason;
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
|
|
@@ -445,7 +445,7 @@
|
|
|
445
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],c=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],t=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],s=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const u=new Uint8Array(30).fill(5);function f(n){const r=new Uint16Array(16);for(const c of n)r[c]++;r[0]=0;const c=new Uint16Array(17);for(let n=1;n<=15;n++)c[n+1]=c[n]+r[n];const t=new Uint16Array(n.length);for(let r=0;r<n.length;r++)n[r]&&(t[c[n[r]]++]=r);return {lengthCounts:r,symbols:t}}const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=(v=()=>function(i){let o=0,v=0,O=0,E=new Uint8Array(1024),l=0,C=0;for(;!C;){C=g(1);const n=g(2);if(0==n)B();else if(1==n)V(f(e),f(u));else {if(2!=n)throw new Error("invalid deflate block type");V(...L());}}return E.subarray(0,l);function W(){if(o>=i.length)throw new Error("unexpected end of deflate data");return i[o++]}function g(n){for(;O<n;)v|=W()<<O,O+=8;const r=v&(1<<n)-1;return v>>>=n,O-=n,r}function B(){v=0,O=0;const n=W()|W()<<8;o+=2,b(l+n);for(let r=0;r<n;r++)E[l++]=W();}function V(s,e){let u=a(s);for(;256!=u;){if(u<256)b(l+1),E[l++]=u;else {const s=u-257,f=n[s]+g(r[s]),i=a(e),o=c[i]+g(t[i]);b(l+f);const v=l-o;for(let n=0;n<f;n++)E[l++]=E[v+n];}u=a(s);}}function L(){const n=g(5)+257,r=g(5)+1,c=g(4)+4,t=new Uint8Array(19);for(let n=0;n<c;n++)t[s[n]]=g(3);const e=f(t),u=new Uint8Array(n+r);let i=0;for(;i<u.length;){const n=a(e);if(n<16)u[i++]=n;else if(16==n){const n=u[i-1];let r=g(2)+3;for(;r--;)u[i++]=n;}else i+=17==n?g(3)+3:g(7)+11;}return [f(u.subarray(0,n)),f(u.subarray(n))]}function a(n){const{lengthCounts:r,symbols:c}=n;let t=0,s=0,e=0;for(let n=1;n<=15;n++){t|=g(1);const u=r[n];if(t-s<u)return c[e+(t-s)];e+=u,s=s+u<<1,t<<=1;}throw new Error("invalid huffman code")}function b(n){if(E.length<n){let r=2*E.length;for(;r<n;)r*=2;const c=new Uint8Array(r);c.set(E.subarray(0,l)),E=c;}}}(function(n){const r=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,c=[];for(let t=0;t<r;t+=4){const r=i.indexOf(n[t])<<18|i.indexOf(n[t+1])<<12|(63&i.indexOf(n[t+2]))<<6|63&i.indexOf(n[t+3]);c.push(r>>16&255),"="!==n[t+2]&&c.push(r>>8&255),"="!==n[t+3]&&c.push(255&r);}return new Uint8Array(c)}("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")),n=>n({workerURI:n=>{const r="text/javascript";let c=v();if("string"==typeof c&&(c=(new TextEncoder).encode(c)),n){const n=new Blob([c],{type:r});return URL.createObjectURL(n)}return "data:"+r+";base64,"+function(n){let r="";const c=n.length;let t=0;for(;t+2<c;t+=3){const c=n[t]<<16|n[t+1]<<8|n[t+2];r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+i[63&c];}const s=c-t;if(1===s){const c=n[t]<<16;r+=i[c>>18&63]+i[c>>12&63]+"==";}else if(2===s){const c=n[t]<<16|n[t+1]<<8;r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+"=";}return r}(c)}}));var v;
|
|
448
|
+
const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],r=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],o=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],V=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],L$1=new Uint8Array(288);L$1.fill(8,0,144),L$1.fill(9,144,256),L$1.fill(7,256,280),L$1.fill(8,280,288);const a=new Uint8Array(30).fill(5);function l(n){const t=new Uint16Array(16);for(const r of n)t[r]++;t[0]=0;const r=new Uint16Array(17);for(let n=1;n<=15;n++)r[n+1]=r[n]+t[n];const o=new Uint16Array(n.length);for(let t=0;t<n.length;t++)n[t]&&(o[r[n[t]]++]=t);return {lengthCounts:t,symbols:o}}const s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(C$1=()=>function(s){let f=0,C=0,K=0,u=new Uint8Array(1024),e=0,g=0;for(;!g;){g=h(1);const n=h(2);if(0==n)q();else if(1==n)b(l(L$1),l(a));else {if(2!=n)throw new Error("invalid deflate block type");b(...c());}}return u.subarray(0,e);function J(){if(f>=s.length)throw new Error("unexpected end of deflate data");return s[f++]}function h(n){for(;K<n;)C|=J()<<K,K+=8;const t=C&(1<<n)-1;return C>>>=n,K-=n,t}function q(){C=0,K=0;const n=J()|J()<<8;f+=2,A(e+n);for(let t=0;t<n;t++)u[e++]=J();}function b(V,L){let a=W(V);for(;256!=a;){if(a<256)A(e+1),u[e++]=a;else {const V=a-257,l=n[V]+h(t[V]),s=W(L),f=r[s]+h(o[s]);A(e+l);const C=e-f;for(let n=0;n<l;n++)u[e++]=u[C+n];}a=W(V);}}function c(){const n=h(5)+257,t=h(5)+1,r=h(4)+4,o=new Uint8Array(19);for(let n=0;n<r;n++)o[V[n]]=h(3);const L=l(o),a=new Uint8Array(n+t);let s=0;for(;s<a.length;){const n=W(L);if(n<16)a[s++]=n;else if(16==n){const n=a[s-1];let t=h(2)+3;for(;t--;)a[s++]=n;}else s+=17==n?h(3)+3:h(7)+11;}return [l(a.subarray(0,n)),l(a.subarray(n))]}function W(n){const{lengthCounts:t,symbols:r}=n;let o=0,V=0,L=0;for(let n=1;n<=15;n++){o|=h(1);const a=t[n];if(o-V<a)return r[L+(o-V)];L+=a,V=V+a<<1,o<<=1;}throw new Error("invalid huffman code")}function A(n){if(u.length<n){let t=2*u.length;for(;t<n;)t*=2;const r=new Uint8Array(t);r.set(u.subarray(0,e)),u=r;}}}(function(n){const t=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let o=0;o<t;o+=4){const t=s.indexOf(n[o])<<18|s.indexOf(n[o+1])<<12|(63&s.indexOf(n[o+2]))<<6|63&s.indexOf(n[o+3]);r.push(t>>16&255),"="!==n[o+2]&&r.push(t>>8&255),"="!==n[o+3]&&r.push(255&t);}return new Uint8Array(r)}("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")),n=>n({workerURI:n=>{const t="text/javascript";let r=C$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),n){const n=new Blob([r],{type:t});return URL.createObjectURL(n)}return "data:"+t+";base64,"+function(n){let t="";const r=n.length;let o=0;for(;o+2<r;o+=3){const r=n[o]<<16|n[o+1]<<8|n[o+2];t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r];}const V=r-o;if(1===V){const r=n[o]<<16;t+=s[r>>18&63]+s[r>>12&63]+"==";}else if(2===V){const r=n[o]<<16|n[o+1]<<8;t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+"=";}return t}(r)}}));var C$1;
|
|
449
449
|
|
|
450
450
|
/*
|
|
451
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1285,12 +1285,12 @@
|
|
|
1285
1285
|
class AESDecryptionStream extends TransformStream {
|
|
1286
1286
|
|
|
1287
1287
|
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
|
|
1288
|
+
const aesCrypto = {};
|
|
1288
1289
|
super({
|
|
1289
1290
|
start() {
|
|
1290
|
-
initAesCrypto(
|
|
1291
|
+
initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
|
|
1291
1292
|
},
|
|
1292
1293
|
async transform(chunk, controller) {
|
|
1293
|
-
const aesCrypto = this;
|
|
1294
1294
|
const {
|
|
1295
1295
|
password,
|
|
1296
1296
|
strength,
|
|
@@ -1309,6 +1309,9 @@
|
|
|
1309
1309
|
} else {
|
|
1310
1310
|
await ready;
|
|
1311
1311
|
}
|
|
1312
|
+
if (aesCrypto.discarded) {
|
|
1313
|
+
return;
|
|
1314
|
+
}
|
|
1312
1315
|
const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - ((chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH));
|
|
1313
1316
|
controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
|
|
1314
1317
|
},
|
|
@@ -1317,9 +1320,12 @@
|
|
|
1317
1320
|
engine,
|
|
1318
1321
|
pendingInput,
|
|
1319
1322
|
ready
|
|
1320
|
-
} =
|
|
1323
|
+
} = aesCrypto;
|
|
1321
1324
|
if (engine) {
|
|
1322
1325
|
await ready;
|
|
1326
|
+
if (aesCrypto.discarded) {
|
|
1327
|
+
return;
|
|
1328
|
+
}
|
|
1323
1329
|
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1324
1330
|
const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
|
|
1325
1331
|
engine.process(decryptedChunkArray, true);
|
|
@@ -1329,27 +1335,26 @@
|
|
|
1329
1335
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1330
1336
|
}
|
|
1331
1337
|
if (invalidAuthenticationCode && checkAuthenticationCode) {
|
|
1332
|
-
|
|
1338
|
+
controller.error(new Error(ERR_INVALID_AUTHENTICATION_CODE));
|
|
1339
|
+
return;
|
|
1333
1340
|
}
|
|
1334
1341
|
controller.enqueue(decryptedChunkArray);
|
|
1335
1342
|
}
|
|
1336
|
-
},
|
|
1337
|
-
cancel() {
|
|
1338
|
-
disposeEngine(this);
|
|
1339
1343
|
}
|
|
1340
1344
|
});
|
|
1345
|
+
setDisposingReadable(this, aesCrypto);
|
|
1341
1346
|
}
|
|
1342
1347
|
}
|
|
1343
1348
|
|
|
1344
1349
|
class AESEncryptionStream extends TransformStream {
|
|
1345
1350
|
|
|
1346
1351
|
constructor({ password, rawPassword, encryptionStrength }) {
|
|
1352
|
+
const aesCrypto = {};
|
|
1347
1353
|
super({
|
|
1348
1354
|
start() {
|
|
1349
|
-
initAesCrypto(
|
|
1355
|
+
initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
|
|
1350
1356
|
},
|
|
1351
1357
|
async transform(chunk, controller) {
|
|
1352
|
-
const aesCrypto = this;
|
|
1353
1358
|
const {
|
|
1354
1359
|
password,
|
|
1355
1360
|
strength,
|
|
@@ -1363,6 +1368,9 @@
|
|
|
1363
1368
|
} else {
|
|
1364
1369
|
await ready;
|
|
1365
1370
|
}
|
|
1371
|
+
if (aesCrypto.discarded) {
|
|
1372
|
+
return;
|
|
1373
|
+
}
|
|
1366
1374
|
const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
|
|
1367
1375
|
output.set(preamble, 0);
|
|
1368
1376
|
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
|
|
@@ -1372,19 +1380,20 @@
|
|
|
1372
1380
|
engine,
|
|
1373
1381
|
pendingInput,
|
|
1374
1382
|
ready
|
|
1375
|
-
} =
|
|
1383
|
+
} = aesCrypto;
|
|
1376
1384
|
if (engine) {
|
|
1377
1385
|
await ready;
|
|
1386
|
+
if (aesCrypto.discarded) {
|
|
1387
|
+
return;
|
|
1388
|
+
}
|
|
1378
1389
|
const encryptedChunkArray = new Uint8Array(pendingInput);
|
|
1379
1390
|
engine.process(encryptedChunkArray, false);
|
|
1380
1391
|
const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1381
1392
|
controller.enqueue(concat(encryptedChunkArray, authenticationCode));
|
|
1382
1393
|
}
|
|
1383
|
-
},
|
|
1384
|
-
cancel() {
|
|
1385
|
-
disposeEngine(this);
|
|
1386
1394
|
}
|
|
1387
1395
|
});
|
|
1396
|
+
setDisposingReadable(this, aesCrypto);
|
|
1388
1397
|
}
|
|
1389
1398
|
}
|
|
1390
1399
|
|
|
@@ -1393,7 +1402,37 @@
|
|
|
1393
1402
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1394
1403
|
password: encodePassword(password, rawPassword),
|
|
1395
1404
|
strength: encryptionStrength - 1,
|
|
1396
|
-
pendingInput: EMPTY_UINT8_ARRAY
|
|
1405
|
+
pendingInput: EMPTY_UINT8_ARRAY,
|
|
1406
|
+
discarded: false
|
|
1407
|
+
});
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
function setDisposingReadable(stream, aesCrypto) {
|
|
1411
|
+
const reader = stream.readable.getReader();
|
|
1412
|
+
const readable = new ReadableStream({
|
|
1413
|
+
async pull(controller) {
|
|
1414
|
+
try {
|
|
1415
|
+
const { value, done } = await reader.read();
|
|
1416
|
+
if (done) {
|
|
1417
|
+
controller.close();
|
|
1418
|
+
} else {
|
|
1419
|
+
controller.enqueue(value);
|
|
1420
|
+
}
|
|
1421
|
+
} catch (error) {
|
|
1422
|
+
disposeEngine(aesCrypto);
|
|
1423
|
+
reader.cancel(error).catch(() => { });
|
|
1424
|
+
throw error;
|
|
1425
|
+
}
|
|
1426
|
+
},
|
|
1427
|
+
cancel(reason) {
|
|
1428
|
+
disposeEngine(aesCrypto);
|
|
1429
|
+
return reader.cancel(reason);
|
|
1430
|
+
}
|
|
1431
|
+
});
|
|
1432
|
+
Object.defineProperty(stream, "readable", {
|
|
1433
|
+
get() {
|
|
1434
|
+
return readable;
|
|
1435
|
+
}
|
|
1397
1436
|
});
|
|
1398
1437
|
}
|
|
1399
1438
|
|
|
@@ -1426,7 +1465,9 @@
|
|
|
1426
1465
|
}
|
|
1427
1466
|
}
|
|
1428
1467
|
|
|
1429
|
-
function disposeEngine(
|
|
1468
|
+
function disposeEngine(aesCrypto) {
|
|
1469
|
+
const { engine } = aesCrypto;
|
|
1470
|
+
aesCrypto.discarded = true;
|
|
1430
1471
|
if (engine && engine.dispose) {
|
|
1431
1472
|
engine.dispose();
|
|
1432
1473
|
}
|
|
@@ -1443,6 +1484,9 @@
|
|
|
1443
1484
|
const keyLength = KEY_LENGTH[strength];
|
|
1444
1485
|
const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
|
|
1445
1486
|
aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
|
|
1487
|
+
if (aesCrypto.discarded) {
|
|
1488
|
+
disposeEngine(aesCrypto);
|
|
1489
|
+
}
|
|
1446
1490
|
return subarray(compositeKey, keyLength * 2);
|
|
1447
1491
|
}
|
|
1448
1492
|
|
|
@@ -1594,11 +1638,11 @@
|
|
|
1594
1638
|
}
|
|
1595
1639
|
|
|
1596
1640
|
function createKeys(target, password, rawPassword) {
|
|
1597
|
-
const
|
|
1641
|
+
const cryptoKeys = [0x12345678, 0x23456789, 0x34567890];
|
|
1598
1642
|
Object.assign(target, {
|
|
1599
|
-
|
|
1600
|
-
crcKey0: new Crc32(
|
|
1601
|
-
crcKey2: new Crc32(
|
|
1643
|
+
cryptoKeys,
|
|
1644
|
+
crcKey0: new Crc32(cryptoKeys[0]),
|
|
1645
|
+
crcKey2: new Crc32(cryptoKeys[2])
|
|
1602
1646
|
});
|
|
1603
1647
|
if (rawPassword) {
|
|
1604
1648
|
for (let index = 0; index < rawPassword.length; index++) {
|
|
@@ -1612,17 +1656,17 @@
|
|
|
1612
1656
|
}
|
|
1613
1657
|
|
|
1614
1658
|
function updateKeys(target, byte) {
|
|
1615
|
-
let [, key1] = target.
|
|
1659
|
+
let [, key1] = target.cryptoKeys;
|
|
1616
1660
|
target.crcKey0.append([byte]);
|
|
1617
1661
|
const key0 = ~target.crcKey0.get();
|
|
1618
1662
|
key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
|
|
1619
1663
|
target.crcKey2.append([key1 >>> 24]);
|
|
1620
1664
|
const key2 = ~target.crcKey2.get();
|
|
1621
|
-
target.
|
|
1665
|
+
target.cryptoKeys = [key0, key1, key2];
|
|
1622
1666
|
}
|
|
1623
1667
|
|
|
1624
1668
|
function getByte(target) {
|
|
1625
|
-
const temp = target.
|
|
1669
|
+
const temp = target.cryptoKeys[2] | 2;
|
|
1626
1670
|
return getInt8(Math.imul(temp, (temp ^ 1)) >>> 8);
|
|
1627
1671
|
}
|
|
1628
1672
|
|
|
@@ -1670,11 +1714,16 @@
|
|
|
1670
1714
|
const reader = readable.getReader();
|
|
1671
1715
|
return new ReadableStream({
|
|
1672
1716
|
async pull(controller) {
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1717
|
+
try {
|
|
1718
|
+
const { value, done } = await reader.read();
|
|
1719
|
+
if (done) {
|
|
1720
|
+
controller.close();
|
|
1721
|
+
} else {
|
|
1722
|
+
controller.enqueue(value);
|
|
1723
|
+
}
|
|
1724
|
+
} catch (error) {
|
|
1725
|
+
reader.cancel(error).catch(() => { });
|
|
1726
|
+
throw error;
|
|
1678
1727
|
}
|
|
1679
1728
|
},
|
|
1680
1729
|
cancel(reason) {
|
|
@@ -1860,7 +1909,6 @@
|
|
|
1860
1909
|
const GZIP_HEADER_LENGTH = 10;
|
|
1861
1910
|
const GZIP_TRAILER_LENGTH = 8;
|
|
1862
1911
|
const GZIP_HEADER_BYTES = [0x1f, 0x8b, 0x08];
|
|
1863
|
-
const GZIP_OUTPUT_STALL_TIMEOUT = 5000;
|
|
1864
1912
|
|
|
1865
1913
|
class DeflateStream extends TransformStream {
|
|
1866
1914
|
|
|
@@ -1871,7 +1919,7 @@
|
|
|
1871
1919
|
let crc32Stream, encryptionStream, gzipCrc32Stream;
|
|
1872
1920
|
let readable = super.readable;
|
|
1873
1921
|
const codecStreams = format && getCodecStreams(format);
|
|
1874
|
-
const GzipCompressionStream =
|
|
1922
|
+
const GzipCompressionStream = getGzipCodecStream(useCompressionStream, CompressionStream, CompressionStreamFallback);
|
|
1875
1923
|
const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) && Boolean(GzipCompressionStream);
|
|
1876
1924
|
if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
|
|
1877
1925
|
crc32Stream = new Crc32Stream();
|
|
@@ -1888,6 +1936,9 @@
|
|
|
1888
1936
|
try {
|
|
1889
1937
|
readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamFallback);
|
|
1890
1938
|
} catch (error) {
|
|
1939
|
+
if (!useCompressionStream && CompressionStreamFallback) {
|
|
1940
|
+
throw error;
|
|
1941
|
+
}
|
|
1891
1942
|
let gzipStream;
|
|
1892
1943
|
try {
|
|
1893
1944
|
gzipStream = new CompressionStream(FORMAT_GZIP);
|
|
@@ -1957,74 +2008,134 @@
|
|
|
1957
2008
|
}
|
|
1958
2009
|
|
|
1959
2010
|
function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32) {
|
|
2011
|
+
const writer = gzipStream.writable.getWriter();
|
|
2012
|
+
const reader = gzipStream.readable.getReader();
|
|
2013
|
+
const outputCrc32 = crc32 === UNDEFINED_VALUE ? new Crc32() : UNDEFINED_VALUE;
|
|
1960
2014
|
let outputLength = 0;
|
|
1961
2015
|
let inputDone = false;
|
|
1962
|
-
let
|
|
2016
|
+
let trailerWritten = false;
|
|
2017
|
+
let idleCheckArmed = false;
|
|
2018
|
+
let readCount = 0;
|
|
2019
|
+
let readPending = false;
|
|
1963
2020
|
let resolveTrailerReady, rejectTrailerReady;
|
|
1964
2021
|
const trailerReady = new Promise((resolve, reject) => {
|
|
1965
2022
|
resolveTrailerReady = resolve;
|
|
1966
2023
|
rejectTrailerReady = reject;
|
|
1967
2024
|
});
|
|
1968
2025
|
trailerReady.catch(() => { });
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
2026
|
+
pump();
|
|
2027
|
+
return new ReadableStream({
|
|
2028
|
+
async pull(controller) {
|
|
2029
|
+
try {
|
|
2030
|
+
const { value, done } = await read();
|
|
2031
|
+
if (done) {
|
|
2032
|
+
controller.close();
|
|
2033
|
+
} else {
|
|
2034
|
+
outputLength += value.length;
|
|
2035
|
+
if (outputLength > outputSize) {
|
|
2036
|
+
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
2037
|
+
}
|
|
2038
|
+
if (outputCrc32) {
|
|
2039
|
+
outputCrc32.append(value);
|
|
2040
|
+
}
|
|
2041
|
+
controller.enqueue(value);
|
|
2042
|
+
}
|
|
2043
|
+
} catch (error) {
|
|
2044
|
+
rejectTrailerReady(error);
|
|
2045
|
+
await cancel(reader, error);
|
|
2046
|
+
throw trailerWritten ? getTrailerError(error) : error;
|
|
2047
|
+
}
|
|
2048
|
+
},
|
|
2049
|
+
cancel(reason) {
|
|
2050
|
+
rejectTrailerReady(reason);
|
|
2051
|
+
return reader.cancel(reason);
|
|
2052
|
+
}
|
|
2053
|
+
});
|
|
2054
|
+
|
|
2055
|
+
async function pump() {
|
|
2056
|
+
const inputReader = readable.getReader();
|
|
2057
|
+
try {
|
|
1974
2058
|
const header = new Uint8Array(GZIP_HEADER_LENGTH);
|
|
1975
2059
|
header.set(GZIP_HEADER_BYTES);
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
2060
|
+
await writer.write(header);
|
|
2061
|
+
for (; ;) {
|
|
2062
|
+
await writer.ready;
|
|
2063
|
+
const { value, done } = await inputReader.read();
|
|
2064
|
+
if (done) {
|
|
2065
|
+
break;
|
|
2066
|
+
}
|
|
2067
|
+
await writer.write(value);
|
|
2068
|
+
}
|
|
1982
2069
|
inputDone = true;
|
|
1983
|
-
|
|
1984
|
-
|
|
2070
|
+
if (outputCrc32) {
|
|
2071
|
+
if (readPending) {
|
|
2072
|
+
armIdleCheck();
|
|
2073
|
+
}
|
|
1985
2074
|
await trailerReady;
|
|
1986
|
-
} finally {
|
|
1987
|
-
stopWatchdog();
|
|
1988
2075
|
}
|
|
1989
2076
|
const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
|
|
1990
2077
|
const dataView = getDataView(trailer);
|
|
1991
|
-
dataView.setUint32(0,
|
|
2078
|
+
dataView.setUint32(0, outputCrc32 ? outputCrc32.get() : crc32, true);
|
|
1992
2079
|
dataView.setUint32(4, outputSize, true);
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
2080
|
+
trailerWritten = true;
|
|
2081
|
+
await writer.write(trailer);
|
|
2082
|
+
await writer.close();
|
|
2083
|
+
} catch (error) {
|
|
2084
|
+
await abort(writer, error);
|
|
2085
|
+
await cancel(inputReader, error);
|
|
1997
2086
|
}
|
|
1998
|
-
}
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
}
|
|
2008
|
-
controller.enqueue(chunk);
|
|
2009
|
-
},
|
|
2010
|
-
cancel(reason) {
|
|
2011
|
-
rejectTrailerReady(reason);
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
function read() {
|
|
2090
|
+
readCount++;
|
|
2091
|
+
readPending = true;
|
|
2092
|
+
const result = reader.read();
|
|
2093
|
+
result.then(onReadSettled, onReadSettled);
|
|
2094
|
+
if (inputDone && outputCrc32) {
|
|
2095
|
+
armIdleCheck();
|
|
2012
2096
|
}
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
readable = pipeThroughBackpressured(readable, gzipStream);
|
|
2016
|
-
return pipeThrough(readable, outputStream);
|
|
2097
|
+
return result;
|
|
2098
|
+
}
|
|
2017
2099
|
|
|
2018
|
-
function
|
|
2019
|
-
|
|
2020
|
-
watchdogTimeout = setTimeout(() => rejectTrailerReady(new Error(ERR_INVALID_UNCOMPRESSED_SIZE)), GZIP_OUTPUT_STALL_TIMEOUT);
|
|
2100
|
+
function onReadSettled() {
|
|
2101
|
+
readPending = false;
|
|
2021
2102
|
}
|
|
2022
2103
|
|
|
2023
|
-
function
|
|
2024
|
-
|
|
2104
|
+
async function armIdleCheck() {
|
|
2105
|
+
if (!idleCheckArmed) {
|
|
2106
|
+
idleCheckArmed = true;
|
|
2107
|
+
const count = readCount;
|
|
2108
|
+
await nextTask();
|
|
2109
|
+
idleCheckArmed = false;
|
|
2110
|
+
if (readPending) {
|
|
2111
|
+
if (readCount == count) {
|
|
2112
|
+
resolveTrailerReady();
|
|
2113
|
+
} else {
|
|
2114
|
+
armIdleCheck();
|
|
2115
|
+
}
|
|
2116
|
+
}
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
function getTrailerError(error) {
|
|
2121
|
+
const trailerError = new Error(outputLength == outputSize ? ERR_INVALID_CRC32 : ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
2122
|
+
trailerError.cause = error;
|
|
2123
|
+
return trailerError;
|
|
2025
2124
|
}
|
|
2026
2125
|
}
|
|
2027
2126
|
|
|
2127
|
+
function nextTask() {
|
|
2128
|
+
return new Promise(resolve => {
|
|
2129
|
+
const { port1, port2 } = new MessageChannel();
|
|
2130
|
+
port2.onmessage = () => {
|
|
2131
|
+
port1.close();
|
|
2132
|
+
port2.close();
|
|
2133
|
+
resolve();
|
|
2134
|
+
};
|
|
2135
|
+
port1.postMessage(UNDEFINED_VALUE);
|
|
2136
|
+
});
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2028
2139
|
class InflateStream extends TransformStream {
|
|
2029
2140
|
|
|
2030
2141
|
constructor(options, { chunkSize, DecompressionStreamFallback, DecompressionStream }) {
|
|
@@ -2045,20 +2156,32 @@
|
|
|
2045
2156
|
if (codecStreams) {
|
|
2046
2157
|
readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize, compressionMethod, rawBitFlag, uncompressedSize: outputSize }));
|
|
2047
2158
|
} else {
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
if (deflate64 || outputSize === UNDEFINED_VALUE) {
|
|
2052
|
-
throw error;
|
|
2053
|
-
}
|
|
2054
|
-
let gzipStream;
|
|
2159
|
+
let gzipStream;
|
|
2160
|
+
const GzipDecompressionStream = getGzipCodecStream(useCompressionStream, DecompressionStream, DecompressionStreamFallback);
|
|
2161
|
+
if (checkCrc32 && !deflate64 && crc32 !== UNDEFINED_VALUE && outputSize !== UNDEFINED_VALUE && GzipDecompressionStream) {
|
|
2055
2162
|
try {
|
|
2056
|
-
gzipStream = new
|
|
2163
|
+
gzipStream = new GzipDecompressionStream(FORMAT_GZIP, { chunkSize });
|
|
2057
2164
|
} catch {
|
|
2058
|
-
|
|
2165
|
+
gzipStream = UNDEFINED_VALUE;
|
|
2059
2166
|
}
|
|
2060
|
-
|
|
2061
|
-
|
|
2167
|
+
}
|
|
2168
|
+
if (!gzipStream) {
|
|
2169
|
+
try {
|
|
2170
|
+
readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
|
|
2171
|
+
} catch (error) {
|
|
2172
|
+
if (deflate64 || outputSize === UNDEFINED_VALUE || (!useCompressionStream && DecompressionStreamFallback)) {
|
|
2173
|
+
throw error;
|
|
2174
|
+
}
|
|
2175
|
+
try {
|
|
2176
|
+
gzipStream = new DecompressionStream(FORMAT_GZIP);
|
|
2177
|
+
} catch {
|
|
2178
|
+
throw error;
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
}
|
|
2182
|
+
if (gzipStream) {
|
|
2183
|
+
gzipCrc32 = true;
|
|
2184
|
+
readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32);
|
|
2062
2185
|
}
|
|
2063
2186
|
}
|
|
2064
2187
|
readable = mapInflateStreamError(readable);
|
|
@@ -2068,8 +2191,8 @@
|
|
|
2068
2191
|
readable = pipeThrough(readable, crc32Stream);
|
|
2069
2192
|
}
|
|
2070
2193
|
setReadable(this, readable, () => {
|
|
2071
|
-
if (
|
|
2072
|
-
const computedCrc32 =
|
|
2194
|
+
if (crc32Stream) {
|
|
2195
|
+
const computedCrc32 = new DataView(crc32Stream.value.buffer).getUint32(0, false);
|
|
2073
2196
|
if (crc32 != computedCrc32) {
|
|
2074
2197
|
throw new Error(ERR_INVALID_CRC32);
|
|
2075
2198
|
}
|
|
@@ -2126,11 +2249,11 @@
|
|
|
2126
2249
|
return new CodecStreamClass(format, options);
|
|
2127
2250
|
}
|
|
2128
2251
|
|
|
2129
|
-
function
|
|
2130
|
-
if (useCompressionStream &&
|
|
2131
|
-
return
|
|
2132
|
-
} else if (
|
|
2133
|
-
return
|
|
2252
|
+
function getGzipCodecStream(useCompressionStream, CodecStreamNative, CodecStreamFallback) {
|
|
2253
|
+
if (useCompressionStream && CodecStreamNative) {
|
|
2254
|
+
return CodecStreamNative;
|
|
2255
|
+
} else if (CodecStreamFallback && CodecStreamFallback.requiresModule) {
|
|
2256
|
+
return CodecStreamFallback;
|
|
2134
2257
|
}
|
|
2135
2258
|
}
|
|
2136
2259
|
|
|
@@ -2200,10 +2323,15 @@
|
|
|
2200
2323
|
const reader = readable.getReader();
|
|
2201
2324
|
return new ReadableStream({
|
|
2202
2325
|
async pull(controller) {
|
|
2203
|
-
let result;
|
|
2204
2326
|
try {
|
|
2205
|
-
|
|
2327
|
+
const { value, done } = await reader.read();
|
|
2328
|
+
if (done) {
|
|
2329
|
+
controller.close();
|
|
2330
|
+
} else {
|
|
2331
|
+
controller.enqueue(value);
|
|
2332
|
+
}
|
|
2206
2333
|
} catch (error) {
|
|
2334
|
+
await cancel(reader, error);
|
|
2207
2335
|
if (error && error.message) {
|
|
2208
2336
|
throw error;
|
|
2209
2337
|
}
|
|
@@ -2211,12 +2339,6 @@
|
|
|
2211
2339
|
mappedError.cause = error;
|
|
2212
2340
|
throw mappedError;
|
|
2213
2341
|
}
|
|
2214
|
-
const { value, done } = result;
|
|
2215
|
-
if (done) {
|
|
2216
|
-
controller.close();
|
|
2217
|
-
} else {
|
|
2218
|
-
controller.enqueue(value);
|
|
2219
|
-
}
|
|
2220
2342
|
},
|
|
2221
2343
|
cancel(reason) {
|
|
2222
2344
|
return reader.cancel(reason);
|
|
@@ -3728,10 +3850,11 @@
|
|
|
3728
3850
|
|
|
3729
3851
|
createReadable(options) {
|
|
3730
3852
|
const reader = this;
|
|
3731
|
-
const { useRangeHeader, forceRangeRequests, size } = reader;
|
|
3853
|
+
const { useRangeHeader, forceRangeRequests, size, eocdCache } = reader;
|
|
3732
3854
|
if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
|
|
3733
3855
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3734
|
-
|
|
3856
|
+
const cached = eocdCache && offset >= size - eocdCache.length;
|
|
3857
|
+
if (readSize > 0 && offset < size && !cached) {
|
|
3735
3858
|
return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
|
|
3736
3859
|
}
|
|
3737
3860
|
}
|
|
@@ -5290,8 +5413,8 @@
|
|
|
5290
5413
|
const passThroughCompression = Boolean(passThrough);
|
|
5291
5414
|
const passThroughEncryption = passThrough === true;
|
|
5292
5415
|
checkPasswordOption(password, rawPassword);
|
|
5293
|
-
password = password && password.length
|
|
5294
|
-
rawPassword = rawPassword && rawPassword.length
|
|
5416
|
+
password = password && password.length ? password : UNDEFINED_VALUE;
|
|
5417
|
+
rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
|
|
5295
5418
|
if (extraFieldAES) {
|
|
5296
5419
|
if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
|
|
5297
5420
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
@@ -6052,7 +6175,7 @@
|
|
|
6052
6175
|
async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
|
|
6053
6176
|
const { size } = reader;
|
|
6054
6177
|
const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
|
|
6055
|
-
const remoteProbeBudget = {
|
|
6178
|
+
const remoteProbeBudget = { remaining: MAX_END_OF_CENTRAL_DIR_PROBES };
|
|
6056
6179
|
let endOfDirectoryInfo;
|
|
6057
6180
|
let plausibleEndOfDirectoryInfo;
|
|
6058
6181
|
let endOfDirectoryReachingEndCount = 0;
|
|
@@ -6145,8 +6268,8 @@
|
|
|
6145
6268
|
if (signatureOffset >= anchoredOffset) {
|
|
6146
6269
|
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
6147
6270
|
}
|
|
6148
|
-
if (remoteProbeBudget.
|
|
6149
|
-
remoteProbeBudget.
|
|
6271
|
+
if (remoteProbeBudget.remaining > 0) {
|
|
6272
|
+
remoteProbeBudget.remaining--;
|
|
6150
6273
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
6151
6274
|
return getUint32$1(getDataView(signatureArray), 0);
|
|
6152
6275
|
}
|
|
@@ -7062,9 +7185,11 @@
|
|
|
7062
7185
|
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7063
7186
|
const passThroughCompression = Boolean(passThrough);
|
|
7064
7187
|
const passThroughEncryption = passThrough === true;
|
|
7065
|
-
|
|
7066
|
-
|
|
7188
|
+
let password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
7189
|
+
let rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
7067
7190
|
checkPasswordOption(password, rawPassword);
|
|
7191
|
+
password = password && password.length ? password : UNDEFINED_VALUE;
|
|
7192
|
+
rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
|
|
7068
7193
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
7069
7194
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
7070
7195
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -8860,7 +8985,7 @@
|
|
|
8860
8985
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8861
8986
|
*/
|
|
8862
8987
|
|
|
8863
|
-
const VERSION = "2.
|
|
8988
|
+
const VERSION = "2.16.1";
|
|
8864
8989
|
|
|
8865
8990
|
/*
|
|
8866
8991
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9391,7 +9516,11 @@
|
|
|
9391
9516
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9392
9517
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9393
9518
|
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9519
|
+
const ERR_INVALID_PASSWORDS = "Invalid passwords option (must be an array of strings)";
|
|
9520
|
+
const ERR_INVALID_REQUEST_PASSWORD = "Invalid requestPassword option (must be a function returning a string or undefined)";
|
|
9394
9521
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9522
|
+
const ABORT_ERROR_NAME = "AbortError";
|
|
9523
|
+
const EMPTY_RAW_PASSWORD = new Uint8Array(0);
|
|
9395
9524
|
|
|
9396
9525
|
class ZipEntry {
|
|
9397
9526
|
|
|
@@ -9764,8 +9893,10 @@
|
|
|
9764
9893
|
zipReader = new ZipReader(reader, options);
|
|
9765
9894
|
}
|
|
9766
9895
|
checkPassThroughValue(options.passThrough);
|
|
9896
|
+
checkPasswordCandidatesOptions(options);
|
|
9767
9897
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9768
9898
|
const importedEntries = [];
|
|
9899
|
+
const passwordState = { known: [] };
|
|
9769
9900
|
const entries = await zipReader.getEntries(options);
|
|
9770
9901
|
for (const entry of entries) {
|
|
9771
9902
|
let parent = this;
|
|
@@ -9810,7 +9941,7 @@
|
|
|
9810
9941
|
}
|
|
9811
9942
|
importedEntries.push(addChild(parent, name, {
|
|
9812
9943
|
data: entry,
|
|
9813
|
-
Reader: getZipBlobReader(Object.assign({}, options)),
|
|
9944
|
+
Reader: getZipBlobReader(Object.assign({}, options), passwordState),
|
|
9814
9945
|
uncompressedSize: options.passThrough ? entry.compressedSize : entry.uncompressedSize,
|
|
9815
9946
|
passThrough: options.passThrough
|
|
9816
9947
|
}));
|
|
@@ -10139,7 +10270,7 @@
|
|
|
10139
10270
|
};
|
|
10140
10271
|
}
|
|
10141
10272
|
|
|
10142
|
-
function getZipBlobReader(options) {
|
|
10273
|
+
function getZipBlobReader(options, passwordState) {
|
|
10143
10274
|
return class extends Reader {
|
|
10144
10275
|
|
|
10145
10276
|
constructor(entry, options = {}) {
|
|
@@ -10152,12 +10283,12 @@
|
|
|
10152
10283
|
const zipBlobReader = this;
|
|
10153
10284
|
const readerOptions = Object.assign({}, options, zipBlobReader.options);
|
|
10154
10285
|
const { checkOverlappingEntry, checkOverlappingEntryOnly } = readerOptions;
|
|
10155
|
-
const data = await zipBlobReader.entry
|
|
10286
|
+
const data = await readEntryData(zipBlobReader.entry, Object.assign(readerOptions, {
|
|
10156
10287
|
checkPasswordOnly: false,
|
|
10157
10288
|
checkOverlappingEntry: checkOverlappingEntryOnly || checkOverlappingEntry,
|
|
10158
10289
|
checkOverlappingEntryOnly: false,
|
|
10159
10290
|
preventClose: false
|
|
10160
|
-
}));
|
|
10291
|
+
}), passwordState);
|
|
10161
10292
|
zipBlobReader.data = data;
|
|
10162
10293
|
zipBlobReader.blobReader = new BlobReader(data);
|
|
10163
10294
|
zipBlobReader.size = data.size;
|
|
@@ -10219,10 +10350,9 @@
|
|
|
10219
10350
|
await initStream(reader);
|
|
10220
10351
|
} catch (error) {
|
|
10221
10352
|
try {
|
|
10353
|
+
error.entry = child;
|
|
10222
10354
|
error.entryId = child.id;
|
|
10223
|
-
error.
|
|
10224
|
-
entry: child
|
|
10225
|
-
};
|
|
10355
|
+
error.entryName = child.getRelativeName(entry);
|
|
10226
10356
|
} catch {
|
|
10227
10357
|
// ignored
|
|
10228
10358
|
}
|
|
@@ -10314,10 +10444,136 @@
|
|
|
10314
10444
|
}
|
|
10315
10445
|
if (readerOptions) {
|
|
10316
10446
|
checkPassThroughValue(readerOptions.passThrough);
|
|
10447
|
+
checkPasswordCandidatesOptions(readerOptions);
|
|
10317
10448
|
}
|
|
10318
10449
|
return readerOptions;
|
|
10319
10450
|
}
|
|
10320
10451
|
|
|
10452
|
+
function checkPasswordCandidatesOptions(options) {
|
|
10453
|
+
const { passwords, requestPassword } = options;
|
|
10454
|
+
if (passwords && (!Array.isArray(passwords) || passwords.some(password => typeof password != STRING_TYPE))) {
|
|
10455
|
+
throw new Error(ERR_INVALID_PASSWORDS);
|
|
10456
|
+
}
|
|
10457
|
+
if (requestPassword && typeof requestPassword != FUNCTION_TYPE) {
|
|
10458
|
+
throw new Error(ERR_INVALID_REQUEST_PASSWORD);
|
|
10459
|
+
}
|
|
10460
|
+
}
|
|
10461
|
+
|
|
10462
|
+
async function readEntryData(entry, options, passwordState) {
|
|
10463
|
+
checkPasswordCandidatesOptions(options);
|
|
10464
|
+
const { passwords, requestPassword, signal } = options;
|
|
10465
|
+
options = Object.assign({}, options);
|
|
10466
|
+
delete options.passwords;
|
|
10467
|
+
delete options.requestPassword;
|
|
10468
|
+
if (!entry.encrypted || options.passThrough || (!passwords && !requestPassword)) {
|
|
10469
|
+
return entry.getData(new BlobWriter(), options);
|
|
10470
|
+
}
|
|
10471
|
+
const tried = new Set();
|
|
10472
|
+
let error;
|
|
10473
|
+
while (true) {
|
|
10474
|
+
for (const candidate of getPasswordCandidates(options, passwordState, passwords)) {
|
|
10475
|
+
if (!tried.has(candidate.key)) {
|
|
10476
|
+
const result = await tryPasswordCandidate(candidate);
|
|
10477
|
+
if (result.done) {
|
|
10478
|
+
return result.data;
|
|
10479
|
+
}
|
|
10480
|
+
error = result.error;
|
|
10481
|
+
}
|
|
10482
|
+
}
|
|
10483
|
+
if (!requestPassword) {
|
|
10484
|
+
break;
|
|
10485
|
+
}
|
|
10486
|
+
if (passwordState.pendingPrompt) {
|
|
10487
|
+
await passwordState.pendingPrompt;
|
|
10488
|
+
continue;
|
|
10489
|
+
}
|
|
10490
|
+
let release;
|
|
10491
|
+
passwordState.pendingPrompt = new Promise(resolve => release = resolve);
|
|
10492
|
+
try {
|
|
10493
|
+
const answer = await requestPassword(entry, error);
|
|
10494
|
+
if (answer === UNDEFINED_VALUE || answer === null) {
|
|
10495
|
+
break;
|
|
10496
|
+
}
|
|
10497
|
+
// deno-lint-ignore valid-typeof
|
|
10498
|
+
if (typeof answer != STRING_TYPE) {
|
|
10499
|
+
throw new Error(ERR_INVALID_REQUEST_PASSWORD);
|
|
10500
|
+
}
|
|
10501
|
+
const result = await tryPasswordCandidate(getPasswordCandidate(answer));
|
|
10502
|
+
if (result.done) {
|
|
10503
|
+
return result.data;
|
|
10504
|
+
}
|
|
10505
|
+
error = result.error;
|
|
10506
|
+
} finally {
|
|
10507
|
+
passwordState.pendingPrompt = UNDEFINED_VALUE;
|
|
10508
|
+
release();
|
|
10509
|
+
}
|
|
10510
|
+
}
|
|
10511
|
+
throw new Error(tried.size ? ERR_INVALID_PASSWORD : ERR_ENCRYPTED);
|
|
10512
|
+
|
|
10513
|
+
async function tryPasswordCandidate(candidate) {
|
|
10514
|
+
tried.add(candidate.key);
|
|
10515
|
+
const candidateOptions = Object.assign({}, options, candidate.options);
|
|
10516
|
+
if (entry.zipCrypto) {
|
|
10517
|
+
candidateOptions.checkCrc32 = true;
|
|
10518
|
+
try {
|
|
10519
|
+
await entry.getData(null, Object.assign({}, candidateOptions, { checkPasswordOnly: true }));
|
|
10520
|
+
} catch (probeError) {
|
|
10521
|
+
if (isInvalidPasswordError(probeError)) {
|
|
10522
|
+
return { done: false, error: probeError };
|
|
10523
|
+
}
|
|
10524
|
+
throw probeError;
|
|
10525
|
+
}
|
|
10526
|
+
}
|
|
10527
|
+
try {
|
|
10528
|
+
const data = await entry.getData(new BlobWriter(), candidateOptions);
|
|
10529
|
+
rememberPassword(passwordState, candidate);
|
|
10530
|
+
return { done: true, data };
|
|
10531
|
+
} catch (readError) {
|
|
10532
|
+
if (isAbortError(readError, signal) || (!entry.zipCrypto && !isInvalidPasswordError(readError))) {
|
|
10533
|
+
throw readError;
|
|
10534
|
+
}
|
|
10535
|
+
return { done: false, error: readError };
|
|
10536
|
+
}
|
|
10537
|
+
}
|
|
10538
|
+
}
|
|
10539
|
+
|
|
10540
|
+
function isInvalidPasswordError(error) {
|
|
10541
|
+
return isErrorObject(error) && error.message == ERR_INVALID_PASSWORD;
|
|
10542
|
+
}
|
|
10543
|
+
|
|
10544
|
+
function isAbortError(error, signal) {
|
|
10545
|
+
return Boolean(signal && signal.aborted) || (isErrorObject(error) && error.name == ABORT_ERROR_NAME);
|
|
10546
|
+
}
|
|
10547
|
+
|
|
10548
|
+
function getPasswordCandidates(options, passwordState, passwords) {
|
|
10549
|
+
const candidates = [];
|
|
10550
|
+
const { password, rawPassword } = options;
|
|
10551
|
+
if (rawPassword && rawPassword.length) {
|
|
10552
|
+
candidates.push({ key: rawPassword, options: { password: "", rawPassword } });
|
|
10553
|
+
}
|
|
10554
|
+
if (password) {
|
|
10555
|
+
candidates.push(getPasswordCandidate(password));
|
|
10556
|
+
}
|
|
10557
|
+
candidates.push(...passwordState.known);
|
|
10558
|
+
if (passwords) {
|
|
10559
|
+
candidates.push(...passwords.filter(password => password).map(getPasswordCandidate));
|
|
10560
|
+
}
|
|
10561
|
+
return candidates;
|
|
10562
|
+
}
|
|
10563
|
+
|
|
10564
|
+
function getPasswordCandidate(password) {
|
|
10565
|
+
return { key: password, options: { password, rawPassword: EMPTY_RAW_PASSWORD } };
|
|
10566
|
+
}
|
|
10567
|
+
|
|
10568
|
+
function rememberPassword(passwordState, candidate) {
|
|
10569
|
+
const { known } = passwordState;
|
|
10570
|
+
const index = known.findIndex(knownCandidate => knownCandidate.key === candidate.key);
|
|
10571
|
+
if (index != -1) {
|
|
10572
|
+
known.splice(index, 1);
|
|
10573
|
+
}
|
|
10574
|
+
known.unshift(candidate);
|
|
10575
|
+
}
|
|
10576
|
+
|
|
10321
10577
|
function checkPassThroughValue(passThrough) {
|
|
10322
10578
|
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10323
10579
|
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
@@ -10455,6 +10711,7 @@
|
|
|
10455
10711
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10456
10712
|
const { onstart, onprogress, onend } = options;
|
|
10457
10713
|
checkPassThroughValue(options.passThrough);
|
|
10714
|
+
checkPasswordCandidatesOptions(options);
|
|
10458
10715
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10459
10716
|
const abortController = new AbortController();
|
|
10460
10717
|
const { signal } = abortController;
|
|
@@ -10797,7 +11054,7 @@
|
|
|
10797
11054
|
*/
|
|
10798
11055
|
|
|
10799
11056
|
|
|
10800
|
-
|
|
11057
|
+
f(setDefaultConfiguration);
|
|
10801
11058
|
|
|
10802
11059
|
exports.BlobReader = BlobReader;
|
|
10803
11060
|
exports.BlobWriter = BlobWriter;
|
|
@@ -10848,11 +11105,13 @@
|
|
|
10848
11105
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
10849
11106
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
10850
11107
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
11108
|
+
exports.ERR_INVALID_PASSWORDS = ERR_INVALID_PASSWORDS;
|
|
10851
11109
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
10852
11110
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10853
11111
|
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
10854
11112
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
10855
11113
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
11114
|
+
exports.ERR_INVALID_REQUEST_PASSWORD = ERR_INVALID_REQUEST_PASSWORD;
|
|
10856
11115
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
10857
11116
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
10858
11117
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|