From 10118450321fde8931f755362589ae532fc5cbed Mon Sep 17 00:00:00 2001 From: Nick Couchman Date: Thu, 19 Apr 2018 07:20:51 -0400 Subject: [PATCH] GUACAMOLE-38: Break query string parsing into its own method. --- .../auth/quickconnect/utility/QCParser.java | 62 ++++++++++++++----- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java index 650d56193..4924619f0 100644 --- a/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java +++ b/extensions/guacamole-auth-quickconnect/src/main/java/org/apache/guacamole/auth/quickconnect/utility/QCParser.java @@ -25,7 +25,9 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.guacamole.GuacamoleClientException; @@ -104,7 +106,7 @@ public class QCParser { String query = qcUri.getQuery(); String username = null; String password = null; - List paramList = null; + Map queryParams = null; if (protocol == null || protocol.isEmpty()) protocol = DEFAULT_URI_PROTOCOL; @@ -112,8 +114,14 @@ public class QCParser { if (host == null || host.isEmpty()) host = DEFAULT_URI_HOST; - if (query != null && !query.isEmpty()) - paramList = Arrays.asList(query.split("&")); + if (query != null && !query.isEmpty()) { + try { + queryParams = parseQueryString(query); + } + catch (UnsupportedEncodingException e) { + throw new GuacamoleServerException("Unexpected lack of UTF-8 encoding support.", e); + } + } if (userInfo != null && !userInfo.isEmpty()) { @@ -138,24 +146,44 @@ public class QCParser { if (password != null && !password.isEmpty()) qcConfig.setParameter("password", password); - if (paramList != null) { - for (String parameter : paramList) { - String[] paramArray = parameter.split("=", 2); - try { - qcConfig.setParameter(URLDecoder.decode(paramArray[0], "UTF-8"), - URLDecoder.decode(paramArray[1], "UTF-8")); - } - catch (UnsupportedEncodingException e) { - logger.error("Unexpected lack of UTF-8 encoding support."); - throw new GuacamoleServerException("Unexpected lack of UTF-8 encoding support.", e); - } - } - } + if (queryParams != null) + for (Map.Entry entry : queryParams.entrySet()) + qcConfig.setParameter(entry.getKey(), entry.getValue()); return qcConfig; } + /** + * Parse the given string for parameter key/value pairs and return + * a map with the parameters. + * + * @param queryStr + * The query string to parse for the values. + * + * @return + * A map with the key/value pairs. + * + * @throws UnsupportedEncodingException + * If Java lacks UTF-8 support. + */ + private static Map parseQueryString(String queryStr) + throws UnsupportedEncodingException { + + // Split the query string into the pairs + List paramList = Arrays.asList(queryStr.split("&")); + Map parameters = new HashMap(); + + // Split into key/value pairs and decode + for (String param : paramList) { + String[] paramArray = param.split("=", 2); + parameters.put(URLDecoder.decode(paramArray[0], "UTF-8"), + URLDecoder.decode(paramArray[1], "UTF-8")); + } + + return parameters; + } + /** * Given a GuacamoleConfiguration object, generate a name * for the configuration based on the protocol, host, user @@ -182,7 +210,7 @@ public class QCParser { String port = config.getParameter("port"); String user = config.getParameter("username"); - StringBuilder name = new StringBuilder(""); + StringBuilder name = new StringBuilder(); if (protocol != null && !protocol.isEmpty()) name.append(protocol).append("://");