From 49b91ebe5691157894eb7e0b8b34b1f08141dd26 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 23 Nov 2014 17:39:48 -0800 Subject: [PATCH] GUAC-340: Expose available protocols within Environment. --- .../guacamole/environment/Environment.java | 20 +++ .../environment/LocalEnvironment.java | 170 +++++++++++++++++- .../guacamole/protocols}/ProtocolInfo.java | 2 +- .../protocols}/ProtocolParameter.java | 2 +- .../protocols}/ProtocolParameterOption.java | 2 +- .../guacamole}/xml/DocumentHandler.java | 2 +- .../glyptodon/guacamole}/xml/TagHandler.java | 2 +- .../guacamole}/xml/package-info.java | 2 +- .../xml/protocol/OptionTagHandler.java | 6 +- .../xml/protocol/ParamTagHandler.java | 6 +- .../xml/protocol/ProtocolTagHandler.java | 6 +- .../guacamole}/xml/protocol/package-info.java | 2 +- .../glyptodon/guacamole}/protocols/rdp.xml | 4 +- .../glyptodon/guacamole}/protocols/ssh.xml | 0 .../glyptodon/guacamole}/protocols/telnet.xml | 2 +- .../glyptodon/guacamole}/protocols/vnc.xml | 0 .../BasicFileAuthenticationProvider.java | 2 +- .../net/basic/crud/protocols/List.java | 137 +------------- .../xml/user_mapping/AuthorizeTagHandler.java | 2 +- .../user_mapping/ConnectionTagHandler.java | 2 +- .../xml/user_mapping/ParamTagHandler.java | 2 +- .../xml/user_mapping/ProtocolTagHandler.java | 2 +- .../user_mapping/UserMappingTagHandler.java | 2 +- 23 files changed, 222 insertions(+), 155 deletions(-) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols}/ProtocolInfo.java (98%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols}/ProtocolParameter.java (99%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole/protocols}/ProtocolParameterOption.java (98%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/DocumentHandler.java (99%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/TagHandler.java (98%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/package-info.java (96%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/protocol/OptionTagHandler.java (92%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/protocol/ParamTagHandler.java (95%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/protocol/ProtocolTagHandler.java (93%) rename {guacamole/src/main/java/org/glyptodon/guacamole/net/basic => guacamole-ext/src/main/java/org/glyptodon/guacamole}/xml/protocol/package-info.java (95%) rename {guacamole/src/main/resources/net/sourceforge/guacamole/net => guacamole-ext/src/main/resources/org/glyptodon/guacamole}/protocols/rdp.xml (99%) rename {guacamole/src/main/resources/net/sourceforge/guacamole/net => guacamole-ext/src/main/resources/org/glyptodon/guacamole}/protocols/ssh.xml (100%) rename {guacamole/src/main/resources/net/sourceforge/guacamole/net => guacamole-ext/src/main/resources/org/glyptodon/guacamole}/protocols/telnet.xml (99%) rename {guacamole/src/main/resources/net/sourceforge/guacamole/net => guacamole-ext/src/main/resources/org/glyptodon/guacamole}/protocols/vnc.xml (100%) 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 index 8805c5173..3882cbab3 100644 --- a/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/Environment.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/Environment.java @@ -23,11 +23,13 @@ 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 @@ -80,6 +82,24 @@ public interface Environment { */ 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. 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 index 0fe2880dc..c96f0dd4d 100644 --- a/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/LocalEnvironment.java +++ b/guacamole-ext/src/main/java/org/glyptodon/guacamole/environment/LocalEnvironment.java @@ -22,14 +22,27 @@ 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 @@ -40,6 +53,17 @@ import org.glyptodon.guacamole.properties.GuacamoleProperty; */ 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. */ @@ -50,6 +74,11 @@ public class LocalEnvironment implements Environment { */ 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. @@ -59,9 +88,11 @@ public class LocalEnvironment implements Environment { */ public LocalEnvironment() throws GuacamoleException { - properties = new Properties(); + // Determine location of GUACAMOLE_HOME guacHome = findGuacamoleHome(); + // Read properties + properties = new Properties(); try { InputStream stream; @@ -92,6 +123,9 @@ public class LocalEnvironment implements Environment { throw new GuacamoleServerException("Error reading guacamole.properties", e); } + // Read all protocols + availableProtocols = readProtocols(); + } /** @@ -127,6 +161,130 @@ public class LocalEnvironment implements Environment { } + /** + * 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; @@ -161,4 +319,14 @@ public class LocalEnvironment implements Environment { } + @Override + public Map getProtocols() { + return availableProtocols; + } + + @Override + public ProtocolInfo getProtocol(String name) { + return availableProtocols.get(name); + } + } 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 99% 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..5904fb965 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 @@ -40,10 +40,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/crud/protocols/List.java b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java index 7efcf6b06..0c1bb1592 100644 --- a/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java +++ b/guacamole/src/main/java/org/glyptodon/guacamole/net/basic/crud/protocols/List.java @@ -22,13 +22,7 @@ package org.glyptodon.guacamole.net.basic.crud.protocols; -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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -37,20 +31,15 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.glyptodon.guacamole.GuacamoleException; import org.glyptodon.guacamole.GuacamoleServerException; +import org.glyptodon.guacamole.environment.Environment; +import org.glyptodon.guacamole.environment.LocalEnvironment; import org.glyptodon.guacamole.net.auth.UserContext; import org.glyptodon.guacamole.net.basic.RestrictedHttpServlet; -import org.glyptodon.guacamole.net.basic.ProtocolInfo; -import org.glyptodon.guacamole.net.basic.ProtocolParameter; -import org.glyptodon.guacamole.net.basic.ProtocolParameterOption; -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.glyptodon.guacamole.protocols.ProtocolInfo; +import org.glyptodon.guacamole.protocols.ProtocolParameter; +import org.glyptodon.guacamole.protocols.ProtocolParameterOption; 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; /** * Simple HttpServlet which outputs XML containing a list of all visible @@ -65,57 +54,6 @@ public class List extends RestrictedHttpServlet { */ private Logger logger = LoggerFactory.getLogger(List.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("Error reading basic user mapping file.", e); - } - catch (SAXException e) { - throw new GuacamoleException("Error parsing basic user mapping XML.", e); - } - - } - /** * Given an XML stream and a fully-populated ProtocolInfo object, writes * out the corresponding protocol XML describing all available parameters. @@ -217,68 +155,9 @@ public class List extends RestrictedHttpServlet { // Set encoding response.setCharacterEncoding("UTF-8"); - // 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 = List.class.getResourceAsStream( - "/net/sourceforge/guacamole/net/protocols/" - + protocol + ".xml"); - - // Parse XML if available - if (stream != null) - protocols.put(protocol, getProtocol(stream)); - - } - - } + // Retrieve map of all available protocols + Environment env = new LocalEnvironment(); + Map protocols = env.getProtocols(); // Write actual XML try { 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;