diff --git a/jablib/src/test/java/org/jabref/logic/util/io/FileUtilTest.java b/jablib/src/test/java/org/jabref/logic/util/io/FileUtilTest.java index 869a3aa974a..8bff7f1e4cd 100644 --- a/jablib/src/test/java/org/jabref/logic/util/io/FileUtilTest.java +++ b/jablib/src/test/java/org/jabref/logic/util/io/FileUtilTest.java @@ -4,9 +4,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -448,70 +448,86 @@ public void cTemp() { } } - @ParameterizedTest - @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") - @MethodSource - void relativizeSymlinks(Path file, List directories, Path expected, String message) { - if (message.startsWith("IGNORED")) { - org.junit.jupiter.api.Assumptions.assumeTrue(false, message); - } - Path result = FileUtil.relativize(file, directories); - assertEquals(expected, result, message); - } - /// Tests for issue - static Stream relativizeSymlinks() throws IOException { - List result = new ArrayList<>(); - - Path realDir = bibTempDir.resolve("realDir"); + @Test + @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") + void simpleRelativizeSymlinks() throws IOException { + Path realDir = bibTempDir.resolve("realDir_" + UUID.randomUUID()); Files.createDirectories(realDir); - // symlinkDir -> realDir - // realDir/simple.pdf Path simpleFile = Files.createFile(realDir.resolve("simple.pdf")); - Path symlinkDir = bibTempDir.resolve("symlinkDir"); + Path symlinkDir = bibTempDir.resolve("symlinkDir_" + UUID.randomUUID()); Files.createSymbolicLink(symlinkDir, realDir); - result.add(Arguments.of(simpleFile, List.of(symlinkDir), Path.of("simple.pdf"), "Simple symlink resolves to relative")); - // chainLink1 -> chainLink2 -> chainReal - // chainReal/chained.pdf - Path chainReal = bibTempDir.resolve("chainReal"); + Path result = FileUtil.relativize(simpleFile, List.of(symlinkDir)); + assertEquals(Path.of("simple.pdf"), result, "Simple symlink resolves to relative"); + } + + @Test + @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") + void chainedRelativizeSymlinks() throws IOException { + Path chainReal = bibTempDir.resolve("chainReal_" + UUID.randomUUID()); Files.createDirectories(chainReal); + Path chainedFile = Files.createFile(chainReal.resolve("chained.pdf")); - Path chainLink2 = bibTempDir.resolve("chainLink2"); + Path chainLink2 = bibTempDir.resolve("chainLink2_" + UUID.randomUUID()); Files.createSymbolicLink(chainLink2, chainReal); - Path chainLink1 = bibTempDir.resolve("chainLink1"); + Path chainLink1 = bibTempDir.resolve("chainLink1_" + UUID.randomUUID()); Files.createSymbolicLink(chainLink1, chainLink2); - result.add(Arguments.of(chainedFile, List.of(chainLink1), Path.of("chained.pdf"), "Chained symlink resolves to relative")); - // realDir/nestedLink -> realDir/nested - // realDir/nested/nested.pdf - Path nestedDir = realDir.resolve("nested"); + Path result = FileUtil.relativize(chainedFile, List.of(chainLink1)); + assertEquals(Path.of("chained.pdf"), result, "Chained symlink resolves to relative"); + } + + @Test + @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") + void nestedRelativizeSymlinks() throws IOException { + Path realDir = bibTempDir.resolve("realDir_" + UUID.randomUUID()); + Files.createDirectories(realDir); + + Path nestedDir = realDir.resolve("nested_" + UUID.randomUUID()); Files.createDirectories(nestedDir); Path nestedFile = Files.createFile(nestedDir.resolve("nested.pdf")); - Path nestedSymlink = realDir.resolve("nestedLink"); + Path nestedSymlink = realDir.resolve("nestedLink_" + UUID.randomUUID()); Files.createSymbolicLink(nestedSymlink, nestedDir); - result.add(Arguments.of(nestedFile, List.of(nestedSymlink), Path.of("nested.pdf"), "Nested symlink resolves to relative")); - // symlinkDir -> realDir - // outside.pdf + Path result = FileUtil.relativize(nestedFile, List.of(nestedSymlink)); + assertEquals(Path.of("nested.pdf"), result, "Nested symlink resolves to relative"); + } + + @Test + @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") + void unrelatedFileRemainsAbsolute() throws IOException { + Path realDir = bibTempDir.resolve("realDir_" + UUID.randomUUID()); + Files.createDirectories(realDir); + Path symlinkDir = bibTempDir.resolve("symlinkDir_" + UUID.randomUUID()); + Files.createSymbolicLink(symlinkDir, realDir); + Path outsideFile = Files.createFile(bibTempDir.resolve("outside.pdf")); - result.add(Arguments.of(outsideFile, List.of(symlinkDir), outsideFile, "Unrelated file remains absolute")); - // symlink chain escaping base dir (ignored test case, see ) + Path result = FileUtil.relativize(outsideFile, List.of(symlinkDir)); + assertEquals(outsideFile, result, "Unrelated file remains absolute"); + } + + @Test + @DisabledOnOs(value = org.junit.jupiter.api.condition.OS.WINDOWS, disabledReason = "Symlink behavior unreliable on windows") + void symlinkEscapeCaseIgnored() throws IOException { Path veryPrivate = bibTempDir.resolve("veryprivate"); Files.createDirectories(veryPrivate); Path secretFile = Files.createFile(veryPrivate.resolve("a.pdf")); + Path expensive = bibTempDir.resolve("expensive"); Files.createSymbolicLink(expensive, veryPrivate); Path things = bibTempDir.resolve("things"); Files.createSymbolicLink(things, expensive); + Path libDir = bibTempDir.resolve("lib"); Files.createDirectories(libDir); - Path bibFile = Files.createFile(libDir.resolve("bib.bib")); - result.add(Arguments.of(secretFile, List.of(things), secretFile, "IGNORED: Symlink chain escaping base dir (#12995 comment)")); + Files.createFile(libDir.resolve("bib.bib")); - return result.stream(); + org.junit.jupiter.api.Assumptions.assumeTrue(false, "IGNORED: Symlink chain escaping base dir, see "); + Path result = FileUtil.relativize(secretFile, List.of(things)); + assertEquals(secretFile, result); } /**