Skip to content

Commit e051c2c

Browse files
authored
Make sure unzipped directories are owner-executable (#387)
1 parent 5443f89 commit e051c2c

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

os/src/ZipOps.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,10 +360,10 @@ object unzip {
360360
} else null
361361

362362
if (zipEntry.isDirectory) {
363-
os.makeDir.all(newFile, perms = perms)
364-
if (perms != null && os.perms(newFile) != perms) {
365-
// because of umask
366-
os.perms.set(newFile, perms)
363+
os.makeDir.all(newFile)
364+
if (perms != null) {
365+
// make sure directories at least have OWNER_EXECUTE
366+
os.perms.set(newFile, perms + PosixFilePermission.OWNER_EXECUTE)
367367
}
368368
} else if (isSymLink) {
369369
val target = scala.io.Source.fromInputStream(zipInputStream).mkString

os/test/src/ZipOpTests.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import test.os.TestUtil.prep
55
import utest._
66

77
import java.io.{ByteArrayInputStream, ByteArrayOutputStream, PrintStream}
8+
import java.nio.file.attribute.PosixFilePermission
89
import java.util.zip.{ZipEntry, ZipOutputStream}
910

1011
object ZipOpTests extends TestSuite {
@@ -537,5 +538,25 @@ object ZipOpTests extends TestSuite {
537538
assert(file2Content == "Content of file2")
538539
}
539540

541+
test("unzipDirectoryEnsureExecutablePermission") - prep { wd =>
542+
if (!scala.util.Properties.isWin) {
543+
val zipFileName = "zipDirExecutable"
544+
val source = wd / "folder1"
545+
val dir = source / "dir"
546+
547+
os.makeDir(dir)
548+
val perms = os.perms(dir)
549+
os.perms.set(dir, perms - PosixFilePermission.OWNER_EXECUTE)
550+
551+
val zipped = os.zip(
552+
dest = wd / s"$zipFileName.zip",
553+
sources = Seq(source)
554+
)
555+
556+
val unzipped = os.unzip(zipped, dest = wd / zipFileName)
557+
assert(os.perms(unzipped / "dir").contains(PosixFilePermission.OWNER_EXECUTE))
558+
assert(os.perms(unzipped / "dir") == perms)
559+
}
560+
}
540561
}
541562
}

0 commit comments

Comments
 (0)