blob: 95159783dc45294d184c7dfee6cb81a79d22e60a [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util.resource;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.zip.ZipFile;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.IO;
import org.junit.Test;
public class JarResourceTest
{
private String testResURI = MavenTestingUtils.getTestResourcesDir().getAbsoluteFile().toURI().toASCIIString();
@Test
public void testJarFile()
throws Exception
{
String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
Resource r = Resource.newResource(s);
Set<String> entries = new HashSet<>(Arrays.asList(r.list()));
assertEquals(3,entries.size());
assertTrue(entries.contains("alphabet"));
assertTrue(entries.contains("numbers"));
assertTrue(entries.contains("subsubdir/"));
File extract = File.createTempFile("extract", null);
if (extract.exists())
extract.delete();
extract.mkdir();
extract.deleteOnExit();
r.copyTo(extract);
Resource e = Resource.newResource(extract.getAbsolutePath());
entries = new HashSet<>(Arrays.asList(e.list()));
assertEquals(3,entries.size());
assertTrue(entries.contains("alphabet"));
assertTrue(entries.contains("numbers"));
assertTrue(entries.contains("subsubdir/"));
IO.delete(extract);
s = "jar:"+testResURI+"TestData/test.zip!/subdir/subsubdir/";
r = Resource.newResource(s);
entries = new HashSet<>(Arrays.asList(r.list()));
assertEquals(2,entries.size());
assertTrue(entries.contains("alphabet"));
assertTrue(entries.contains("numbers"));
extract = File.createTempFile("extract", null);
if (extract.exists())
extract.delete();
extract.mkdir();
extract.deleteOnExit();
r.copyTo(extract);
e = Resource.newResource(extract.getAbsolutePath());
entries = new HashSet<>(Arrays.asList(e.list()));
assertEquals(2,entries.size());
assertTrue(entries.contains("alphabet"));
assertTrue(entries.contains("numbers"));
IO.delete(extract);
}
/* ------------------------------------------------------------ */
@Test
public void testJarFileGetAllResoures()
throws Exception
{
String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
Resource r = Resource.newResource(s);
Collection<Resource> deep=r.getAllResources();
assertEquals(4, deep.size());
}
@Test
public void testJarFileIsContainedIn ()
throws Exception
{
String s = "jar:"+testResURI+"TestData/test.zip!/subdir/";
Resource r = Resource.newResource(s);
Resource container = Resource.newResource(testResURI+"TestData/test.zip");
assertTrue(r instanceof JarFileResource);
JarFileResource jarFileResource = (JarFileResource)r;
assertTrue(jarFileResource.isContainedIn(container));
container = Resource.newResource(testResURI+"TestData");
assertFalse(jarFileResource.isContainedIn(container));
}
/* ------------------------------------------------------------ */
@Test
public void testJarFileLastModified ()
throws Exception
{
String s = "jar:"+testResURI+"TestData/test.zip!/subdir/numbers";
try(ZipFile zf = new ZipFile(MavenTestingUtils.getTestResourceFile("TestData/test.zip")))
{
long last = zf.getEntry("subdir/numbers").getTime();
Resource r = Resource.newResource(s);
assertEquals(last,r.lastModified());
}
}
/* ------------------------------------------------------------ */
@Test
public void testJarFileCopyToDirectoryTraversal () throws Exception
{
String s = "jar:"+testResURI+"TestData/extract.zip!/";
Resource r = Resource.newResource(s);
assertTrue(r instanceof JarResource);
JarResource jarResource = (JarResource)r;
File destParent = File.createTempFile("copyjar", null);
if (destParent.exists())
destParent.delete();
destParent.mkdir();
destParent.deleteOnExit();
File dest = new File(destParent.getCanonicalPath()+"/extract");
if(dest.exists())
dest.delete();
dest.mkdir();
dest.deleteOnExit();
jarResource.copyTo(dest);
// dest contains only the valid entry; dest.getParent() contains only the dest directory
assertEquals(1, dest.listFiles().length);
assertEquals(1, dest.getParentFile().listFiles().length);
FilenameFilter dotdotFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("dotdot.txt");
}
};
assertEquals(0, dest.listFiles(dotdotFilenameFilter).length);
assertEquals(0, dest.getParentFile().listFiles(dotdotFilenameFilter).length);
FilenameFilter extractfileFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("extract-filenotdir");
}
};
assertEquals(0, dest.listFiles(extractfileFilenameFilter).length);
assertEquals(0, dest.getParentFile().listFiles(extractfileFilenameFilter).length);
FilenameFilter currentDirectoryFilenameFilter = new FilenameFilter() {
@Override
public boolean accept(File directory, String name)
{
return name.equals("current.txt");
}
};
assertEquals(1, dest.listFiles(currentDirectoryFilenameFilter).length);
assertEquals(0, dest.getParentFile().listFiles(currentDirectoryFilenameFilter).length);
IO.delete(dest);
assertFalse(dest.exists());
}
}