From 8abb728835c9f11b7618204a2ee99320681efaa8 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Thu, 17 Apr 2014 23:08:07 -0400 Subject: [PATCH] [findbugs] Add null checks to the page parameters in ProjectPage --- src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java | 108 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java index fb86fb0..c658394 100644 --- a/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java +++ b/src/main/java/com/gitblit/wicket/GitblitParamUrlCodingStrategy.java @@ -16,35 +16,42 @@ package com.gitblit.wicket; import java.text.MessageFormat; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import org.apache.wicket.IRequestTarget; import org.apache.wicket.Page; -import org.apache.wicket.PageParameters; import org.apache.wicket.request.RequestParameters; import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy; +import org.apache.wicket.util.string.AppendingStringBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.gitblit.GitBlit; +import com.gitblit.IStoredSettings; import com.gitblit.Keys; /** * Simple subclass of mixed parameter url coding strategy that works around the * encoded forward-slash issue that is present in some servlet containers. - * + * * https://issues.apache.org/jira/browse/WICKET-1303 * http://tomcat.apache.org/security-6.html - * + * * @author James Moger - * + * */ public class GitblitParamUrlCodingStrategy extends MixedParamUrlCodingStrategy { + private final String[] parameterNames; + private Logger logger = LoggerFactory.getLogger(GitblitParamUrlCodingStrategy.class); + + private IStoredSettings settings; /** * Construct. - * + * * @param <C> * @param mountPath * mount path (not empty) @@ -53,20 +60,26 @@ * @param parameterNames * the parameter names (not null) */ - public <C extends Page> GitblitParamUrlCodingStrategy(String mountPath, + public <C extends Page> GitblitParamUrlCodingStrategy( + IStoredSettings settings, + String mountPath, Class<C> bookmarkablePageClass, String[] parameterNames) { + super(mountPath, bookmarkablePageClass, parameterNames); + this.parameterNames = parameterNames; + this.settings = settings; } /** * Url encodes a string that is mean for a URL path (e.g., between slashes) - * + * * @param string * string to be encoded * @return encoded string */ + @Override protected String urlEncodePathComponent(String string) { - char altChar = GitBlit.getChar(Keys.web.forwardSlashCharacter, '/'); + char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); if (altChar != '/') { string = string.replace('/', altChar); } @@ -76,12 +89,13 @@ /** * Returns a decoded value of the given value (taken from a URL path * section) - * + * * @param value * @return Decodes the value */ + @Override protected String urlDecodePathComponent(String value) { - char altChar = GitBlit.getChar(Keys.web.forwardSlashCharacter, '/'); + char altChar = settings.getChar(Keys.web.forwardSlashCharacter, '/'); if (altChar != '/') { value = value.replace(altChar, '/'); } @@ -90,7 +104,7 @@ /** * Gets the decoded request target. - * + * * @param requestParameters * the request parameters * @return the decoded request target @@ -102,8 +116,74 @@ logger.debug(MessageFormat .format("REQ: {0} PARAMS {1}", getMountPath(), parametersFragment)); - final PageParameters parameters = new PageParameters(decodeParameters(parametersFragment, - requestParameters.getParameters())); return super.decode(requestParameters); } + + /** + * @see org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer, + * java.util.Map) + */ + @Override + protected void appendParameters(AppendingStringBuffer url, Map<String, ?> parameters) + { + if (!url.endsWith("/")) + { + url.append("/"); + } + + Set<String> parameterNamesToAdd = new HashSet<String>(parameters.keySet()); + + // Find index of last specified parameter + boolean foundParameter = false; + int lastSpecifiedParameter = parameterNames.length; + while (lastSpecifiedParameter != 0 && !foundParameter) + { + foundParameter = parameters.containsKey(parameterNames[--lastSpecifiedParameter]); + } + + if (foundParameter) + { + for (int i = 0; i <= lastSpecifiedParameter; i++) + { + String parameterName = parameterNames[i]; + final Object param = parameters.get(parameterName); + String value = param instanceof String[] ? ((String[])param)[0] : ((param == null) + ? null : param.toString()); + if (value == null) + { + value = ""; + } + if (!url.endsWith("/")) + { + url.append("/"); + } + url.append(urlEncodePathComponent(value)); + parameterNamesToAdd.remove(parameterName); + } + } + + if (!parameterNamesToAdd.isEmpty()) + { + boolean first = true; + for (String parameterName : parameterNamesToAdd) + { + final Object param = parameters.get(parameterName); + if (param instanceof String[]) { + String [] values = (String[]) param; + for (String value : values) { + url.append(first ? '?' : '&'); + url.append(urlEncodeQueryComponent(parameterName)).append("=").append( + urlEncodeQueryComponent(value)); + first = false; + } + } else { + url.append(first ? '?' : '&'); + String value = String.valueOf(param); + url.append(urlEncodeQueryComponent(parameterName)).append("=").append( + urlEncodeQueryComponent(value)); + } + first = false; + } + } + } } \ No newline at end of file -- Gitblit v1.9.1