Skip to content

Commit b2b28a7

Browse files
Merge pull request #569 from lephilousophe/fix-unix-perms
Fix UNIX permissions
2 parents c6e243c + 0430a8e commit b2b28a7

4 files changed

Lines changed: 15 additions & 10 deletions

File tree

lib/core/constants.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ const BITFLAG_LEVEL = 0x06;
5858
const BITFLAG_DATA_DESCRIPTOR = 0x0008;
5959
const BITFLAG_LANG_ENCODING_FLAG = 0x0800;
6060
const FILE_ATTR_MSDOS_DIR_MASK = 0x10;
61-
const FILE_ATTR_UNIX_DIR_MASK = 0x4000;
61+
const FILE_ATTR_UNIX_TYPE_MASK = 0o170000;
62+
const FILE_ATTR_UNIX_TYPE_DIR = 0o040000;
6263
const FILE_ATTR_UNIX_EXECUTABLE_MASK = 0o111;
6364
const FILE_ATTR_UNIX_DEFAULT_MASK = 0o644;
6465

@@ -105,7 +106,8 @@ export {
105106
BITFLAG_DATA_DESCRIPTOR,
106107
BITFLAG_LANG_ENCODING_FLAG,
107108
FILE_ATTR_MSDOS_DIR_MASK,
108-
FILE_ATTR_UNIX_DIR_MASK,
109+
FILE_ATTR_UNIX_TYPE_MASK,
110+
FILE_ATTR_UNIX_TYPE_DIR,
109111
FILE_ATTR_UNIX_EXECUTABLE_MASK,
110112
FILE_ATTR_UNIX_DEFAULT_MASK,
111113
VERSION_DEFLATE,

lib/core/zip-reader.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ import {
5757
BITFLAG_DATA_DESCRIPTOR,
5858
BITFLAG_LANG_ENCODING_FLAG,
5959
FILE_ATTR_MSDOS_DIR_MASK,
60-
FILE_ATTR_UNIX_DIR_MASK,
60+
FILE_ATTR_UNIX_TYPE_MASK,
61+
FILE_ATTR_UNIX_TYPE_DIR,
6162
FILE_ATTR_UNIX_EXECUTABLE_MASK,
6263
DIRECTORY_SIGNATURE,
6364
UNDEFINED_VALUE
@@ -263,9 +264,9 @@ class ZipReader {
263264
const externalFileAttributes = getUint32(directoryView, offset + 38);
264265
const directory =
265266
(msDosCompatible && ((getUint8(directoryView, offset + 38) & FILE_ATTR_MSDOS_DIR_MASK) == FILE_ATTR_MSDOS_DIR_MASK)) ||
266-
(unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_DIR_MASK) == FILE_ATTR_UNIX_DIR_MASK)) ||
267+
(unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_TYPE_MASK) == FILE_ATTR_UNIX_TYPE_DIR)) ||
267268
(rawFilename.length && rawFilename[rawFilename.length - 1] == DIRECTORY_SIGNATURE.charCodeAt(0));
268-
const executable = (unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_EXECUTABLE_MASK) == FILE_ATTR_UNIX_EXECUTABLE_MASK));
269+
const executable = (unixCompatible && (((externalFileAttributes >> 16) & FILE_ATTR_UNIX_EXECUTABLE_MASK) != 0));
269270
const offsetFileEntry = getUint32(directoryView, offset + 42) + prependedDataLength;
270271
Object.assign(fileEntry, {
271272
versionMadeBy,

lib/core/zip-writer.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import {
5656
BITFLAG_DATA_DESCRIPTOR,
5757
BITFLAG_LANG_ENCODING_FLAG,
5858
FILE_ATTR_MSDOS_DIR_MASK,
59+
FILE_ATTR_UNIX_TYPE_DIR,
5960
FILE_ATTR_UNIX_EXECUTABLE_MASK,
6061
FILE_ATTR_UNIX_DEFAULT_MASK,
6162
VERSION_DEFLATE,
@@ -250,10 +251,9 @@ async function addFile(zipWriter, name, reader, options) {
250251
name += DIRECTORY_SIGNATURE;
251252
}
252253
if (externalFileAttributes === 0) {
253-
if (msDosCompatible) {
254-
externalFileAttributes = FILE_ATTR_MSDOS_DIR_MASK;
255-
} else {
256-
externalFileAttributes = (FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
254+
externalFileAttributes = FILE_ATTR_MSDOS_DIR_MASK;
255+
if (!msDosCompatible) {
256+
externalFileAttributes |= (FILE_ATTR_UNIX_TYPE_DIR | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_DEFAULT_MASK) << 16;
257257
}
258258
}
259259
} else if (!msDosCompatible && externalFileAttributes === 0) {

tests/all/test-directory.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ async function test() {
1818
await zipWriter.close();
1919
const zipReader = new zip.ZipReader(new zip.BlobReader(await blobWriter.getData()));
2020
const entries = await zipReader.getEntries();
21-
if (entries[0].directory && entries[0].filename == FOLDER_NAME && entries[0].externalFileAttributes >> 16 == 0o755) {
21+
if (entries[0].directory && entries[0].filename == FOLDER_NAME &&
22+
(entries[0].externalFileAttributes & 0xffff) == 0x10 &&
23+
entries[0].externalFileAttributes >> 16 == 0o40755) {
2224
if (!entries[1].directory && entries[1].filename == FILENAME) {
2325
const text = await entries[1].getData(new zip.TextWriter());
2426
await zipReader.close();

0 commit comments

Comments
 (0)