package org.codehaus.plexus.archiver.jar; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.jar.JarFile; import java.util.jar.Attributes; import java.util.Iterator; import java.util.Map; import junit.framework.TestCase; /** Tests, whether it is possible to create invalid jar * files by using invalid MANIFEST values. */ public class BlanksTest extends TestCase { public void testLineFeeds() throws Exception { Manifest manifest = new Manifest(); final String entryName = BlanksTest.class.getName(); manifest.addConfiguredAttribute( new Manifest.Attribute( entryName, "xyz\r\nzyx" ) ); JarArchiver jarArchiver = new JarArchiver(); jarArchiver.addConfiguredManifest( manifest ); File tmpFile = File.createTempFile( entryName, null ); tmpFile.deleteOnExit(); jarArchiver.setDestFile( tmpFile ); jarArchiver.createArchive(); ZipFile zipFile = new ZipFile( tmpFile ); final String match = entryName + ": "; for ( Enumeration en = zipFile.entries(); en.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) en.nextElement(); if ( "META-INF/MANIFEST.MF".equals( entry.getName() ) ) { InputStream istream = zipFile.getInputStream( entry ); try { InputStreamReader isr = new InputStreamReader( istream, "UTF-8" ); try { BufferedReader br = new BufferedReader( isr ); try { boolean found = false; for (;;) { String line = br.readLine(); if (line == null) { break; } if (line.startsWith( match )) { found = true; String value = line.substring( match.length() ).trim(); assertTrue("xyz zyx".equals(value) || "xyz zyx".equals(value)); } } assertTrue(found); br.close(); br = null; } finally { if (br != null) { try { br.close(); } catch (Throwable t) { /* Ignore me */ } } } isr.close(); isr = null; } finally { if (isr != null) { try { isr.close(); } catch (Throwable t) { /* Ignore me */ } } } istream.close(); istream = null; } finally { if (istream != null) { try { istream.close(); } catch (Throwable t) { /* Ignore me */ } } } } } } /* demonstrates that the jar manifest created by plexus can be reread by the offical SDK */ public void testLineFeedsFixed() throws Exception { Manifest manifest = new Manifest(); // . is not an accepted alphanum in Attribute value final String entryName = BlanksTest.class.getName().replace(".", ""); manifest.addConfiguredAttribute( new Manifest.Attribute( entryName, "xyz\r\nzyx" ) ); JarArchiver jarArchiver = new JarArchiver(); jarArchiver.addConfiguredManifest( manifest ); File tmpFile = File.createTempFile( entryName, null ); tmpFile.deleteOnExit(); jarArchiver.setDestFile( tmpFile ); jarArchiver.createArchive(); JarFile jarFile = new JarFile( tmpFile ); java.util.jar.Manifest manifest2 = jarFile.getManifest(); Attributes attributes = manifest2.getMainAttributes(); String value = attributes.getValue(entryName); assertTrue(value.matches("xyzzyx")); } }