mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	Merge branch 'master' into GUAC-546-REWRITE-merge
Conflicts: guacamole/src/main/java/org/glyptodon/guacamole/net/basic/rest/protocol/ProtocolRetrievalService.java
This commit is contained in:
		| @@ -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<String, ProtocolInfo> 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 <Type> 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> Type getProperty(GuacamoleProperty<Type> 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 <Type> 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> Type getProperty(GuacamoleProperty<Type> 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 <Type> 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> Type getRequiredProperty(GuacamoleProperty<Type> property) | ||||||
|  |             throws GuacamoleException; | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -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<String, ProtocolInfo> 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<String, ProtocolInfo> readProtocols() throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         // Map of all available protocols | ||||||
|  |         Map<String, ProtocolInfo> protocols = new HashMap<String, ProtocolInfo>(); | ||||||
|  |  | ||||||
|  |         // 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> Type getProperty(GuacamoleProperty<Type> property) throws GuacamoleException { | ||||||
|  |         return property.parseValue(properties.getProperty(property.getName())); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public <Type> Type getProperty(GuacamoleProperty<Type> property, | ||||||
|  |             Type defaultValue) throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         Type value = getProperty(property); | ||||||
|  |         if (value == null) | ||||||
|  |             return defaultValue; | ||||||
|  |  | ||||||
|  |         return value; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public <Type> Type getRequiredProperty(GuacamoleProperty<Type> property) | ||||||
|  |             throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         Type value = getProperty(property); | ||||||
|  |         if (value == null) | ||||||
|  |             throw new GuacamoleServerException("Property " + property.getName() + " is required."); | ||||||
|  |  | ||||||
|  |         return value; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Map<String, ProtocolInfo> getProtocols() { | ||||||
|  |         return availableProtocols; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public ProtocolInfo getProtocol(String name) { | ||||||
|  |         return availableProtocols.get(name); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -25,12 +25,13 @@ package org.glyptodon.guacamole.net.auth.simple; | |||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import org.glyptodon.guacamole.GuacamoleException; | 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.GuacamoleSocket; | ||||||
| import org.glyptodon.guacamole.net.InetGuacamoleSocket; | import org.glyptodon.guacamole.net.InetGuacamoleSocket; | ||||||
| import org.glyptodon.guacamole.net.SSLGuacamoleSocket; | import org.glyptodon.guacamole.net.SSLGuacamoleSocket; | ||||||
| import org.glyptodon.guacamole.net.auth.AbstractConnection; | import org.glyptodon.guacamole.net.auth.AbstractConnection; | ||||||
| import org.glyptodon.guacamole.net.auth.ConnectionRecord; | import org.glyptodon.guacamole.net.auth.ConnectionRecord; | ||||||
| import org.glyptodon.guacamole.properties.GuacamoleProperties; |  | ||||||
| import org.glyptodon.guacamole.protocol.ConfiguredGuacamoleSocket; | import org.glyptodon.guacamole.protocol.ConfiguredGuacamoleSocket; | ||||||
| import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | import org.glyptodon.guacamole.protocol.GuacamoleClientInformation; | ||||||
| import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | import org.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||||
| @@ -81,12 +82,14 @@ public class SimpleConnection extends AbstractConnection { | |||||||
|     public GuacamoleSocket connect(GuacamoleClientInformation info) |     public GuacamoleSocket connect(GuacamoleClientInformation info) | ||||||
|             throws GuacamoleException { |             throws GuacamoleException { | ||||||
|  |  | ||||||
|  |         Environment env = new LocalEnvironment(); | ||||||
|  |          | ||||||
|         // Get guacd connection parameters |         // Get guacd connection parameters | ||||||
|         String hostname = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_HOSTNAME); |         String hostname = env.getProperty(Environment.GUACD_HOSTNAME); | ||||||
|         int port = GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_PORT); |         int port = env.getProperty(Environment.GUACD_PORT); | ||||||
|  |  | ||||||
|         // If guacd requires SSL, use it |         // If guacd requires SSL, use it | ||||||
|         if (GuacamoleProperties.getProperty(GuacamoleProperties.GUACD_SSL, false)) |         if (env.getProperty(Environment.GUACD_SSL, false)) | ||||||
|             return new ConfiguredGuacamoleSocket( |             return new ConfiguredGuacamoleSocket( | ||||||
|                 new SSLGuacamoleSocket(hostname, port), |                 new SSLGuacamoleSocket(hostname, port), | ||||||
|                 config, info |                 config, info | ||||||
|   | |||||||
| @@ -23,14 +23,27 @@ | |||||||
| package org.glyptodon.guacamole.properties; | package org.glyptodon.guacamole.properties; | ||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Abstract representation of the Guacamole configuration directory. |  * Abstract representation of the Guacamole configuration directory. | ||||||
|  * |  * | ||||||
|  |  * @deprecated | ||||||
|  * @author Michael Jumper |  * @author Michael Jumper | ||||||
|  */ |  */ | ||||||
| public class GuacamoleHome { | 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. |      * GuacamoleHome is a utility class and cannot be instantiated. | ||||||
|      */ |      */ | ||||||
|   | |||||||
| @@ -29,6 +29,8 @@ import java.io.InputStream; | |||||||
| import java.util.Properties; | import java.util.Properties; | ||||||
| import org.glyptodon.guacamole.GuacamoleException; | import org.glyptodon.guacamole.GuacamoleException; | ||||||
| import org.glyptodon.guacamole.GuacamoleServerException; | import org.glyptodon.guacamole.GuacamoleServerException; | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Simple utility class for reading properties from the guacamole.properties |  * 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 |  * If none of those locations are possible, guacamole.properties will also | ||||||
|  * be read from the root of the classpath. |  * be read from the root of the classpath. | ||||||
|  * |  * | ||||||
|  |  * @deprecated | ||||||
|  * @author Michael Jumper |  * @author Michael Jumper | ||||||
|  */ |  */ | ||||||
| public class GuacamoleProperties { | 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. |      * GuacamoleProperties is a utility class and cannot be instantiated. | ||||||
|      */ |      */ | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
|  * THE SOFTWARE. |  * THE SOFTWARE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| package org.glyptodon.guacamole.net.basic; | package org.glyptodon.guacamole.protocols; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -20,7 +20,7 @@ | |||||||
|  * THE SOFTWARE. |  * THE SOFTWARE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| package org.glyptodon.guacamole.net.basic; | package org.glyptodon.guacamole.protocols; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @@ -20,7 +20,7 @@ | |||||||
|  * THE SOFTWARE. |  * THE SOFTWARE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| package org.glyptodon.guacamole.net.basic; | package org.glyptodon.guacamole.protocols; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Describes an available legal value for an enumerated protocol parameter. |  * Describes an available legal value for an enumerated protocol parameter. | ||||||
| @@ -20,7 +20,7 @@ | |||||||
|  * THE SOFTWARE. |  * THE SOFTWARE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| package org.glyptodon.guacamole.net.basic.xml; | package org.glyptodon.guacamole.xml; | ||||||
| 
 | 
 | ||||||
| import java.util.Deque; | import java.util.Deque; | ||||||
| import java.util.LinkedList; | import java.util.LinkedList; | ||||||
| @@ -20,7 +20,7 @@ | |||||||
|  * THE SOFTWARE. |  * THE SOFTWARE. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| package org.glyptodon.guacamole.net.basic.xml; | package org.glyptodon.guacamole.xml; | ||||||
| 
 | 
 | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
| @@ -24,5 +24,5 @@ | |||||||
|  * Classes driving the SAX-based XML parser used by the Guacamole web |  * Classes driving the SAX-based XML parser used by the Guacamole web | ||||||
|  * application. |  * application. | ||||||
|  */ |  */ | ||||||
| package org.glyptodon.guacamole.net.basic.xml; | package org.glyptodon.guacamole.xml; | ||||||
| 
 | 
 | ||||||
| @@ -20,10 +20,10 @@ | |||||||
|  * THE SOFTWARE. |  * 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.protocols.ProtocolParameterOption; | ||||||
| import org.glyptodon.guacamole.net.basic.xml.TagHandler; | import org.glyptodon.guacamole.xml.TagHandler; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
| 
 | 
 | ||||||
| @@ -20,10 +20,10 @@ | |||||||
|  * THE SOFTWARE. |  * 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.protocols.ProtocolParameter; | ||||||
| import org.glyptodon.guacamole.net.basic.xml.TagHandler; | import org.glyptodon.guacamole.xml.TagHandler; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
| 
 | 
 | ||||||
| @@ -20,10 +20,10 @@ | |||||||
|  * THE SOFTWARE. |  * 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.protocols.ProtocolInfo; | ||||||
| import org.glyptodon.guacamole.net.basic.xml.TagHandler; | import org.glyptodon.guacamole.xml.TagHandler; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
| 
 | 
 | ||||||
| @@ -24,5 +24,5 @@ | |||||||
|  * Classes related to parsing XML files which describe the parameters of a |  * Classes related to parsing XML files which describe the parameters of a | ||||||
|  * protocol. |  * protocol. | ||||||
|  */ |  */ | ||||||
| package org.glyptodon.guacamole.net.basic.xml.protocol; | package org.glyptodon.guacamole.xml.protocol; | ||||||
| 
 | 
 | ||||||
| @@ -23,6 +23,7 @@ | |||||||
|         <option value="en-us-qwerty">US English (Qwerty)</option> |         <option value="en-us-qwerty">US English (Qwerty)</option> | ||||||
|         <option value="fr-fr-azerty">French (Azerty)</option> |         <option value="fr-fr-azerty">French (Azerty)</option> | ||||||
|         <option value="de-de-qwertz">German (Qwertz)</option> |         <option value="de-de-qwertz">German (Qwertz)</option> | ||||||
|  |         <option value="sv-se-qwerty">Swedish (Qwerty)</option> | ||||||
|         <option value="failsafe">Unicode</option> |         <option value="failsafe">Unicode</option> | ||||||
|     </param> |     </param> | ||||||
| 
 | 
 | ||||||
| @@ -33,7 +33,7 @@ import org.glyptodon.guacamole.net.auth.Credentials; | |||||||
| import org.glyptodon.guacamole.net.auth.simple.SimpleAuthenticationProvider; | import org.glyptodon.guacamole.net.auth.simple.SimpleAuthenticationProvider; | ||||||
| import org.glyptodon.guacamole.net.basic.auth.Authorization; | import org.glyptodon.guacamole.net.basic.auth.Authorization; | ||||||
| import org.glyptodon.guacamole.net.basic.auth.UserMapping; | 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.net.basic.xml.user_mapping.UserMappingTagHandler; | ||||||
| import org.glyptodon.guacamole.properties.FileGuacamoleProperty; | import org.glyptodon.guacamole.properties.FileGuacamoleProperty; | ||||||
| import org.glyptodon.guacamole.properties.GuacamoleProperties; | import org.glyptodon.guacamole.properties.GuacamoleProperties; | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ | |||||||
| package org.glyptodon.guacamole.net.basic.rest; | package org.glyptodon.guacamole.net.basic.rest; | ||||||
|  |  | ||||||
| import com.google.inject.AbstractModule; | import com.google.inject.AbstractModule; | ||||||
| import org.glyptodon.guacamole.net.basic.rest.protocol.ProtocolRetrievalService; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * A Guice Module for setting up dependency injection for the  |  * A Guice Module for setting up dependency injection for the  | ||||||
| @@ -37,7 +36,6 @@ public class RESTModule extends AbstractModule { | |||||||
|     protected void configure() { |     protected void configure() { | ||||||
|  |  | ||||||
|         // Bind generic low-level services |         // Bind generic low-level services | ||||||
|         bind(ProtocolRetrievalService.class); |  | ||||||
|         bind(ObjectRetrievalService.class); |         bind(ObjectRetrievalService.class); | ||||||
|          |          | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -30,9 +30,11 @@ import javax.ws.rs.Produces; | |||||||
| import javax.ws.rs.QueryParam; | import javax.ws.rs.QueryParam; | ||||||
| import javax.ws.rs.core.MediaType; | import javax.ws.rs.core.MediaType; | ||||||
| import org.glyptodon.guacamole.GuacamoleException; | 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.AuthProviderRESTExposure; | ||||||
| import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService; | import org.glyptodon.guacamole.net.basic.rest.auth.AuthenticationService; | ||||||
|  | import org.glyptodon.guacamole.protocols.ProtocolInfo; | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
| @@ -56,12 +58,6 @@ public class ProtocolRESTService { | |||||||
|     @Inject |     @Inject | ||||||
|     private AuthenticationService authenticationService; |     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. |      * Gets a map of protocols defined in the system - protocol name to protocol. | ||||||
|      *  |      *  | ||||||
| @@ -84,7 +80,8 @@ public class ProtocolRESTService { | |||||||
|         authenticationService.getUserContext(authToken); |         authenticationService.getUserContext(authToken); | ||||||
|  |  | ||||||
|         // Get and return a map of all protocols. |         // Get and return a map of all protocols. | ||||||
|         return protocolRetrievalservice.getProtocolMap(); |         Environment env = new LocalEnvironment(); | ||||||
|  |         return env.getProtocols(); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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<String, ProtocolInfo> getProtocolMap() throws GuacamoleException { |  | ||||||
|         // Map of all available protocols |  | ||||||
|         Map<String, ProtocolInfo> protocols = new HashMap<String, ProtocolInfo>(); |  | ||||||
|  |  | ||||||
|         // 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; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -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.Authorization; | ||||||
| import org.glyptodon.guacamole.net.basic.auth.UserMapping; | 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.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ | |||||||
| package org.glyptodon.guacamole.net.basic.xml.user_mapping; | package org.glyptodon.guacamole.net.basic.xml.user_mapping; | ||||||
|  |  | ||||||
| import org.glyptodon.guacamole.net.basic.auth.Authorization; | 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.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ | |||||||
|  |  | ||||||
| package org.glyptodon.guacamole.net.basic.xml.user_mapping; | 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.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ | |||||||
|  |  | ||||||
| package org.glyptodon.guacamole.net.basic.xml.user_mapping; | 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.glyptodon.guacamole.protocol.GuacamoleConfiguration; | ||||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ | |||||||
| package org.glyptodon.guacamole.net.basic.xml.user_mapping; | package org.glyptodon.guacamole.net.basic.xml.user_mapping; | ||||||
|  |  | ||||||
| import org.glyptodon.guacamole.net.basic.auth.UserMapping; | 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.Attributes; | ||||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user