+1 from me.
David Jencks wrote: > I'd like to apply the patch > http://issues.apache.org/jira/secure/attachment/12334350/GERONIMO-2006.patch > > > from http://issues.apache.org/jira/browse/GERONIMO-2006 > > It fixes a buffer overflow problem in tomcat (which presumably doesn't > need a vote since it's a bug fix) and does some simple checks on the > plan you supply to upgrade the plan if it is clearly a 1.0 plan. > > here's my +1. I'd like to know if it counts, see my separate post > asking about this. > > here's the text of the patch: again I'd like to know if this is required > or if the link to the jira issue is sufficient. > > Thanks > david jencks > > > Index: applications/console-standard/project.xml > =================================================================== > --- applications/console-standard/project.xml (revision 407792) > +++ applications/console-standard/project.xml (working copy) > @@ -92,6 +92,11 @@ > </dependency> > <dependency> > <groupId>geronimo</groupId> > + <artifactId>geronimo-upgrade</artifactId> > + <version>${pom.currentVersion}</version> > + </dependency> > + <dependency> > + <groupId>geronimo</groupId> > <artifactId>geronimo-deploy-jsr88</artifactId> > <version>${pom.currentVersion}</version> > </dependency> > Index: > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/PlanExportServlet.java > > =================================================================== > --- > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/PlanExportServlet.java > > (revision 0) > +++ > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/PlanExportServlet.java > > (revision 0) > @@ -0,0 +1,41 @@ > +/** > +* > +* Copyright 2006 The Apache Software Foundation > +* > +* Licensed 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.geronimo.console.configmanager; > + > +import javax.servlet.ServletException; > +import javax.servlet.http.HttpServlet; > +import javax.servlet.http.HttpServletRequest; > +import javax.servlet.http.HttpServletResponse; > +import java.io.IOException; > + > +/** > +* Servlet that lets you download a migrated plan > +* > +* @version $Rev$ $Date$ > +*/ > +public class PlanExportServlet extends HttpServlet { > + protected void doPost(HttpServletRequest request, > HttpServletResponse response) throws ServletException, IOException { > + String migratedPlan = request.getParameter("migratedPlan"); > + if (migratedPlan == null) { > + response.sendError(HttpServletResponse.SC_BAD_REQUEST); > + } else { > + response.setContentType("application/x-unknown"); > + response.addHeader("Content-Disposition", "attachment; > filename=migrated-plan.xml"); > + response.getOutputStream().write(migratedPlan.getBytes()); > + } > + } > +} > > Property changes on: > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/PlanExportServlet.java > > ___________________________________________________________________ > Name: svn:mime-type > + text/plain > Name: svn:keywords > + Date Author Id Revision HeadURL > Name: svn:eol-style > + native > > Index: > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/DeploymentPortlet.java > > =================================================================== > --- > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/DeploymentPortlet.java > > (revision 407792) > +++ > applications/console-standard/src/java/org/apache/geronimo/console/configmanager/DeploymentPortlet.java > > (working copy) > @@ -17,8 +17,11 @@ > package org.apache.geronimo.console.configmanager; > +import java.io.ByteArrayInputStream; > import java.io.File; > +import java.io.FileInputStream; > import java.io.IOException; > +import java.io.StringWriter; > import java.util.Iterator; > import java.util.List; > import java.util.ArrayList; > @@ -34,6 +37,9 @@ > import javax.portlet.PortletRequestDispatcher; > import javax.portlet.RenderRequest; > import javax.portlet.RenderResponse; > +import javax.xml.parsers.DocumentBuilder; > +import javax.xml.parsers.DocumentBuilderFactory; > + > import org.apache.commons.fileupload.FileItem; > import org.apache.commons.fileupload.FileUploadException; > import org.apache.commons.fileupload.disk.DiskFileItemFactory; > @@ -43,17 +49,21 @@ > import org.apache.geronimo.deployment.plugin.ConfigIDExtractor; > import org.apache.geronimo.common.DeploymentException; > import org.apache.geronimo.kernel.repository.Artifact; > +import org.apache.geronimo.upgrade.Upgrade1_0To1_1; > +import org.w3c.dom.Document; > public class DeploymentPortlet extends BasePortlet { > + private static final String DEPLOY_VIEW = > "/WEB-INF/view/configmanager/deploy.jsp"; > + private static final String HELP_VIEW = > "/WEB-INF/view/configmanager/deployHelp.jsp"; > + private static final String MIGRATED_PLAN_PARM = "migratedPlan"; > + private static final String ORIGINAL_PLAN_PARM = "originalPlan"; > + private static final String FULL_STATUS_PARM = > "fullStatusMessage"; > + private static final String ABBR_STATUS_PARM = > "abbrStatusMessage"; > private PortletRequestDispatcher deployView; > - > private PortletRequestDispatcher helpView; > - private boolean messageNotRendered = true; > - > public void processAction(ActionRequest actionRequest, > ActionResponse actionResponse) throws > PortletException, IOException { > - messageNotRendered = true; > if (!PortletFileUpload.isMultipartContent(actionRequest)) { > throw new PortletException("Expected file upload"); > } > @@ -107,6 +117,7 @@ > throw new PortletException(e); > } > DeploymentFactoryManager dfm = > DeploymentFactoryManager.getInstance(); > + FileInputStream fis = null; > try { > DeploymentManager mgr = > dfm.getDeploymentManager("deployer:geronimo:inVM", null, null); > try { > @@ -128,23 +139,58 @@ > while(progress.getDeploymentStatus().isRunning()) { > Thread.sleep(100); > } > - > + > + String abbrStatusMessage; > + String fullStatusMessage = null; > if(progress.getDeploymentStatus().isCompleted()) { > - String message = "The application was successfully > "+(isRedeploy ? "re" : "")+"deployed.<br/>"; > + abbrStatusMessage = "The application was > successfully "+(isRedeploy ? "re" : "")+"deployed.<br/>"; > // start installed app/s > if (!isRedeploy && startApp != null && > !startApp.equals("")) { > progress = > mgr.start(progress.getResultTargetModuleIDs()); > > while(progress.getDeploymentStatus().isRunning()) { > Thread.sleep(100); > } > - message+="The application was successfully > started"; > + abbrStatusMessage+="The application was > successfully started"; > } > - actionResponse.setRenderParameter("outcome",message); > } else { > - actionResponse.setRenderParameter("outcome", > "Deployment failed: "+progress.getDeploymentStatus().getMessage()); > + fullStatusMessage = > progress.getDeploymentStatus().getMessage(); > + // for the abbreviated status message clip off > everything > + // after the first line, which in most cases means > the gnarly stacktrace > + abbrStatusMessage = "Deployment failed:<br/>" > + + fullStatusMessage.substring(0, > fullStatusMessage.indexOf('\n')); > + // try to provide an upgraded version of the plan > + try { > + if (planFile != null && planFile.exists()) { > + byte[] plan = new byte[(int) > planFile.length()]; > + fis = new FileInputStream(planFile); > + fis.read(plan); > + DocumentBuilder documentBuilder = > DocumentBuilderFactory.newInstance().newDocumentBuilder(); > + Document doc = documentBuilder.parse(new > ByteArrayInputStream(plan)); > + // v1.1 switched from configId to moduleId > + String configId = > doc.getDocumentElement().getAttribute("configId"); > + if (configId != null && > !("".equals(configId))) { > + StringWriter sw = new StringWriter(); > + new Upgrade1_0To1_1().upgrade(new > ByteArrayInputStream(plan), sw); > + // have to store the original and > upgraded plans in the session > + // because the buffer size for render > parameters is sometimes not > + // big enough > + > actionRequest.getPortletSession().setAttribute(MIGRATED_PLAN_PARM, > sw.getBuffer()); > + > actionRequest.getPortletSession().setAttribute(ORIGINAL_PLAN_PARM, new > String(plan)); > + } > + } > + } catch (Exception e) { > + // cannot provide a migrated plan in this case, > most likely > + // because the deployment plan would not parse. > a valid > + // status message has already been provided in > this case > + } > } > + // have to store the status messages in the portlet > session > + // because the buffer size for render parameters is > sometimes not big enough > + > actionRequest.getPortletSession().setAttribute(FULL_STATUS_PARM, > fullStatusMessage); > + > actionRequest.getPortletSession().setAttribute(ABBR_STATUS_PARM, > abbrStatusMessage); > } finally { > mgr.release(); > + if (fis!=null) fis.close(); > } > } catch (Exception e) { > throw new PortletException(e); > @@ -184,14 +230,24 @@ > protected void doView(RenderRequest renderRequest, > RenderResponse renderResponse) throws > PortletException, IOException { > - if (messageNotRendered) { > - renderRequest.setAttribute("outcome", renderRequest > - .getParameter("outcome")); > - messageNotRendered = false; > - } > + // The deployment plans and messages from the deployers > sometime exceeds > + // the buffer size for render attributes. To avoid the buffer > + // overrun the render attributes are temporarily stored in the > portlet > + // session during the processAction phase and then copied into > render > + // attributes here so the JSP has easier access to them. This > seems > + // to only be an issue on tomcat. > + copyRenderAttribute(renderRequest, FULL_STATUS_PARM); > + copyRenderAttribute(renderRequest, ABBR_STATUS_PARM); > + copyRenderAttribute(renderRequest, MIGRATED_PLAN_PARM); > + copyRenderAttribute(renderRequest, ORIGINAL_PLAN_PARM); > deployView.include(renderRequest, renderResponse); > - // clear previous message for next rendering > } > + > + private void copyRenderAttribute(RenderRequest renderRequest, > String attr) { > + Object value = > renderRequest.getPortletSession().getAttribute(attr); > + renderRequest.getPortletSession().removeAttribute(attr); > + renderRequest.setAttribute(attr, value); > + } > protected void doHelp(RenderRequest renderRequest, > RenderResponse renderResponse) throws > PortletException, IOException { > @@ -200,8 +256,8 @@ > public void init(PortletConfig portletConfig) throws > PortletException { > super.init(portletConfig); > - deployView = > portletConfig.getPortletContext().getRequestDispatcher("/WEB-INF/view/configmanager/deploy.jsp"); > > - helpView = > portletConfig.getPortletContext().getRequestDispatcher("/WEB-INF/view/configmanager/deployHelp.jsp"); > > + deployView = > portletConfig.getPortletContext().getRequestDispatcher(DEPLOY_VIEW); > + helpView = > portletConfig.getPortletContext().getRequestDispatcher(HELP_VIEW); > } > public void destroy() { > Index: > applications/console-standard/src/webapp/WEB-INF/view/configmanager/deploy.jsp > > =================================================================== > --- > applications/console-standard/src/webapp/WEB-INF/view/configmanager/deploy.jsp > > (revision 407792) > +++ > applications/console-standard/src/webapp/WEB-INF/view/configmanager/deploy.jsp > > (working copy) > @@ -1,9 +1,67 @@ > -<%@ page import="java.io.PrintWriter"%> > <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> > <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%> > <portlet:defineObjects/> > -<c:if test="${! outcome}"><pre>${outcome}</pre></c:if> > +<script> > +// toggle the display state of an element > +function <portlet:namespace/>toggleDisplay(id) { > + var element = document.getElementById("<portlet:namespace/>"+id); > + if (element.style.display == 'inline') { > + element.style.display='none'; > + } else { > + element.style.display='inline'; > + } > +} > +</script> > + > +<!-- Abbreviated status message --> > +<c:if test="${!(empty abbrStatusMessage)}"> > + <div id="<portlet:namespace/>abbrStatusMessage" > style="display:inline"> > + ${abbrStatusMessage}<br/> > + <c:if test="${!(empty fullStatusMessage)}"> > + <button > onclick="<portlet:namespace/>toggleDisplay('fullStatusMessage');<portlet:namespace/>toggleDisplay('abbrStatusMessage');return > false;">Show full details</button> > + </c:if> > + </div> > +</c:if> > +<!-- Full status message --> > +<c:if test="${!(empty fullStatusMessage)}"> > + <div id="<portlet:namespace/>fullStatusMessage" style="display:none"> > + <pre> > +<c:out escapeXml="true" value="${fullStatusMessage}"/> > + </pre> > + </div> > +</c:if> > + > +<P/> > + > +<!-- Migrated Plan --> > +<c:if test="${!(empty migratedPlan)}"> > +<hr/><br/> > +The deployment plan you provided appears to be for a previous version of > +the application server. > +A migrated version of your plan is provided below for your > convenience. Not all > +deployment plans can be fully migrated so some manual editing may be > required > +before the migrated plan can be deployed. > +<p/> > +<div id="<portlet:namespace/>migratedPlan" style="display:inline"> > +Migrated plan: > +<form method="POST" action="/console/plan-export"> > + <textarea name="migratedPlan" rows=10 cols=80><c:out > escapeXml="true" value="${migratedPlan}"/></textarea> > + <br/> > + <button > onclick="<portlet:namespace/>toggleDisplay('originalPlan');<portlet:namespace/>toggleDisplay('migratedPlan');return > false;">Show original plan</button> > + <input type="submit" value="Save this plan locally"/> > +</form> > +</div> > +<div id="<portlet:namespace/>originalPlan" style="display:none"> > +Original plan: > +<form> > + <textarea rows=10 cols=80><c:out escapeXml="true" > value="${originalPlan}"/></textarea><br/> > + <button > onclick="<portlet:namespace/>toggleDisplay('migratedPlan');<portlet:namespace/>toggleDisplay('originalPlan');return > false;">Show Migrated plan</button> > +</form> > +</div> > +<br/><hr/><br/> > +</c:if> > + > <form enctype="multipart/form-data" method="POST" > action="<portlet:actionURL><portlet:param name="action" > value="deploy"/></portlet:actionURL>"> > <table> > <tr><th align="right">Archive: </th><td><input type="file" > name="module" /></td></tr> > Index: applications/console-standard/src/webapp/WEB-INF/web.xml > =================================================================== > --- applications/console-standard/src/webapp/WEB-INF/web.xml > (revision 407792) > +++ applications/console-standard/src/webapp/WEB-INF/web.xml (working > copy) > @@ -763,6 +763,11 @@ > <servlet-name>maven-repo</servlet-name> > > <servlet-class>org.apache.geronimo.console.car.GeronimoAsMavenServlet</servlet-class> > > </servlet> > +<servlet> > + <display-name>Plan Export Servlet</display-name> > + <servlet-name>plan-export</servlet-name> > + > <servlet-class>org.apache.geronimo.console.configmanager.PlanExportServlet</servlet-class> > > +</servlet> > <servlet-mapping> > <servlet-name>dwr-invoker</servlet-name> > @@ -776,6 +781,10 @@ > <servlet-name>maven-repo</servlet-name> > <url-pattern>/maven-repo/*</url-pattern> > </servlet-mapping> > +<servlet-mapping> > + <servlet-name>plan-export</servlet-name> > + <url-pattern>/plan-export</url-pattern> > +</servlet-mapping> > Index: applications/console-framework/src/webapp/WEB-INF/web.xml > =================================================================== > --- applications/console-framework/src/webapp/WEB-INF/web.xml > (revision 407792) > +++ applications/console-framework/src/webapp/WEB-INF/web.xml > (working copy) > @@ -71,6 +71,20 @@ > <param-value>/graphs</param-value> > </init-param> > </servlet> > + > + <servlet> > + <display-name>Plan Export Forward Servlet</display-name> > + <servlet-name>plan-export-forward</servlet-name> > + > <servlet-class>org.apache.geronimo.console.servlet.ContextForwardServlet</servlet-class> > > + <init-param> > + <param-name>context-path</param-name> > + <param-value>/console-standard</param-value> > + </init-param> > + <init-param> > + <param-name>servlet-path</param-name> > + <param-value>/plan-export</param-value> > + </init-param> > + </servlet> > <servlet-mapping> > <servlet-name>se-console</servlet-name> > @@ -92,6 +106,10 @@ > <servlet-name>svg-forward</servlet-name> > <url-pattern>/graphs/*</url-pattern> > </servlet-mapping> > + <servlet-mapping> > + <servlet-name>plan-export-forward</servlet-name> > + <url-pattern>/plan-export</url-pattern> > + </servlet-mapping> > <security-constraint> > <web-resource-collection> > Index: configs/console-tomcat/project.xml > =================================================================== > --- configs/console-tomcat/project.xml (revision 407792) > +++ configs/console-tomcat/project.xml (working copy) > @@ -146,6 +146,14 @@ > </dependency> > <dependency> > <groupId>geronimo</groupId> > + <artifactId>geronimo-upgrade</artifactId> > + <version>${geronimo_version}</version> > + <properties> > + <geronimo.dependency>true</geronimo.dependency> > + </properties> > + </dependency> > + <dependency> > + <groupId>geronimo</groupId> > <artifactId>geronimo-management</artifactId> > <version>${geronimo_version}</version> > <properties> > Index: configs/console-jetty/project.xml > =================================================================== > --- configs/console-jetty/project.xml (revision 407792) > +++ configs/console-jetty/project.xml (working copy) > @@ -146,6 +146,14 @@ > </dependency> > <dependency> > <groupId>geronimo</groupId> > + <artifactId>geronimo-upgrade</artifactId> > + <version>${geronimo_version}</version> > + <properties> > + <geronimo.dependency>true</geronimo.dependency> > + </properties> > + </dependency> > + <dependency> > + <groupId>geronimo</groupId> > <artifactId>geronimo-management</artifactId> > <version>${geronimo_version}</version> > <properties>
