@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.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";
|
|
@@ -4735,6 +4737,21 @@
|
|
|
4735
4737
|
const ERR_INVALID_FILENAME_VALIDATION = "Invalid filenameValidation (must be 'strict', 'balanced' or 'tolerant')";
|
|
4736
4738
|
const ERR_INVALID_MAX_APPENDED_DATA_SIZE = "Invalid maxAppendedDataSize (must be a number greater than or equal to 0)";
|
|
4737
4739
|
const ERR_UNSUPPORTED_UINT64 = "64-bit value exceeds Number.MAX_SAFE_INTEGER";
|
|
4740
|
+
const WARNING_UNSORTED_CENTRAL_DIRECTORY = "unsorted central directory";
|
|
4741
|
+
const WARNING_UNKNOWN_VERSION = "unknown version needed to extract";
|
|
4742
|
+
const WARNING_COMPRESSED_PATCHED_DATA = "compressed patched data";
|
|
4743
|
+
const WARNING_MALFORMED_EXTRA_FIELD = "malformed extra field";
|
|
4744
|
+
const WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = "unknown zip64 extensible data";
|
|
4745
|
+
const WARNING_WRAPPED_ENTRIES_COUNT = "wrapped entries count";
|
|
4746
|
+
const WARNING_APPENDED_DATA = "appended data";
|
|
4747
|
+
const WARNING_PREPENDED_DATA = "prepended data";
|
|
4748
|
+
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4749
|
+
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4750
|
+
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4751
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4752
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4753
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
4754
|
+
const MAX_KNOWN_VERSION = 63;
|
|
4738
4755
|
const DRIVE_LETTER_REGEXP = /^[a-zA-Z]:/;
|
|
4739
4756
|
const CHARSET_UTF8 = "utf-8";
|
|
4740
4757
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
@@ -4785,6 +4802,7 @@
|
|
|
4785
4802
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
4786
4803
|
throw new Error(ERR_BAD_FORMAT);
|
|
4787
4804
|
}
|
|
4805
|
+
const warnings = zipReader.warnings = [];
|
|
4788
4806
|
const strictness = getStrictness(options, zipReader.options);
|
|
4789
4807
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
4790
4808
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -4808,8 +4826,12 @@
|
|
|
4808
4826
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4809
4827
|
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4810
4828
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4811
|
-
|
|
4812
|
-
|
|
4829
|
+
const appendedDataLength = reader.size - appendedDataOffset;
|
|
4830
|
+
if (appendedDataLength > maxAppendedDataSize) {
|
|
4831
|
+
throwAmbiguousArchive(WARNING_APPENDED_DATA);
|
|
4832
|
+
}
|
|
4833
|
+
if (appendedDataLength > 0) {
|
|
4834
|
+
addWarning(warnings, WARNING_APPENDED_DATA);
|
|
4813
4835
|
}
|
|
4814
4836
|
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4815
4837
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
@@ -4863,23 +4885,23 @@
|
|
|
4863
4885
|
}
|
|
4864
4886
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4865
4887
|
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4866
|
-
} else if (
|
|
4867
|
-
|
|
4888
|
+
} else if (lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4889
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4868
4890
|
}
|
|
4869
4891
|
if (diskNumber == MAX_16_BITS) {
|
|
4870
4892
|
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4871
|
-
} else if (
|
|
4872
|
-
|
|
4893
|
+
} else if (diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4894
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4873
4895
|
}
|
|
4874
4896
|
if (filesLength == MAX_16_BITS) {
|
|
4875
4897
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
4876
|
-
} else if (
|
|
4877
|
-
|
|
4898
|
+
} else if (filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
4899
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4878
4900
|
}
|
|
4879
4901
|
if (directoryDataLength == MAX_32_BITS) {
|
|
4880
4902
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
4881
|
-
} else if (
|
|
4882
|
-
|
|
4903
|
+
} else if (directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
4904
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY);
|
|
4883
4905
|
}
|
|
4884
4906
|
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4885
4907
|
}
|
|
@@ -4948,14 +4970,22 @@
|
|
|
4948
4970
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4949
4971
|
decryptedDirectory = true;
|
|
4950
4972
|
}
|
|
4973
|
+
if (directoryEncryptionInfo && !decryptedDirectory &&
|
|
4974
|
+
(directoryArray.length < 4 || getUint32$1(directoryView, 0) == CENTRAL_FILE_HEADER_SIGNATURE)) {
|
|
4975
|
+
addWarning(warnings, WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA);
|
|
4976
|
+
}
|
|
4951
4977
|
startOffset = directoryDataOffset;
|
|
4952
4978
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
4953
4979
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
4954
|
-
const filenames =
|
|
4980
|
+
const filenames = new Set();
|
|
4955
4981
|
let duplicateFilename;
|
|
4982
|
+
let previousEntryPosition = -1;
|
|
4956
4983
|
const recoverWrappedFilesLength = !checkAmbiguity && !zip64EndOfDirectory;
|
|
4957
4984
|
if (!filesLength && recoverWrappedFilesLength) {
|
|
4958
4985
|
filesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
4986
|
+
if (filesLength) {
|
|
4987
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
4988
|
+
}
|
|
4959
4989
|
}
|
|
4960
4990
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4961
4991
|
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
@@ -5034,15 +5064,26 @@
|
|
|
5034
5064
|
filename,
|
|
5035
5065
|
comment
|
|
5036
5066
|
});
|
|
5037
|
-
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)
|
|
5067
|
+
if (readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6)) {
|
|
5068
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD, filename);
|
|
5069
|
+
}
|
|
5038
5070
|
fileEntry.offset += prependedDataLength;
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5071
|
+
const entryPosition = getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset;
|
|
5072
|
+
startOffset = Math.min(entryPosition, startOffset);
|
|
5073
|
+
if (entryPosition < previousEntryPosition) {
|
|
5074
|
+
addWarning(warnings, WARNING_UNSORTED_CENTRAL_DIRECTORY, filename);
|
|
5075
|
+
}
|
|
5076
|
+
previousEntryPosition = entryPosition;
|
|
5077
|
+
if ((fileEntry.version & MAX_8_BITS) > MAX_KNOWN_VERSION) {
|
|
5078
|
+
addWarning(warnings, WARNING_UNKNOWN_VERSION, filename);
|
|
5079
|
+
}
|
|
5080
|
+
if ((fileEntry.rawBitFlag & BITFLAG_COMPRESSED_PATCHED_DATA) == BITFLAG_COMPRESSED_PATCHED_DATA) {
|
|
5081
|
+
addWarning(warnings, WARNING_COMPRESSED_PATCHED_DATA, filename);
|
|
5082
|
+
}
|
|
5083
|
+
if (filenames.has(fileEntry.filename)) {
|
|
5084
|
+
duplicateFilename = true;
|
|
5045
5085
|
}
|
|
5086
|
+
filenames.add(fileEntry.filename);
|
|
5046
5087
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
5047
5088
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
5048
5089
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -5080,7 +5121,11 @@
|
|
|
5080
5121
|
};
|
|
5081
5122
|
offset = endOffset;
|
|
5082
5123
|
if (indexFile == filesLength - 1 && recoverWrappedFilesLength) {
|
|
5083
|
-
|
|
5124
|
+
const wrappedFilesLength = getWrappedFilesLength(directoryView, directoryArray, offset);
|
|
5125
|
+
if (wrappedFilesLength) {
|
|
5126
|
+
filesLength += wrappedFilesLength;
|
|
5127
|
+
addWarning(warnings, WARNING_WRAPPED_ENTRIES_COUNT);
|
|
5128
|
+
}
|
|
5084
5129
|
}
|
|
5085
5130
|
const { onprogress } = options;
|
|
5086
5131
|
if (onprogress) {
|
|
@@ -5106,18 +5151,22 @@
|
|
|
5106
5151
|
zipReader.digitalSignature = digitalSignature;
|
|
5107
5152
|
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
5108
5153
|
}
|
|
5109
|
-
if (
|
|
5110
|
-
|
|
5154
|
+
if ((offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) ||
|
|
5155
|
+
(!decryptedDirectory && offset != directoryDataLength && offsetAfterSignature != directoryDataLength)) {
|
|
5156
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_TRAILING_CENTRAL_DIRECTORY_DATA);
|
|
5111
5157
|
}
|
|
5112
5158
|
if (duplicateFilename) {
|
|
5113
|
-
|
|
5159
|
+
reportAmbiguity(checkAmbiguity, warnings, WARNING_DUPLICATE_FILENAME);
|
|
5114
5160
|
}
|
|
5115
5161
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5116
5162
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5117
5163
|
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5118
5164
|
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5119
5165
|
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5120
|
-
throwAmbiguousArchive(
|
|
5166
|
+
throwAmbiguousArchive(WARNING_PREPENDED_DATA);
|
|
5167
|
+
}
|
|
5168
|
+
if (prependedDataLength || (filesLength && startOffset > SPLIT_ZIP_FILE_SIGNATURE_LENGTH)) {
|
|
5169
|
+
addWarning(warnings, WARNING_PREPENDED_DATA);
|
|
5121
5170
|
}
|
|
5122
5171
|
if (extractPrependedData) {
|
|
5123
5172
|
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
@@ -5187,6 +5236,28 @@
|
|
|
5187
5236
|
}
|
|
5188
5237
|
}
|
|
5189
5238
|
|
|
5239
|
+
async function isZipFile(reader, options = {}) {
|
|
5240
|
+
reader = new GenericReader(reader);
|
|
5241
|
+
await initStream(reader);
|
|
5242
|
+
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
5243
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
5244
|
+
await initStream(reader);
|
|
5245
|
+
}
|
|
5246
|
+
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5247
|
+
return false;
|
|
5248
|
+
}
|
|
5249
|
+
const strictness = getStrictness(options, {});
|
|
5250
|
+
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
5251
|
+
const maxAppendedDataSize = getMaxAppendedDataSize(options[OPTION_MAX_APPENDED_DATA_SIZE], strictness);
|
|
5252
|
+
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
5253
|
+
if (!endOfDirectoryInfo || (strictness == STRICTNESS_STRICT && endOfDirectoryReachingEndCount > 1)) {
|
|
5254
|
+
return false;
|
|
5255
|
+
}
|
|
5256
|
+
const commentLength = getUint16$1(getDataView(endOfDirectoryInfo), 20);
|
|
5257
|
+
const appendedDataOffset = endOfDirectoryInfo.offset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
5258
|
+
return reader.size - appendedDataOffset <= maxAppendedDataSize;
|
|
5259
|
+
}
|
|
5260
|
+
|
|
5190
5261
|
let ZipEntry$1 = class ZipEntry {
|
|
5191
5262
|
|
|
5192
5263
|
constructor(reader, options) {
|
|
@@ -5218,6 +5289,7 @@
|
|
|
5218
5289
|
dataDescriptor
|
|
5219
5290
|
} = bitFlag;
|
|
5220
5291
|
const localDirectory = fileEntry.localDirectory = {};
|
|
5292
|
+
const warnings = fileEntry.warnings = [];
|
|
5221
5293
|
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
5222
5294
|
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
5223
5295
|
const dataView = getDataView(dataArray);
|
|
@@ -5258,10 +5330,10 @@
|
|
|
5258
5330
|
if (checkLocalFilename) {
|
|
5259
5331
|
localDirectory.rawFilename = rawLocalFilename;
|
|
5260
5332
|
}
|
|
5261
|
-
readCommonFooter(zipEntry, localDirectory, dataView, 4, true)
|
|
5262
|
-
|
|
5263
|
-
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename);
|
|
5333
|
+
if (readCommonFooter(zipEntry, localDirectory, dataView, 4, true)) {
|
|
5334
|
+
addWarning(warnings, WARNING_MALFORMED_EXTRA_FIELD);
|
|
5264
5335
|
}
|
|
5336
|
+
validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, checkLocalDirectory ? UNDEFINED_VALUE : warnings);
|
|
5265
5337
|
const { lastAccessDate, creationDate, uid, gid } = localDirectory;
|
|
5266
5338
|
if (lastAccessDate) {
|
|
5267
5339
|
fileEntry.lastAccessDate = lastAccessDate;
|
|
@@ -5487,6 +5559,7 @@
|
|
|
5487
5559
|
const extraField = directory.extraField = new Map();
|
|
5488
5560
|
const rawExtraFieldView = getDataView(rawExtraField);
|
|
5489
5561
|
let offsetExtraField = 0;
|
|
5562
|
+
let malformedExtraField = false;
|
|
5490
5563
|
try {
|
|
5491
5564
|
while (offsetExtraField < rawExtraField.length) {
|
|
5492
5565
|
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
@@ -5498,7 +5571,10 @@
|
|
|
5498
5571
|
offsetExtraField += 4 + size;
|
|
5499
5572
|
}
|
|
5500
5573
|
} catch {
|
|
5501
|
-
|
|
5574
|
+
malformedExtraField = true;
|
|
5575
|
+
}
|
|
5576
|
+
if (offsetExtraField > rawExtraField.length) {
|
|
5577
|
+
malformedExtraField = true;
|
|
5502
5578
|
}
|
|
5503
5579
|
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5504
5580
|
Object.assign(directory, {
|
|
@@ -5566,6 +5642,7 @@
|
|
|
5566
5642
|
if (extraFieldUSDZ) {
|
|
5567
5643
|
directory.extraFieldUSDZ = extraFieldUSDZ;
|
|
5568
5644
|
}
|
|
5645
|
+
return malformedExtraField;
|
|
5569
5646
|
}
|
|
5570
5647
|
|
|
5571
5648
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
@@ -6027,27 +6104,46 @@
|
|
|
6027
6104
|
return UNDEFINED_VALUE;
|
|
6028
6105
|
}
|
|
6029
6106
|
|
|
6030
|
-
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
6107
|
+
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename, warnings) {
|
|
6031
6108
|
const { rawFilename } = zipEntry;
|
|
6109
|
+
const reject = !warnings;
|
|
6032
6110
|
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
6033
6111
|
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
6034
6112
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6035
6113
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6036
6114
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6037
|
-
|
|
6115
|
+
reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
|
|
6038
6116
|
}
|
|
6039
6117
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6040
|
-
|
|
6118
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
6041
6119
|
}
|
|
6042
6120
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
6043
|
-
|
|
6121
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD);
|
|
6044
6122
|
}
|
|
6045
6123
|
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
6046
6124
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
6047
6125
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
6048
6126
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
6049
6127
|
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
6050
|
-
|
|
6128
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES);
|
|
6129
|
+
}
|
|
6130
|
+
}
|
|
6131
|
+
|
|
6132
|
+
function reportAmbiguity(reject, warnings, reason) {
|
|
6133
|
+
if (reject) {
|
|
6134
|
+
throwAmbiguousArchive(reason);
|
|
6135
|
+
} else {
|
|
6136
|
+
addWarning(warnings, reason);
|
|
6137
|
+
}
|
|
6138
|
+
}
|
|
6139
|
+
|
|
6140
|
+
function addWarning(warnings, reason, filename) {
|
|
6141
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6142
|
+
const warning = { reason };
|
|
6143
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
6144
|
+
warning.filename = filename;
|
|
6145
|
+
}
|
|
6146
|
+
warnings.push(warning);
|
|
6051
6147
|
}
|
|
6052
6148
|
}
|
|
6053
6149
|
|
|
@@ -6124,8 +6220,23 @@
|
|
|
6124
6220
|
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
6125
6221
|
ERR_UNSUPPORTED_UINT64: ERR_UNSUPPORTED_UINT64,
|
|
6126
6222
|
ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
|
|
6223
|
+
WARNING_APPENDED_DATA: WARNING_APPENDED_DATA,
|
|
6224
|
+
WARNING_COMPRESSED_PATCHED_DATA: WARNING_COMPRESSED_PATCHED_DATA,
|
|
6225
|
+
WARNING_DUPLICATE_FILENAME: WARNING_DUPLICATE_FILENAME,
|
|
6226
|
+
WARNING_MALFORMED_EXTRA_FIELD: WARNING_MALFORMED_EXTRA_FIELD,
|
|
6227
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6228
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6229
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6230
|
+
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6231
|
+
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6232
|
+
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
6233
|
+
WARNING_UNKNOWN_VERSION: WARNING_UNKNOWN_VERSION,
|
|
6234
|
+
WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA: WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA,
|
|
6235
|
+
WARNING_UNSORTED_CENTRAL_DIRECTORY: WARNING_UNSORTED_CENTRAL_DIRECTORY,
|
|
6236
|
+
WARNING_WRAPPED_ENTRIES_COUNT: WARNING_WRAPPED_ENTRIES_COUNT,
|
|
6127
6237
|
ZipReader: ZipReader,
|
|
6128
|
-
ZipReaderStream: ZipReaderStream
|
|
6238
|
+
ZipReaderStream: ZipReaderStream,
|
|
6239
|
+
isZipFile: isZipFile
|
|
6129
6240
|
});
|
|
6130
6241
|
|
|
6131
6242
|
/*
|
|
@@ -6338,6 +6449,7 @@
|
|
|
6338
6449
|
rawExtraFieldNTFS: EMPTY_UINT8_ARRAY,
|
|
6339
6450
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6340
6451
|
rawExtraField,
|
|
6452
|
+
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6341
6453
|
extendedTimestamp: false,
|
|
6342
6454
|
headerArray,
|
|
6343
6455
|
headerView
|
|
@@ -6511,7 +6623,6 @@
|
|
|
6511
6623
|
|
|
6512
6624
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6513
6625
|
options = Object.assign({}, options);
|
|
6514
|
-
name = name.trim();
|
|
6515
6626
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6516
6627
|
name += DIRECTORY_SIGNATURE;
|
|
6517
6628
|
}
|
|
@@ -6602,7 +6713,6 @@
|
|
|
6602
6713
|
}
|
|
6603
6714
|
|
|
6604
6715
|
function resolveAttributes(zipWriter, name, options) {
|
|
6605
|
-
name = name.trim();
|
|
6606
6716
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6607
6717
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
6608
6718
|
const executable = getOptionValue(zipWriter, options, PROPERTY_NAME_EXECUTABLE);
|
|
@@ -6807,6 +6917,7 @@
|
|
|
6807
6917
|
}
|
|
6808
6918
|
const rawExtraField = serializeExtraField(options[PROPERTY_NAME_EXTRA_FIELD]);
|
|
6809
6919
|
const rawLocalExtraField = serializeExtraField(options[OPTION_LOCAL_EXTRA_FIELD]);
|
|
6920
|
+
const rawCentralExtraField = serializeExtraField(options[OPTION_CENTRAL_EXTRA_FIELD]);
|
|
6810
6921
|
return {
|
|
6811
6922
|
comment,
|
|
6812
6923
|
resolvedOptions: {
|
|
@@ -6842,7 +6953,8 @@
|
|
|
6842
6953
|
dataDescriptor,
|
|
6843
6954
|
zip64,
|
|
6844
6955
|
rawExtraField,
|
|
6845
|
-
rawLocalExtraField
|
|
6956
|
+
rawLocalExtraField,
|
|
6957
|
+
rawCentralExtraField
|
|
6846
6958
|
}
|
|
6847
6959
|
};
|
|
6848
6960
|
}
|
|
@@ -6984,7 +7096,6 @@
|
|
|
6984
7096
|
let { name } = entry;
|
|
6985
7097
|
const { size } = entry;
|
|
6986
7098
|
const options = Object.assign({}, entry.options);
|
|
6987
|
-
name = name.trim();
|
|
6988
7099
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6989
7100
|
name += DIRECTORY_SIGNATURE;
|
|
6990
7101
|
}
|
|
@@ -7240,6 +7351,7 @@
|
|
|
7240
7351
|
versionMadeBy,
|
|
7241
7352
|
rawComment,
|
|
7242
7353
|
rawExtraField,
|
|
7354
|
+
rawCentralExtraField,
|
|
7243
7355
|
useWebWorkers,
|
|
7244
7356
|
transferStreams,
|
|
7245
7357
|
onstart,
|
|
@@ -7283,6 +7395,7 @@
|
|
|
7283
7395
|
rawExtraFieldUnix,
|
|
7284
7396
|
rawExtraFieldAES,
|
|
7285
7397
|
rawExtraField,
|
|
7398
|
+
rawCentralExtraField,
|
|
7286
7399
|
extendedTimestamp,
|
|
7287
7400
|
msDosCompatible,
|
|
7288
7401
|
internalFileAttributes,
|
|
@@ -7783,6 +7896,7 @@
|
|
|
7783
7896
|
rawExtraFieldNTFS,
|
|
7784
7897
|
rawExtraFieldUnix,
|
|
7785
7898
|
rawExtraField,
|
|
7899
|
+
rawCentralExtraField,
|
|
7786
7900
|
extendedTimestamp,
|
|
7787
7901
|
extraFieldExtendedTimestampFlag,
|
|
7788
7902
|
lastModDate,
|
|
@@ -7837,7 +7951,8 @@
|
|
|
7837
7951
|
rawExtraFieldNTFS,
|
|
7838
7952
|
rawExtraFieldUnix,
|
|
7839
7953
|
rawExtraFieldTimestamp,
|
|
7840
|
-
rawExtraField
|
|
7954
|
+
rawExtraField,
|
|
7955
|
+
rawCentralExtraField);
|
|
7841
7956
|
if (extraFieldLength > MAX_16_BITS) {
|
|
7842
7957
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
7843
7958
|
}
|
|
@@ -7865,6 +7980,7 @@
|
|
|
7865
7980
|
rawExtraFieldNTFS,
|
|
7866
7981
|
rawExtraFieldUnix,
|
|
7867
7982
|
rawExtraField,
|
|
7983
|
+
rawCentralExtraField,
|
|
7868
7984
|
rawComment,
|
|
7869
7985
|
versionMadeBy,
|
|
7870
7986
|
headerArray,
|
|
@@ -7879,7 +7995,7 @@
|
|
|
7879
7995
|
uncompressedSize,
|
|
7880
7996
|
compressedSize
|
|
7881
7997
|
} = fileEntry;
|
|
7882
|
-
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
7998
|
+
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField, rawCentralExtraField);
|
|
7883
7999
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
7884
8000
|
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
7885
8001
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
@@ -7917,6 +8033,7 @@
|
|
|
7917
8033
|
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7918
8034
|
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7919
8035
|
directoryRecord.writeBytes(rawExtraField);
|
|
8036
|
+
directoryRecord.writeBytes(rawCentralExtraField);
|
|
7920
8037
|
directoryRecord.writeBytes(rawComment);
|
|
7921
8038
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7922
8039
|
offset += directoryRecordLength;
|
|
@@ -10741,6 +10858,20 @@
|
|
|
10741
10858
|
exports.TextWriter = TextWriter;
|
|
10742
10859
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
10743
10860
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
10861
|
+
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
10862
|
+
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
10863
|
+
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
10864
|
+
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
10865
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
10866
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
10867
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
10868
|
+
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
10869
|
+
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
10870
|
+
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|
|
10871
|
+
exports.WARNING_UNKNOWN_VERSION = WARNING_UNKNOWN_VERSION;
|
|
10872
|
+
exports.WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA = WARNING_UNKNOWN_ZIP64_EXTENSIBLE_DATA;
|
|
10873
|
+
exports.WARNING_UNSORTED_CENTRAL_DIRECTORY = WARNING_UNSORTED_CENTRAL_DIRECTORY;
|
|
10874
|
+
exports.WARNING_WRAPPED_ENTRIES_COUNT = WARNING_WRAPPED_ENTRIES_COUNT;
|
|
10744
10875
|
exports.Writer = Writer;
|
|
10745
10876
|
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10746
10877
|
exports.ZipEntry = ZipEntry;
|
|
@@ -10756,6 +10887,7 @@
|
|
|
10756
10887
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
10757
10888
|
exports.fs = fs;
|
|
10758
10889
|
exports.getMimeType = getMimeType;
|
|
10890
|
+
exports.isZipFile = isZipFile;
|
|
10759
10891
|
exports.registerCodec = registerCodec;
|
|
10760
10892
|
exports.resetConfiguration = resetConfiguration;
|
|
10761
10893
|
exports.terminateWorkers = terminateWorkersAndModule;
|