Author: markt
Date: Sun Jun 11 15:38:34 2017
New Revision: 1798371
URL: http://svn.apache.org/viewvc?rev=1798371&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61154
Introduce a new custom permission, DeployXmlPermisasion, that allows a web
application running under a security manager to use a META-INF/context.xml even
when Host.deployXML is false.
Added:
tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java
(with props)
Modified:
tomcat/trunk/conf/catalina.policy
tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java
tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
tomcat/trunk/webapps/docs/changelog.xml
tomcat/trunk/webapps/docs/config/host.xml
Modified: tomcat/trunk/conf/catalina.policy
URL:
http://svn.apache.org/viewvc/tomcat/trunk/conf/catalina.policy?rev=1798371&r1=1798370&r2=1798371&view=diff
==============================================================================
--- tomcat/trunk/conf/catalina.policy (original)
+++ tomcat/trunk/conf/catalina.policy Sun Jun 11 15:38:34 2017
@@ -193,8 +193,9 @@ grant {
// The Manager application needs access to the following packages to support
the
-// session display functionality. These settings support the following
-// configurations:
+// session display functionality. It also requires the custom Tomcat
+// DeployXmlPermission to enable the use of META_INF/context.xml
+// These settings support the following configurations:
// - default CATALINA_HOME == CATALINA_BASE
// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE
// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME
@@ -204,6 +205,7 @@ grant codeBase "file:${catalina.base}/we
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.manager";
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.manager.util";
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
};
grant codeBase "file:${catalina.home}/webapps/manager/-" {
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina";
@@ -211,8 +213,23 @@ grant codeBase "file:${catalina.home}/we
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.manager";
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.manager.util";
permission java.lang.RuntimePermission
"accessClassInPackage.org.apache.catalina.util";
+ permission org.apache.catalina.security.DeployXmlPermission "manager";
};
+// The Host Manager application needs the custom Tomcat DeployXmlPermission to
+// enable the use of META_INF/context.xml
+// These settings support the following configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Host Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Host Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+grant codeBase "file:${catalina.home}/webapps/host-manager/-" {
+ permission org.apache.catalina.security.DeployXmlPermission "host-manager";
+};
+
+
// You can assign additional permissions to particular web applications by
// adding additional "grant" entries here, based on the code base for that
// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files.
Added: tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java?rev=1798371&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java
(added)
+++ tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java Sun
Jun 11 15:38:34 2017
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.security;
+
+import java.security.BasicPermission;
+
+/**
+ * Grant this permission to a docBase to permit the web application to use any
+ * <code>META-INF/context.xml</code> that might be present with in the
+ * application when <code>deployXML</code> has been disabled at the Host level.
+ * The name of the permission should be the base name for the web application.
+ */
+public class DeployXmlPermission extends BasicPermission {
+
+ private static final long serialVersionUID = 1L;
+
+ public DeployXmlPermission(String name) {
+ super(name);
+ }
+
+ public DeployXmlPermission(String name, String actions) {
+ super(name, actions);
+ }
+}
Propchange:
tomcat/trunk/java/org/apache/catalina/security/DeployXmlPermission.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java?rev=1798371&r1=1798370&r2=1798371&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/HostConfig.java Sun Jun 11
15:38:34 2017
@@ -22,7 +22,14 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.nio.file.Files;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Policy;
+import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -47,6 +54,7 @@ import javax.management.ObjectName;
import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.DistributedManager;
+import org.apache.catalina.Globals;
import org.apache.catalina.Host;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleEvent;
@@ -54,6 +62,7 @@ import org.apache.catalina.LifecycleList
import org.apache.catalina.Manager;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.security.DeployXmlPermission;
import org.apache.catalina.util.ContextName;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
@@ -196,7 +205,34 @@ public class HostConfig implements Lifec
* @param deployXML The new deploy XML flag
*/
public void setDeployXML(boolean deployXML) {
- this.deployXML= deployXML;
+ this.deployXML = deployXML;
+ }
+
+
+ private boolean isDeployThisXML(File docBase, ContextName cn) {
+ boolean deployThisXML = isDeployXML();
+ if (Globals.IS_SECURITY_ENABLED && !deployThisXML) {
+ // When running under a SecurityManager, deployXML may be
overridden
+ // on a per Context basis by the granting of a specific permission
+ Policy currentPolicy = Policy.getPolicy();
+ if (currentPolicy != null) {
+ URL contextRootUrl;
+ try {
+ contextRootUrl = docBase.toURI().toURL();
+ CodeSource cs = new CodeSource(contextRootUrl,
(Certificate[]) null);
+ PermissionCollection pc = currentPolicy.getPermissions(cs);
+ Permission p = new DeployXmlPermission(cn.getBaseName());
+ if (pc.implies(p)) {
+ deployThisXML = true;
+ }
+ } catch (MalformedURLException e) {
+ // Should never happen
+ log.warn("hostConfig.docBaseUrlInvalid", e);
+ }
+ }
+ }
+
+ return deployThisXML;
}
@@ -809,8 +845,10 @@ public class HostConfig implements Lifec
}
Context context = null;
+ boolean deployThisXML = isDeployThisXML(war, cn);
+
try {
- if (deployXML && useXml && !copyXML) {
+ if (deployThisXML && useXml && !copyXML) {
synchronized (digesterLock) {
try {
context = (Context) digester.parse(xml);
@@ -826,7 +864,7 @@ public class HostConfig implements Lifec
}
}
context.setConfigFile(xml.toURI().toURL());
- } else if (deployXML && xmlInWar) {
+ } else if (deployThisXML && xmlInWar) {
synchronized (digesterLock) {
try (JarFile jar = new JarFile(war)) {
JarEntry entry =
jar.getJarEntry(Constants.ApplicationContextXml);
@@ -846,7 +884,7 @@ public class HostConfig implements Lifec
UriUtil.buildJarUrl(war,
Constants.ApplicationContextXml));
}
}
- } else if (!deployXML && xmlInWar) {
+ } else if (!deployThisXML && xmlInWar) {
// Block deployment as META-INF/context.xml may contain
security
// configuration necessary for a secure deployment.
log.error(sm.getString("hostConfig.deployDescriptor.blocked",
@@ -866,7 +904,7 @@ public class HostConfig implements Lifec
}
boolean copyThisXml = false;
- if (deployXML) {
+ if (deployThisXML) {
if (host instanceof StandardHost) {
copyThisXml = ((StandardHost) host).isCopyXML();
}
@@ -902,7 +940,7 @@ public class HostConfig implements Lifec
}
DeployedApplication deployedApp = new DeployedApplication(cn.getName(),
- xml.exists() && deployXML && copyThisXml);
+ xml.exists() && deployThisXML && copyThisXml);
long startTime = 0;
// Deploy the application in this WAR file
@@ -917,7 +955,7 @@ public class HostConfig implements Lifec
deployedApp.redeployResources.put
(war.getAbsolutePath(), Long.valueOf(war.lastModified()));
- if (deployXML && xml.exists() && copyThisXml) {
+ if (deployThisXML && xml.exists() && copyThisXml) {
deployedApp.redeployResources.put(xml.getAbsolutePath(),
Long.valueOf(xml.lastModified()));
} else {
@@ -955,7 +993,7 @@ public class HostConfig implements Lifec
Long.valueOf(docBase.lastModified()));
addWatchedResources(deployedApp, docBase.getAbsolutePath(),
context);
- if (deployXML && !copyThisXml && (xmlInWar || xml.exists())) {
+ if (deployThisXML && !copyThisXml && (xmlInWar ||
xml.exists())) {
deployedApp.redeployResources.put(xml.getAbsolutePath(),
Long.valueOf(xml.lastModified()));
}
@@ -1042,10 +1080,11 @@ public class HostConfig implements Lifec
DeployedApplication deployedApp;
- boolean copyThisXml = copyXML;
+ boolean copyThisXml = isCopyXML();
+ boolean deployThisXML = isDeployThisXML(dir, cn);
try {
- if (deployXML && xml.exists()) {
+ if (deployThisXML && xml.exists()) {
synchronized (digesterLock) {
try {
context = (Context) digester.parse(xml);
@@ -1073,7 +1112,7 @@ public class HostConfig implements Lifec
} else {
context.setConfigFile(xml.toURI().toURL());
}
- } else if (!deployXML && xml.exists()) {
+ } else if (!deployThisXML && xml.exists()) {
// Block deployment as META-INF/context.xml may contain
security
// configuration necessary for a secure deployment.
log.error(sm.getString("hostConfig.deployDescriptor.blocked",
@@ -1099,7 +1138,7 @@ public class HostConfig implements Lifec
dir.getAbsolutePath()), t);
} finally {
deployedApp = new DeployedApplication(cn.getName(),
- xml.exists() && deployXML && copyThisXml);
+ xml.exists() && deployThisXML && copyThisXml);
// Fake re-deploy resource to detect if a WAR is added at a later
// point
@@ -1107,7 +1146,7 @@ public class HostConfig implements Lifec
Long.valueOf(0));
deployedApp.redeployResources.put(dir.getAbsolutePath(),
Long.valueOf(dir.lastModified()));
- if (deployXML && xml.exists()) {
+ if (deployThisXML && xml.exists()) {
if (copyThisXml) {
deployedApp.redeployResources.put(
xmlCopy.getAbsolutePath(),
Modified: tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties?rev=1798371&r1=1798370&r2=1798371&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/catalina/startup/LocalStrings.properties Sun
Jun 11 15:38:34 2017
@@ -108,6 +108,7 @@ hostConfig.deployWar.threaded.error=Erro
hostConfig.deployWar.finished=Deployment of web application archive [{0}] has
finished in [{1}] ms
hostConfig.deploy.error=Exception while deploying web application directory
[{0}]
hostConfig.deploying=Deploying discovered web applications
+hostConfig.docBaseUrlInvalid=The provided docBase cannot be expressed as a URL
hostConfig.expand=Expanding web application archive [{0}]
hostConfig.expand.error=Exception while expanding web application archive [{0}]
hostConfig.expanding=Expanding discovered web application archives
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1798371&r1=1798370&r2=1798371&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Sun Jun 11 15:38:34 2017
@@ -86,6 +86,15 @@
text fragments when generating the default error pages. Patch provided
by Katya Todorova. (violetagg)
</fix>
+ <fix>
+ <bug>61154</bug>: Allow the Manager and Host Manager web applciations
to
+ start by default when running under a security manager. This was
+ accomplished by adding a custom permission,
+ <code>org.apache.catalina.security.DeployXmlPermisasion</code>, that
+ permits an application to use a <code>META-INF/context.xml</code> file
+ and then granting that permission to the Manager and Host Manager.
+ (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Coyote">
Modified: tomcat/trunk/webapps/docs/config/host.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/host.xml?rev=1798371&r1=1798370&r2=1798371&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/host.xml (original)
+++ tomcat/trunk/webapps/docs/config/host.xml Sun Jun 11 15:38:34 2017
@@ -261,7 +261,13 @@
fail to start in case the descriptor contains necessary configuration
for secure deployment (such as a RemoteAddrValve) which should not be
ignored. The flag's value defaults to <code>true</code> unless a
- security manager is enabled when the default is <code>false</code>.</p>
+ security manager is enabled when the default is <code>false</code>.
+ When running under a security manager this may be enabled on a per web
+ application basis by granting the
+ <code>org.apache.catalina.security.DeployXmlPermission</code> to the
web
+ application. The Manager and Host Manager applications are granted this
+ permission by default so that they continue to work when running under
a
+ security manager.</p>
</attribute>
<attribute name="errorReportValveClass" required="false">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]