[rfc][icedtea-web] Reproducer & unit test for unsigned content in META-INF/
Jiri Vanek
jvanek at redhat.com
Mon Aug 13 01:59:02 PDT 2012
On 07/05/2012 05:27 PM, Adam Domurad wrote:
> Note, bugfix already in HEAD. Reproducer sanity checked by backing out
> -r429 in HEAD.
>
> Reproducer functions by copying and modifying ReadPropertiesSigned.jar
> to have unsigned content in META-INF/ directory. If it is felt that it
> should sign and create its own jar let me know.
>
> Unit test changelog:
> 2012-07-05 Adam Domurad<adomurad at redhat.com>
>
> Unit test for method in JCV, isMetaInfFile()
> * netx/net/sourceforge/jnlp/tools/JarCertVerifier.java:
> Made isMetaInfFile package-private for testing purposes.
> * tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java:
> New, tests isMetaInfFile()
Unittest seams ok. As it is modifying also a code a bit, do you mind head + 1.3?
>
> Reproducer changelog:
> 2012-07-05 Adam Domurad<adomurad at redhat.com>
>
> Reproducer for allowing unsigned content in META-INF/ folder.
> Derives from ReadPropertiesSigned test's signed jar.
> *
> tests/reproducers/custom/UnsignedContentInMETAINF/resources/UnsignedContentInMETAINF.jnlp:
> New, runs a modified version of ReadPropertiesSigned.jar
> (UnsignedContentInMETAINF.jar)
> *
> tests/reproducers/custom/UnsignedContentInMETAINF/srcs/META-INF/unsigned_file_in_metainf:
> New, placed into a modified version of ReadPropertiesSigned.jar
> (UnsignedContentInMETAINF.jar) so that there is unsigned content in the
> META-INF/ folder.
> * tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile:
> New, creates a modified version of ReadPropertiesSigned.jar, named
> UnsignedContentInMETAINF.jar, and places unsigned content inside its
> META-INF/ folder
> *
> tests/reproducers/custom/UnsignedContentInMETAINF/testcases/UnsignedContentInMETAINF.java:
> Test driver for jnlp file
>
> Thanks,
> Adam
>
Thanx for reproducer. Overall looks good, one clarification below however needed.
>
> unsigned-metainf-content-reproducer.patch
>
...snip...
> +</jnlp>
> diff --git a/tests/reproducers/custom/UnsignedContentInMETAINF/srcs/META-INF/unsigned_file_in_metainf b/tests/reproducers/custom/UnsignedContentInMETAINF/srcs/META-INF/unsigned_file_in_metainf
> new file mode 100644
Purpose of this is to create new file (I have not seen it used in reproducer) or empty directory in
src (which I have not seen used too)?
If there is need for empty file or (or dir) then touch (mkdir) in custom Makefile perhaps? Although
I agree that have those files in file tree is little bit clearer, mercurial do not like empty
directories :(
Also - it is in src so you expect to have it compiled (as you are overwriting embedded jar's work)
or copied? it is not clear from makefile (but I can be dummy enough to miss it)
> diff --git a/tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile b/tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile
> new file mode 100644
> --- /dev/null
> +++ b/tests/reproducers/custom/UnsignedContentInMETAINF/srcs/Makefile
> @@ -0,0 +1,17 @@
> +TESTNAME=UnsignedContentInMETAINF
> +JAVAC_CLASSPATH=$(JNLP_TESTS_ENGINE_DIR):$(NETX_DIR)/lib/classes.jar
> +DEPLOY_DIR=$(JNLP_TESTS_SERVER_DEPLOYDIR)
> +JAVAC=$(BOOT_DIR)/bin/javac
> +JAR=$(BOOT_DIR)/bin/jar
> +
> +prepare-reproducer:
> + echo PREPARING REPRODUCER $(TESTNAME)
> + cp $(DEPLOY_DIR)/ReadPropertiesSigned.jar $(DEPLOY_DIR)/UnsignedContentInMETAINF.jar
> + $(JAR) uf $(DEPLOY_DIR)/UnsignedContentInMETAINF.jar META-INF
those two lines above are what is confusing me:
you are coping ReadPropertiesSigned.jar and overwriting UnsignedContentInMETAINF.jar.
Then you are updating this copy for META-INF (directory?) which do not exists(?)
Although if it would exists, then it would be nice to have deirectory where this jar u is happening.
From both above - probably wrongly placed META-INF and strange cp and jar u, I think that
reproducer is not testing what it should.
Or am I wrong and pure $(JAR) uf $(DEPLOY_DIR)/UnsignedContentInMETAINF.jar META-INF, with
non-existent META-INF directory will cause timestamps in jar to change and so make signatures of
metainf invalid? But then you do not need this
tests/reproducers/custom/UnsignedContentInMETAINF/srcs/META-INF/unsigned_file_in_metainf misleading
file.
If this is true, then perhaps more visible approach then just modifying the time-stamp can be used?
Rest of the reproducer is nice work, thanks for it!
J.
> + echo PREPARED REPRODUCER $(TESTNAME)s
> +
> +clean-reproducer:
> + echo CLEANING REPRODUCER $(TESTNAME)
> + rm -f UnsignedContentInMETAINF.jar
> + echo CLEANED REPRODUCER $(TESTNAME)
> +
> diff --git a/tests/reproducers/custom/UnsignedContentInMETAINF/testcases/UnsignedContentInMETAINF.java b/tests/reproducers/custom/UnsignedContentInMETAINF/testcases/UnsignedContentInMETAINF.java
> new file mode 100644
> --- /dev/null
> +++ b/tests/reproducers/custom/UnsignedContentInMETAINF/testcases/UnsignedContentInMETAINF.java
> @@ -0,0 +1,65 @@
> +/* UnsignedContentInMETAINF.java
> +Copyright (C) 2011 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING. If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library. Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module. An independent module is a module which is not derived from
> +or based on this library. If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so. If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +
> +import java.util.Arrays;
> +import java.util.Collections;
> +import java.util.List;
> +import net.sourceforge.jnlp.ServerAccess;
> +import org.junit.Assert;
> +import org.junit.Test;
> +import net.sourceforge.jnlp.ProcessResult;;
> +
> +public class UnsignedContentInMETAINF {
> +
> + private static ServerAccess server = new ServerAccess();
> + private final List<String> l=Collections.unmodifiableList(Arrays.asList(new String[] {"-Xtrustall"}));
> +
> + String accessMatcher = "(?s).*java.security.AccessControlException.{0,5}access denied.{0,5}java.util.PropertyPermission.{0,5}" + "user.name.{0,5}read" + ".*";
> +
> + @Test
> + public void ReadSignedPropertiesWithUnsignedContentInMETAINF() throws Exception {
> + //request for allpermissions
> + ProcessResult pr=server.executeJavawsHeadless(l,"/UnsignedContentInMETAINF.jnlp");
> + Assert.assertFalse("Stderr should NOT match "+accessMatcher+" but did",pr.stderr.matches(accessMatcher));
> + String ss="ClassNotFoundException";
> + Assert.assertFalse("Stderr should not contain "+ss+" but did",pr.stderr.contains(ss));
> + Assert.assertTrue("Stdout length should be >= 4 but was "+pr.stdout.length(),pr.stdout.length()>=4); // /home/user or /root or anything else :(
> + Assert.assertFalse("Should not be terminated but was",pr.wasTerminated);
> + Assert.assertEquals((Integer)0, pr.returnValue);
> + }
> + }
>
>
> JCVIsMetaInfFile.patch
>
>
> diff --git a/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java b/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
> --- a/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
> +++ b/netx/net/sourceforge/jnlp/tools/JarCertVerifier.java
> @@ -441,7 +441,7 @@ public class JarCertVerifier implements
> * . META-INF/*.DSA
> * . META-INF/*.RSA
> */
> - static private boolean isMetaInfFile(String name) {
> + static boolean isMetaInfFile(String name) {
> String ucName = name.toUpperCase();
> return ucName.startsWith(META_INF);
> }
> diff --git a/tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java b/tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java
> new file mode 100644
> --- /dev/null
> +++ b/tests/netx/unit/net/sourceforge/jnlp/tools/JarCertVerifierTest.java
> @@ -0,0 +1,17 @@
> +package net.sourceforge.jnlp.tools;
> +
> +import static org.junit.Assert.*;
> +
> +import org.junit.Test;
> +
> +public class JarCertVerifierTest {
> +
> + @Test
> + public void testIsMetaInfFile() {
> + final String METAINF ="META-INF";
> + assertFalse(JarCertVerifier.isMetaInfFile("some_dir/" + METAINF + "/filename"));
> + assertFalse(JarCertVerifier.isMetaInfFile(METAINF + "filename"));
> + assertTrue(JarCertVerifier.isMetaInfFile(METAINF + "/filename"));
> + }
> +
> +}
>
More information about the distro-pkg-dev
mailing list