-
Bug
-
Resolution: Unresolved
-
Medium
-
None
-
5.10.2, 5.10.6, 5.10.7, 6.0.4, 6.3.1, 6.6.1, 6.13.8
-
82
-
Severity 3 - Minor
-
3
-
Summary
Confluence shows stack trace when accessing a page that uses a special character in the title
Environment
- Confluence 5.10.2
- Safari
- Mozilla Firefox
Steps to Reproduce
- Create a page and add a special character (e.g. a '|'' in the title)
- Save the page
- In Firefox or Safari, log into Confluence and paste the URL directly, for example http://localhost:8090/confluence/display/BATS/page+|+test
Expected Results
Page is displayed properly using any browser. This was tested in Confluence 5.8.5 and we found that going to that link directly even with a special character displayed the page without issues
Actual Results
User sees a 'java.net.URISyntaxException: Illegal character in path at index' stack trace on the page. This error is thrown in the logs:
2016-08-25 15:49:59,959 ERROR [http-nio-8090-exec-8] [[Standalone].[localhost].[/confluence].[simple-display]] log Servlet.service() for servlet [simple-display] in context with path [/confluence] threw exception java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 30: /confluence/display/BATS/page+|+test at com.github.kristofa.brave.servlet.ServletHttpServerRequest.getUri(ServletHttpServerRequest.java:27) at com.atlassian.confluence.web.filter.ZipkinTracingFilter$1.lambda$create$0(ZipkinTracingFilter.java:38) at com.github.kristofa.brave.http.HttpServerRequestAdapter.getSpanName(HttpServerRequestAdapter.java:41) at com.github.kristofa.brave.ServerRequestInterceptor.handle(ServerRequestInterceptor.java:47) at com.github.kristofa.brave.servlet.BraveServletFilter.doFilter(BraveServletFilter.java:56) at com.atlassian.confluence.web.filter.ZipkinTracingFilter.doFilter(ZipkinTracingFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.confluence.web.filter.ResponseOutputStreamFilter.doFilter(ResponseOutputStreamFilter.java:23) at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.johnson.filters.AbstractJohnsonFilter.doFilter(AbstractJohnsonFilter.java:72) at com.atlassian.confluence.web.ConfluenceJohnsonFilter.doFilter(ConfluenceJohnsonFilter.java:33) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.core.filters.encoding.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:41) at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.confluence.impl.servlet.HoldingUntilStartedFilter.doFilter(HoldingUntilStartedFilter.java:88) at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.core.filters.HeaderSanitisingFilter.doFilter(HeaderSanitisingFilter.java:44) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.confluence.servlet.FourOhFourErrorLoggingFilter.doFilter(FourOhFourErrorLoggingFilter.java:64) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at com.atlassian.confluence.web.filter.DebugFilter.doFilter(DebugFilter.java:46) at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.valves.StuckThreadDetectionValve.invoke(StuckThreadDetectionValve.java:206) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.URISyntaxException: Illegal character in path at index 30: /confluence/display/BATS/page+|+test at java.net.URI$Parser.fail(URI.java:2848) at java.net.URI$Parser.checkChars(URI.java:3021) at java.net.URI$Parser.parseHierarchical(URI.java:3105) at java.net.URI$Parser.parse(URI.java:3063) at java.net.URI.<init>(URI.java:588) at com.github.kristofa.brave.servlet.ServletHttpServerRequest.getUri(ServletHttpServerRequest.java:25) ... 49 more 2016-08-25 15:49:59,962 INFO [http-nio-8090-exec-8] [atlassian.confluence.status.SystemErrorInformationLogger] writeToLog Request Unique ID : 23256772-bdd8-43e3-a43d-260f641b7897 -------------------------- JVM Stats -------------------------- usedMemory = 891993208 usedMemoryInMegabytes = 850 availableHeap = 181748616 freeMemoryInMegabytes = 173 allocatedHeap = 1073741824 freeAllocatedHeap = 181748616 totalMemory = 1073741824 totalMemoryInMegabytes = 1024 availablePermGen = 0 maxPermGen = -1 maxHeap = 1073741824 usedHeap = 891993208 freeMemory = 181748616 usedPermGen = -1 -------------------------- Request Information -------------------------- URL: http://localhost:8090/confluence/500page.jsp Scheme: http Server: localhost Port: 8090 URI: /confluence/500page.jsp Context Path: /confluence Servlet Path: /500page.jsp Path Info: null Query String: null -------------------------- Attributes -------------------------- javax.servlet.forward.request_uri: /confluence/display/BATS/page+|+test javax.servlet.forward.context_path: /confluence javax.servlet.forward.servlet_path: /display javax.servlet.forward.path_info: /BATS/page+|+test javax.servlet.error.status_code: 500 com.atlassian.confluence.impl.profiling.DecoratorTimings: com.atlassian.confluence.impl.profiling.DecoratorTimings@698f04e0 com.opensymphony.sitemesh.APPLIED_ONCE: true javax.servlet.error.message: javax.servlet.error.servlet_name: simple-display atlassian.core.seraph.original.url: /500page.jsp javax.servlet.error.request_uri: /confluence/display/BATS/page+|+test loginfilter.already.filtered: true com.atlassian.core.filters.HeaderSanitisingFilter_already_filtered: true com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter: true com.atlassian.confluence.web.ConfluenceJohnsonFilter_already_filtered: true javax.servlet.error.exception: java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 30: /confluence/display/BATS/page+|+test os_securityfilter_already_filtered: true com.atlassian.seraph.auth.LoginReason: OK com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter: true -------------------------- Parameters -------------------------- caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 30: /confluence/display/BATS/page+|+test at com.github.kristofa.brave.servlet.ServletHttpServerRequest.getUri(ServletHttpServerRequest.java:27) caused by: java.net.URISyntaxException: Illegal character in path at index 30: /confluence/display/BATS/page+|+test at java.net.URI$Parser.fail(URI.java:2848) 2016-08-25 15:50:00,281 WARN [http-nio-8090-exec-6] [common.security.jersey.XsrfResourceFilter] passesAdditionalBrowserChecks Additional XSRF checks failed for request: http://localhost:8090/confluence/rest/webResources/1.0/resources , origin: null , referrer: http://localhost:8090/confluence/display/BATS/page+|+test , credentials in request: true , allowed via CORS: false -- referer: http://localhost:8090/confluence/display/BATS/page+|+test | url: /confluence/rest/webResources/1.0/resources | traceId: bb89b029c339b958 | userName: admin 2016-08-25 15:50:00,771 WARN [http-nio-8090-exec-2] [common.security.jersey.XsrfResourceFilter] passesAdditionalBrowserChecks Additional XSRF checks failed for request: http://localhost:8090/confluence/rest/analytics/1.0/publish/bulk , origin: null , referrer: http://localhost:8090/confluence/display/BATS/page+|+test , credentials in request: true , allowed via CORS: false -- referer: http://localhost:8090/confluence/display/BATS/page+|+test | url: /confluence/rest/analytics/1.0/publish/bulk | traceId: a3e3e661a783e3ff | userName: admin
Notes
This issue does not usually occur with Chrome.
Here is the list of the special characters:
";", "?", "/", "#", "%", "+", "|", "[", "]", "\"
Workaround
There are a couple of ways to change this.
Changes in reverse proxy
Follow this guide: Pages with special characters are not accessible via reverse proxy.
Changes in Confluence
- Use Chrome to access the page
- Remove the special character from the title of the page
- Run this SQL query (adjust the title section for the relevant invalid character)
select contentid, contenttype, title, lowertitle, lastmoddate from content where contenttype = 'PAGE' and prevver is NULL and (title like '%[%' or title like '%]%') order by lastmoddate;
- Run this SQL query (adjust the title section for the relevant invalid character)
- For each contentid edit the page with