Author: markt Date: Mon Nov 18 21:12:46 2013 New Revision: 1543163 URL: http://svn.apache.org/r1543163 Log: Grant read permissions to all resource locations used by the web application
Modified: tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java tomcat/trunk/java/org/apache/catalina/WebResourceSet.java tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java tomcat/trunk/java/org/apache/catalina/webresources/AbstractFileResourceSet.java tomcat/trunk/java/org/apache/catalina/webresources/JarResourceSet.java tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java Modified: tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java (original) +++ tomcat/trunk/java/org/apache/catalina/WebResourceRoot.java Mon Nov 18 21:12:46 2013 @@ -18,6 +18,7 @@ package org.apache.catalina; import java.io.InputStream; import java.net.URL; +import java.util.List; import java.util.Set; /** @@ -397,6 +398,12 @@ public interface WebResourceRoot extends void deregisterTracedResource(WebResourceTraceWrapper traceWrapperInputStream); + /** + * Obtain the set of {@link WebResourceSet#getBaseUrl()} for all + * {@link WebResourceSet}s used by this root. + */ + List<URL> getBaseUrls(); + static enum ResourceSetType { PRE, RESOURCE_JAR, Modified: tomcat/trunk/java/org/apache/catalina/WebResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/WebResourceSet.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/WebResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/WebResourceSet.java Mon Nov 18 21:12:46 2013 @@ -17,6 +17,7 @@ package org.apache.catalina; import java.io.InputStream; +import java.net.URL; import java.util.Set; /** @@ -102,4 +103,11 @@ public interface WebResourceSet extends boolean getClassLoaderOnly(); void setClassLoaderOnly(boolean classLoaderOnly); + + /** + * Obtain the base URL for this set of resources. One of the uses of this is + * to grant read permissions to the resources when running under a security + * manager. + */ + URL getBaseUrl(); } Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Mon Nov 18 21:12:46 2013 @@ -456,7 +456,7 @@ public class WebappClassLoader extends U * * @param filepath file directory path */ - public void addPermission(String filepath) { + void addPermission(String filepath) { if (filepath == null) { return; } @@ -465,13 +465,18 @@ public class WebappClassLoader extends U if (securityManager != null) { Permission permission = null; - if (!path.endsWith(File.separator)) { - permission = new FilePermission(path, "read"); + if (path.startsWith("file:")) { + path = path.substring(5); + if (!path.endsWith(File.separator)) { + permission = new FilePermission(path, "read"); + addPermission(permission); + path = path + File.separator; + } + permission = new FilePermission(path + "-", "read"); addPermission(permission); - path = path + File.separator; + } else { + // Unsupported resource location. } - permission = new FilePermission(path + "-", "read"); - addPermission(permission); } } @@ -482,7 +487,7 @@ public class WebappClassLoader extends U * * @param url URL for a file or directory on local system */ - public void addPermission(URL url) { + void addPermission(URL url) { if (url != null) { addPermission(url.toString()); } @@ -494,7 +499,7 @@ public class WebappClassLoader extends U * * @param permission The permission */ - public void addPermission(Permission permission) { + void addPermission(Permission permission) { if ((securityManager != null) && (permission != null)) { permissionList.add(permission); } Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappLoader.java Mon Nov 18 21:12:46 2013 @@ -25,7 +25,6 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Constructor; import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLDecoder; @@ -546,64 +545,8 @@ public class WebappLoader extends Lifecy } } - try { - - URL rootURL = servletContext.getResource("/"); - classLoader.addPermission(rootURL); - - String contextRoot = servletContext.getRealPath("/"); - if (contextRoot != null) { - try { - contextRoot = (new File(contextRoot)).getCanonicalPath(); - classLoader.addPermission(contextRoot); - } catch (IOException e) { - // Ignore - } - } - - URL classesURL = servletContext.getResource("/WEB-INF/classes/"); - classLoader.addPermission(classesURL); - URL libURL = servletContext.getResource("/WEB-INF/lib/"); - classLoader.addPermission(libURL); - - if (contextRoot != null) { - - if (libURL != null) { - File rootDir = new File(contextRoot); - File libDir = new File(rootDir, "WEB-INF/lib/"); - try { - String path = libDir.getCanonicalPath(); - classLoader.addPermission(path); - } catch (IOException e) { - // Ignore - } - } - - } else { - - if (workDir != null) { - if (libURL != null) { - File libDir = new File(workDir, "WEB-INF/lib/"); - try { - String path = libDir.getCanonicalPath(); - classLoader.addPermission(path); - } catch (IOException e) { - // Ignore - } - } - if (classesURL != null) { - File classesDir = new File(workDir, "WEB-INF/classes/"); - try { - String path = classesDir.getCanonicalPath(); - classLoader.addPermission(path); - } catch (IOException e) { - // Ignore - } - } - } - } - } catch (MalformedURLException e) { - // Ignore + for (URL url : context.getResources().getBaseUrls()) { + classLoader.addPermission(url); } } Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java Mon Nov 18 21:12:46 2013 @@ -18,6 +18,7 @@ package org.apache.catalina.webresources import java.io.File; import java.io.InputStream; +import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -32,7 +33,8 @@ import org.apache.catalina.util.Resource public abstract class AbstractArchiveResourceSet extends AbstractResourceSet { private final HashMap<String,JarEntry> jarFileEntries = new HashMap<>(); - private String baseUrl; + private URL baseUrl; + private String baseUrlString; private Manifest manifest; @@ -40,12 +42,22 @@ public abstract class AbstractArchiveRes this.manifest = manifest; } - protected final String getBaseUrl() { + protected final void setBaseUrl(URL baseUrl) { + this.baseUrl = baseUrl; + if (baseUrl == null) { + this.baseUrlString = null; + } else { + this.baseUrlString = baseUrl.toString(); + } + } + + @Override + public final URL getBaseUrl() { return baseUrl; } - protected final void setBaseUrl(String baseUrl) { - this.baseUrl = baseUrl; + protected final String getBaseUrlString() { + return baseUrlString; } protected final HashMap<String,JarEntry> getJarFileEntries() { Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractFileResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/AbstractFileResourceSet.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/AbstractFileResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/AbstractFileResourceSet.java Mon Nov 18 21:12:46 2013 @@ -18,6 +18,8 @@ package org.apache.catalina.webresources import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import org.apache.catalina.LifecycleException; import org.apache.tomcat.util.http.RequestUtil; @@ -104,6 +106,16 @@ public abstract class AbstractFileResour return RequestUtil.normalize(path, File.separatorChar == '/'); } + @Override + public URL getBaseUrl() { + try { + return getFileBase().toURI().toURL(); + } catch (MalformedURLException e) { + return null; + } + } + + //-------------------------------------------------------- Lifecycle methods @Override protected void initInternal() throws LifecycleException { Modified: tomcat/trunk/java/org/apache/catalina/webresources/JarResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarResourceSet.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/JarResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/JarResourceSet.java Mon Nov 18 21:12:46 2013 @@ -75,7 +75,7 @@ public class JarResourceSet extends Abst @Override protected WebResource createArchiveResource(JarEntry jarEntry, String webAppPath, Manifest manifest) { - return new JarResource(getRoot(), webAppPath, getBase(), getBaseUrl(), + return new JarResource(getRoot(), webAppPath, getBase(), getBaseUrlString(), jarEntry, getInternalPath(), manifest); } @@ -95,7 +95,7 @@ public class JarResourceSet extends Abst } try { - setBaseUrl((new File(getBase())).toURI().toURL().toString()); + setBaseUrl((new File(getBase())).toURI().toURL()); } catch (MalformedURLException e) { throw new IllegalArgumentException(e); } 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=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java Mon Nov 18 21:12:46 2013 @@ -78,7 +78,7 @@ public class JarWarResourceSet extends A @Override protected WebResource createArchiveResource(JarEntry jarEntry, String webAppPath, Manifest manifest) { - return new JarWarResource(getRoot(), webAppPath, getBase(), getBaseUrl(), + return new JarWarResource(getRoot(), webAppPath, getBase(), getBaseUrlString(), jarEntry, archivePath, getInternalPath(), manifest); } @@ -103,7 +103,7 @@ public class JarWarResourceSet extends A } try { - setBaseUrl((new File(getBase())).toURI().toURL().toString()); + setBaseUrl((new File(getBase())).toURI().toURL()); } catch (MalformedURLException e) { throw new IllegalArgumentException(e); } Modified: tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java?rev=1543163&r1=1543162&r2=1543163&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java Mon Nov 18 21:12:46 2013 @@ -25,6 +25,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.List; import java.util.Locale; import java.util.Set; @@ -527,6 +528,22 @@ public class StandardRoot extends Lifecy } + @Override + public List<URL> getBaseUrls() { + List<URL> result = new ArrayList<>(); + for (List<WebResourceSet> list : allResources) { + for (WebResourceSet webResourceSet : list) { + if (!webResourceSet.getClassLoaderOnly()) { + URL url = webResourceSet.getBaseUrl(); + if (url != null) { + result.add(url); + } + } + } + } + return result; + } + // ----------------------------------------------------------- JMX Lifecycle @Override protected String getDomainInternal() { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org