@zip.js/zip.js 2.8.58 → 2.8.59
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/deno.json +1 -1
- package/dist/zip-core-external.js +157 -39
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +171 -38
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +157 -40
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +156 -39
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +157 -40
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +171 -39
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +171 -39
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +171 -38
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +171 -38
- package/dist/zip-native.min.js +1 -1
- package/dist/zip.js +171 -38
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +171 -39
- package/index-native.min.js +1 -1
- package/index.cjs +171 -39
- package/index.d.cts +184 -1
- package/index.d.ts +184 -1
- package/index.min.js +1 -1
- package/lib/core/constants.js +2 -0
- package/lib/core/options.js +2 -0
- package/lib/core/zip-reader.js +143 -33
- package/lib/core/zip-writer.js +13 -6
- package/lib/zip-core-reader.js +16 -1
- package/package.json +1 -1
package/dist/zip.js
CHANGED
|
@@ -83,6 +83,7 @@
|
|
|
83
83
|
const BITFLAG_LEVEL_FAST_MASK = 0b100;
|
|
84
84
|
const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
|
|
85
85
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
86
|
+
const BITFLAG_COMPRESSED_PATCHED_DATA = 0b100000;
|
|
86
87
|
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
87
88
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
88
89
|
const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
|
|
@@ -200,6 +201,7 @@
|
|
|
200
201
|
const OPTION_USDZ = "usdz";
|
|
201
202
|
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
202
203
|
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
204
|
+
const OPTION_CENTRAL_EXTRA_FIELD = "centralExtraField";
|
|
203
205
|
const OPTION_STRICTNESS = "strictness";
|
|
204
206
|
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
205
207
|
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
@@ -4715,6 +4717,21 @@
|
|
|
4715
4717
|
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4716
4718
|
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4717
4719
|
const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
|
|
4720
|
+
const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
|
|
4721
|
+
const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
|
|
4722
|
+
const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
|
|
4723
|
+
const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
|
|
4724
|
+
const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
|
|
4725
|
+
const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
|
|
4726
|
+
const WARNING_APPENDED_DATA = "appended data";
|
|
4727
|
+
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4728
|
+
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4729
|
+
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4730
|
+
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4731
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4732
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4733
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
4734
|
+
const MAX_KNOWN_VERSION = 63;
|
|
4718
4735
|
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4719
4736
|
const CHARSET_UTF8 = "utf-8";
|
|
4720
4737
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
@@ -4765,6 +4782,7 @@
|
|
|
4765
4782
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
4766
4783
|
throw new Error(ERR_BAD_FORMAT);
|
|
4767
4784
|
}
|
|
4785
|
+
const warnings = zipReader.warnings = [];
|
|
4768
4786
|
const strictness = getStrictness(options, zipReader.options);
|
|
4769
4787
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4770
4788
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -4788,8 +4806,12 @@
|
|
|
4788
4806
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4789
4807
|
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4790
4808
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4791
|
-
|
|
4792
|
-
|
|
4809
|
+
const appendedDataLength = reader.size - appendedDataOffset;
|
|
4810
|
+
if (appendedDataLength > maxAppendedDataSize) {
|
|
4811
|
+
throwAmbiguousArchive(WARNING_APPENDED_DATA);
|
|
4812
|
+
}
|
|
4813
|
+
if (appendedDataLength > 0) {
|
|
4814
|
+
addWarning(warnings, WARNING_APPENDED_DATA);
|
|
4793
4815
|
}
|
|
4794
4816
|
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4795
4817
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
@@ -4843,23 +4865,23 @@
|
|
|
4843
4865
|
}
|
|
4844
4866
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4845
4867
|
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4846
|
-
} else if (
|
|
4847
|
-
|
|
4868
|
+
} else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4869
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4848
4870
|
}
|
|
4849
4871
|
if (diskNumber == MAX_16_BITS) {
|
|
4850
4872
|
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4851
|
-
} else if (
|
|
4852
|
-
|
|
4873
|
+
} else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4874
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4853
4875
|
}
|
|
4854
4876
|
if (filesLength == MAX_16_BITS) {
|
|
4855
4877
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
4856
|
-
} else if (
|
|
4857
|
-
|
|
4878
|
+
} else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
4879
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4858
4880
|
}
|
|
4859
4881
|
if (directoryDataLength == MAX_32_BITS) {
|
|
4860
4882
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
4861
|
-
} else if (
|
|
4862
|
-
|
|
4883
|
+
} else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
4884
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4863
4885
|
}
|
|
4864
4886
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4865
4887
|
}
|
|
@@ -4928,14 +4950,22 @@
|
|
|
4928
4950
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4929
4951
|
decryptedDirectory = true;
|
|
4930
4952
|
}
|
|
4953
|
+
if (directoryEncryptionInfo && !decryptedDirectory &&
|
|
4954
|
+
(directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
|
|
4955
|
+
addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
|
|
4956
|
+
}
|
|
4931
4957
|
startOffset = directoryDataOffset;
|
|
4932
4958
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
4933
4959
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
4934
|
-
const filenames =
|
|
4960
|
+
const filenames = new Set();
|
|
4935
4961
|
let duplicateFilename;
|
|
4962
|
+
let previousEntryPosition = -1;
|
|
4936
4963
|
const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
|
|
4937
4964
|
if (!filesLength && recoverWrappedFilesLength) {
|
|
4938
4965
|
filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
4966
|
+
if (filesLength) {
|
|
4967
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
4968
|
+
}
|
|
4939
4969
|
}
|
|
4940
4970
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4941
4971
|
const fileEntry = new ZipEntry(reader, zipReader.options);
|
|
@@ -5014,15 +5044,26 @@
|
|
|
5014
5044
|
filename,
|
|
5015
5045
|
comment
|
|
5016
5046
|
});
|
|
5017
|
-
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)
|
|
5047
|
+
if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
|
|
5048
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5049
|
+
}
|
|
5018
5050
|
fileEntry.offset += prependedDataLength;
|
|
5019
|
-
|
|
5020
|
-
|
|
5021
|
-
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5051
|
+
const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
|
|
5052
|
+
startOffset = Math.min(entryPosition, startOffset);
|
|
5053
|
+
if (entryPosition < previousEntryPosition) {
|
|
5054
|
+
addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
|
|
5055
|
+
}
|
|
5056
|
+
previousEntryPosition = entryPosition;
|
|
5057
|
+
if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
|
|
5058
|
+
addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
|
|
5059
|
+
}
|
|
5060
|
+
if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
|
|
5061
|
+
addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
|
|
5062
|
+
}
|
|
5063
|
+
if (filenames.has(fileEntry.filename)) {
|
|
5064
|
+
duplicateFilename = true;
|
|
5025
5065
|
}
|
|
5066
|
+
filenames.add(fileEntry.filename);
|
|
5026
5067
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5027
5068
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
5028
5069
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -5060,7 +5101,11 @@
|
|
|
5060
5101
|
};
|
|
5061
5102
|
offset = endOffset;
|
|
5062
5103
|
if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
|
|
5063
|
-
|
|
5104
|
+
const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
5105
|
+
if (wrappedFilesLength) {
|
|
5106
|
+
filesLength += wrappedFilesLength;
|
|
5107
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
5108
|
+
}
|
|
5064
5109
|
}
|
|
5065
5110
|
const { onprogress } = options;
|
|
5066
5111
|
if (onprogress) {
|
|
@@ -5086,18 +5131,22 @@
|
|
|
5086
5131
|
zipReader.digitalSignature = digitalSignature;
|
|
5087
5132
|
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
5088
5133
|
}
|
|
5089
|
-
if (
|
|
5090
|
-
|
|
5134
|
+
if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
|
|
5135
|
+
(!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
|
|
5136
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
|
|
5091
5137
|
}
|
|
5092
5138
|
if (duplicateFilename) {
|
|
5093
|
-
|
|
5139
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
|
|
5094
5140
|
}
|
|
5095
5141
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5096
5142
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5097
5143
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5098
5144
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5099
5145
|
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5100
|
-
throwAmbiguousArchive(
|
|
5146
|
+
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5147
|
+
}
|
|
5148
|
+
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5149
|
+
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5101
5150
|
}
|
|
5102
5151
|
if (extractPrependedData) {
|
|
5103
5152
|
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
@@ -5167,6 +5216,28 @@
|
|
|
5167
5216
|
}
|
|
5168
5217
|
}
|
|
5169
5218
|
|
|
5219
|
+
async function isZipFile(reader, options = {}) {
|
|
5220
|
+
reader = new GenericReader(reader);
|
|
5221
|
+
await initStream(reader);
|
|
5222
|
+
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
5223
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
5224
|
+
await initStream(reader);
|
|
5225
|
+
}
|
|
5226
|
+
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5227
|
+
return false;
|
|
5228
|
+
}
|
|
5229
|
+
const strictness = getStrictness(options, {});
|
|
5230
|
+
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
5231
|
+
const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
|
|
5232
|
+
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
5233
|
+
if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
|
|
5234
|
+
return false;
|
|
5235
|
+
}
|
|
5236
|
+
const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
|
|
5237
|
+
const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
5238
|
+
return reader.size - appendedDataOffset <= maxAppendedDataSize;
|
|
5239
|
+
}
|
|
5240
|
+
|
|
5170
5241
|
class ZipEntry {
|
|
5171
5242
|
|
|
5172
5243
|
constructor(reader, options) {
|
|
@@ -5198,6 +5269,7 @@
|
|
|
5198
5269
|
dataDescriptor
|
|
5199
5270
|
} = bitFlag;
|
|
5200
5271
|
const localDirectory = fileEntry.localDirectory = {};
|
|
5272
|
+
const warnings = fileEntry.warnings = [];
|
|
5201
5273
|
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
5202
5274
|
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
5203
5275
|
const dataView = getDataView(dataArray);
|
|
@@ -5238,10 +5310,10 @@
|
|
|
5238
5310
|
if (checkLocalFilename) {
|
|
5239
5311
|
localDirectory.rawFilename = rawLocalFilename;
|
|
5240
5312
|
}
|
|
5241
|
-
readCommonFooter(zipEntry, localDirectory, dataView, 4, true)
|
|
5242
|
-
|
|
5243
|
-
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
|
|
5313
|
+
if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
|
|
5314
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
|
|
5244
5315
|
}
|
|
5316
|
+
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
|
|
5245
5317
|
const { lastAccessDate, creationDate, uid, gid } = localDirectory;
|
|
5246
5318
|
if (lastAccessDate) {
|
|
5247
5319
|
fileEntry.lastAccessDate = lastAccessDate;
|
|
@@ -5467,6 +5539,7 @@
|
|
|
5467
5539
|
const extraField = directory.extraField = new Map();
|
|
5468
5540
|
const rawExtraFieldView = getDataView(rawExtraField);
|
|
5469
5541
|
let offsetExtraField = 0;
|
|
5542
|
+
let malformedExtraField = false;
|
|
5470
5543
|
try {
|
|
5471
5544
|
while (offsetExtraField < rawExtraField.length) {
|
|
5472
5545
|
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
@@ -5478,7 +5551,10 @@
|
|
|
5478
5551
|
offsetExtraField += 4 + size;
|
|
5479
5552
|
}
|
|
5480
5553
|
} catch {
|
|
5481
|
-
|
|
5554
|
+
malformedExtraField = true;
|
|
5555
|
+
}
|
|
5556
|
+
if (offsetExtraField > rawExtraField.length) {
|
|
5557
|
+
malformedExtraField = true;
|
|
5482
5558
|
}
|
|
5483
5559
|
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5484
5560
|
Object.assign(directory, {
|
|
@@ -5546,6 +5622,7 @@
|
|
|
5546
5622
|
if (extraFieldUSDZ) {
|
|
5547
5623
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
5548
5624
|
}
|
|
5625
|
+
return malformedExtraField;
|
|
5549
5626
|
}
|
|
5550
5627
|
|
|
5551
5628
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
@@ -6007,27 +6084,46 @@
|
|
|
6007
6084
|
return UNDEFINED_VALUE;
|
|
6008
6085
|
}
|
|
6009
6086
|
|
|
6010
|
-
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
6087
|
+
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
|
|
6011
6088
|
const { rawFilename } = zipEntry;
|
|
6089
|
+
const reject = !warnings;
|
|
6012
6090
|
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
6013
6091
|
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
6014
6092
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6015
6093
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6016
6094
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6017
|
-
|
|
6095
|
+
reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
|
|
6018
6096
|
}
|
|
6019
6097
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6020
|
-
|
|
6098
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
6021
6099
|
}
|
|
6022
6100
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
6023
|
-
|
|
6101
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
|
|
6024
6102
|
}
|
|
6025
6103
|
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
6026
6104
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
6027
6105
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
6028
6106
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
6029
6107
|
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
6030
|
-
|
|
6108
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
|
|
6109
|
+
}
|
|
6110
|
+
}
|
|
6111
|
+
|
|
6112
|
+
function reportAmbiguity(reject, warnings, reason) {
|
|
6113
|
+
if (reject) {
|
|
6114
|
+
throwAmbiguousArchive(reason);
|
|
6115
|
+
} else {
|
|
6116
|
+
addWarning(warnings, reason);
|
|
6117
|
+
}
|
|
6118
|
+
}
|
|
6119
|
+
|
|
6120
|
+
function addWarning(warnings, reason, filename) {
|
|
6121
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6122
|
+
const warning = { reason };
|
|
6123
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
6124
|
+
warning.filename = filename;
|
|
6125
|
+
}
|
|
6126
|
+
warnings.push(warning);
|
|
6031
6127
|
}
|
|
6032
6128
|
}
|
|
6033
6129
|
|
|
@@ -6104,8 +6200,23 @@
|
|
|
6104
6200
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
6105
6201
|
ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
|
|
6106
6202
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
6203
|
+
WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
|
|
6204
|
+
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6205
|
+
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6206
|
+
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6207
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6208
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6209
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6210
|
+
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6211
|
+
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6212
|
+
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
6213
|
+
WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
|
|
6214
|
+
WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
|
|
6215
|
+
WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
|
|
6216
|
+
WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
|
|
6107
6217
|
ZipReader: ZipReader,
|
|
6108
|
-
ZipReaderStream: ZipReaderStream
|
|
6218
|
+
ZipReaderStream: ZipReaderStream,
|
|
6219
|
+
isZipFile: isZipFile
|
|
6109
6220
|
});
|
|
6110
6221
|
|
|
6111
6222
|
/*
|
|
@@ -6318,6 +6429,7 @@
|
|
|
6318
6429
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6319
6430
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6320
6431
|
rawExtraField,
|
|
6432
|
+
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6321
6433
|
extendedTimestamp: false,
|
|
6322
6434
|
headerArray,
|
|
6323
6435
|
headerView
|
|
@@ -6491,7 +6603,6 @@
|
|
|
6491
6603
|
|
|
6492
6604
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6493
6605
|
options = Object.assign({}, options);
|
|
6494
|
-
name = name.trim();
|
|
6495
6606
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6496
6607
|
name += DIRECTORY_SIGNATURE;
|
|
6497
6608
|
}
|
|
@@ -6582,7 +6693,6 @@
|
|
|
6582
6693
|
}
|
|
6583
6694
|
|
|
6584
6695
|
function resolveAttributes(zipWriter, name, options) {
|
|
6585
|
-
name = name.trim();
|
|
6586
6696
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6587
6697
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
6588
6698
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
@@ -6787,6 +6897,7 @@
|
|
|
6787
6897
|
}
|
|
6788
6898
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
6789
6899
|
const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
|
|
6900
|
+
const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
|
|
6790
6901
|
return {
|
|
6791
6902
|
comment,
|
|
6792
6903
|
resolvedOptions: {
|
|
@@ -6822,7 +6933,8 @@
|
|
|
6822
6933
|
dataDescriptor,
|
|
6823
6934
|
zip64,
|
|
6824
6935
|
rawExtraField,
|
|
6825
|
-
rawLocalExtraField
|
|
6936
|
+
rawLocalExtraField,
|
|
6937
|
+
rawCentralExtraField
|
|
6826
6938
|
}
|
|
6827
6939
|
};
|
|
6828
6940
|
}
|
|
@@ -7141,6 +7253,7 @@
|
|
|
7141
7253
|
versionMadeBy,
|
|
7142
7254
|
rawComment,
|
|
7143
7255
|
rawExtraField,
|
|
7256
|
+
rawCentralExtraField,
|
|
7144
7257
|
useWebWorkers,
|
|
7145
7258
|
transferStreams,
|
|
7146
7259
|
onstart,
|
|
@@ -7184,6 +7297,7 @@
|
|
|
7184
7297
|
rawExtraFieldUnix,
|
|
7185
7298
|
rawExtraFieldAES,
|
|
7186
7299
|
rawExtraField,
|
|
7300
|
+
rawCentralExtraField,
|
|
7187
7301
|
extendedTimestamp,
|
|
7188
7302
|
msDosCompatible,
|
|
7189
7303
|
internalFileAttributes,
|
|
@@ -7684,6 +7798,7 @@
|
|
|
7684
7798
|
rawExtraFieldNTFS,
|
|
7685
7799
|
rawExtraFieldUnix,
|
|
7686
7800
|
rawExtraField,
|
|
7801
|
+
rawCentralExtraField,
|
|
7687
7802
|
extendedTimestamp,
|
|
7688
7803
|
extraFieldExtendedTimestampFlag,
|
|
7689
7804
|
lastModDate,
|
|
@@ -7738,7 +7853,8 @@
|
|
|
7738
7853
|
rawExtraFieldNTFS,
|
|
7739
7854
|
rawExtraFieldUnix,
|
|
7740
7855
|
rawExtraFieldTimestamp,
|
|
7741
|
-
rawExtraField
|
|
7856
|
+
rawExtraField,
|
|
7857
|
+
rawCentralExtraField);
|
|
7742
7858
|
if (extraFieldLength > MAX_16_BITS) {
|
|
7743
7859
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
7744
7860
|
}
|
|
@@ -7766,6 +7882,7 @@
|
|
|
7766
7882
|
rawExtraFieldNTFS,
|
|
7767
7883
|
rawExtraFieldUnix,
|
|
7768
7884
|
rawExtraField,
|
|
7885
|
+
rawCentralExtraField,
|
|
7769
7886
|
rawComment,
|
|
7770
7887
|
versionMadeBy,
|
|
7771
7888
|
headerArray,
|
|
@@ -7780,7 +7897,7 @@
|
|
|
7780
7897
|
uncompressedSize,
|
|
7781
7898
|
compressedSize
|
|
7782
7899
|
} = fileEntry;
|
|
7783
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
7900
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
7784
7901
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
7785
7902
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
7786
7903
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -7818,6 +7935,7 @@
|
|
|
7818
7935
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7819
7936
|
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7820
7937
|
directoryRecord.writeBytes(rawExtraField);
|
|
7938
|
+
directoryRecord.writeBytes(rawCentralExtraField);
|
|
7821
7939
|
directoryRecord.writeBytes(rawComment);
|
|
7822
7940
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7823
7941
|
offset += directoryRecordLength;
|
|
@@ -9255,6 +9373,20 @@
|
|
|
9255
9373
|
exports.TextWriter = TextWriter;
|
|
9256
9374
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
9257
9375
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
9376
|
+
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
9377
|
+
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
9378
|
+
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
9379
|
+
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
9380
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
9381
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
9382
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
9383
|
+
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
9384
|
+
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
9385
|
+
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|
|
9386
|
+
exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
|
|
9387
|
+
exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
|
|
9388
|
+
exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
|
|
9389
|
+
exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
|
|
9258
9390
|
exports.Writer = Writer;
|
|
9259
9391
|
exports.ZipReader = ZipReader;
|
|
9260
9392
|
exports.ZipReaderStream = ZipReaderStream;
|
|
@@ -9265,6 +9397,7 @@
|
|
|
9265
9397
|
exports.createOPFSTempStream = createOPFSTempStream;
|
|
9266
9398
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
9267
9399
|
exports.getMimeType = getMimeType;
|
|
9400
|
+
exports.isZipFile = isZipFile;
|
|
9268
9401
|
exports.registerCodec = registerCodec;
|
|
9269
9402
|
exports.resetConfiguration = resetConfiguration;
|
|
9270
9403
|
exports.terminateWorkers = terminateWorkersAndModule;
|