]> source.dussan.org Git - gitblit.git/commitdiff
Allow specification of forward-slash character in urls (issue 11)
authorJames Moger <james.moger@gitblit.com>
Mon, 18 Jul 2011 22:10:34 +0000 (18:10 -0400)
committerJames Moger <james.moger@gitblit.com>
Mon, 18 Jul 2011 22:10:34 +0000 (18:10 -0400)
distrib/gitblit.properties
docs/00_index.mkd
docs/02_faq.mkd
docs/04_releases.mkd
src/com/gitblit/GitBlit.java
src/com/gitblit/IStoredSettings.java
src/com/gitblit/wicket/GitBlitWebApp.java
src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java [new file with mode: 0644]

index 2ae3d0114c9874d4453a1fe2f8b8e0a85127405b..73a1747c33c9ace0f8a4366c61f1a806278baa47 100644 (file)
@@ -135,13 +135,25 @@ web.datetimestampLongFormat = EEEE, MMMM d, yyyy h:mm a z
 # Mount URL parameters\r
 # This setting controls if pretty or parameter URLs are used.\r
 # i.e.\r
-# if true: http://localhost/commit/myrepo/abcdef\r
-# if false: http://localhost/commit/?r=myrepo&h=abcdef\r
+# if true:\r
+#     http://localhost/commit/myrepo/abcdef\r
+# if false:\r
+#     http://localhost/commit/?r=myrepo&h=abcdef\r
 #\r
 # SINCE 0.5.0\r
 # RESTART REQUIRED\r
 web.mountParameters = true\r
 \r
+# Some servlet containers (e.g. Tomcat >= 6.0.10) disallow '/' (%2F) encoding\r
+# in URLs as a security precaution for proxies.  This setting tells Gitblit\r
+# to preemptively replace '/' with '*' or '!' for url string parameters.\r
+#\r
+# <https://issues.apache.org/jira/browse/WICKET-1303>\r
+# <http://tomcat.apache.org/security-6.html>\r
+#\r
+# SINCE 0.5.2\r
+web.forwardSlashCharacter = /\r
+\r
 # Show other URLs on the summary page for accessing your git repositories\r
 # Use spaces to separate urls. {0} is the token for the repository name.\r
 # e.g.\r
index edb058d8506ad58001ebecc0bc761bb2f604ecf0..a2f83132fd2d19a7067f783f624e65cd3687cba6 100644 (file)
@@ -23,6 +23,7 @@ Gitblit requires a Java 6 Runtime Environment (JRE) or a Java 6 Development Kit
 \r
 **%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*\r
 \r
+- forward-slashes ('/', %2F) can be encoded using a custom character to workaround some servlet container default security measures for proxy servers<br/>**New:** *web.forwardSlashCharacter = /*\r
 - optionally display repository on-disk size on repositories page<br/>**New:** *web.showRepositorySizes = true*\r
 - tone-down repository group header color\r
 \r
index e160773d7e47a378fbbc0c35c726317e786b3c3e..a1fcf139d70eb4d9c078ccbf012ced49f4403e17 100644 (file)
@@ -36,6 +36,9 @@ Run the server as *root* (security concern) or change the ports you are serving
 ### Gitblit WAR will not authenticate any users?!\r
 Confirm that the &lt;context-param&gt; *realm.userService* value in your `web.xml` file actually points to a `users.properties` file.\r
 \r
+### Gitblit won't open my grouped repository (/group/myrepo.git) or browse my branch/tag/ref?!\r
+This is likely an url encoding/decoding problem.  In `gitblit.properties` or `web.xml`, try setting *web.mountParameters* to *false*.\r
+\r
 ## General Interest Questions\r
 \r
 ### Gitblit?  What kind of name is that?\r
index 94aaa1a181448ae2de4b781500ba3395c079f79d..559b13278295ac565b9fc3ce7409bee0abed591a 100644 (file)
@@ -3,6 +3,7 @@
 ### Current Release\r
 **%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*\r
 \r
+- forward-slashes ('/', %2F) can be encoded using a custom character to workaround some servlet container default security measures for proxy servers<br/>**New:** *web.forwardSlashCharacter = /*\r
 - optionally display repository on-disk size on repositories page<br/>**New:** *web.showRepositorySizes = true*\r
 - tone-down repository group header color\r
 \r
index 968034de3ef9d410f9e0bd40b3ad3b2ef6aa5237..e570e7bccf98ef88ed253d4b5797537abab8d717 100644 (file)
@@ -128,6 +128,20 @@ public class GitBlit implements ServletContextListener {
                return self().settings.getInteger(key, defaultValue);\r
        }\r
 \r
+       /**\r
+        * Returns the char value for the specified key. If the key does not exist\r
+        * or the value for the key can not be interpreted as a character, the\r
+        * defaultValue is returned.\r
+        * \r
+        * @see IStoredSettings.getChar(String key, char defaultValue)\r
+        * @param key\r
+        * @param defaultValue\r
+        * @return key value or defaultValue\r
+        */\r
+       public static char getChar(String key, char defaultValue) {\r
+               return self().settings.getChar(key, defaultValue);\r
+       }\r
+       \r
        /**\r
         * Returns the string value for the specified key. If the key does not exist\r
         * or the value for the key can not be interpreted as a string, the\r
index b380c63872f38460aa201924a76952c5fff907a6..0cc4bb46757e6f00b29ed06c1f31c0aad0e008ad 100644 (file)
@@ -116,6 +116,26 @@ public abstract class IStoredSettings {
                }\r
                return defaultValue;\r
        }\r
+       \r
+       /**\r
+        * Returns the char value for the specified key. If the key does not exist\r
+        * or the value for the key can not be interpreted as a char, the\r
+        * defaultValue is returned.\r
+        * \r
+        * @param key\r
+        * @param defaultValue\r
+        * @return key value or defaultValue\r
+        */\r
+       public char getChar(String name, char defaultValue) {\r
+               Properties props = getSettings();\r
+               if (props.containsKey(name)) {\r
+                       String value = props.getProperty(name);\r
+                       if (!StringUtils.isEmpty(value)) {\r
+                               return value.charAt(0);\r
+                       }\r
+               }\r
+               return defaultValue;\r
+       }\r
 \r
        /**\r
         * Returns the string value for the specified key. If the key does not exist\r
index 1b13ea38a576c315af3574e346ab268fe2304735..4b5e660476665b082ccc60c420692efcab6ffc53 100644 (file)
@@ -110,7 +110,7 @@ public class GitBlitWebApp extends WebApplication {
                if (!GitBlit.getBoolean(Keys.web.mountParameters, true)) {\r
                        parameters = new String[] {};\r
                }\r
-               mount(new MixedParamUrlCodingStrategy(location, clazz, parameters));\r
+               mount(new GitblitParamUrlCodingStrategy(location, clazz, parameters));\r
        }\r
 \r
        @Override\r
diff --git a/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java
new file mode 100644 (file)
index 0000000..c30b9c3
--- /dev/null
@@ -0,0 +1,83 @@
+/*\r
+ * Copyright 2011 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket;\r
+\r
+import org.apache.wicket.Page;\r
+import org.apache.wicket.protocol.http.WicketURLDecoder;\r
+import org.apache.wicket.protocol.http.WicketURLEncoder;\r
+import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;\r
+\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+\r
+/**\r
+ * Simple subclass of mixed parameter url coding strategy that works around the\r
+ * encoded forward-slash issue that is present in some servlet containers.\r
+ * \r
+ * https://issues.apache.org/jira/browse/WICKET-1303\r
+ * http://tomcat.apache.org/security-6.html\r
+ * \r
+ * @author James Moger\r
+ * \r
+ */\r
+public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy {\r
+\r
+       /**\r
+        * Construct.\r
+        * \r
+        * @param <C>\r
+        * @param mountPath\r
+        *            mount path (not empty)\r
+        * @param bookmarkablePageClass\r
+        *            class of mounted page (not null)\r
+        * @param parameterNames\r
+        *            the parameter names (not null)\r
+        */\r
+       public <C extends Page> GitblitParamUrlCodingStrategy(String mountPath,\r
+                       Class<C> bookmarkablePageClass, String[] parameterNames) {\r
+               super(mountPath, bookmarkablePageClass, parameterNames);\r
+       }\r
+\r
+       /**\r
+        * Url encodes a string that is mean for a URL path (e.g., between slashes)\r
+        * \r
+        * @param string\r
+        *            string to be encoded\r
+        * @return encoded string\r
+        */\r
+       protected String urlEncodePathComponent(String string) {\r
+               char altChar = GitBlit.getChar(Keys.web.forwardSlashCharacter, '/');\r
+               if (altChar != '/') {\r
+                       string = string.replace('/', altChar);\r
+               }\r
+               return super.urlEncodePathComponent(string);\r
+       }\r
+\r
+       /**\r
+        * Returns a decoded value of the given value (taken from a URL path\r
+        * section)\r
+        * \r
+        * @param value\r
+        * @return Decodes the value\r
+        */\r
+       protected String urlDecodePathComponent(String value) {\r
+               char altChar = GitBlit.getChar(Keys.web.forwardSlashCharacter, '/');\r
+               if (altChar != '/') {\r
+                       value = value.replace(altChar, '/');\r
+               }\r
+               return super.urlDecodePathComponent(value);\r
+       }\r
+}
\ No newline at end of file