1
1
package libdaemonjvm
2
2
3
+ import java .io .IOException
3
4
import java .nio .channels .FileChannel
4
5
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
8
8
import java .nio .file .StandardOpenOption
9
+ import scala .collection .JavaConverters ._
10
+ import scala .util .Properties
9
11
10
12
final case class LockFiles (
11
13
lockFile : Path ,
@@ -38,9 +40,39 @@ final case class LockFiles(
38
40
}
39
41
40
42
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
+
41
56
def under (dir : Path , windowsPipeName : String ): LockFiles =
42
57
under(dir, windowsPipeName, addPipePrefix = true )
43
58
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
+ }
44
76
LockFiles (
45
77
lockFile = dir.resolve(" lock" ),
46
78
pidFile = dir.resolve(" pid" ),
@@ -49,4 +81,5 @@ object LockFiles {
49
81
if (addPipePrefix) " \\\\ .\\ pipe\\ " + windowsPipeName else windowsPipeName
50
82
)
51
83
)
84
+ }
52
85
}
0 commit comments