Index: core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java (revision 2345)
+++ core/src/main/java/com/xpn/xwiki/plugin/packaging/PackageAPI.java (working copy)
@@ -158,7 +158,7 @@
public String export() throws IOException, XWikiException {
getXWikiContext().getResponse().setContentType("application/zip");
- getXWikiContext().getResponse().addHeader("Content-disposition", "attachment; filename=" + XWiki.getURLEncoded(plugin.getName()) + ".xar");
+ getXWikiContext().getResponse().addHeader("Content-disposition", "attachment; filename=" + context.getWiki().getURLEncoded(plugin.getName()) + ".xar");
getXWikiContext().setFinished(true);
return plugin.export(getXWikiContext().getResponse().getOutputStream(), getXWikiContext());
}
Index: core/src/main/java/com/xpn/xwiki/api/XWiki.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/api/XWiki.java (revision 2345)
+++ core/src/main/java/com/xpn/xwiki/api/XWiki.java (working copy)
@@ -209,7 +209,7 @@
public String getURLEncoded(String content)
{
- return com.xpn.xwiki.XWiki.getURLEncoded(content);
+ return xwiki.getURLEncoded(content);
}
/**
Index: core/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/XWiki.java (revision 2345)
+++ core/src/main/java/com/xpn/xwiki/XWiki.java (working copy)
@@ -1046,10 +1046,10 @@
return scontent;
}
- public static String getURLEncoded(String content)
+ public String getURLEncoded(String content)
{
try {
- return URLEncoder.encode(content, "UTF-8");
+ return URLEncoder.encode(content, this.getEncoding());
} catch (UnsupportedEncodingException e) {
return content;
}
@@ -3663,12 +3663,29 @@
if ((request.getParameter("topic") != null)
&& (action.equals("edit") || action.equals("inline")))
docname = request.getParameter("topic");
- else
- docname = getDocumentNameFromPath(request.getPathInfo(), context);
+ else {
+ docname = getDocumentNameFromPath(fixDecodedURI(request, request.getPathInfo()), context);
+ }
}
return docname;
}
+ private String fixDecodedURI(XWikiRequest request, String uri) {
+ // PATCH: tomcat does not properly handle URIs with non ascii characters.
+ // By default, it decodes the URI as if it was encoded in ISO-8859-1
+ // there is currently no setting to modify this behaviour, so we have to
+ // fix the improperly decoded URI.
+ if (!"ISO-8859-1".equals(getEncoding())) {
+ try {
+ byte[] urib = uri.getBytes("ISO-8859-1");
+ return new String(urib, getEncoding());
+ } catch (UnsupportedEncodingException e) {
+ log.error("Unsupported Encoding Exception received, check your xwiki config.", e);
+ }
+ }
+ return uri;
+ }
+
public boolean prepareDocuments(XWikiRequest request, XWikiContext context,
VelocityContext vcontext) throws XWikiException
{
Index: core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java (revision 2345)
+++ core/src/main/java/com/xpn/xwiki/util/TOCGenerator.java (working copy)
@@ -110,7 +110,7 @@
public static String makeHeadingID (String text, int occurence, XWikiContext context) {
// Encode to convert unsafe chars
//text = Utils.encode(text.trim(), context);
- text = "H" + XWiki.getURLEncoded(text);
+ text = "H" + context.getWiki().getURLEncoded(text);
text = text.replaceAll("[^a-zA-Z0-9]", "");
if (occurence > 0) {
Index: core/src/main/java/com/xpn/xwiki/web/DownloadAction.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/web/DownloadAction.java (revision 2345)
+++ core/src/main/java/com/xpn/xwiki/web/DownloadAction.java (working copy)
@@ -72,7 +72,7 @@
String mimetype = attachment.getMimeType(context);
response.setContentType(mimetype);
- String ofilename = XWiki.getURLEncoded(attachment.getFilename()).replaceAll("\\+", " ");
+ String ofilename = context.getWiki().getURLEncoded(attachment.getFilename()).replaceAll("\\+", " ");
// The inline attribute of Content-Disposition tells the browser that they should display
// the downloaded file in the page (see http://www.ietf.org/rfc/rfc1806.txt for more
Index: web/standard/src/main/webapp/skins/xwiki10b1/login.vm
===================================================================
--- web/standard/src/main/webapp/skins/xwiki10b1/login.vm (revision 2345)
+++ web/standard/src/main/webapp/skins/xwiki10b1/login.vm (working copy)
@@ -1,6 +1,6 @@
#if($context.user!="XWiki.XWikiGuest")
#if($request.xredirect)
-$response.sendRedirect($request.xredirect)
+$response.sendRedirect($xwiki.getURLEncoded($request.xredirect))
#else
$response.sendRedirect($xwiki.getURL("Main.WebHome"))
#end
Index: web/standard/src/main/webapp/skins/xwiki10b1/global.vm
===================================================================
--- web/standard/src/main/webapp/skins/xwiki10b1/global.vm (revision 2345)
+++ web/standard/src/main/webapp/skins/xwiki10b1/global.vm (working copy)
@@ -36,10 +36,10 @@
#end
#if ($context.action != "loginerror")
#if ($isguest)
-#set($loginurl = $xwiki.getURL("XWiki.XWikiLogin", "login", "xredirect=$logredir"))
+#set($loginurl = $xwiki.getURL("XWiki.XWikiLogin", "login", "xredirect=$xwiki.getURLEncoded($logredir)"))
#sep()
#else
-#set($logouturl = $xwiki.getURL("XWiki.XWikiLogout","logout", "xredirect=$logredir"))
+#set($logouturl = $xwiki.getURL("XWiki.XWikiLogout","logout", "xredirect=$xwiki.getURLEncoded($logredir)"))
#sep()
#end
#end
Index: web/standard/src/main/webapp/skins/xwiki10b1/create.vm
===================================================================
--- web/standard/src/main/webapp/skins/xwiki10b1/create.vm (revision 2345)
+++ web/standard/src/main/webapp/skins/xwiki10b1/create.vm (working copy)
@@ -48,9 +48,13 @@
##$newdoc.getURL("edit", "template=${template}&parent=${parent}$auxparams"))
#if($newdoc.isNew())
#if($tocreate == "post")
-$response.sendRedirect($newdoc.getURL("inline", "parent=Blog.WebHome&template=XWiki.ArticleClassTemplate&XWiki.ArticleClass_0_title=$title"))
+#set($etitle = $xwiki.getURLEncoded($title))
+$response.sendRedirect($newdoc.getURL("inline", "parent=Blog.WebHome&template=XWiki.ArticleClassTemplate&XWiki.ArticleClass_0_title=$etitle"))
#else
-$response.sendRedirect($newdoc.getURL("edit", "template=${template}&parent=${parent}${auxparams}&title=$title"))
+#set($etitle = $xwiki.getURLEncoded($title))
+#set($etemplate = $xwiki.getURLEncoded("${template}"))
+#set($eparent = $xwiki.getURLEncoded("${parent}${auxparams}"))
+$response.sendRedirect($newdoc.getURL("edit", "template=${etemplate}&parent=${eparent}&title=$etitle"))
#end
#else
$response.sendRedirect($newdoc.getURL("view", "xpage=docalreadyexists"))