Skip to content

Commit 4993aa1

Browse files
authored
Make os.list, os.walk, os.exists trigger Checker#onRead (#385)
1 parent 57700dd commit 4993aa1

File tree

3 files changed

+77
-18
lines changed

3 files changed

+77
-18
lines changed

os/src/FileOps.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ object remove extends Function1[Path, Boolean] {
355355
object exists extends Function1[Path, Boolean] {
356356
def apply(p: Path): Boolean = Files.exists(p.wrapped)
357357
def apply(p: Path, followLinks: Boolean = true): Boolean = {
358+
checker.value.onRead(p)
358359
val opts = if (followLinks) Array[LinkOption]() else Array(LinkOption.NOFOLLOW_LINKS)
359360
Files.exists(p.wrapped, opts: _*)
360361
}

os/src/ListOps.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ object list extends Function1[Path, IndexedSeq[Path]] {
3030
object stream extends Function1[Path, geny.Generator[Path]] {
3131
def apply(arg: Path) = new Generator[Path] {
3232
def generate(handleItem: Path => Generator.Action) = {
33+
checker.value.onRead(arg)
3334
val ds = Files.newDirectoryStream(arg.toNIO)
3435
val iter = ds.iterator()
3536
var currentAction: Generator.Action = Generator.Continue
@@ -196,7 +197,7 @@ object walk {
196197
maxDepth: Int = Int.MaxValue,
197198
includeTarget: Boolean = false
198199
): Generator[(Path, os.StatInfo)] = {
199-
200+
checker.value.onRead(path)
200201
val opts0 = if (followLinks) Array[LinkOption]() else Array(LinkOption.NOFOLLOW_LINKS)
201202
val opts = new java.util.HashSet[FileVisitOption]
202203
if (followLinks) opts.add(FileVisitOption.FOLLOW_LINKS)

os/test/src/CheckerTests.scala

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,35 @@ object CheckerTests extends TestSuite {
99
// restricted directory
1010
val rd = os.Path(sys.env("OS_TEST_RESOURCE_FOLDER")) / "restricted"
1111

12+
test("list") - prepChecker { wd =>
13+
os.list(wd) // ok
14+
intercept[ReadDenied] {
15+
os.list(rd)
16+
}
17+
os.list.stream(wd) // ok
18+
intercept[ReadDenied] {
19+
os.list.stream(rd).foreach(_ => ())
20+
}
21+
}
22+
test("walk") - prepChecker { wd =>
23+
os.walk(wd) // ok
24+
intercept[ReadDenied] {
25+
os.walk(rd)
26+
}
27+
os.walk.stream(wd) // ok
28+
intercept[ReadDenied] {
29+
os.walk.stream(rd)
30+
}
31+
os.walk.attrs(wd) // ok
32+
intercept[ReadDenied] {
33+
os.walk.attrs(rd)
34+
}
35+
os.walk.stream.attrs(wd) // ok
36+
intercept[ReadDenied] {
37+
os.walk.stream.attrs(rd)
38+
}
39+
}
40+
1241
test("stat") {
1342
test("mtime") - prepChecker { wd =>
1443
val before = os.mtime(rd / "File.txt")
@@ -96,12 +125,16 @@ object CheckerTests extends TestSuite {
96125
intercept[WriteDenied] {
97126
os.move(wd / "folder1/one.txt", rd / "folder1/File.txt")
98127
}
99-
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
128+
os.checker.withValue(os.Checker.Nop) {
129+
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
130+
}
100131

101132
intercept[WriteDenied] {
102133
os.move(wd / "folder2/nestedA", rd / "folder2/nestedC")
103134
}
104-
os.list(rd / "folder2") ==> Seq(rd / "folder2/nestedA", rd / "folder2/nestedB")
135+
os.checker.withValue(os.Checker.Nop) {
136+
os.list(rd / "folder2") ==> Seq(rd / "folder2/nestedA", rd / "folder2/nestedB")
137+
}
105138

106139
os.list(wd / "folder1") ==> Seq(wd / "folder1/one.txt")
107140
os.move(wd / "folder1/one.txt", wd / "folder1/first.txt")
@@ -128,12 +161,16 @@ object CheckerTests extends TestSuite {
128161
intercept[WriteDenied] {
129162
os.copy(wd / "folder1/one.txt", rd / "folder1/File.txt")
130163
}
131-
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
164+
os.checker.withValue(os.Checker.Nop) {
165+
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
166+
}
132167

133168
intercept[WriteDenied] {
134169
os.copy(wd / "folder2/nestedA", rd / "folder2/nestedC")
135170
}
136-
os.list(rd / "folder2") ==> Seq(rd / "folder2/nestedA", rd / "folder2/nestedB")
171+
os.checker.withValue(os.Checker.Nop) {
172+
os.list(rd / "folder2") ==> Seq(rd / "folder2/nestedA", rd / "folder2/nestedB")
173+
}
137174

138175
os.list(wd / "folder1") ==> Seq(wd / "folder1/one.txt")
139176
os.copy(wd / "folder1/one.txt", wd / "folder1/first.txt")
@@ -187,7 +224,9 @@ object CheckerTests extends TestSuite {
187224
intercept[WriteDenied] {
188225
os.remove(rd / "folder1")
189226
}
190-
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
227+
os.checker.withValue(os.Checker.Nop) {
228+
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
229+
}
191230

192231
Unchecked.scope(os.makeDir(rd / "folder"), os.remove(rd / "folder")) {
193232
intercept[WriteDenied] {
@@ -211,18 +250,24 @@ object CheckerTests extends TestSuite {
211250
intercept[WriteDenied] {
212251
os.remove(rd / "misc/file-symlink")
213252
}
214-
os.exists(rd / "misc/file-symlink", followLinks = false) ==> true
253+
os.checker.withValue(os.Checker.Nop) {
254+
os.exists(rd / "misc/file-symlink", followLinks = false) ==> true
255+
}
215256

216257
intercept[WriteDenied] {
217258
os.remove(rd / "misc/folder-symlink")
218259
}
219-
os.exists(rd / "misc/folder-symlink", followLinks = false) ==> true
260+
os.checker.withValue(os.Checker.Nop) {
261+
os.exists(rd / "misc/folder-symlink", followLinks = false) ==> true
262+
}
220263

221264
intercept[WriteDenied] {
222265
os.remove(rd / "misc/broken-symlink")
223266
}
224-
os.exists(rd / "misc/broken-symlink", followLinks = false) ==> true
225-
os.exists(rd / "misc/broken-symlink") ==> true
267+
os.checker.withValue(os.Checker.Nop) {
268+
os.exists(rd / "misc/broken-symlink", followLinks = false) ==> true
269+
os.exists(rd / "misc/broken-symlink") ==> true
270+
}
226271

227272
os.remove(wd / "misc/file-symlink")
228273
os.exists(wd / "misc/file-symlink", followLinks = false) ==> false
@@ -241,7 +286,9 @@ object CheckerTests extends TestSuite {
241286
intercept[WriteDenied] {
242287
os.remove.all(rd / "folder1")
243288
}
244-
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
289+
os.checker.withValue(os.Checker.Nop) {
290+
os.list(rd / "folder1") ==> Seq(rd / "folder1/one.txt")
291+
}
245292

246293
os.exists(wd / "folder1/one.txt") ==> true
247294
os.remove.all(wd / "folder1")
@@ -252,17 +299,23 @@ object CheckerTests extends TestSuite {
252299
intercept[WriteDenied] {
253300
os.remove.all(rd / "misc/file-symlink")
254301
}
255-
os.exists(rd / "misc/file-symlink", followLinks = false) ==> true
302+
os.checker.withValue(os.Checker.Nop) {
303+
os.exists(rd / "misc/file-symlink", followLinks = false) ==> true
304+
}
256305

257306
intercept[WriteDenied] {
258307
os.remove.all(rd / "misc/folder-symlink")
259308
}
260-
os.exists(rd / "misc/folder-symlink", followLinks = false) ==> true
309+
os.checker.withValue(os.Checker.Nop) {
310+
os.exists(rd / "misc/folder-symlink", followLinks = false) ==> true
311+
}
261312

262313
intercept[WriteDenied] {
263314
os.remove.all(rd / "misc/broken-symlink")
264315
}
265-
os.exists(rd / "misc/broken-symlink", followLinks = false) ==> true
316+
os.checker.withValue(os.Checker.Nop) {
317+
os.exists(rd / "misc/broken-symlink", followLinks = false) ==> true
318+
}
266319

267320
os.remove.all(wd / "misc/file-symlink")
268321
os.exists(wd / "misc/file-symlink", followLinks = false) ==> false
@@ -332,23 +385,27 @@ object CheckerTests extends TestSuite {
332385
}
333386
test("temp") {
334387
test - prepChecker { wd =>
335-
val before = os.walk(rd)
388+
val before = os.checker.withValue(os.Checker.Nop) { os.walk(rd) }
336389
intercept[WriteDenied] {
337390
os.temp("default content", dir = rd)
338391
}
339-
os.walk(rd) ==> before
392+
os.checker.withValue(os.Checker.Nop) {
393+
os.walk(rd) ==> before
394+
}
340395

341396
val tempOne = os.temp("default content", dir = wd)
342397
os.read(tempOne) ==> "default content"
343398
os.write.over(tempOne, "Hello")
344399
os.read(tempOne) ==> "Hello"
345400
}
346401
test("dir") - prepChecker { wd =>
347-
val before = os.walk(rd)
402+
val before = os.checker.withValue(os.Checker.Nop) { os.walk(rd) }
348403
intercept[WriteDenied] {
349404
os.temp.dir(dir = rd)
350405
}
351-
os.walk(rd) ==> before
406+
os.checker.withValue(os.Checker.Nop) {
407+
os.walk(rd) ==> before
408+
}
352409

353410
val tempDir = os.temp.dir(dir = wd)
354411
os.list(tempDir) ==> Nil

0 commit comments

Comments
 (0)