@zip.js/zip.js 2.8.7 → 2.8.9
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.js +407 -53
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +406 -52
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +411 -57
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +407 -53
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +408 -54
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +411 -57
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip.js +407 -53
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +411 -57
- package/index-native.min.js +1 -1
- package/index.cjs +407 -53
- package/index.d.ts +118 -2
- package/index.min.js +1 -1
- package/lib/core/constants.js +23 -1
- package/lib/core/io.js +19 -4
- package/lib/core/options.js +3 -1
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/streams/zlib-wasm/zlib-streams.js +13 -6
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/zip-entry.js +75 -9
- package/lib/core/zip-reader.js +113 -29
- package/lib/core/zip-writer.js +230 -14
- package/package.json +4 -4
package/lib/core/zip-entry.js
CHANGED
|
@@ -42,6 +42,8 @@ const PROPERTY_NAME_CREATION_DATE = "creationDate";
|
|
|
42
42
|
const PROPERTY_NAME_RAW_CREATION_DATE = "rawCreationDate";
|
|
43
43
|
const PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES = "internalFileAttributes";
|
|
44
44
|
const PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES = "externalFileAttributes";
|
|
45
|
+
const PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW = "msdosAttributesRaw";
|
|
46
|
+
const PROPERTY_NAME_MSDOS_ATTRIBUTES = "msdosAttributes";
|
|
45
47
|
const PROPERTY_NAME_MS_DOS_COMPATIBLE = "msDosCompatible";
|
|
46
48
|
const PROPERTY_NAME_ZIP64 = "zip64";
|
|
47
49
|
const PROPERTY_NAME_ENCRYPTED = "encrypted";
|
|
@@ -53,17 +55,73 @@ const PROPERTY_NAME_EXECUTABLE = "executable";
|
|
|
53
55
|
const PROPERTY_NAME_COMPRESSION_METHOD = "compressionMethod";
|
|
54
56
|
const PROPERTY_NAME_SIGNATURE = "signature";
|
|
55
57
|
const PROPERTY_NAME_EXTRA_FIELD = "extraField";
|
|
58
|
+
const PROPERTY_NAME_EXTRA_FIELD_INFOZIP = "extraFieldInfoZip";
|
|
59
|
+
const PROPERTY_NAME_EXTRA_FIELD_UNIX = "extraFieldUnix";
|
|
60
|
+
const PROPERTY_NAME_UID = "uid";
|
|
61
|
+
const PROPERTY_NAME_GID = "gid";
|
|
62
|
+
const PROPERTY_NAME_UNIX_MODE = "unixMode";
|
|
63
|
+
const PROPERTY_NAME_SETUID = "setuid";
|
|
64
|
+
const PROPERTY_NAME_SETGID = "setgid";
|
|
65
|
+
const PROPERTY_NAME_STICKY = "sticky";
|
|
66
|
+
const PROPERTY_NAME_BITFLAG = "bitFlag";
|
|
67
|
+
const PROPERTY_NAME_FILENAME_UTF8 = "filenameUTF8";
|
|
68
|
+
const PROPERTY_NAME_COMMENT_UTF8 = "commentUTF8";
|
|
69
|
+
const PROPERTY_NAME_RAW_EXTRA_FIELD = "rawExtraField";
|
|
70
|
+
const PROPERTY_NAME_EXTRA_FIELD_ZIP64 = "extraFieldZip64";
|
|
71
|
+
const PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH = "extraFieldUnicodePath";
|
|
72
|
+
const PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT = "extraFieldUnicodeComment";
|
|
73
|
+
const PROPERTY_NAME_EXTRA_FIELD_AES = "extraFieldAES";
|
|
74
|
+
const PROPERTY_NAME_EXTRA_FIELD_NTFS = "extraFieldNTFS";
|
|
75
|
+
const PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP = "extraFieldExtendedTimestamp";
|
|
56
76
|
|
|
57
77
|
const PROPERTY_NAMES = [
|
|
58
|
-
PROPERTY_NAME_FILENAME,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
78
|
+
PROPERTY_NAME_FILENAME,
|
|
79
|
+
PROPERTY_NAME_RAW_FILENAME,
|
|
80
|
+
PROPERTY_NAME_UNCOMPRESSED_SIZE,
|
|
81
|
+
PROPERTY_NAME_COMPRESSED_SIZE,
|
|
82
|
+
PROPERTY_NAME_LAST_MODIFICATION_DATE,
|
|
83
|
+
PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE,
|
|
84
|
+
PROPERTY_NAME_COMMENT,
|
|
85
|
+
PROPERTY_NAME_RAW_COMMENT,
|
|
86
|
+
PROPERTY_NAME_LAST_ACCESS_DATE,
|
|
87
|
+
PROPERTY_NAME_CREATION_DATE,
|
|
88
|
+
PROPERTY_NAME_RAW_CREATION_DATE,
|
|
89
|
+
PROPERTY_NAME_OFFSET,
|
|
90
|
+
PROPERTY_NAME_DISK_NUMBER_START,
|
|
91
|
+
PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
|
|
92
|
+
PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES,
|
|
93
|
+
PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW,
|
|
94
|
+
PROPERTY_NAME_MSDOS_ATTRIBUTES,
|
|
95
|
+
PROPERTY_NAME_MS_DOS_COMPATIBLE,
|
|
96
|
+
PROPERTY_NAME_ZIP64,
|
|
97
|
+
PROPERTY_NAME_ENCRYPTED,
|
|
98
|
+
PROPERTY_NAME_VERSION,
|
|
99
|
+
PROPERTY_NAME_VERSION_MADE_BY,
|
|
100
|
+
PROPERTY_NAME_ZIPCRYPTO,
|
|
101
|
+
PROPERTY_NAME_DIRECTORY,
|
|
102
|
+
PROPERTY_NAME_EXECUTABLE,
|
|
103
|
+
PROPERTY_NAME_COMPRESSION_METHOD,
|
|
104
|
+
PROPERTY_NAME_SIGNATURE,
|
|
105
|
+
PROPERTY_NAME_EXTRA_FIELD,
|
|
106
|
+
PROPERTY_NAME_EXTRA_FIELD_UNIX,
|
|
107
|
+
PROPERTY_NAME_EXTRA_FIELD_INFOZIP,
|
|
108
|
+
PROPERTY_NAME_UID,
|
|
109
|
+
PROPERTY_NAME_GID,
|
|
110
|
+
PROPERTY_NAME_UNIX_MODE,
|
|
111
|
+
PROPERTY_NAME_SETUID,
|
|
112
|
+
PROPERTY_NAME_SETGID,
|
|
113
|
+
PROPERTY_NAME_STICKY,
|
|
114
|
+
PROPERTY_NAME_BITFLAG,
|
|
115
|
+
PROPERTY_NAME_FILENAME_UTF8,
|
|
116
|
+
PROPERTY_NAME_COMMENT_UTF8,
|
|
117
|
+
PROPERTY_NAME_RAW_EXTRA_FIELD,
|
|
118
|
+
PROPERTY_NAME_EXTRA_FIELD_ZIP64,
|
|
119
|
+
PROPERTY_NAME_EXTRA_FIELD_UNICODE_PATH,
|
|
120
|
+
PROPERTY_NAME_EXTRA_FIELD_UNICODE_COMMENT,
|
|
121
|
+
PROPERTY_NAME_EXTRA_FIELD_AES,
|
|
122
|
+
PROPERTY_NAME_EXTRA_FIELD_NTFS,
|
|
123
|
+
PROPERTY_NAME_EXTRA_FIELD_EXTENDED_TIMESTAMP
|
|
124
|
+
];
|
|
67
125
|
|
|
68
126
|
class Entry {
|
|
69
127
|
|
|
@@ -90,6 +148,8 @@ export {
|
|
|
90
148
|
PROPERTY_NAME_RAW_CREATION_DATE,
|
|
91
149
|
PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES,
|
|
92
150
|
PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTES,
|
|
151
|
+
PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW,
|
|
152
|
+
PROPERTY_NAME_MSDOS_ATTRIBUTES,
|
|
93
153
|
PROPERTY_NAME_MS_DOS_COMPATIBLE,
|
|
94
154
|
PROPERTY_NAME_ZIP64,
|
|
95
155
|
PROPERTY_NAME_ENCRYPTED,
|
|
@@ -101,5 +161,11 @@ export {
|
|
|
101
161
|
PROPERTY_NAME_COMPRESSION_METHOD,
|
|
102
162
|
PROPERTY_NAME_SIGNATURE,
|
|
103
163
|
PROPERTY_NAME_EXTRA_FIELD,
|
|
164
|
+
PROPERTY_NAME_GID,
|
|
165
|
+
PROPERTY_NAME_UID,
|
|
166
|
+
PROPERTY_NAME_UNIX_MODE,
|
|
167
|
+
PROPERTY_NAME_SETUID,
|
|
168
|
+
PROPERTY_NAME_SETGID,
|
|
169
|
+
PROPERTY_NAME_STICKY,
|
|
104
170
|
Entry
|
|
105
171
|
};
|
package/lib/core/zip-reader.js
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
import {
|
|
33
33
|
MAX_32_BITS,
|
|
34
34
|
MAX_16_BITS,
|
|
35
|
+
MAX_8_BITS,
|
|
35
36
|
COMPRESSION_METHOD_DEFLATE,
|
|
36
37
|
COMPRESSION_METHOD_STORE,
|
|
37
38
|
COMPRESSION_METHOD_AES,
|
|
@@ -52,6 +53,8 @@ import {
|
|
|
52
53
|
EXTRAFIELD_TYPE_NTFS,
|
|
53
54
|
EXTRAFIELD_TYPE_NTFS_TAG1,
|
|
54
55
|
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
56
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
57
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
55
58
|
EXTRAFIELD_TYPE_USDZ,
|
|
56
59
|
END_OF_CENTRAL_DIR_LENGTH,
|
|
57
60
|
ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH,
|
|
@@ -61,16 +64,24 @@ import {
|
|
|
61
64
|
BITFLAG_DATA_DESCRIPTOR,
|
|
62
65
|
BITFLAG_LANG_ENCODING_FLAG,
|
|
63
66
|
FILE_ATTR_MSDOS_DIR_MASK,
|
|
67
|
+
FILE_ATTR_MSDOS_READONLY_MASK,
|
|
68
|
+
FILE_ATTR_MSDOS_HIDDEN_MASK,
|
|
69
|
+
FILE_ATTR_MSDOS_SYSTEM_MASK,
|
|
70
|
+
FILE_ATTR_MSDOS_ARCHIVE_MASK,
|
|
64
71
|
FILE_ATTR_UNIX_TYPE_MASK,
|
|
65
72
|
FILE_ATTR_UNIX_TYPE_DIR,
|
|
66
73
|
FILE_ATTR_UNIX_EXECUTABLE_MASK,
|
|
74
|
+
FILE_ATTR_UNIX_DEFAULT_MASK,
|
|
67
75
|
DIRECTORY_SIGNATURE,
|
|
68
76
|
HEADER_SIZE,
|
|
69
77
|
HEADER_OFFSET_SIGNATURE,
|
|
70
78
|
HEADER_OFFSET_COMPRESSED_SIZE,
|
|
71
79
|
HEADER_OFFSET_UNCOMPRESSED_SIZE,
|
|
72
80
|
UNDEFINED_VALUE,
|
|
73
|
-
COMPRESSION_METHOD_DEFLATE_64
|
|
81
|
+
COMPRESSION_METHOD_DEFLATE_64,
|
|
82
|
+
FILE_ATTR_UNIX_SETUID_MASK,
|
|
83
|
+
FILE_ATTR_UNIX_SETGID_MASK,
|
|
84
|
+
FILE_ATTR_UNIX_STICKY_MASK
|
|
74
85
|
} from "./constants.js";
|
|
75
86
|
import {
|
|
76
87
|
getConfiguration,
|
|
@@ -142,6 +153,7 @@ const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
|
142
153
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
143
154
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
144
155
|
const CHARSET_UTF8 = "utf-8";
|
|
156
|
+
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
145
157
|
const CHARSET_CP437 = "cp437";
|
|
146
158
|
const ZIP64_PROPERTIES = [
|
|
147
159
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -297,51 +309,71 @@ class ZipReader {
|
|
|
297
309
|
const filenameUTF8 = languageEncodingFlag;
|
|
298
310
|
const commentUTF8 = languageEncodingFlag;
|
|
299
311
|
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
312
|
+
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
313
|
+
const msdosAttributes = {
|
|
314
|
+
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
315
|
+
hidden: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_HIDDEN_MASK),
|
|
316
|
+
system: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_SYSTEM_MASK),
|
|
317
|
+
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
318
|
+
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
319
|
+
};
|
|
305
320
|
const offsetFileEntry = getUint32(directoryView, offset + 42) + prependedDataLength;
|
|
321
|
+
const decode = getOptionValue(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
322
|
+
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
323
|
+
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
324
|
+
let filename = decode(rawFilename, rawFilenameEncoding);
|
|
325
|
+
if (filename === UNDEFINED_VALUE) {
|
|
326
|
+
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
327
|
+
}
|
|
328
|
+
let comment = decode(rawComment, rawCommentEncoding);
|
|
329
|
+
if (comment === UNDEFINED_VALUE) {
|
|
330
|
+
comment = decodeText(rawComment, rawCommentEncoding);
|
|
331
|
+
}
|
|
306
332
|
Object.assign(fileEntry, {
|
|
307
333
|
versionMadeBy,
|
|
308
334
|
msDosCompatible,
|
|
309
335
|
compressedSize: 0,
|
|
310
336
|
uncompressedSize: 0,
|
|
311
337
|
commentLength,
|
|
312
|
-
directory,
|
|
313
338
|
offset: offsetFileEntry,
|
|
314
339
|
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
315
340
|
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
316
341
|
externalFileAttributes,
|
|
342
|
+
msdosAttributesRaw,
|
|
343
|
+
msdosAttributes,
|
|
317
344
|
rawFilename,
|
|
318
345
|
filenameUTF8,
|
|
319
346
|
commentUTF8,
|
|
320
347
|
rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset),
|
|
321
|
-
executable
|
|
322
|
-
});
|
|
323
|
-
fileEntry.internalFileAttribute = fileEntry.internalFileAttributes;
|
|
324
|
-
fileEntry.externalFileAttribute = fileEntry.externalFileAttributes;
|
|
325
|
-
const decode = getOptionValue(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
326
|
-
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
327
|
-
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
328
|
-
let filename = decode(rawFilename, rawFilenameEncoding);
|
|
329
|
-
if (filename === UNDEFINED_VALUE) {
|
|
330
|
-
filename = decodeText(rawFilename, rawFilenameEncoding);
|
|
331
|
-
}
|
|
332
|
-
let comment = decode(rawComment, rawCommentEncoding);
|
|
333
|
-
if (comment === UNDEFINED_VALUE) {
|
|
334
|
-
comment = decodeText(rawComment, rawCommentEncoding);
|
|
335
|
-
}
|
|
336
|
-
Object.assign(fileEntry, {
|
|
337
348
|
rawComment,
|
|
338
349
|
filename,
|
|
339
|
-
comment
|
|
340
|
-
directory: directory || filename.endsWith(DIRECTORY_SIGNATURE)
|
|
350
|
+
comment
|
|
341
351
|
});
|
|
342
352
|
startOffset = Math.max(offsetFileEntry, startOffset);
|
|
343
353
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
344
|
-
|
|
354
|
+
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
355
|
+
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
356
|
+
fileEntry.unixMode = unixExternalUpper;
|
|
357
|
+
}
|
|
358
|
+
const setuid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETUID_MASK);
|
|
359
|
+
const setgid = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_SETGID_MASK);
|
|
360
|
+
const sticky = Boolean(fileEntry.unixMode & FILE_ATTR_UNIX_STICKY_MASK);
|
|
361
|
+
const executable = (fileEntry.unixMode !== UNDEFINED_VALUE)
|
|
362
|
+
? ((fileEntry.unixMode & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0)
|
|
363
|
+
: (unixCompatible && ((unixExternalUpper & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0));
|
|
364
|
+
const modeIsDir = fileEntry.unixMode !== UNDEFINED_VALUE && ((fileEntry.unixMode & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
365
|
+
const upperIsDir = ((unixExternalUpper & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR);
|
|
366
|
+
Object.assign(fileEntry, {
|
|
367
|
+
setuid,
|
|
368
|
+
setgid,
|
|
369
|
+
sticky,
|
|
370
|
+
unixExternalUpper,
|
|
371
|
+
internalFileAttribute: fileEntry.internalFileAttributes,
|
|
372
|
+
externalFileAttribute: fileEntry.externalFileAttributes,
|
|
373
|
+
executable,
|
|
374
|
+
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
375
|
+
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
376
|
+
});
|
|
345
377
|
const entry = new Entry(fileEntry);
|
|
346
378
|
entry.getData = (writer, options) => fileEntry.getData(writer, entry, zipReader.readRanges, options);
|
|
347
379
|
entry.arrayBuffer = async options => {
|
|
@@ -534,7 +566,7 @@ class ZipEntry {
|
|
|
534
566
|
zipCrypto,
|
|
535
567
|
encryptionStrength: extraFieldAES && extraFieldAES.strength,
|
|
536
568
|
signed: getOptionValue(zipEntry, options, OPTION_CHECK_SIGNATURE) && !passThrough,
|
|
537
|
-
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) &
|
|
569
|
+
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((signature >>> 24) & MAX_8_BITS)),
|
|
538
570
|
outputSize: passThrough ? compressedSize : uncompressedSize,
|
|
539
571
|
signature,
|
|
540
572
|
compressed: compressionMethod != 0 && !passThrough,
|
|
@@ -665,6 +697,17 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
665
697
|
readExtraFieldNTFS(extraFieldNTFS, directory);
|
|
666
698
|
directory.extraFieldNTFS = extraFieldNTFS;
|
|
667
699
|
}
|
|
700
|
+
const extraFieldUnix = extraField.get(EXTRAFIELD_TYPE_UNIX);
|
|
701
|
+
if (extraFieldUnix) {
|
|
702
|
+
readExtraFieldUnix(extraFieldUnix, directory, false);
|
|
703
|
+
directory.extraFieldUnix = extraFieldUnix;
|
|
704
|
+
} else {
|
|
705
|
+
const extraFieldInfoZip = extraField.get(EXTRAFIELD_TYPE_INFOZIP);
|
|
706
|
+
if (extraFieldInfoZip) {
|
|
707
|
+
readExtraFieldUnix(extraFieldInfoZip, directory, true);
|
|
708
|
+
directory.extraFieldInfoZip = extraFieldInfoZip;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
668
711
|
const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
669
712
|
if (extraFieldExtendedTimestamp) {
|
|
670
713
|
readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
|
|
@@ -706,7 +749,7 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
706
749
|
});
|
|
707
750
|
if (extraFieldUnicode.valid) {
|
|
708
751
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
709
|
-
directory[propertyName +
|
|
752
|
+
directory[propertyName + PROPERTY_NAME_UTF8_SUFFIX] = true;
|
|
710
753
|
}
|
|
711
754
|
}
|
|
712
755
|
|
|
@@ -762,6 +805,47 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
762
805
|
}
|
|
763
806
|
}
|
|
764
807
|
|
|
808
|
+
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
809
|
+
try {
|
|
810
|
+
const view = getDataView(new Uint8Array(extraField.data));
|
|
811
|
+
let offset = 0;
|
|
812
|
+
const version = getUint8(view, offset++);
|
|
813
|
+
const uidSize = getUint8(view, offset++);
|
|
814
|
+
const uidBytes = extraField.data.subarray(offset, offset + uidSize);
|
|
815
|
+
offset += uidSize;
|
|
816
|
+
const uid = unpackUnixId(uidBytes);
|
|
817
|
+
const gidSize = getUint8(view, offset++);
|
|
818
|
+
const gidBytes = extraField.data.subarray(offset, offset + gidSize);
|
|
819
|
+
offset += gidSize;
|
|
820
|
+
const gid = unpackUnixId(gidBytes);
|
|
821
|
+
let unixMode = UNDEFINED_VALUE;
|
|
822
|
+
if (!isInfoZip && offset + 2 <= extraField.data.length) {
|
|
823
|
+
const base = extraField.data;
|
|
824
|
+
const modeView = new DataView(base.buffer, base.byteOffset + offset, 2);
|
|
825
|
+
unixMode = modeView.getUint16(0, true);
|
|
826
|
+
}
|
|
827
|
+
Object.assign(extraField, { version, uid, gid, unixMode });
|
|
828
|
+
if (uid !== UNDEFINED_VALUE) {
|
|
829
|
+
directory.uid = uid;
|
|
830
|
+
}
|
|
831
|
+
if (gid !== UNDEFINED_VALUE) {
|
|
832
|
+
directory.gid = gid;
|
|
833
|
+
}
|
|
834
|
+
if (unixMode !== UNDEFINED_VALUE) {
|
|
835
|
+
directory.unixMode = unixMode;
|
|
836
|
+
}
|
|
837
|
+
} catch {
|
|
838
|
+
// ignored
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function unpackUnixId(bytes) {
|
|
843
|
+
const buffer = new Uint8Array(4);
|
|
844
|
+
buffer.set(bytes, 0);
|
|
845
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, 4);
|
|
846
|
+
return view.getUint32(0, true);
|
|
847
|
+
}
|
|
848
|
+
|
|
765
849
|
function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
|
|
766
850
|
const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
|
|
767
851
|
const flags = getUint8(extraFieldView, 0);
|
|
@@ -888,7 +972,7 @@ function getOptionValue(zipReader, options, name) {
|
|
|
888
972
|
}
|
|
889
973
|
|
|
890
974
|
function getDate(timeRaw) {
|
|
891
|
-
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw &
|
|
975
|
+
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
892
976
|
try {
|
|
893
977
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
894
978
|
} catch {
|