@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-fs-native.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";
|
|
@@ -4731,6 +4733,21 @@
|
|
|
4731
4733
|
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4732
4734
|
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4733
4735
|
const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
|
|
4736
|
+
const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
|
|
4737
|
+
const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
|
|
4738
|
+
const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
|
|
4739
|
+
const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
|
|
4740
|
+
const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
|
|
4741
|
+
const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
|
|
4742
|
+
const WARNING_APPENDED_DATA = "appended data";
|
|
4743
|
+
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4744
|
+
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4745
|
+
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4746
|
+
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4747
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4748
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4749
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
4750
|
+
const MAX_KNOWN_VERSION = 63;
|
|
4734
4751
|
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4735
4752
|
const CHARSET_UTF8 = "utf-8";
|
|
4736
4753
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
@@ -4781,6 +4798,7 @@
|
|
|
4781
4798
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
4782
4799
|
throw new Error(ERR_BAD_FORMAT);
|
|
4783
4800
|
}
|
|
4801
|
+
const warnings = zipReader.warnings = [];
|
|
4784
4802
|
const strictness = getStrictness(options, zipReader.options);
|
|
4785
4803
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4786
4804
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -4804,8 +4822,12 @@
|
|
|
4804
4822
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4805
4823
|
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4806
4824
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4807
|
-
|
|
4808
|
-
|
|
4825
|
+
const appendedDataLength = reader.size - appendedDataOffset;
|
|
4826
|
+
if (appendedDataLength > maxAppendedDataSize) {
|
|
4827
|
+
throwAmbiguousArchive(WARNING_APPENDED_DATA);
|
|
4828
|
+
}
|
|
4829
|
+
if (appendedDataLength > 0) {
|
|
4830
|
+
addWarning(warnings, WARNING_APPENDED_DATA);
|
|
4809
4831
|
}
|
|
4810
4832
|
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4811
4833
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
@@ -4859,23 +4881,23 @@
|
|
|
4859
4881
|
}
|
|
4860
4882
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4861
4883
|
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4862
|
-
} else if (
|
|
4863
|
-
|
|
4884
|
+
} else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4885
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4864
4886
|
}
|
|
4865
4887
|
if (diskNumber == MAX_16_BITS) {
|
|
4866
4888
|
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4867
|
-
} else if (
|
|
4868
|
-
|
|
4889
|
+
} else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4890
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4869
4891
|
}
|
|
4870
4892
|
if (filesLength == MAX_16_BITS) {
|
|
4871
4893
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
4872
|
-
} else if (
|
|
4873
|
-
|
|
4894
|
+
} else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
4895
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4874
4896
|
}
|
|
4875
4897
|
if (directoryDataLength == MAX_32_BITS) {
|
|
4876
4898
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
4877
|
-
} else if (
|
|
4878
|
-
|
|
4899
|
+
} else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
4900
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4879
4901
|
}
|
|
4880
4902
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4881
4903
|
}
|
|
@@ -4944,14 +4966,22 @@
|
|
|
4944
4966
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4945
4967
|
decryptedDirectory = true;
|
|
4946
4968
|
}
|
|
4969
|
+
if (directoryEncryptionInfo && !decryptedDirectory &&
|
|
4970
|
+
(directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
|
|
4971
|
+
addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
|
|
4972
|
+
}
|
|
4947
4973
|
startOffset = directoryDataOffset;
|
|
4948
4974
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
4949
4975
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
4950
|
-
const filenames =
|
|
4976
|
+
const filenames = new Set();
|
|
4951
4977
|
let duplicateFilename;
|
|
4978
|
+
let previousEntryPosition = -1;
|
|
4952
4979
|
const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
|
|
4953
4980
|
if (!filesLength && recoverWrappedFilesLength) {
|
|
4954
4981
|
filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
4982
|
+
if (filesLength) {
|
|
4983
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
4984
|
+
}
|
|
4955
4985
|
}
|
|
4956
4986
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4957
4987
|
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
@@ -5030,15 +5060,26 @@
|
|
|
5030
5060
|
filename,
|
|
5031
5061
|
comment
|
|
5032
5062
|
});
|
|
5033
|
-
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)
|
|
5063
|
+
if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
|
|
5064
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5065
|
+
}
|
|
5034
5066
|
fileEntry.offset += prependedDataLength;
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5067
|
+
const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
|
|
5068
|
+
startOffset = Math.min(entryPosition, startOffset);
|
|
5069
|
+
if (entryPosition < previousEntryPosition) {
|
|
5070
|
+
addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
|
|
5071
|
+
}
|
|
5072
|
+
previousEntryPosition = entryPosition;
|
|
5073
|
+
if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
|
|
5074
|
+
addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
|
|
5075
|
+
}
|
|
5076
|
+
if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
|
|
5077
|
+
addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
|
|
5078
|
+
}
|
|
5079
|
+
if (filenames.has(fileEntry.filename)) {
|
|
5080
|
+
duplicateFilename = true;
|
|
5041
5081
|
}
|
|
5082
|
+
filenames.add(fileEntry.filename);
|
|
5042
5083
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5043
5084
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
5044
5085
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -5076,7 +5117,11 @@
|
|
|
5076
5117
|
};
|
|
5077
5118
|
offset = endOffset;
|
|
5078
5119
|
if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
|
|
5079
|
-
|
|
5120
|
+
const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
5121
|
+
if (wrappedFilesLength) {
|
|
5122
|
+
filesLength += wrappedFilesLength;
|
|
5123
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
5124
|
+
}
|
|
5080
5125
|
}
|
|
5081
5126
|
const { onprogress } = options;
|
|
5082
5127
|
if (onprogress) {
|
|
@@ -5102,18 +5147,22 @@
|
|
|
5102
5147
|
zipReader.digitalSignature = digitalSignature;
|
|
5103
5148
|
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
5104
5149
|
}
|
|
5105
|
-
if (
|
|
5106
|
-
|
|
5150
|
+
if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
|
|
5151
|
+
(!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
|
|
5152
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
|
|
5107
5153
|
}
|
|
5108
5154
|
if (duplicateFilename) {
|
|
5109
|
-
|
|
5155
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
|
|
5110
5156
|
}
|
|
5111
5157
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5112
5158
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5113
5159
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5114
5160
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5115
5161
|
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5116
|
-
throwAmbiguousArchive(
|
|
5162
|
+
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5163
|
+
}
|
|
5164
|
+
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5165
|
+
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5117
5166
|
}
|
|
5118
5167
|
if (extractPrependedData) {
|
|
5119
5168
|
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
@@ -5183,6 +5232,28 @@
|
|
|
5183
5232
|
}
|
|
5184
5233
|
}
|
|
5185
5234
|
|
|
5235
|
+
async function isZipFile(reader, options = {}) {
|
|
5236
|
+
reader = new GenericReader(reader);
|
|
5237
|
+
await initStream(reader);
|
|
5238
|
+
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
5239
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
5240
|
+
await initStream(reader);
|
|
5241
|
+
}
|
|
5242
|
+
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5243
|
+
return false;
|
|
5244
|
+
}
|
|
5245
|
+
const strictness = getStrictness(options, {});
|
|
5246
|
+
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
5247
|
+
const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
|
|
5248
|
+
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
5249
|
+
if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
|
|
5250
|
+
return false;
|
|
5251
|
+
}
|
|
5252
|
+
const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
|
|
5253
|
+
const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
5254
|
+
return reader.size - appendedDataOffset <= maxAppendedDataSize;
|
|
5255
|
+
}
|
|
5256
|
+
|
|
5186
5257
|
let ZipEntry$1 = class ZipEntry {
|
|
5187
5258
|
|
|
5188
5259
|
constructor(reader, options) {
|
|
@@ -5214,6 +5285,7 @@
|
|
|
5214
5285
|
dataDescriptor
|
|
5215
5286
|
} = bitFlag;
|
|
5216
5287
|
const localDirectory = fileEntry.localDirectory = {};
|
|
5288
|
+
const warnings = fileEntry.warnings = [];
|
|
5217
5289
|
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
5218
5290
|
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
5219
5291
|
const dataView = getDataView(dataArray);
|
|
@@ -5254,10 +5326,10 @@
|
|
|
5254
5326
|
if (checkLocalFilename) {
|
|
5255
5327
|
localDirectory.rawFilename = rawLocalFilename;
|
|
5256
5328
|
}
|
|
5257
|
-
readCommonFooter(zipEntry, localDirectory, dataView, 4, true)
|
|
5258
|
-
|
|
5259
|
-
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
|
|
5329
|
+
if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
|
|
5330
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
|
|
5260
5331
|
}
|
|
5332
|
+
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
|
|
5261
5333
|
const { lastAccessDate, creationDate, uid, gid } = localDirectory;
|
|
5262
5334
|
if (lastAccessDate) {
|
|
5263
5335
|
fileEntry.lastAccessDate = lastAccessDate;
|
|
@@ -5483,6 +5555,7 @@
|
|
|
5483
5555
|
const extraField = directory.extraField = new Map();
|
|
5484
5556
|
const rawExtraFieldView = getDataView(rawExtraField);
|
|
5485
5557
|
let offsetExtraField = 0;
|
|
5558
|
+
let malformedExtraField = false;
|
|
5486
5559
|
try {
|
|
5487
5560
|
while (offsetExtraField < rawExtraField.length) {
|
|
5488
5561
|
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
@@ -5494,7 +5567,10 @@
|
|
|
5494
5567
|
offsetExtraField += 4 + size;
|
|
5495
5568
|
}
|
|
5496
5569
|
} catch {
|
|
5497
|
-
|
|
5570
|
+
malformedExtraField = true;
|
|
5571
|
+
}
|
|
5572
|
+
if (offsetExtraField > rawExtraField.length) {
|
|
5573
|
+
malformedExtraField = true;
|
|
5498
5574
|
}
|
|
5499
5575
|
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5500
5576
|
Object.assign(directory, {
|
|
@@ -5562,6 +5638,7 @@
|
|
|
5562
5638
|
if (extraFieldUSDZ) {
|
|
5563
5639
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
5564
5640
|
}
|
|
5641
|
+
return malformedExtraField;
|
|
5565
5642
|
}
|
|
5566
5643
|
|
|
5567
5644
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
@@ -6023,27 +6100,46 @@
|
|
|
6023
6100
|
return UNDEFINED_VALUE;
|
|
6024
6101
|
}
|
|
6025
6102
|
|
|
6026
|
-
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
6103
|
+
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
|
|
6027
6104
|
const { rawFilename } = zipEntry;
|
|
6105
|
+
const reject = !warnings;
|
|
6028
6106
|
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
6029
6107
|
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
6030
6108
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6031
6109
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6032
6110
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6033
|
-
|
|
6111
|
+
reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
|
|
6034
6112
|
}
|
|
6035
6113
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6036
|
-
|
|
6114
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
6037
6115
|
}
|
|
6038
6116
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
6039
|
-
|
|
6117
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
|
|
6040
6118
|
}
|
|
6041
6119
|
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
6042
6120
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
6043
6121
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
6044
6122
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
6045
6123
|
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
6046
|
-
|
|
6124
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
|
|
6125
|
+
}
|
|
6126
|
+
}
|
|
6127
|
+
|
|
6128
|
+
function reportAmbiguity(reject, warnings, reason) {
|
|
6129
|
+
if (reject) {
|
|
6130
|
+
throwAmbiguousArchive(reason);
|
|
6131
|
+
} else {
|
|
6132
|
+
addWarning(warnings, reason);
|
|
6133
|
+
}
|
|
6134
|
+
}
|
|
6135
|
+
|
|
6136
|
+
function addWarning(warnings, reason, filename) {
|
|
6137
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6138
|
+
const warning = { reason };
|
|
6139
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
6140
|
+
warning.filename = filename;
|
|
6141
|
+
}
|
|
6142
|
+
warnings.push(warning);
|
|
6047
6143
|
}
|
|
6048
6144
|
}
|
|
6049
6145
|
|
|
@@ -6120,8 +6216,23 @@
|
|
|
6120
6216
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
6121
6217
|
ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
|
|
6122
6218
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
6219
|
+
WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
|
|
6220
|
+
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6221
|
+
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6222
|
+
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6223
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6224
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6225
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6226
|
+
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6227
|
+
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6228
|
+
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
6229
|
+
WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
|
|
6230
|
+
WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
|
|
6231
|
+
WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
|
|
6232
|
+
WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
|
|
6123
6233
|
ZipReader: ZipReader,
|
|
6124
|
-
ZipReaderStream: ZipReaderStream
|
|
6234
|
+
ZipReaderStream: ZipReaderStream,
|
|
6235
|
+
isZipFile: isZipFile
|
|
6125
6236
|
});
|
|
6126
6237
|
|
|
6127
6238
|
/*
|
|
@@ -6334,6 +6445,7 @@
|
|
|
6334
6445
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6335
6446
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6336
6447
|
rawExtraField,
|
|
6448
|
+
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6337
6449
|
extendedTimestamp: false,
|
|
6338
6450
|
headerArray,
|
|
6339
6451
|
headerView
|
|
@@ -6507,7 +6619,6 @@
|
|
|
6507
6619
|
|
|
6508
6620
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6509
6621
|
options = Object.assign({}, options);
|
|
6510
|
-
name = name.trim();
|
|
6511
6622
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6512
6623
|
name += DIRECTORY_SIGNATURE;
|
|
6513
6624
|
}
|
|
@@ -6598,7 +6709,6 @@
|
|
|
6598
6709
|
}
|
|
6599
6710
|
|
|
6600
6711
|
function resolveAttributes(zipWriter, name, options) {
|
|
6601
|
-
name = name.trim();
|
|
6602
6712
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6603
6713
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
6604
6714
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
@@ -6803,6 +6913,7 @@
|
|
|
6803
6913
|
}
|
|
6804
6914
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
6805
6915
|
const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
|
|
6916
|
+
const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
|
|
6806
6917
|
return {
|
|
6807
6918
|
comment,
|
|
6808
6919
|
resolvedOptions: {
|
|
@@ -6838,7 +6949,8 @@
|
|
|
6838
6949
|
dataDescriptor,
|
|
6839
6950
|
zip64,
|
|
6840
6951
|
rawExtraField,
|
|
6841
|
-
rawLocalExtraField
|
|
6952
|
+
rawLocalExtraField,
|
|
6953
|
+
rawCentralExtraField
|
|
6842
6954
|
}
|
|
6843
6955
|
};
|
|
6844
6956
|
}
|
|
@@ -6980,7 +7092,6 @@
|
|
|
6980
7092
|
let { name } = entry;
|
|
6981
7093
|
const { size } = entry;
|
|
6982
7094
|
const options = Object.assign({}, entry.options);
|
|
6983
|
-
name = name.trim();
|
|
6984
7095
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6985
7096
|
name += DIRECTORY_SIGNATURE;
|
|
6986
7097
|
}
|
|
@@ -7236,6 +7347,7 @@
|
|
|
7236
7347
|
versionMadeBy,
|
|
7237
7348
|
rawComment,
|
|
7238
7349
|
rawExtraField,
|
|
7350
|
+
rawCentralExtraField,
|
|
7239
7351
|
useWebWorkers,
|
|
7240
7352
|
transferStreams,
|
|
7241
7353
|
onstart,
|
|
@@ -7279,6 +7391,7 @@
|
|
|
7279
7391
|
rawExtraFieldUnix,
|
|
7280
7392
|
rawExtraFieldAES,
|
|
7281
7393
|
rawExtraField,
|
|
7394
|
+
rawCentralExtraField,
|
|
7282
7395
|
extendedTimestamp,
|
|
7283
7396
|
msDosCompatible,
|
|
7284
7397
|
internalFileAttributes,
|
|
@@ -7779,6 +7892,7 @@
|
|
|
7779
7892
|
rawExtraFieldNTFS,
|
|
7780
7893
|
rawExtraFieldUnix,
|
|
7781
7894
|
rawExtraField,
|
|
7895
|
+
rawCentralExtraField,
|
|
7782
7896
|
extendedTimestamp,
|
|
7783
7897
|
extraFieldExtendedTimestampFlag,
|
|
7784
7898
|
lastModDate,
|
|
@@ -7833,7 +7947,8 @@
|
|
|
7833
7947
|
rawExtraFieldNTFS,
|
|
7834
7948
|
rawExtraFieldUnix,
|
|
7835
7949
|
rawExtraFieldTimestamp,
|
|
7836
|
-
rawExtraField
|
|
7950
|
+
rawExtraField,
|
|
7951
|
+
rawCentralExtraField);
|
|
7837
7952
|
if (extraFieldLength > MAX_16_BITS) {
|
|
7838
7953
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
7839
7954
|
}
|
|
@@ -7861,6 +7976,7 @@
|
|
|
7861
7976
|
rawExtraFieldNTFS,
|
|
7862
7977
|
rawExtraFieldUnix,
|
|
7863
7978
|
rawExtraField,
|
|
7979
|
+
rawCentralExtraField,
|
|
7864
7980
|
rawComment,
|
|
7865
7981
|
versionMadeBy,
|
|
7866
7982
|
headerArray,
|
|
@@ -7875,7 +7991,7 @@
|
|
|
7875
7991
|
uncompressedSize,
|
|
7876
7992
|
compressedSize
|
|
7877
7993
|
} = fileEntry;
|
|
7878
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
7994
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
7879
7995
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
7880
7996
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
7881
7997
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -7913,6 +8029,7 @@
|
|
|
7913
8029
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7914
8030
|
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7915
8031
|
directoryRecord.writeBytes(rawExtraField);
|
|
8032
|
+
directoryRecord.writeBytes(rawCentralExtraField);
|
|
7916
8033
|
directoryRecord.writeBytes(rawComment);
|
|
7917
8034
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7918
8035
|
offset += directoryRecordLength;
|
|
@@ -10372,6 +10489,20 @@
|
|
|
10372
10489
|
exports.TextWriter = TextWriter;
|
|
10373
10490
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
10374
10491
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
10492
|
+
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
10493
|
+
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
10494
|
+
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
10495
|
+
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
10496
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
10497
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
10498
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
10499
|
+
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
10500
|
+
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
10501
|
+
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|
|
10502
|
+
exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
|
|
10503
|
+
exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
|
|
10504
|
+
exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
|
|
10505
|
+
exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
|
|
10375
10506
|
exports.Writer = Writer;
|
|
10376
10507
|
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10377
10508
|
exports.ZipEntry = ZipEntry;
|
|
@@ -10387,6 +10518,7 @@
|
|
|
10387
10518
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
10388
10519
|
exports.fs = fs;
|
|
10389
10520
|
exports.getMimeType = getMimeType;
|
|
10521
|
+
exports.isZipFile = isZipFile;
|
|
10390
10522
|
exports.registerCodec = registerCodec;
|
|
10391
10523
|
exports.resetConfiguration = resetConfiguration;
|
|
10392
10524
|
exports.terminateWorkers = terminateWorkers;
|