@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-core.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";
|
|
@@ -4709,6 +4711,21 @@
|
|
|
4709
4711
|
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4710
4712
|
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4711
4713
|
const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
|
|
4714
|
+
const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
|
|
4715
|
+
const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
|
|
4716
|
+
const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
|
|
4717
|
+
const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
|
|
4718
|
+
const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
|
|
4719
|
+
const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
|
|
4720
|
+
const WARNING_APPENDED_DATA = "appended data";
|
|
4721
|
+
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4722
|
+
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4723
|
+
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4724
|
+
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4725
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4726
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4727
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
4728
|
+
const MAX_KNOWN_VERSION = 63;
|
|
4712
4729
|
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4713
4730
|
const CHARSET_UTF8 = "utf-8";
|
|
4714
4731
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
@@ -4759,6 +4776,7 @@
|
|
|
4759
4776
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
4760
4777
|
throw new Error(ERR_BAD_FORMAT);
|
|
4761
4778
|
}
|
|
4779
|
+
const warnings = zipReader.warnings = [];
|
|
4762
4780
|
const strictness = getStrictness(options, zipReader.options);
|
|
4763
4781
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4764
4782
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -4782,8 +4800,12 @@
|
|
|
4782
4800
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4783
4801
|
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4784
4802
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4785
|
-
|
|
4786
|
-
|
|
4803
|
+
const appendedDataLength = reader.size - appendedDataOffset;
|
|
4804
|
+
if (appendedDataLength > maxAppendedDataSize) {
|
|
4805
|
+
throwAmbiguousArchive(WARNING_APPENDED_DATA);
|
|
4806
|
+
}
|
|
4807
|
+
if (appendedDataLength > 0) {
|
|
4808
|
+
addWarning(warnings, WARNING_APPENDED_DATA);
|
|
4787
4809
|
}
|
|
4788
4810
|
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4789
4811
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
@@ -4837,23 +4859,23 @@
|
|
|
4837
4859
|
}
|
|
4838
4860
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4839
4861
|
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4840
|
-
} else if (
|
|
4841
|
-
|
|
4862
|
+
} else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4863
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4842
4864
|
}
|
|
4843
4865
|
if (diskNumber == MAX_16_BITS) {
|
|
4844
4866
|
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4845
|
-
} else if (
|
|
4846
|
-
|
|
4867
|
+
} else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4868
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4847
4869
|
}
|
|
4848
4870
|
if (filesLength == MAX_16_BITS) {
|
|
4849
4871
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
4850
|
-
} else if (
|
|
4851
|
-
|
|
4872
|
+
} else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
4873
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4852
4874
|
}
|
|
4853
4875
|
if (directoryDataLength == MAX_32_BITS) {
|
|
4854
4876
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
4855
|
-
} else if (
|
|
4856
|
-
|
|
4877
|
+
} else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
4878
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4857
4879
|
}
|
|
4858
4880
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4859
4881
|
}
|
|
@@ -4922,14 +4944,22 @@
|
|
|
4922
4944
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4923
4945
|
decryptedDirectory = true;
|
|
4924
4946
|
}
|
|
4947
|
+
if (directoryEncryptionInfo && !decryptedDirectory &&
|
|
4948
|
+
(directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
|
|
4949
|
+
addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
|
|
4950
|
+
}
|
|
4925
4951
|
startOffset = directoryDataOffset;
|
|
4926
4952
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
4927
4953
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
4928
|
-
const filenames =
|
|
4954
|
+
const filenames = new Set();
|
|
4929
4955
|
let duplicateFilename;
|
|
4956
|
+
let previousEntryPosition = -1;
|
|
4930
4957
|
const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
|
|
4931
4958
|
if (!filesLength && recoverWrappedFilesLength) {
|
|
4932
4959
|
filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
4960
|
+
if (filesLength) {
|
|
4961
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
4962
|
+
}
|
|
4933
4963
|
}
|
|
4934
4964
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4935
4965
|
const fileEntry = new ZipEntry(reader, zipReader.options);
|
|
@@ -5008,15 +5038,26 @@
|
|
|
5008
5038
|
filename,
|
|
5009
5039
|
comment
|
|
5010
5040
|
});
|
|
5011
|
-
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)
|
|
5041
|
+
if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
|
|
5042
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5043
|
+
}
|
|
5012
5044
|
fileEntry.offset += prependedDataLength;
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5045
|
+
const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
|
|
5046
|
+
startOffset = Math.min(entryPosition, startOffset);
|
|
5047
|
+
if (entryPosition < previousEntryPosition) {
|
|
5048
|
+
addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
|
|
5049
|
+
}
|
|
5050
|
+
previousEntryPosition = entryPosition;
|
|
5051
|
+
if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
|
|
5052
|
+
addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
|
|
5053
|
+
}
|
|
5054
|
+
if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
|
|
5055
|
+
addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
|
|
5056
|
+
}
|
|
5057
|
+
if (filenames.has(fileEntry.filename)) {
|
|
5058
|
+
duplicateFilename = true;
|
|
5019
5059
|
}
|
|
5060
|
+
filenames.add(fileEntry.filename);
|
|
5020
5061
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5021
5062
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
5022
5063
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -5054,7 +5095,11 @@
|
|
|
5054
5095
|
};
|
|
5055
5096
|
offset = endOffset;
|
|
5056
5097
|
if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
|
|
5057
|
-
|
|
5098
|
+
const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
5099
|
+
if (wrappedFilesLength) {
|
|
5100
|
+
filesLength += wrappedFilesLength;
|
|
5101
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
5102
|
+
}
|
|
5058
5103
|
}
|
|
5059
5104
|
const { onprogress } = options;
|
|
5060
5105
|
if (onprogress) {
|
|
@@ -5080,18 +5125,22 @@
|
|
|
5080
5125
|
zipReader.digitalSignature = digitalSignature;
|
|
5081
5126
|
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
5082
5127
|
}
|
|
5083
|
-
if (
|
|
5084
|
-
|
|
5128
|
+
if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
|
|
5129
|
+
(!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
|
|
5130
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
|
|
5085
5131
|
}
|
|
5086
5132
|
if (duplicateFilename) {
|
|
5087
|
-
|
|
5133
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
|
|
5088
5134
|
}
|
|
5089
5135
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5090
5136
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5091
5137
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5092
5138
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5093
5139
|
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5094
|
-
throwAmbiguousArchive(
|
|
5140
|
+
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5141
|
+
}
|
|
5142
|
+
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5143
|
+
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5095
5144
|
}
|
|
5096
5145
|
if (extractPrependedData) {
|
|
5097
5146
|
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
@@ -5161,6 +5210,28 @@
|
|
|
5161
5210
|
}
|
|
5162
5211
|
}
|
|
5163
5212
|
|
|
5213
|
+
async function isZipFile(reader, options = {}) {
|
|
5214
|
+
reader = new GenericReader(reader);
|
|
5215
|
+
await initStream(reader);
|
|
5216
|
+
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
5217
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
5218
|
+
await initStream(reader);
|
|
5219
|
+
}
|
|
5220
|
+
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5221
|
+
return false;
|
|
5222
|
+
}
|
|
5223
|
+
const strictness = getStrictness(options, {});
|
|
5224
|
+
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
5225
|
+
const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
|
|
5226
|
+
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
5227
|
+
if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
|
|
5228
|
+
return false;
|
|
5229
|
+
}
|
|
5230
|
+
const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
|
|
5231
|
+
const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
5232
|
+
return reader.size - appendedDataOffset <= maxAppendedDataSize;
|
|
5233
|
+
}
|
|
5234
|
+
|
|
5164
5235
|
class ZipEntry {
|
|
5165
5236
|
|
|
5166
5237
|
constructor(reader, options) {
|
|
@@ -5192,6 +5263,7 @@
|
|
|
5192
5263
|
dataDescriptor
|
|
5193
5264
|
} = bitFlag;
|
|
5194
5265
|
const localDirectory = fileEntry.localDirectory = {};
|
|
5266
|
+
const warnings = fileEntry.warnings = [];
|
|
5195
5267
|
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
5196
5268
|
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
5197
5269
|
const dataView = getDataView(dataArray);
|
|
@@ -5232,10 +5304,10 @@
|
|
|
5232
5304
|
if (checkLocalFilename) {
|
|
5233
5305
|
localDirectory.rawFilename = rawLocalFilename;
|
|
5234
5306
|
}
|
|
5235
|
-
readCommonFooter(zipEntry, localDirectory, dataView, 4, true)
|
|
5236
|
-
|
|
5237
|
-
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
|
|
5307
|
+
if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
|
|
5308
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
|
|
5238
5309
|
}
|
|
5310
|
+
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
|
|
5239
5311
|
const { lastAccessDate, creationDate, uid, gid } = localDirectory;
|
|
5240
5312
|
if (lastAccessDate) {
|
|
5241
5313
|
fileEntry.lastAccessDate = lastAccessDate;
|
|
@@ -5461,6 +5533,7 @@
|
|
|
5461
5533
|
const extraField = directory.extraField = new Map();
|
|
5462
5534
|
const rawExtraFieldView = getDataView(rawExtraField);
|
|
5463
5535
|
let offsetExtraField = 0;
|
|
5536
|
+
let malformedExtraField = false;
|
|
5464
5537
|
try {
|
|
5465
5538
|
while (offsetExtraField < rawExtraField.length) {
|
|
5466
5539
|
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
@@ -5472,7 +5545,10 @@
|
|
|
5472
5545
|
offsetExtraField += 4 + size;
|
|
5473
5546
|
}
|
|
5474
5547
|
} catch {
|
|
5475
|
-
|
|
5548
|
+
malformedExtraField = true;
|
|
5549
|
+
}
|
|
5550
|
+
if (offsetExtraField > rawExtraField.length) {
|
|
5551
|
+
malformedExtraField = true;
|
|
5476
5552
|
}
|
|
5477
5553
|
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5478
5554
|
Object.assign(directory, {
|
|
@@ -5540,6 +5616,7 @@
|
|
|
5540
5616
|
if (extraFieldUSDZ) {
|
|
5541
5617
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
5542
5618
|
}
|
|
5619
|
+
return malformedExtraField;
|
|
5543
5620
|
}
|
|
5544
5621
|
|
|
5545
5622
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
@@ -6001,27 +6078,46 @@
|
|
|
6001
6078
|
return UNDEFINED_VALUE;
|
|
6002
6079
|
}
|
|
6003
6080
|
|
|
6004
|
-
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
6081
|
+
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
|
|
6005
6082
|
const { rawFilename } = zipEntry;
|
|
6083
|
+
const reject = !warnings;
|
|
6006
6084
|
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
6007
6085
|
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
6008
6086
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6009
6087
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6010
6088
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6011
|
-
|
|
6089
|
+
reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
|
|
6012
6090
|
}
|
|
6013
6091
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6014
|
-
|
|
6092
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
6015
6093
|
}
|
|
6016
6094
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
6017
|
-
|
|
6095
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
|
|
6018
6096
|
}
|
|
6019
6097
|
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
6020
6098
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
6021
6099
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
6022
6100
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
6023
6101
|
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
6024
|
-
|
|
6102
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
|
|
6103
|
+
}
|
|
6104
|
+
}
|
|
6105
|
+
|
|
6106
|
+
function reportAmbiguity(reject, warnings, reason) {
|
|
6107
|
+
if (reject) {
|
|
6108
|
+
throwAmbiguousArchive(reason);
|
|
6109
|
+
} else {
|
|
6110
|
+
addWarning(warnings, reason);
|
|
6111
|
+
}
|
|
6112
|
+
}
|
|
6113
|
+
|
|
6114
|
+
function addWarning(warnings, reason, filename) {
|
|
6115
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6116
|
+
const warning = { reason };
|
|
6117
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
6118
|
+
warning.filename = filename;
|
|
6119
|
+
}
|
|
6120
|
+
warnings.push(warning);
|
|
6025
6121
|
}
|
|
6026
6122
|
}
|
|
6027
6123
|
|
|
@@ -6098,8 +6194,23 @@
|
|
|
6098
6194
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
6099
6195
|
ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
|
|
6100
6196
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
6197
|
+
WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
|
|
6198
|
+
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6199
|
+
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6200
|
+
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6201
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6202
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6203
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6204
|
+
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6205
|
+
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6206
|
+
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
6207
|
+
WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
|
|
6208
|
+
WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
|
|
6209
|
+
WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
|
|
6210
|
+
WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
|
|
6101
6211
|
ZipReader: ZipReader,
|
|
6102
|
-
ZipReaderStream: ZipReaderStream
|
|
6212
|
+
ZipReaderStream: ZipReaderStream,
|
|
6213
|
+
isZipFile: isZipFile
|
|
6103
6214
|
});
|
|
6104
6215
|
|
|
6105
6216
|
/*
|
|
@@ -6312,6 +6423,7 @@
|
|
|
6312
6423
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6313
6424
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6314
6425
|
rawExtraField,
|
|
6426
|
+
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6315
6427
|
extendedTimestamp: false,
|
|
6316
6428
|
headerArray,
|
|
6317
6429
|
headerView
|
|
@@ -6485,7 +6597,6 @@
|
|
|
6485
6597
|
|
|
6486
6598
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6487
6599
|
options = Object.assign({}, options);
|
|
6488
|
-
name = name.trim();
|
|
6489
6600
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6490
6601
|
name += DIRECTORY_SIGNATURE;
|
|
6491
6602
|
}
|
|
@@ -6576,7 +6687,6 @@
|
|
|
6576
6687
|
}
|
|
6577
6688
|
|
|
6578
6689
|
function resolveAttributes(zipWriter, name, options) {
|
|
6579
|
-
name = name.trim();
|
|
6580
6690
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6581
6691
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
6582
6692
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
@@ -6781,6 +6891,7 @@
|
|
|
6781
6891
|
}
|
|
6782
6892
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
6783
6893
|
const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
|
|
6894
|
+
const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
|
|
6784
6895
|
return {
|
|
6785
6896
|
comment,
|
|
6786
6897
|
resolvedOptions: {
|
|
@@ -6816,7 +6927,8 @@
|
|
|
6816
6927
|
dataDescriptor,
|
|
6817
6928
|
zip64,
|
|
6818
6929
|
rawExtraField,
|
|
6819
|
-
rawLocalExtraField
|
|
6930
|
+
rawLocalExtraField,
|
|
6931
|
+
rawCentralExtraField
|
|
6820
6932
|
}
|
|
6821
6933
|
};
|
|
6822
6934
|
}
|
|
@@ -7135,6 +7247,7 @@
|
|
|
7135
7247
|
versionMadeBy,
|
|
7136
7248
|
rawComment,
|
|
7137
7249
|
rawExtraField,
|
|
7250
|
+
rawCentralExtraField,
|
|
7138
7251
|
useWebWorkers,
|
|
7139
7252
|
transferStreams,
|
|
7140
7253
|
onstart,
|
|
@@ -7178,6 +7291,7 @@
|
|
|
7178
7291
|
rawExtraFieldUnix,
|
|
7179
7292
|
rawExtraFieldAES,
|
|
7180
7293
|
rawExtraField,
|
|
7294
|
+
rawCentralExtraField,
|
|
7181
7295
|
extendedTimestamp,
|
|
7182
7296
|
msDosCompatible,
|
|
7183
7297
|
internalFileAttributes,
|
|
@@ -7678,6 +7792,7 @@
|
|
|
7678
7792
|
rawExtraFieldNTFS,
|
|
7679
7793
|
rawExtraFieldUnix,
|
|
7680
7794
|
rawExtraField,
|
|
7795
|
+
rawCentralExtraField,
|
|
7681
7796
|
extendedTimestamp,
|
|
7682
7797
|
extraFieldExtendedTimestampFlag,
|
|
7683
7798
|
lastModDate,
|
|
@@ -7732,7 +7847,8 @@
|
|
|
7732
7847
|
rawExtraFieldNTFS,
|
|
7733
7848
|
rawExtraFieldUnix,
|
|
7734
7849
|
rawExtraFieldTimestamp,
|
|
7735
|
-
rawExtraField
|
|
7850
|
+
rawExtraField,
|
|
7851
|
+
rawCentralExtraField);
|
|
7736
7852
|
if (extraFieldLength > MAX_16_BITS) {
|
|
7737
7853
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
7738
7854
|
}
|
|
@@ -7760,6 +7876,7 @@
|
|
|
7760
7876
|
rawExtraFieldNTFS,
|
|
7761
7877
|
rawExtraFieldUnix,
|
|
7762
7878
|
rawExtraField,
|
|
7879
|
+
rawCentralExtraField,
|
|
7763
7880
|
rawComment,
|
|
7764
7881
|
versionMadeBy,
|
|
7765
7882
|
headerArray,
|
|
@@ -7774,7 +7891,7 @@
|
|
|
7774
7891
|
uncompressedSize,
|
|
7775
7892
|
compressedSize
|
|
7776
7893
|
} = fileEntry;
|
|
7777
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
7894
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
7778
7895
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
7779
7896
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
7780
7897
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -7812,6 +7929,7 @@
|
|
|
7812
7929
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7813
7930
|
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7814
7931
|
directoryRecord.writeBytes(rawExtraField);
|
|
7932
|
+
directoryRecord.writeBytes(rawCentralExtraField);
|
|
7815
7933
|
directoryRecord.writeBytes(rawComment);
|
|
7816
7934
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7817
7935
|
offset += directoryRecordLength;
|
|
@@ -8815,6 +8933,20 @@
|
|
|
8815
8933
|
exports.TextWriter = TextWriter;
|
|
8816
8934
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
8817
8935
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
8936
|
+
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
8937
|
+
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
8938
|
+
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
8939
|
+
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
8940
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
8941
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
8942
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
8943
|
+
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
8944
|
+
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
8945
|
+
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|
|
8946
|
+
exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
|
|
8947
|
+
exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
|
|
8948
|
+
exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
|
|
8949
|
+
exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
|
|
8818
8950
|
exports.Writer = Writer;
|
|
8819
8951
|
exports.ZipReader = ZipReader;
|
|
8820
8952
|
exports.ZipReaderStream = ZipReaderStream;
|
|
@@ -8825,6 +8957,7 @@
|
|
|
8825
8957
|
exports.createOPFSTempStream = createOPFSTempStream;
|
|
8826
8958
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
8827
8959
|
exports.getMimeType = getMimeType;
|
|
8960
|
+
exports.isZipFile = isZipFile;
|
|
8828
8961
|
exports.registerCodec = registerCodec;
|
|
8829
8962
|
exports.resetConfiguration = resetConfiguration;
|
|
8830
8963
|
exports.terminateWorkers = terminateWorkers;
|