Author: markt
Date: Tue Apr  4 14:04:21 2017
New Revision: 1790119

URL: http://svn.apache.org/viewvc?rev=1790119&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60940
Improve the handling of the META-INF/ and META-INF/MANIFEST.MF entries for Jar 
files located in /WEB-INF/lib when running a web application from a packed WAR 
file.

Added:
    
tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java
Modified:
    tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java
    tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java?rev=1790119&r1=1790118&r2=1790119&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java Tue Apr  
4 14:04:21 2017
@@ -150,12 +150,11 @@ public final class ExtensionValidator {
             if (manifestResource.isFile()) {
                 // Primarily used for error reporting
                 String jarName = manifestResource.getURL().toExternalForm();
-                Manifest jmanifest = null;
-                try (InputStream is = manifestResource.getInputStream()) {
-                    jmanifest = new Manifest(is);
-                    ManifestResource mre = new ManifestResource(jarName,
-                            jmanifest, ManifestResource.APPLICATION);
-                    appManifestResources.add(mre);
+                Manifest jmanifest = manifestResource.getManifest();
+                if (jmanifest != null) {
+                       ManifestResource mre = new ManifestResource(jarName,
+                               jmanifest, ManifestResource.APPLICATION);
+                       appManifestResources.add(mre);
                 }
             }
         }

Modified: 
tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java?rev=1790119&r1=1790118&r2=1790119&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java 
Tue Apr  4 14:04:21 2017
@@ -107,11 +107,28 @@ public class JarWarResourceSet extends A
 
                     try (JarInputStream jarIs = new JarInputStream(jarFileIs)) 
{
                         JarEntry entry = jarIs.getNextJarEntry();
+                        boolean hasMetaInf = false;
                         while (entry != null) {
+                               if (!hasMetaInf && 
entry.getName().startsWith("META-INF/")) {
+                                       hasMetaInf = true;
+                               }
                             archiveEntries.put(entry.getName(), entry);
                             entry = jarIs.getNextJarEntry();
                         }
                         setManifest(jarIs.getManifest());
+                       // Hacks to work-around JarInputStream swallowing these
+                        // entries. The attributes for these entries will be
+                        // incomplete. Making the attributes available would
+                        // require (re-)reading the stream as a ZipInputStream
+                        // and creating JarEntry objects from the ZipEntries.
+                        if (hasMetaInf) {
+                               JarEntry metaInfDir = new JarEntry("META-INF/");
+                               archiveEntries.put(metaInfDir.getName(), 
metaInfDir);
+                        }
+                        if (jarIs.getManifest() != null) {
+                               JarEntry manifest = new 
JarEntry("META-INF/MANIFEST.MF");
+                               archiveEntries.put(manifest.getName(), 
manifest);
+                        }
                     }
                 } catch (IOException ioe) {
                     // Should never happen

Added: 
tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java?rev=1790119&view=auto
==============================================================================
--- 
tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java 
(added)
+++ 
tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java 
Tue Apr  4 14:04:21 2017
@@ -0,0 +1,40 @@
+package org.apache.catalina.webresources;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.WebResource;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.TomcatBaseTest;
+
+public class TestJarWarResourceSet extends TomcatBaseTest {
+
+    @Before
+    public void register() {
+        TomcatURLStreamHandlerFactory.register();
+    }
+
+    
+       @Test
+       public void testJarWarMetaInf() throws LifecycleException  {
+        Tomcat tomcat = getTomcatInstance();
+
+               File warFile = new 
File("test/webresources/war-url-connection.war");
+        Context ctx = tomcat.addContext("", warFile.getAbsolutePath());
+        
+        tomcat.start();
+
+        StandardRoot root = (StandardRoot) ctx.getResources();
+        
+               WebResource[] results = 
root.getClassLoaderResources("/META-INF");
+               
+               Assert.assertNotNull(results);
+               Assert.assertEquals(1, results.length);
+               Assert.assertNotNull(results[0].getURL());
+       }
+}

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1790119&r1=1790118&r2=1790119&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Apr  4 14:04:21 2017
@@ -64,6 +64,12 @@
         Avoid a <code>NullPointerException</code> when reading attributes for a
         running HTTP connector where TLS is not enabled. (markt)
       </fix>
+      <fix>
+        <bug>60940</bug>: Improve the handling of the <code>META-INF/</code> 
and
+        <code>META-INF/MANIFEST.MF</code> entries for Jar files located in
+        <code>/WEB-INF/lib</code> when running a web application from a packed
+        WAR file. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to