Skip to content

Commit 8824199

Browse files
Ensure the passed daemon directory has the right permissions (#3)
1 parent a159419 commit 8824199

File tree

3 files changed

+61
-8
lines changed

3 files changed

+61
-8
lines changed

library/src/libdaemonjvm/LockFiles.scala

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package libdaemonjvm
22

3+
import java.io.IOException
34
import java.nio.channels.FileChannel
45
import java.nio.file.{Files, Path}
5-
import java.nio.channels.FileLock
6-
import java.nio.channels.ClosedChannelException
7-
import java.io.IOException
6+
import java.nio.channels.{ClosedChannelException, FileLock}
7+
import java.nio.file.attribute.PosixFilePermission
88
import java.nio.file.StandardOpenOption
9+
import scala.collection.JavaConverters._
10+
import scala.util.Properties
911

1012
final case class LockFiles(
1113
lockFile: Path,
@@ -38,9 +40,39 @@ final case class LockFiles(
3840
}
3941

4042
object LockFiles {
43+
44+
private val forbiddenPermissions = {
45+
import PosixFilePermission._
46+
Set(
47+
GROUP_READ,
48+
GROUP_WRITE,
49+
GROUP_EXECUTE,
50+
OTHERS_READ,
51+
OTHERS_WRITE,
52+
OTHERS_EXECUTE
53+
)
54+
}
55+
4156
def under(dir: Path, windowsPipeName: String): LockFiles =
4257
under(dir, windowsPipeName, addPipePrefix = true)
4358
def under(dir: Path, windowsPipeName: String, addPipePrefix: Boolean): LockFiles =
59+
under(dir, windowsPipeName, addPipePrefix, checkPermissions = true)
60+
def under(
61+
dir: Path,
62+
windowsPipeName: String,
63+
addPipePrefix: Boolean,
64+
checkPermissions: Boolean
65+
): LockFiles = {
66+
// FIXME Java 16 support on Windows also uses actual files on disk AFAIK.
67+
// So we might need to check permissions there too.
68+
if (checkPermissions && !Properties.isWin) {
69+
val perms = Files.getPosixFilePermissions(dir).asScala.toSet
70+
val invalid = perms.intersect(forbiddenPermissions)
71+
if (invalid.nonEmpty)
72+
throw new IllegalArgumentException(
73+
s"$dir has invalid permissions ${invalid.map(_.name()).toVector.sorted.mkString(", ")}"
74+
)
75+
}
4476
LockFiles(
4577
lockFile = dir.resolve("lock"),
4678
pidFile = dir.resolve("pid"),
@@ -49,4 +81,5 @@ object LockFiles {
4981
if (addPipePrefix) "\\\\.\\pipe\\" + windowsPipeName else windowsPipeName
5082
)
5183
)
84+
}
5285
}

manual/server/src/libdaemonjvm/TestServer.scala

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,34 @@
11
package libdaemonjvm
22

3-
import java.nio.file.Paths
3+
import java.io.IOException
4+
import java.nio.file.{Files, Paths}
5+
import java.nio.file.attribute.PosixFilePermission
6+
import java.util.concurrent.atomic.AtomicInteger
47

58
import scala.concurrent.duration._
6-
import java.util.concurrent.atomic.AtomicInteger
9+
import scala.jdk.CollectionConverters._
10+
import scala.util.Properties
711

812
import libdaemonjvm.internal.SocketFile
913
import libdaemonjvm.server.Lock
10-
import java.io.IOException
1114

1215
object TestServer {
1316
val delay = 2.seconds
1417
def runTestClients = false
1518
def main(args: Array[String]): Unit = {
16-
val files = LockFiles.under(Paths.get("data-dir"), "libdaemonjvm\\test-server-client\\pipe")
19+
val path = Paths.get("data-dir")
20+
if (!Properties.isWin) {
21+
Files.createDirectories(path)
22+
Files.setPosixFilePermissions(
23+
path,
24+
Set(
25+
PosixFilePermission.OWNER_READ,
26+
PosixFilePermission.OWNER_WRITE,
27+
PosixFilePermission.OWNER_EXECUTE
28+
).asJava
29+
)
30+
}
31+
val files = LockFiles.under(path, "libdaemonjvm\\test-server-client\\pipe")
1732
val incomingConn = Lock.tryAcquire(files) match {
1833
case Left(e) => throw e
1934
case Right(Left(s)) => () => s.accept()

tests/test/src/libdaemonjvm/tests/TestUtil.scala

+6-1
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@ object TestUtil {
3232
dir
3333
}
3434

35-
def lockFiles(dir: os.Path): LockFiles =
35+
def lockFiles(dir: os.Path): LockFiles = {
36+
if (!Properties.isWin) {
37+
os.makeDir.all(dir)
38+
os.perms.set(dir, "rwx------")
39+
}
3640
LockFiles.under(
3741
dir.toNIO,
3842
"libdaemonjvm-tests-" + dir.segments.toVector.drop(dir.segmentCount - 2).mkString("-")
3943
)
44+
}
4045

4146
private val count = new AtomicInteger
4247
def withTestDir[T](f: os.Path => T): T = {

0 commit comments

Comments
 (0)