From c7a5f0bcd611f6acac003f18a2022a185a34a5ee Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 22 Mar 2016 15:20:48 -0700 Subject: [PATCH] GUACAMOLE-1: Remove BasicGuacamoleProperties. Finally remove support for "auth-provider" and "lib-directory" properties. --- .../guacamole/GuacamoleClassLoader.java | 185 ------------------ .../guacamole/extension/ExtensionModule.java | 42 ---- .../extension/LanguageResourceService.java | 17 +- .../AuthenticationProviderProperty.java | 68 ------- .../properties/BasicGuacamoleProperties.java | 90 --------- .../rest/auth/BasicTokenSessionMap.java | 21 +- 6 files changed, 31 insertions(+), 392 deletions(-) delete mode 100644 guacamole/src/main/java/org/apache/guacamole/GuacamoleClassLoader.java delete mode 100644 guacamole/src/main/java/org/apache/guacamole/properties/AuthenticationProviderProperty.java delete mode 100644 guacamole/src/main/java/org/apache/guacamole/properties/BasicGuacamoleProperties.java diff --git a/guacamole/src/main/java/org/apache/guacamole/GuacamoleClassLoader.java b/guacamole/src/main/java/org/apache/guacamole/GuacamoleClassLoader.java deleted file mode 100644 index f89b885d9..000000000 --- a/guacamole/src/main/java/org/apache/guacamole/GuacamoleClassLoader.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2013 Glyptodon LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package org.apache.guacamole; - -import java.io.File; -import java.io.FilenameFilter; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.ArrayList; -import java.util.Collection; -import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.environment.Environment; -import org.apache.guacamole.environment.LocalEnvironment; -import org.apache.guacamole.properties.BasicGuacamoleProperties; - -/** - * A ClassLoader implementation which finds classes within a configurable - * directory. This directory is set within guacamole.properties. This class - * is deprecated in favor of DirectoryClassLoader, which is automatically - * configured based on the presence/absence of GUACAMOLE_HOME/lib. - * - * @author Michael Jumper - */ -@Deprecated -public class GuacamoleClassLoader extends ClassLoader { - - /** - * Class loader which will load classes from the classpath specified - * in guacamole.properties. - */ - private URLClassLoader classLoader = null; - - /** - * Any exception that occurs while the class loader is being instantiated. - */ - private static GuacamoleException exception = null; - - /** - * Singleton instance of the GuacamoleClassLoader. - */ - private static GuacamoleClassLoader instance = null; - - static { - - try { - // Attempt to create singleton classloader which loads classes from - // all .jar's in the lib directory defined in guacamole.properties - instance = AccessController.doPrivileged(new PrivilegedExceptionAction() { - - @Override - public GuacamoleClassLoader run() throws GuacamoleException { - - // TODONT: This should be injected, but GuacamoleClassLoader will be removed soon. - Environment environment = new LocalEnvironment(); - - return new GuacamoleClassLoader( - environment.getProperty(BasicGuacamoleProperties.LIB_DIRECTORY) - ); - - } - - }); - } - - catch (PrivilegedActionException e) { - // On error, record exception - exception = (GuacamoleException) e.getException(); - } - - } - - /** - * Creates a new GuacamoleClassLoader which reads classes from the given - * directory. - * - * @param libDirectory The directory to load classes from. - * @throws GuacamoleException If the file given is not a director, or if - * an error occurs while constructing the URL - * for the backing classloader. - */ - private GuacamoleClassLoader(File libDirectory) throws GuacamoleException { - - // If no directory provided, just direct requests to parent classloader - if (libDirectory == null) - return; - - // Validate directory is indeed a directory - if (!libDirectory.isDirectory()) - throw new GuacamoleException(libDirectory + " is not a directory."); - - // Get list of URLs for all .jar's in the lib directory - Collection jarURLs = new ArrayList(); - File[] files = libDirectory.listFiles(new FilenameFilter() { - - @Override - public boolean accept(File dir, String name) { - - // If it ends with .jar, accept the file - return name.endsWith(".jar"); - - } - - }); - - // Verify directory was successfully read - if (files == null) - throw new GuacamoleException("Unable to read contents of directory " + libDirectory); - - // Add the URL for each .jar to the jar URL list - for (File file : files) { - - try { - jarURLs.add(file.toURI().toURL()); - } - catch (MalformedURLException e) { - throw new GuacamoleException(e); - } - - } - - // Set delegate classloader to new URLClassLoader which loads from the - // .jars found above. - - URL[] urls = new URL[jarURLs.size()]; - classLoader = new URLClassLoader( - jarURLs.toArray(urls), - getClass().getClassLoader() - ); - - } - - /** - * Returns an instance of a GuacamoleClassLoader which finds classes - * within the directory configured in guacamole.properties. - * - * @return An instance of a GuacamoleClassLoader. - * @throws GuacamoleException If no instance could be returned due to an - * error. - */ - public static GuacamoleClassLoader getInstance() throws GuacamoleException { - - // If instance could not be created, rethrow original exception - if (exception != null) throw exception; - - return instance; - - } - - @Override - public Class findClass(String name) throws ClassNotFoundException { - - // If no classloader, use default loader - if (classLoader == null) - return Class.forName(name); - - // Otherwise, delegate - return classLoader.loadClass(name); - - } - -} diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java index 3823fbc6f..c8906b4ea 100644 --- a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java +++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionModule.java @@ -37,7 +37,6 @@ import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.GuacamoleServerException; import org.apache.guacamole.environment.Environment; import org.apache.guacamole.net.auth.AuthenticationProvider; -import org.apache.guacamole.properties.BasicGuacamoleProperties; import org.apache.guacamole.resource.Resource; import org.apache.guacamole.resource.ResourceServlet; import org.apache.guacamole.resource.SequenceResource; @@ -148,42 +147,6 @@ public class ExtensionModule extends ServletModule { this.patchResourceService = new PatchResourceService(); } - /** - * Reads the value of the now-deprecated "auth-provider" property from - * guacamole.properties, returning the corresponding AuthenticationProvider - * class. If no authentication provider could be read, or the property is - * not present, null is returned. - * - * As this property is deprecated, this function will also log warning - * messages if the property is actually specified. - * - * @return - * The value of the deprecated "auth-provider" property, or null if the - * property is not present. - */ - @SuppressWarnings("deprecation") // We must continue to use this property until it is truly no longer supported - private Class getAuthProviderProperty() { - - // Get and bind auth provider instance, if defined via property - try { - - // Use "auth-provider" property if present, but warn about deprecation - Class authenticationProvider = environment.getProperty(BasicGuacamoleProperties.AUTH_PROVIDER); - if (authenticationProvider != null) - logger.warn("The \"auth-provider\" and \"lib-directory\" properties are now deprecated. Please use the \"extensions\" and \"lib\" directories within GUACAMOLE_HOME instead."); - - return authenticationProvider; - - } - catch (GuacamoleException e) { - logger.warn("Value of deprecated \"auth-provider\" property within guacamole.properties is not valid: {}", e.getMessage()); - logger.debug("Error reading authentication provider from guacamole.properties.", e); - } - - return null; - - } - /** * Binds the given AuthenticationProvider class such that any service * requiring access to the AuthenticationProvider can obtain it via @@ -410,11 +373,6 @@ public class ExtensionModule extends ServletModule { // Load initial language resources from servlet context languageResourceService.addLanguageResources(getServletContext()); - // Load authentication provider from guacamole.properties for sake of backwards compatibility - Class authProviderProperty = getAuthProviderProperty(); - if (authProviderProperty != null) - bindAuthenticationProvider(authProviderProperty); - // Init JavaScript resources with base guacamole.min.js Collection javaScriptResources = new ArrayList(); javaScriptResources.add(new WebApplicationResource(getServletContext(), "/guacamole.min.js")); diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java b/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java index c04388708..2dec8ff2c 100644 --- a/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java +++ b/guacamole/src/main/java/org/apache/guacamole/extension/LanguageResourceService.java @@ -38,7 +38,7 @@ import org.codehaus.jackson.node.JsonNodeFactory; import org.codehaus.jackson.node.ObjectNode; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.environment.Environment; -import org.apache.guacamole.properties.BasicGuacamoleProperties; +import org.apache.guacamole.properties.StringSetProperty; import org.apache.guacamole.resource.ByteArrayResource; import org.apache.guacamole.resource.Resource; import org.apache.guacamole.resource.WebApplicationResource; @@ -79,6 +79,19 @@ public class LanguageResourceService { */ private static final Pattern LANGUAGE_KEY_PATTERN = Pattern.compile(".*/([a-z]+(_[A-Z]+)?)\\.json"); + /** + * Comma-separated list of all allowed languages, where each language is + * represented by a language key, such as "en" or "en_US". If specified, + * only languages within this list will be listed as available by the REST + * service. + */ + public final StringSetProperty ALLOWED_LANGUAGES = new StringSetProperty() { + + @Override + public String getName() { return "allowed-languages"; } + + }; + /** * The set of all language keys which are explicitly listed as allowed * within guacamole.properties, or null if all defined languages should be @@ -110,7 +123,7 @@ public class LanguageResourceService { // Parse list of available languages from properties try { - parsedAllowedLanguages = environment.getProperty(BasicGuacamoleProperties.ALLOWED_LANGUAGES); + parsedAllowedLanguages = environment.getProperty(ALLOWED_LANGUAGES); logger.debug("Available languages will be restricted to: {}", parsedAllowedLanguages); } diff --git a/guacamole/src/main/java/org/apache/guacamole/properties/AuthenticationProviderProperty.java b/guacamole/src/main/java/org/apache/guacamole/properties/AuthenticationProviderProperty.java deleted file mode 100644 index 09f357695..000000000 --- a/guacamole/src/main/java/org/apache/guacamole/properties/AuthenticationProviderProperty.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2015 Glyptodon LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package org.apache.guacamole.properties; - -import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.net.auth.AuthenticationProvider; -import org.apache.guacamole.properties.GuacamoleProperty; - -/** - * A GuacamoleProperty whose value is the name of a class to use to - * authenticate users. This class must implement AuthenticationProvider. Use - * of this property type is deprecated in favor of the - * GUACAMOLE_HOME/extensions directory. - * - * @author Michael Jumper - */ -@Deprecated -public abstract class AuthenticationProviderProperty implements GuacamoleProperty> { - - @Override - @SuppressWarnings("unchecked") // Explicitly checked within by isAssignableFrom() - public Class parseValue(String authProviderClassName) throws GuacamoleException { - - // If no property provided, return null. - if (authProviderClassName == null) - return null; - - // Get auth provider instance - try { - - // Get authentication provider class - Class authProviderClass = org.apache.guacamole.GuacamoleClassLoader.getInstance().loadClass(authProviderClassName); - - // Verify the located class is actually a subclass of AuthenticationProvider - if (!AuthenticationProvider.class.isAssignableFrom(authProviderClass)) - throw new GuacamoleException("Specified authentication provider class is not a AuthenticationProvider."); - - // Return located class - return (Class) authProviderClass; - - } - catch (ClassNotFoundException e) { - throw new GuacamoleException("Authentication provider class not found", e); - } - - } - -} diff --git a/guacamole/src/main/java/org/apache/guacamole/properties/BasicGuacamoleProperties.java b/guacamole/src/main/java/org/apache/guacamole/properties/BasicGuacamoleProperties.java deleted file mode 100644 index 9d8d99f82..000000000 --- a/guacamole/src/main/java/org/apache/guacamole/properties/BasicGuacamoleProperties.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2013 Glyptodon LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package org.apache.guacamole.properties; - -import org.apache.guacamole.properties.FileGuacamoleProperty; -import org.apache.guacamole.properties.IntegerGuacamoleProperty; -import org.apache.guacamole.properties.StringGuacamoleProperty; - -/** - * Properties used by the default Guacamole web application. - * - * @author Michael Jumper - */ -public class BasicGuacamoleProperties { - - /** - * This class should not be instantiated. - */ - private BasicGuacamoleProperties() {} - - /** - * The authentication provider to user when retrieving the authorized - * configurations of a user. This property is currently supported, but - * deprecated in favor of the GUACAMOLE_HOME/extensions directory. - */ - @Deprecated - public static final AuthenticationProviderProperty AUTH_PROVIDER = new AuthenticationProviderProperty() { - - @Override - public String getName() { return "auth-provider"; } - - }; - - /** - * The directory to search for authentication provider classes. This - * property is currently supported, but deprecated in favor of the - * GUACAMOLE_HOME/lib directory. - */ - @Deprecated - public static final FileGuacamoleProperty LIB_DIRECTORY = new FileGuacamoleProperty() { - - @Override - public String getName() { return "lib-directory"; } - - }; - - /** - * The session timeout for the API, in minutes. - */ - public static final IntegerGuacamoleProperty API_SESSION_TIMEOUT = new IntegerGuacamoleProperty() { - - @Override - public String getName() { return "api-session-timeout"; } - - }; - - /** - * Comma-separated list of all allowed languages, where each language is - * represented by a language key, such as "en" or "en_US". If specified, - * only languages within this list will be listed as available by the REST - * service. - */ - public static final StringSetProperty ALLOWED_LANGUAGES = new StringSetProperty() { - - @Override - public String getName() { return "allowed-languages"; } - - }; - -} diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/auth/BasicTokenSessionMap.java b/guacamole/src/main/java/org/apache/guacamole/rest/auth/BasicTokenSessionMap.java index 9de33fbb2..9486122ed 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/auth/BasicTokenSessionMap.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/auth/BasicTokenSessionMap.java @@ -32,14 +32,14 @@ import java.util.concurrent.TimeUnit; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.environment.Environment; import org.apache.guacamole.GuacamoleSession; -import org.apache.guacamole.properties.BasicGuacamoleProperties; +import org.apache.guacamole.properties.IntegerGuacamoleProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * A basic, HashMap-based implementation of the TokenSessionMap with support - * for session timeouts. - * + * A HashMap-based implementation of the TokenSessionMap with support for + * session timeouts. + * * @author James Muehlner */ public class BasicTokenSessionMap implements TokenSessionMap { @@ -60,6 +60,17 @@ public class BasicTokenSessionMap implements TokenSessionMap { private final ConcurrentMap sessionMap = new ConcurrentHashMap(); + /** + * The session timeout for the Guacamole REST API, in minutes. + */ + private final IntegerGuacamoleProperty API_SESSION_TIMEOUT = + new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "api-session-timeout"; } + + }; + /** * Create a new BasicTokenGuacamoleSessionMap configured using the given * environment. @@ -73,7 +84,7 @@ public class BasicTokenSessionMap implements TokenSessionMap { // Read session timeout from guacamole.properties try { - sessionTimeoutValue = environment.getProperty(BasicGuacamoleProperties.API_SESSION_TIMEOUT, 60); + sessionTimeoutValue = environment.getProperty(API_SESSION_TIMEOUT, 60); } catch (GuacamoleException e) { logger.error("Unable to read guacamole.properties: {}", e.getMessage());