diff --git a/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/Environment.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/Environment.java new file mode 100644 index 000000000..3882cbab3 --- /dev/null +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/Environment.java @@ -0,0 +1,154 @@ +/* + * 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.glyptodon.guacamole.environment; + +import java.io.File; +import java.util.Map; +import org.glyptodon.guacamole.GuacamoleException; +import org.glyptodon.guacamole.properties.BooleanGuacamoleProperty; +import org.glyptodon.guacamole.properties.GuacamoleProperty; +import org.glyptodon.guacamole.properties.IntegerGuacamoleProperty; +import org.glyptodon.guacamole.properties.StringGuacamoleProperty; +import org.glyptodon.guacamole.protocols.ProtocolInfo; + +/** + * The environment of an arbitrary Guacamole instance, describing available + * protocols, configuration parameters, and the GUACAMOLE_HOME directory. + * + * @author Michael Jumper + */ +public interface Environment { + + /** + * The hostname of the server where guacd (the Guacamole proxy server) is + * running. + */ + public static final StringGuacamoleProperty GUACD_HOSTNAME = new StringGuacamoleProperty() { + + @Override + public String getName() { return "guacd-hostname"; } + + }; + + /** + * The port that guacd (the Guacamole proxy server) is listening on. + */ + public static final IntegerGuacamoleProperty GUACD_PORT = new IntegerGuacamoleProperty() { + + @Override + public String getName() { return "guacd-port"; } + + }; + + /** + * Whether guacd requires SSL/TLS on connections. + */ + public static final BooleanGuacamoleProperty GUACD_SSL = new BooleanGuacamoleProperty() { + + @Override + public String getName() { return "guacd-ssl"; } + + }; + + /** + * Returns the Guacamole home directory as determined when this Environment + * object was created. The Guacamole home directory is found by checking, in + * order: the guacamole.home system property, the GUACAMOLE_HOME environment + * variable, and finally the .guacamole directory in the home directory of + * the user running the servlet container. + * + * @return The File representing the Guacamole home directory, which may + * or may not exist, and may turn out to not be a directory. + */ + public File getGuacamoleHome(); + + /** + * Returns a map of all available protocols, where each key is the name of + * that protocol as would be passed to guacd during connection. + * + * @return A map of all available protocols. + */ + public Map getProtocols(); + + /** + * Returns the protocol having the given name. The name must be the + * protocol name as would be passed to guacd during connection. + * + * @param name The name of the protocol. + * @return The protocol having the given name, or null if no such + * protocol is registered. + */ + public ProtocolInfo getProtocol(String name); + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. + * + * @param The type that the given property is parsed into. + * @param property The property to read from guacamole.properties. + * @return The parsed value of the property as read from + * guacamole.properties. + * @throws GuacamoleException If an error occurs while parsing the value + * for the given property in + * guacamole.properties. + */ + public Type getProperty(GuacamoleProperty property) + throws GuacamoleException; + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties, if any. If no value is found, the + * provided default value is returned. + * + * @param The type that the given property is parsed into. + * @param property The property to read from guacamole.properties. + * @param defaultValue The value to return if no value was given in + * guacamole.properties. + * @return The parsed value of the property as read from + * guacamole.properties, or the provided default value if no value + * was found. + * @throws GuacamoleException If an error occurs while parsing the value + * for the given property in + * guacamole.properties. + */ + public Type getProperty(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException; + + /** + * Given a GuacamoleProperty, parses and returns the value set for that + * property in guacamole.properties. An exception is thrown if the value + * is not provided. + * + * @param The type that the given property is parsed into. + * @param property The property to read from guacamole.properties. + * @return The parsed value of the property as read from + * guacamole.properties. + * @throws GuacamoleException If an error occurs while parsing the value + * for the given property in + * guacamole.properties, or if the property is + * not specified. + */ + public Type getRequiredProperty(GuacamoleProperty property) + throws GuacamoleException; + +} diff --git a/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/LocalEnvironment.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/LocalEnvironment.java new file mode 100644 index 000000000..c96f0dd4d --- /dev/null +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/LocalEnvironment.java @@ -0,0 +1,332 @@ +/* + * 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.glyptodon.guacamole.environment; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.glyptodon.guacamole.GuacamoleException; +import org.glyptodon.guacamole.GuacamoleServerException; +import org.glyptodon.guacamole.properties.GuacamoleProperty; +import org.glyptodon.guacamole.protocols.ProtocolInfo; +import org.glyptodon.guacamole.xml.DocumentHandler; +import org.glyptodon.guacamole.xml.protocol.ProtocolTagHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; + +/** + * The environment of the locally-running Guacamole instance, describing + * available protocols, configuration parameters, and the GUACAMOLE_HOME + * directory. + * + * @author Michael Jumper + */ +public class LocalEnvironment implements Environment { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(LocalEnvironment.class); + + /** + * Array of all known protocol names. + */ + private static final String[] KNOWN_PROTOCOLS = new String[]{ + "vnc", "rdp", "ssh", "telnet"}; + + /** + * All properties read from guacamole.properties. + */ + private final Properties properties; + + /** + * The location of GUACAMOLE_HOME, which may not truly exist. + */ + private final File guacHome; + + /** + * The map of all available protocols. + */ + private final Map availableProtocols; + + /** + * Creates a new Environment, initializing that environment based on the + * location of GUACAMOLE_HOME and the contents of guacamole.properties. + * + * @throws GuacamoleException If an error occurs while determining the + * environment of this Guacamole instance. + */ + public LocalEnvironment() throws GuacamoleException { + + // Determine location of GUACAMOLE_HOME + guacHome = findGuacamoleHome(); + + // Read properties + properties = new Properties(); + try { + + InputStream stream; + + // If not a directory, load from classpath + if (!guacHome.isDirectory()) { + + // Read from classpath + stream = LocalEnvironment.class.getResourceAsStream("/guacamole.properties"); + if (stream == null) + throw new GuacamoleServerException( + "guacamole.properties not loaded from " + guacHome + + " (not a directory), and guacamole.properties could" + + " not be found as a resource in the classpath."); + + } + + // Otherwise, try to load from file + else + stream = new FileInputStream(new File(guacHome, "guacamole.properties")); + + // Load properties, always close stream + try { properties.load(stream); } + finally { stream.close(); } + + } + catch (IOException e) { + throw new GuacamoleServerException("Error reading guacamole.properties", e); + } + + // Read all protocols + availableProtocols = readProtocols(); + + } + + /** + * Locates the Guacamole home directory by checking, in order: + * the guacamole.home system property, the GUACAMOLE_HOME environment + * variable, and finally the .guacamole directory in the home directory of + * the user running the servlet container. + * + * @return The File representing the Guacamole home directory, which may + * or may not exist, and may turn out to not be a directory. + */ + private static File findGuacamoleHome() { + + // Attempt to find Guacamole home + File guacHome; + + // Use system property by default + String desiredDir = System.getProperty("guacamole.home"); + + // Failing that, try the GUACAMOLE_HOME environment variable + if (desiredDir == null) desiredDir = System.getenv("GUACAMOLE_HOME"); + + // If successful, use explicitly specified directory + if (desiredDir != null) + guacHome = new File(desiredDir); + + // If not explicitly specified, use ~/.guacamole + else + guacHome = new File(System.getProperty("user.home"), ".guacamole"); + + // Return discovered directory + return guacHome; + + } + + /** + * Parses the given XML file, returning the parsed ProtocolInfo. + * + * @param input An input stream containing XML describing the parameters + * associated with a protocol supported by Guacamole. + * @return A new ProtocolInfo object which contains the parameters described + * by the XML file parsed. + * @throws GuacamoleException If an error occurs while parsing the XML file. + */ + private ProtocolInfo readProtocol(InputStream input) + throws GuacamoleException { + + // Parse document + try { + + // Get handler for root element + ProtocolTagHandler protocolTagHandler = + new ProtocolTagHandler(); + + // Set up document handler + DocumentHandler contentHandler = new DocumentHandler( + "protocol", protocolTagHandler); + + // Set up XML parser + XMLReader parser = XMLReaderFactory.createXMLReader(); + parser.setContentHandler(contentHandler); + + // Read and parse file + InputStream xml = new BufferedInputStream(input); + parser.parse(new InputSource(xml)); + xml.close(); + + // Return parsed protocol + return protocolTagHandler.asProtocolInfo(); + + } + catch (IOException e) { + throw new GuacamoleException("Error reading basic user mapping file.", e); + } + catch (SAXException e) { + throw new GuacamoleException("Error parsing basic user mapping XML.", e); + } + + } + + /** + * Reads through all pre-defined protocols and any protocols within the + * "protocols" subdirectory of GUACAMOLE_HOME, returning a map containing + * each of these protocols. The key of each entry will be the name of that + * protocol, as would be passed to guacd during connection. + * + * @return A map of all available protocols. + * @throws GuacamoleException If an error occurs while reading the various + * protocol XML files. + */ + private Map readProtocols() throws GuacamoleException { + + // Map of all available protocols + Map protocols = new HashMap(); + + // Get protcols directory + File protocol_directory = new File(getGuacamoleHome(), "protocols"); + + // Read protocols from directory if it exists + if (protocol_directory.isDirectory()) { + + // Get all XML files + File[] files = protocol_directory.listFiles( + new FilenameFilter() { + + @Override + public boolean accept(File file, String string) { + return string.endsWith(".xml"); + } + + } + ); + + // Load each protocol from each file + for (File file : files) { + + try { + + // Parse protocol + FileInputStream stream = new FileInputStream(file); + ProtocolInfo protocol = readProtocol(stream); + stream.close(); + + // Store protocol + protocols.put(protocol.getName(), protocol); + + } + catch (IOException e) { + logger.error("Unable to read connection parameter information from \"{}\": {}", file.getAbsolutePath(), e.getMessage()); + logger.debug("Error reading protocol XML.", e); + } + + } + + } + + // If known protocols are not already defined, read from classpath + for (String protocol : KNOWN_PROTOCOLS) { + + // If protocol not defined yet, attempt to load from classpath + if (!protocols.containsKey(protocol)) { + + InputStream stream = LocalEnvironment.class.getResourceAsStream( + "/org/glyptodon/guacamole/protocols/" + + protocol + ".xml"); + + // Parse XML if available + if (stream != null) + protocols.put(protocol, readProtocol(stream)); + + } + + } + + // Protocols map now fully populated + return protocols; + + } + + @Override + public File getGuacamoleHome() { + return guacHome; + } + + @Override + public Type getProperty(GuacamoleProperty property) throws GuacamoleException { + return property.parseValue(properties.getProperty(property.getName())); + } + + @Override + public Type getProperty(GuacamoleProperty property, + Type defaultValue) throws GuacamoleException { + + Type value = getProperty(property); + if (value == null) + return defaultValue; + + return value; + + } + + @Override + public Type getRequiredProperty(GuacamoleProperty property) + throws GuacamoleException { + + Type value = getProperty(property); + if (value == null) + throw new GuacamoleServerException("Property " + property.getName() + " is required."); + + return value; + + } + + @Override + public Map getProtocols() { + return availableProtocols; + } + + @Override + public ProtocolInfo getProtocol(String name) { + return availableProtocols.get(name); + } + +} diff --git a/guacamole-ext/src/main/java/org/glyptodon/guacamole/net/auth/simple/SimpleConnection.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/net/auth/simple/SimpleConnection.java index b8f1fd327..5065ef5d7 100644 --- a/guacamole-ext/src/main/java/org/glyptodon/guacamole/net/auth/simple/SimpleConnection.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/net/auth/simple/SimpleConnection.java @@ -25,12 +25,13 @@ package org.glyptodon.guacamole.net.auth.simple; import java.util.Collections; import java.util.List; import org.glyptodon.guacamole.GuacamoleException; +import org.glyptodon.guacamole.environment.Environment; +import org.glyptodon.guacamole.environment.LocalEnvironment; import org.glyptodon.guacamole.net.GuacamoleSocket; import org.glyptodon.guacamole.net.InetGuacamoleSocket; import org.glyptodon.guacamole.net.SSLGuacamoleSocket; import org.glyptodon.guacamole.net.auth.AbstractConnection; import org.glyptodon.guacamole.net.auth.ConnectionRecord; -import org.glyptodon.guacamole.properties.GuacamoleProperties; import org.glyptodon.guacamole.protocol.ConfiguredGuacamoleSocket; import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; @@ -81,12 +82,14 @@ public class SimpleConnection extends AbstractConnection { public GuacamoleSocket connect(GuacamoleClientInformation info) throws GuacamoleException { + Environment env = new LocalEnvironment(); + // Get guacd connection parameters - String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME); - int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT); + String hostname = env.getProperty(Environment.GUACD_HOSTNAME); + int port = env.getProperty(Environment.GUACD_PORT); // If guacd requires SSL, use it - if (GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_SSL, false)) + if (env.getProperty(Environment.GUACD_SSL, false)) return new ConfiguredGuacamoleSocket( new SSLGuacamoleSocket(hostname, port), config, info diff --git a/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleHome.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleHome.java index a9a5165a4..b629183cd 100644 --- a/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleHome.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleHome.java @@ -23,14 +23,27 @@ package org.glyptodon.guacamole.properties; import java.io.File; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Abstract representation of the Guacamole configuration directory. * + * @deprecated * @author Michael Jumper */ public class GuacamoleHome { + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(GuacamoleHome.class); + + static { + // Warn about deprecation + logger.warn("GuacamoleHome is deprecated. Please use Environment instead."); + } + /** * GuacamoleHome is a utility class and cannot be instantiated. */ diff --git a/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleProperties.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleProperties.java index 88925bd66..891667e05 100644 --- a/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleProperties.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/properties/GuacamoleProperties.java @@ -29,6 +29,8 @@ import java.io.InputStream; import java.util.Properties; import org.glyptodon.guacamole.GuacamoleException; import org.glyptodon.guacamole.GuacamoleServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Simple utility class for reading properties from the guacamole.properties @@ -39,10 +41,21 @@ import org.glyptodon.guacamole.GuacamoleServerException; * If none of those locations are possible, guacamole.properties will also * be read from the root of the classpath. * + * @deprecated * @author Michael Jumper */ public class GuacamoleProperties { + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(GuacamoleProperties.class); + + static { + // Warn about deprecation + logger.warn("GuacamoleProperties is deprecated. Please use Environment instead."); + } + /** * GuacamoleProperties is a utility class and cannot be instantiated. */ diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolInfo.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolInfo.java similarity index 98% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolInfo.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolInfo.java index 3c2497175..ad3b5e7d4 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolInfo.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolInfo.java @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic; +package org.glyptodon.guacamole.protocols; import java.util.ArrayList; import java.util.Collection; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameter.java similarity index 99% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameter.java index 48307387a..40b59a497 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameter.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameter.java @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic; +package org.glyptodon.guacamole.protocols; import java.util.ArrayList; import java.util.Collection; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameterOption.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameterOption.java similarity index 98% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameterOption.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameterOption.java index 2027046ec..52d233a16 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/ProtocolParameterOption.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols/ProtocolParameterOption.java @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic; +package org.glyptodon.guacamole.protocols; /** * Describes an available legal value for an enumerated protocol parameter. diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/DocumentHandler.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/DocumentHandler.java similarity index 99% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/DocumentHandler.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/DocumentHandler.java index c63c1b403..7f16a9916 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/DocumentHandler.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/DocumentHandler.java @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic.xml; +package org.glyptodon.guacamole.xml; import java.util.Deque; import java.util.LinkedList; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/TagHandler.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/TagHandler.java similarity index 98% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/TagHandler.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/TagHandler.java index 88fed7bd6..b8904998d 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/TagHandler.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/TagHandler.java @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic.xml; +package org.glyptodon.guacamole.xml; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/package-info.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/package-info.java similarity index 96% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/package-info.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/package-info.java index 91b6a3a6d..4b6d1562b 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/package-info.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/package-info.java @@ -24,5 +24,5 @@ * Classes driving the SAX-based XML parser used by the Guacamole web * application. */ -package org.glyptodon.guacamole.net.basic.xml; +package org.glyptodon.guacamole.xml; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/OptionTagHandler.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/OptionTagHandler.java similarity index 92% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/OptionTagHandler.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/OptionTagHandler.java index b05fac4f4..ce4299081 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/OptionTagHandler.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/OptionTagHandler.java @@ -20,10 +20,10 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic.xml.protocol; +package org.glyptodon.guacamole.xml.protocol; -import org.glyptodon.guacamole.net.basic.ProtocolParameterOption; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.protocols.ProtocolParameterOption; +import org.glyptodon.guacamole.xml.TagHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ParamTagHandler.java similarity index 95% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ParamTagHandler.java index 26336432e..cb59c04ed 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ParamTagHandler.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ParamTagHandler.java @@ -20,10 +20,10 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic.xml.protocol; +package org.glyptodon.guacamole.xml.protocol; -import org.glyptodon.guacamole.net.basic.ProtocolParameter; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.protocols.ProtocolParameter; +import org.glyptodon.guacamole.xml.TagHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ProtocolTagHandler.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ProtocolTagHandler.java similarity index 93% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ProtocolTagHandler.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ProtocolTagHandler.java index 601e485a7..562784509 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/ProtocolTagHandler.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/ProtocolTagHandler.java @@ -20,10 +20,10 @@ * THE SOFTWARE. */ -package org.glyptodon.guacamole.net.basic.xml.protocol; +package org.glyptodon.guacamole.xml.protocol; -import org.glyptodon.guacamole.net.basic.ProtocolInfo; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.protocols.ProtocolInfo; +import org.glyptodon.guacamole.xml.TagHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/package-info.java b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/package-info.java similarity index 95% rename from guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/package-info.java rename to guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/package-info.java index dba3f1b79..021d7b82d 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/protocol/package-info.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/xml/protocol/package-info.java @@ -24,5 +24,5 @@ * Classes related to parsing XML files which describe the parameters of a * protocol. */ -package org.glyptodon.guacamole.net.basic.xml.protocol; +package org.glyptodon.guacamole.xml.protocol; diff --git a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/rdp.xml b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/rdp.xml similarity index 97% rename from guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/rdp.xml rename to guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/rdp.xml index 7bd39404f..d31ab3ec2 100644 --- a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/rdp.xml +++ b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/rdp.xml @@ -23,6 +23,7 @@ + @@ -40,10 +41,10 @@ - + - + diff --git a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/ssh.xml b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/ssh.xml similarity index 100% rename from guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/ssh.xml rename to guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/ssh.xml diff --git a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/telnet.xml b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/telnet.xml similarity index 99% rename from guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/telnet.xml rename to guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/telnet.xml index fe797436b..984b9caa1 100644 --- a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/telnet.xml +++ b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/telnet.xml @@ -8,7 +8,7 @@ - + diff --git a/guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/vnc.xml b/guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/vnc.xml similarity index 100% rename from guacamole/src/main/resources/net/sourceforge/guacamole/net/protocols/vnc.xml rename to guacamole-ext/src/main/resources/org/glyptodon/guacamole/protocols/vnc.xml diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicFileAuthenticationProvider.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicFileAuthenticationProvider.java index 0614d52e1..5cedcaa79 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicFileAuthenticationProvider.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/BasicFileAuthenticationProvider.java @@ -33,7 +33,7 @@ import org.glyptodon.guacamole.net.auth.Credentials; import org.glyptodon.guacamole.net.auth.simple.SimpleAuthenticationProvider; import org.glyptodon.guacamole.net.basic.auth.Authorization; import org.glyptodon.guacamole.net.basic.auth.UserMapping; -import org.glyptodon.guacamole.net.basic.xml.DocumentHandler; +import org.glyptodon.guacamole.xml.DocumentHandler; import org.glyptodon.guacamole.net.basic.xml.user_mapping.UserMappingTagHandler; import org.glyptodon.guacamole.properties.FileGuacamoleProperty; import org.glyptodon.guacamole.properties.GuacamoleProperties; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTModule.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTModule.java index 9b17d356a..7cdbb71a8 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTModule.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/RESTModule.java @@ -23,7 +23,6 @@ package org.glyptodon.guacamole.net.basic.rest; import com.google.inject.AbstractModule; -import org.glyptodon.guacamole.net.basic.rest.protocol.ProtocolRetrievalService; /** * A Guice Module for setting up dependency injection for the @@ -37,7 +36,6 @@ public class RESTModule extends AbstractModule { protected void configure() { // Bind generic low-level services - bind(ProtocolRetrievalService.class); bind(ObjectRetrievalService.class); } diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRESTService.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRESTService.java index 537e53c4d..4d99465ee 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRESTService.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRESTService.java @@ -30,9 +30,11 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import org.glyptodon.guacamole.GuacamoleException; -import org.glyptodon.guacamole.net.basic.ProtocolInfo; +import org.glyptodon.guacamole.environment.Environment; +import org.glyptodon.guacamole.environment.LocalEnvironment; import org.glyptodon.guacamole.net.basic.rest.AuthProviderRESTExposure; import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService; +import org.glyptodon.guacamole.protocols.ProtocolInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,12 +58,6 @@ public class ProtocolRESTService { @Inject private AuthenticationService authenticationService; - /** - * Service for retrieving protocol definitions. - */ - @Inject - private ProtocolRetrievalService protocolRetrievalservice; - /** * Gets a map of protocols defined in the system - protocol name to protocol. * @@ -84,7 +80,8 @@ public class ProtocolRESTService { authenticationService.getUserContext(authToken); // Get and return a map of all protocols. - return protocolRetrievalservice.getProtocolMap(); + Environment env = new LocalEnvironment(); + return env.getProtocols(); } diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRetrievalService.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRetrievalService.java deleted file mode 100644 index 9f8958f8d..000000000 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRetrievalService.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2014 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.glyptodon.guacamole.net.basic.rest.protocol; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; -import org.glyptodon.guacamole.GuacamoleException; -import org.glyptodon.guacamole.net.basic.ProtocolInfo; -import org.glyptodon.guacamole.net.basic.xml.DocumentHandler; -import org.glyptodon.guacamole.net.basic.xml.protocol.ProtocolTagHandler; -import org.glyptodon.guacamole.properties.GuacamoleHome; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.XMLReaderFactory; - -/** - * A service for retrieving protocol definitions from the - * XML files storing the information. - * - * @author James Muehlner - */ -public class ProtocolRetrievalService { - - /** - * Logger for this class. - */ - private static final Logger logger = LoggerFactory.getLogger(ProtocolRetrievalService.class); - - /** - * Array of all known protocol names. - */ - private static final String[] KNOWN_PROTOCOLS = new String[]{ - "vnc", "rdp", "ssh", "telnet"}; - - /** - * Parses the given XML file, returning the parsed ProtocolInfo. - * - * @param input An input stream containing XML describing the parameters - * associated with a protocol supported by Guacamole. - * @return A new ProtocolInfo object which contains the parameters described - * by the XML file parsed. - * @throws GuacamoleException If an error occurs while parsing the XML file. - */ - private ProtocolInfo getProtocol(InputStream input) - throws GuacamoleException { - - // Parse document - try { - - // Get handler for root element - ProtocolTagHandler protocolTagHandler = - new ProtocolTagHandler(); - - // Set up document handler - DocumentHandler contentHandler = new DocumentHandler( - "protocol", protocolTagHandler); - - // Set up XML parser - XMLReader parser = XMLReaderFactory.createXMLReader(); - parser.setContentHandler(contentHandler); - - // Read and parse file - InputStream xml = new BufferedInputStream(input); - parser.parse(new InputSource(xml)); - xml.close(); - - // Return parsed protocol - return protocolTagHandler.asProtocolInfo(); - - } - catch (IOException e) { - throw new GuacamoleException(e); - } - catch (SAXException e) { - throw new GuacamoleException(e); - } - - } - - /** - * Retrieves a map of protocol name to ProtocolInfo for all protocols defined - * in the XML files. - * - * @return A map of all defined protocols. - * @throws GuacamoleException If an error occurs while retrieving the protocols. - */ - public Map getProtocolMap() throws GuacamoleException { - // Map of all available protocols - Map protocols = new HashMap(); - - // Get protcols directory - File protocol_directory = new File(GuacamoleHome.getDirectory(), - "protocols"); - - // Read protocols from directory if it exists - if (protocol_directory.isDirectory()) { - - // Get all XML files - File[] files = protocol_directory.listFiles( - new FilenameFilter() { - @Override - public boolean accept(File file, String string) { - return string.endsWith(".xml"); - } - } - ); - - // Load each protocol from each file - for (File file : files) { - try { - // Parse protocol - FileInputStream stream = new FileInputStream(file); - ProtocolInfo protocol = getProtocol(stream); - stream.close(); - - // Store protocol - protocols.put(protocol.getName(), protocol); - - } - catch (IOException e) { - logger.error("Unable to read connection parameter information from \"{}\": {}", file.getAbsolutePath(), e.getMessage()); - logger.debug("Error reading protocol XML.", e); - } - } - } - - // If known protocols are not already defined, read from classpath - for (String protocol : KNOWN_PROTOCOLS) { - - // If protocol not defined yet, attempt to load from classpath - if (!protocols.containsKey(protocol)) { - InputStream stream = ProtocolRetrievalService.class.getResourceAsStream( - "/net/sourceforge/guacamole/net/protocols/" - + protocol + ".xml"); - - // Parse XML if available - if (stream != null) - protocols.put(protocol, getProtocol(stream)); - - } - } - - return protocols; - } - -} diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/AuthorizeTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/AuthorizeTagHandler.java index b2fd3fa51..18e224378 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/AuthorizeTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/AuthorizeTagHandler.java @@ -24,7 +24,7 @@ package org.glyptodon.guacamole.net.basic.xml.user_mapping; import org.glyptodon.guacamole.net.basic.auth.Authorization; import org.glyptodon.guacamole.net.basic.auth.UserMapping; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.xml.TagHandler; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ConnectionTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ConnectionTagHandler.java index 14d07bb95..7473b7316 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ConnectionTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ConnectionTagHandler.java @@ -23,7 +23,7 @@ package org.glyptodon.guacamole.net.basic.xml.user_mapping; import org.glyptodon.guacamole.net.basic.auth.Authorization; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.xml.TagHandler; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ParamTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ParamTagHandler.java index a58783836..afc990ca8 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ParamTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ParamTagHandler.java @@ -22,7 +22,7 @@ package org.glyptodon.guacamole.net.basic.xml.user_mapping; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.xml.TagHandler; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ProtocolTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ProtocolTagHandler.java index f97323884..14a5758d0 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ProtocolTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/ProtocolTagHandler.java @@ -22,7 +22,7 @@ package org.glyptodon.guacamole.net.basic.xml.user_mapping; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.xml.TagHandler; import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/UserMappingTagHandler.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/UserMappingTagHandler.java index 42960a33b..250f494c6 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/UserMappingTagHandler.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/xml/user_mapping/UserMappingTagHandler.java @@ -23,7 +23,7 @@ package org.glyptodon.guacamole.net.basic.xml.user_mapping; import org.glyptodon.guacamole.net.basic.auth.UserMapping; -import org.glyptodon.guacamole.net.basic.xml.TagHandler; +import org.glyptodon.guacamole.xml.TagHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException;