package io.undertow.server.handlers.file; import io.undertow.testutils.category.UnitTest; import io.undertow.server.handlers.resource.PathResourceManager; import io.undertow.server.handlers.resource.ResourceManager; import io.undertow.util.ETag; import org.junit.Assert; import org.junit.Assume; import org.junit.Test; import org.junit.experimental.categories.Category; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; /** * @author Tomaz Cerar (c) 2016 Red Hat Inc. */ @Category(UnitTest.class) public class PathResourceManagerTestCase { @Test public void testGetResource() throws Exception { final Path rootPath = Paths.get(getClass().getResource("page.html").toURI()).getParent(); final PathResourceManager resourceManager = new PathResourceManager(rootPath, 1024 * 1024); Assert.assertNotNull(resourceManager.getResource("page.html")); Assert.assertNotNull(resourceManager.getResource("./page.html")); Assert.assertNotNull(resourceManager.getResource("../file/page.html")); } @Test public void testCantEscapeRoot() throws Exception { final Path rootPath = Paths.get(getClass().getResource("page.html").toURI()).getParent().resolve("subdir"); final PathResourceManager resourceManager = new PathResourceManager(rootPath, 1024 * 1024); Assert.assertNotNull(resourceManager.getResource("a.txt")); Assert.assertNull(resourceManager.getResource("../page.html")); } @Test public void testBaseDirInSymlink() throws Exception { Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows")); Path filePath = Paths.get(getClass().getResource("page.html").toURI()); Path rootPath = filePath.getParent(); Path newDir = rootPath.resolve("newDir"); Path innerPage = newDir.resolve("page.html"); Path newSymlink = rootPath.resolve("newSymlink"); try { Files.createDirectories(newDir); Files.copy(filePath, innerPage); Files.createSymbolicLink(newSymlink, newDir); Assert.assertTrue("Ensure that newSymlink is still a symlink as expected", Files.isSymbolicLink(newSymlink)); final PathResourceManager resourceManager = new PathResourceManager(newSymlink, 1024 * 1024); Assert.assertNotNull(resourceManager.getResource("page.html")); Assert.assertNull(resourceManager.getResource("Page.html")); Assert.assertNotNull(resourceManager.getResource("./page.html")); } finally { Files.deleteIfExists(newSymlink); Files.deleteIfExists(innerPage); Files.deleteIfExists(newDir); Files.deleteIfExists(newDir); } } @Test public void testETagFunction() throws Exception { final String fileName = "page.html"; final Path rootPath = Paths.get(getClass().getResource(fileName).toURI()).getParent(); final ResourceManager resourceManager = PathResourceManager.builder() .setBase(rootPath) .setETagFunction(new PathResourceManager.ETagFunction() { @Override public ETag generate(Path path) { return new ETag(true, path.getFileName().toString()); } }) .build(); ETag expected = new ETag(true, fileName); ETag actual = resourceManager.getResource("page.html").getETag(); Assert.assertEquals(expected, actual); } }