@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-legacy.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";
|
|
@@ -4711,6 +4713,21 @@
|
|
|
4711
4713
|
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4712
4714
|
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4713
4715
|
const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
|
|
4716
|
+
const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
|
|
4717
|
+
const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
|
|
4718
|
+
const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
|
|
4719
|
+
const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
|
|
4720
|
+
const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
|
|
4721
|
+
const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
|
|
4722
|
+
const WARNING_APPENDED_DATA = "appended data";
|
|
4723
|
+
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4724
|
+
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4725
|
+
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4726
|
+
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4727
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4728
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4729
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
4730
|
+
const MAX_KNOWN_VERSION = 63;
|
|
4714
4731
|
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4715
4732
|
const CHARSET_UTF8 = "utf-8";
|
|
4716
4733
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
@@ -4761,6 +4778,7 @@
|
|
|
4761
4778
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
4762
4779
|
throw new Error(ERR_BAD_FORMAT);
|
|
4763
4780
|
}
|
|
4781
|
+
const warnings = zipReader.warnings = [];
|
|
4764
4782
|
const strictness = getStrictness(options, zipReader.options);
|
|
4765
4783
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4766
4784
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -4784,8 +4802,12 @@
|
|
|
4784
4802
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4785
4803
|
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4786
4804
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4787
|
-
|
|
4788
|
-
|
|
4805
|
+
const appendedDataLength = reader.size - appendedDataOffset;
|
|
4806
|
+
if (appendedDataLength > maxAppendedDataSize) {
|
|
4807
|
+
throwAmbiguousArchive(WARNING_APPENDED_DATA);
|
|
4808
|
+
}
|
|
4809
|
+
if (appendedDataLength > 0) {
|
|
4810
|
+
addWarning(warnings, WARNING_APPENDED_DATA);
|
|
4789
4811
|
}
|
|
4790
4812
|
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4791
4813
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
@@ -4839,23 +4861,23 @@
|
|
|
4839
4861
|
}
|
|
4840
4862
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4841
4863
|
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4842
|
-
} else if (
|
|
4843
|
-
|
|
4864
|
+
} else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4865
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4844
4866
|
}
|
|
4845
4867
|
if (diskNumber == MAX_16_BITS) {
|
|
4846
4868
|
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4847
|
-
} else if (
|
|
4848
|
-
|
|
4869
|
+
} else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4870
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4849
4871
|
}
|
|
4850
4872
|
if (filesLength == MAX_16_BITS) {
|
|
4851
4873
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
4852
|
-
} else if (
|
|
4853
|
-
|
|
4874
|
+
} else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
4875
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4854
4876
|
}
|
|
4855
4877
|
if (directoryDataLength == MAX_32_BITS) {
|
|
4856
4878
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
4857
|
-
} else if (
|
|
4858
|
-
|
|
4879
|
+
} else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
4880
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4859
4881
|
}
|
|
4860
4882
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4861
4883
|
}
|
|
@@ -4924,14 +4946,22 @@
|
|
|
4924
4946
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4925
4947
|
decryptedDirectory = true;
|
|
4926
4948
|
}
|
|
4949
|
+
if (directoryEncryptionInfo && !decryptedDirectory &&
|
|
4950
|
+
(directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
|
|
4951
|
+
addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
|
|
4952
|
+
}
|
|
4927
4953
|
startOffset = directoryDataOffset;
|
|
4928
4954
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
4929
4955
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
4930
|
-
const filenames =
|
|
4956
|
+
const filenames = new Set();
|
|
4931
4957
|
let duplicateFilename;
|
|
4958
|
+
let previousEntryPosition = -1;
|
|
4932
4959
|
const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
|
|
4933
4960
|
if (!filesLength && recoverWrappedFilesLength) {
|
|
4934
4961
|
filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
4962
|
+
if (filesLength) {
|
|
4963
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
4964
|
+
}
|
|
4935
4965
|
}
|
|
4936
4966
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4937
4967
|
const fileEntry = new ZipEntry(reader, zipReader.options);
|
|
@@ -5010,15 +5040,26 @@
|
|
|
5010
5040
|
filename,
|
|
5011
5041
|
comment
|
|
5012
5042
|
});
|
|
5013
|
-
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)
|
|
5043
|
+
if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
|
|
5044
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5045
|
+
}
|
|
5014
5046
|
fileEntry.offset += prependedDataLength;
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5047
|
+
const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
|
|
5048
|
+
startOffset = Math.min(entryPosition, startOffset);
|
|
5049
|
+
if (entryPosition < previousEntryPosition) {
|
|
5050
|
+
addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
|
|
5051
|
+
}
|
|
5052
|
+
previousEntryPosition = entryPosition;
|
|
5053
|
+
if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
|
|
5054
|
+
addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
|
|
5055
|
+
}
|
|
5056
|
+
if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
|
|
5057
|
+
addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
|
|
5058
|
+
}
|
|
5059
|
+
if (filenames.has(fileEntry.filename)) {
|
|
5060
|
+
duplicateFilename = true;
|
|
5021
5061
|
}
|
|
5062
|
+
filenames.add(fileEntry.filename);
|
|
5022
5063
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5023
5064
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
5024
5065
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -5056,7 +5097,11 @@
|
|
|
5056
5097
|
};
|
|
5057
5098
|
offset = endOffset;
|
|
5058
5099
|
if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
|
|
5059
|
-
|
|
5100
|
+
const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
5101
|
+
if (wrappedFilesLength) {
|
|
5102
|
+
filesLength += wrappedFilesLength;
|
|
5103
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
5104
|
+
}
|
|
5060
5105
|
}
|
|
5061
5106
|
const { onprogress } = options;
|
|
5062
5107
|
if (onprogress) {
|
|
@@ -5082,18 +5127,22 @@
|
|
|
5082
5127
|
zipReader.digitalSignature = digitalSignature;
|
|
5083
5128
|
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
5084
5129
|
}
|
|
5085
|
-
if (
|
|
5086
|
-
|
|
5130
|
+
if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
|
|
5131
|
+
(!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
|
|
5132
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
|
|
5087
5133
|
}
|
|
5088
5134
|
if (duplicateFilename) {
|
|
5089
|
-
|
|
5135
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
|
|
5090
5136
|
}
|
|
5091
5137
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5092
5138
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5093
5139
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5094
5140
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5095
5141
|
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5096
|
-
throwAmbiguousArchive(
|
|
5142
|
+
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5143
|
+
}
|
|
5144
|
+
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5145
|
+
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5097
5146
|
}
|
|
5098
5147
|
if (extractPrependedData) {
|
|
5099
5148
|
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
@@ -5163,6 +5212,28 @@
|
|
|
5163
5212
|
}
|
|
5164
5213
|
}
|
|
5165
5214
|
|
|
5215
|
+
async function isZipFile(reader, options = {}) {
|
|
5216
|
+
reader = new GenericReader(reader);
|
|
5217
|
+
await initStream(reader);
|
|
5218
|
+
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
5219
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
5220
|
+
await initStream(reader);
|
|
5221
|
+
}
|
|
5222
|
+
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5223
|
+
return false;
|
|
5224
|
+
}
|
|
5225
|
+
const strictness = getStrictness(options, {});
|
|
5226
|
+
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
5227
|
+
const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
|
|
5228
|
+
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
5229
|
+
if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
|
|
5230
|
+
return false;
|
|
5231
|
+
}
|
|
5232
|
+
const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
|
|
5233
|
+
const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
5234
|
+
return reader.size - appendedDataOffset <= maxAppendedDataSize;
|
|
5235
|
+
}
|
|
5236
|
+
|
|
5166
5237
|
class ZipEntry {
|
|
5167
5238
|
|
|
5168
5239
|
constructor(reader, options) {
|
|
@@ -5194,6 +5265,7 @@
|
|
|
5194
5265
|
dataDescriptor
|
|
5195
5266
|
} = bitFlag;
|
|
5196
5267
|
const localDirectory = fileEntry.localDirectory = {};
|
|
5268
|
+
const warnings = fileEntry.warnings = [];
|
|
5197
5269
|
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
5198
5270
|
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
5199
5271
|
const dataView = getDataView(dataArray);
|
|
@@ -5234,10 +5306,10 @@
|
|
|
5234
5306
|
if (checkLocalFilename) {
|
|
5235
5307
|
localDirectory.rawFilename = rawLocalFilename;
|
|
5236
5308
|
}
|
|
5237
|
-
readCommonFooter(zipEntry, localDirectory, dataView, 4, true)
|
|
5238
|
-
|
|
5239
|
-
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
|
|
5309
|
+
if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
|
|
5310
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
|
|
5240
5311
|
}
|
|
5312
|
+
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
|
|
5241
5313
|
const { lastAccessDate, creationDate, uid, gid } = localDirectory;
|
|
5242
5314
|
if (lastAccessDate) {
|
|
5243
5315
|
fileEntry.lastAccessDate = lastAccessDate;
|
|
@@ -5463,6 +5535,7 @@
|
|
|
5463
5535
|
const extraField = directory.extraField = new Map();
|
|
5464
5536
|
const rawExtraFieldView = getDataView(rawExtraField);
|
|
5465
5537
|
let offsetExtraField = 0;
|
|
5538
|
+
let malformedExtraField = false;
|
|
5466
5539
|
try {
|
|
5467
5540
|
while (offsetExtraField < rawExtraField.length) {
|
|
5468
5541
|
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
@@ -5474,7 +5547,10 @@
|
|
|
5474
5547
|
offsetExtraField += 4 + size;
|
|
5475
5548
|
}
|
|
5476
5549
|
} catch {
|
|
5477
|
-
|
|
5550
|
+
malformedExtraField = true;
|
|
5551
|
+
}
|
|
5552
|
+
if (offsetExtraField > rawExtraField.length) {
|
|
5553
|
+
malformedExtraField = true;
|
|
5478
5554
|
}
|
|
5479
5555
|
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5480
5556
|
Object.assign(directory, {
|
|
@@ -5542,6 +5618,7 @@
|
|
|
5542
5618
|
if (extraFieldUSDZ) {
|
|
5543
5619
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
5544
5620
|
}
|
|
5621
|
+
return malformedExtraField;
|
|
5545
5622
|
}
|
|
5546
5623
|
|
|
5547
5624
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
@@ -6003,27 +6080,46 @@
|
|
|
6003
6080
|
return UNDEFINED_VALUE;
|
|
6004
6081
|
}
|
|
6005
6082
|
|
|
6006
|
-
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
6083
|
+
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
|
|
6007
6084
|
const { rawFilename } = zipEntry;
|
|
6085
|
+
const reject = !warnings;
|
|
6008
6086
|
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
6009
6087
|
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
6010
6088
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6011
6089
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6012
6090
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6013
|
-
|
|
6091
|
+
reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
|
|
6014
6092
|
}
|
|
6015
6093
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6016
|
-
|
|
6094
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
6017
6095
|
}
|
|
6018
6096
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
6019
|
-
|
|
6097
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
|
|
6020
6098
|
}
|
|
6021
6099
|
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
6022
6100
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
6023
6101
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
6024
6102
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
6025
6103
|
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
6026
|
-
|
|
6104
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
|
|
6105
|
+
}
|
|
6106
|
+
}
|
|
6107
|
+
|
|
6108
|
+
function reportAmbiguity(reject, warnings, reason) {
|
|
6109
|
+
if (reject) {
|
|
6110
|
+
throwAmbiguousArchive(reason);
|
|
6111
|
+
} else {
|
|
6112
|
+
addWarning(warnings, reason);
|
|
6113
|
+
}
|
|
6114
|
+
}
|
|
6115
|
+
|
|
6116
|
+
function addWarning(warnings, reason, filename) {
|
|
6117
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6118
|
+
const warning = { reason };
|
|
6119
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
6120
|
+
warning.filename = filename;
|
|
6121
|
+
}
|
|
6122
|
+
warnings.push(warning);
|
|
6027
6123
|
}
|
|
6028
6124
|
}
|
|
6029
6125
|
|
|
@@ -6100,8 +6196,23 @@
|
|
|
6100
6196
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
6101
6197
|
ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
|
|
6102
6198
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
6199
|
+
WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
|
|
6200
|
+
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6201
|
+
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6202
|
+
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6203
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6204
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6205
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6206
|
+
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6207
|
+
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6208
|
+
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
6209
|
+
WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
|
|
6210
|
+
WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
|
|
6211
|
+
WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
|
|
6212
|
+
WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
|
|
6103
6213
|
ZipReader: ZipReader,
|
|
6104
|
-
ZipReaderStream: ZipReaderStream
|
|
6214
|
+
ZipReaderStream: ZipReaderStream,
|
|
6215
|
+
isZipFile: isZipFile
|
|
6105
6216
|
});
|
|
6106
6217
|
|
|
6107
6218
|
/*
|
|
@@ -6314,6 +6425,7 @@
|
|
|
6314
6425
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6315
6426
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6316
6427
|
rawExtraField,
|
|
6428
|
+
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6317
6429
|
extendedTimestamp: false,
|
|
6318
6430
|
headerArray,
|
|
6319
6431
|
headerView
|
|
@@ -6487,7 +6599,6 @@
|
|
|
6487
6599
|
|
|
6488
6600
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6489
6601
|
options = Object.assign({}, options);
|
|
6490
|
-
name = name.trim();
|
|
6491
6602
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6492
6603
|
name += DIRECTORY_SIGNATURE;
|
|
6493
6604
|
}
|
|
@@ -6578,7 +6689,6 @@
|
|
|
6578
6689
|
}
|
|
6579
6690
|
|
|
6580
6691
|
function resolveAttributes(zipWriter, name, options) {
|
|
6581
|
-
name = name.trim();
|
|
6582
6692
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6583
6693
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
6584
6694
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
@@ -6783,6 +6893,7 @@
|
|
|
6783
6893
|
}
|
|
6784
6894
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
6785
6895
|
const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
|
|
6896
|
+
const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
|
|
6786
6897
|
return {
|
|
6787
6898
|
comment,
|
|
6788
6899
|
resolvedOptions: {
|
|
@@ -6818,7 +6929,8 @@
|
|
|
6818
6929
|
dataDescriptor,
|
|
6819
6930
|
zip64,
|
|
6820
6931
|
rawExtraField,
|
|
6821
|
-
rawLocalExtraField
|
|
6932
|
+
rawLocalExtraField,
|
|
6933
|
+
rawCentralExtraField
|
|
6822
6934
|
}
|
|
6823
6935
|
};
|
|
6824
6936
|
}
|
|
@@ -7137,6 +7249,7 @@
|
|
|
7137
7249
|
versionMadeBy,
|
|
7138
7250
|
rawComment,
|
|
7139
7251
|
rawExtraField,
|
|
7252
|
+
rawCentralExtraField,
|
|
7140
7253
|
useWebWorkers,
|
|
7141
7254
|
transferStreams,
|
|
7142
7255
|
onstart,
|
|
@@ -7180,6 +7293,7 @@
|
|
|
7180
7293
|
rawExtraFieldUnix,
|
|
7181
7294
|
rawExtraFieldAES,
|
|
7182
7295
|
rawExtraField,
|
|
7296
|
+
rawCentralExtraField,
|
|
7183
7297
|
extendedTimestamp,
|
|
7184
7298
|
msDosCompatible,
|
|
7185
7299
|
internalFileAttributes,
|
|
@@ -7680,6 +7794,7 @@
|
|
|
7680
7794
|
rawExtraFieldNTFS,
|
|
7681
7795
|
rawExtraFieldUnix,
|
|
7682
7796
|
rawExtraField,
|
|
7797
|
+
rawCentralExtraField,
|
|
7683
7798
|
extendedTimestamp,
|
|
7684
7799
|
extraFieldExtendedTimestampFlag,
|
|
7685
7800
|
lastModDate,
|
|
@@ -7734,7 +7849,8 @@
|
|
|
7734
7849
|
rawExtraFieldNTFS,
|
|
7735
7850
|
rawExtraFieldUnix,
|
|
7736
7851
|
rawExtraFieldTimestamp,
|
|
7737
|
-
rawExtraField
|
|
7852
|
+
rawExtraField,
|
|
7853
|
+
rawCentralExtraField);
|
|
7738
7854
|
if (extraFieldLength > MAX_16_BITS) {
|
|
7739
7855
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
7740
7856
|
}
|
|
@@ -7762,6 +7878,7 @@
|
|
|
7762
7878
|
rawExtraFieldNTFS,
|
|
7763
7879
|
rawExtraFieldUnix,
|
|
7764
7880
|
rawExtraField,
|
|
7881
|
+
rawCentralExtraField,
|
|
7765
7882
|
rawComment,
|
|
7766
7883
|
versionMadeBy,
|
|
7767
7884
|
headerArray,
|
|
@@ -7776,7 +7893,7 @@
|
|
|
7776
7893
|
uncompressedSize,
|
|
7777
7894
|
compressedSize
|
|
7778
7895
|
} = fileEntry;
|
|
7779
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
7896
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
7780
7897
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
7781
7898
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
7782
7899
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -7814,6 +7931,7 @@
|
|
|
7814
7931
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7815
7932
|
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7816
7933
|
directoryRecord.writeBytes(rawExtraField);
|
|
7934
|
+
directoryRecord.writeBytes(rawCentralExtraField);
|
|
7817
7935
|
directoryRecord.writeBytes(rawComment);
|
|
7818
7936
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7819
7937
|
offset += directoryRecordLength;
|
|
@@ -8848,6 +8966,20 @@
|
|
|
8848
8966
|
exports.TextWriter = TextWriter;
|
|
8849
8967
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
8850
8968
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
8969
|
+
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
8970
|
+
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
8971
|
+
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
8972
|
+
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
8973
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
8974
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
8975
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
8976
|
+
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
8977
|
+
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
8978
|
+
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|
|
8979
|
+
exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
|
|
8980
|
+
exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
|
|
8981
|
+
exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
|
|
8982
|
+
exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
|
|
8851
8983
|
exports.Writer = Writer;
|
|
8852
8984
|
exports.ZipReader = ZipReader;
|
|
8853
8985
|
exports.ZipReaderStream = ZipReaderStream;
|
|
@@ -8858,6 +8990,7 @@
|
|
|
8858
8990
|
exports.createOPFSTempStream = createOPFSTempStream;
|
|
8859
8991
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
8860
8992
|
exports.getMimeType = getMimeType;
|
|
8993
|
+
exports.isZipFile = isZipFile;
|
|
8861
8994
|
exports.registerCodec = registerCodec;
|
|
8862
8995
|
exports.resetConfiguration = resetConfiguration;
|
|
8863
8996
|
exports.terminateWorkers = terminateWorkers;
|