http://jira.opensymphony.com/secure/ViewIssue.jspa?key=WW-62
I traced this down to
pageContext.getRequest().getRequestDispatcher(resourcePath)
in webwork.view.taglib.IncludeTag. getRD() returns null on orion when the
path is "/foo/../bar.jsp" or "\foo\..\bar.jsp" but work when path is
"/foo/..\bar.jsp". I was discussing this with one of the Orion guys, and
he tried it and said it looked like a quirk on their end. He said he'd
look into it for 1.6.1.
In the mean time, I've got a patch that fixes the problem by flattening
'..' out of the path. This might be a good plan regardless since I'm not
sure what the spec has to say about supporting '..'
Diff is attached.
--Erik
Index: webwork/src/main/webwork/view/taglib/IncludeTag.java
===================================================================
RCS file: /cvsroot/opensymphony/webwork/src/main/webwork/view/taglib/IncludeTag.java,v
retrieving revision 1.12
diff -r1.12 IncludeTag.java
106a107
> String returnValue;
108,116c109,140
< return (relativePath);
< if (!(request instanceof HttpServletRequest))
< return (relativePath);
< HttpServletRequest hrequest = (HttpServletRequest) request;
< String uri = (String)
< request.getAttribute("javax.servlet.include.servlet_path");
< if (uri == null)
< uri = hrequest.getServletPath();
< return (uri.substring(0, uri.lastIndexOf('/')) + '/' + relativePath);
---
> returnValue = relativePath;
> else if (!(request instanceof HttpServletRequest))
> returnValue = relativePath;
> else {
> HttpServletRequest hrequest = (HttpServletRequest) request;
> String uri = (String)
> request.getAttribute("javax.servlet.include.servlet_path");
> if (uri == null)
> uri = hrequest.getServletPath();
> returnValue = uri.substring(0, uri.lastIndexOf('/')) + '/' +
>relativePath;
> }
>
> if (returnValue.indexOf("..") != -1) { // Fix Orion bug that can't handle ..
>in path
> Stack stack = new Stack();
> StringTokenizer pathParts = new
>StringTokenizer(returnValue.replace('\\', '/'), "/");
> while (pathParts.hasMoreTokens()) {
> String part = pathParts.nextToken();
> if (part.equals(".."))
> stack.pop();
> else
> stack.push(part);
> }
>
> StringBuffer flatPathBuffer = new StringBuffer();
>
> for (int i = 0; i < stack.size(); i++)
> flatPathBuffer.append("/" + stack.elementAt(i));
>
> returnValue = flatPathBuffer.toString();
> }
>
> return returnValue;