481355 Nested Symlinks
This commit is contained in:
parent
56afc2b0e5
commit
4bb63b9e03
|
@ -71,23 +71,39 @@ public class AllowSymLinkAliasChecker implements AliasCheck
|
||||||
}
|
}
|
||||||
|
|
||||||
// No, so let's check each element ourselves
|
// No, so let's check each element ourselves
|
||||||
Path d = path.getRoot();
|
boolean linked=true;
|
||||||
for (Path e:path)
|
Path target=path;
|
||||||
|
int loops=0;
|
||||||
|
while (linked)
|
||||||
{
|
{
|
||||||
d=d.resolve(e);
|
if (++loops>100)
|
||||||
|
|
||||||
while (Files.exists(d) && Files.isSymbolicLink(d))
|
|
||||||
{
|
{
|
||||||
Path link=Files.readSymbolicLink(d);
|
if (LOG.isDebugEnabled())
|
||||||
if (!link.isAbsolute())
|
LOG.debug("Too many symlinks {} --> {}",resource,target);
|
||||||
link=d.resolve(link);
|
return false;
|
||||||
d=link;
|
|
||||||
}
|
}
|
||||||
|
linked=false;
|
||||||
|
Path d = target.getRoot();
|
||||||
|
for (Path e:target)
|
||||||
|
{
|
||||||
|
d=d.resolve(e);
|
||||||
|
|
||||||
|
while (Files.exists(d) && Files.isSymbolicLink(d))
|
||||||
|
{
|
||||||
|
Path link=Files.readSymbolicLink(d);
|
||||||
|
if (!link.isAbsolute())
|
||||||
|
link=d.resolve(link);
|
||||||
|
d=link;
|
||||||
|
linked=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
target=d;
|
||||||
}
|
}
|
||||||
if (pathResource.getAliasPath().equals(d))
|
|
||||||
|
if (pathResource.getAliasPath().equals(target))
|
||||||
{
|
{
|
||||||
if (LOG.isDebugEnabled())
|
if (LOG.isDebugEnabled())
|
||||||
LOG.debug("Allow path symlink {} --> {}",resource,d);
|
LOG.debug("Allow path symlink {} --> {}",resource,target);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,18 @@ public class ContextHandlerGetResourceTest
|
||||||
|
|
||||||
Files.createSymbolicLink(new File(docroot,"other").toPath(),new File("../transit").toPath());
|
Files.createSymbolicLink(new File(docroot,"other").toPath(),new File("../transit").toPath());
|
||||||
Files.createSymbolicLink(transit.toPath(),otherroot.toPath());
|
Files.createSymbolicLink(transit.toPath(),otherroot.toPath());
|
||||||
|
|
||||||
|
// /web/logs -> /var/logs -> /media/internal/logs
|
||||||
|
// where /media/internal -> /media/internal-physical/
|
||||||
|
new File(docroot,"media/internal-physical/logs").mkdirs();
|
||||||
|
Files.createSymbolicLink(new File(docroot,"media/internal").toPath(),new File(docroot,"media/internal-physical").toPath());
|
||||||
|
new File(docroot,"var").mkdir();
|
||||||
|
Files.createSymbolicLink(new File(docroot,"var/logs").toPath(),new File(docroot,"media/internal/logs").toPath());
|
||||||
|
new File(docroot,"web").mkdir();
|
||||||
|
Files.createSymbolicLink(new File(docroot,"web/logs").toPath(),new File(docroot,"var/logs").toPath());
|
||||||
|
new File(docroot,"media/internal-physical/logs/file.log").createNewFile();
|
||||||
|
|
||||||
|
System.err.println("docroot="+docroot);
|
||||||
}
|
}
|
||||||
|
|
||||||
OS_ALIAS_SUPPORTED = new File(sub, "TEXTFI~1.TXT").exists();
|
OS_ALIAS_SUPPORTED = new File(sub, "TEXTFI~1.TXT").exists();
|
||||||
|
@ -383,6 +395,29 @@ public class ContextHandlerGetResourceTest
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSymlinkNested() throws Exception
|
||||||
|
{
|
||||||
|
Assume.assumeTrue(OS.IS_UNIX);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
allowSymlinks.set(true);
|
||||||
|
|
||||||
|
final String path="/web/logs/file.log";
|
||||||
|
|
||||||
|
Resource resource=context.getResource(path);
|
||||||
|
assertNotNull(resource);
|
||||||
|
assertEquals("file.log",resource.getFile().getName());
|
||||||
|
assertTrue(resource.exists());
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
allowSymlinks.set(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSymlinkUnknown() throws Exception
|
public void testSymlinkUnknown() throws Exception
|
||||||
|
|
Loading…
Reference in New Issue