mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 21:27:40 +00:00
Implement protocol XML list servlet, include default parameter set for VNC.
This commit is contained in:
@@ -0,0 +1,222 @@
|
|||||||
|
package net.sourceforge.guacamole.net.basic.crud.protocols;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Guacamole - Clientless Remote Desktop
|
||||||
|
* Copyright (C) 2010 Michael Jumper
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.xml.stream.XMLOutputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.XMLStreamWriter;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleServerException;
|
||||||
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.basic.AuthenticatingHttpServlet;
|
||||||
|
import net.sourceforge.guacamole.net.basic.ProtocolInfo;
|
||||||
|
import net.sourceforge.guacamole.net.basic.ProtocolParameter;
|
||||||
|
import net.sourceforge.guacamole.net.basic.ProtocolParameterOption;
|
||||||
|
import net.sourceforge.guacamole.net.basic.xml.DocumentHandler;
|
||||||
|
import net.sourceforge.guacamole.net.basic.xml.protocol.ProtocolTagHandler;
|
||||||
|
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
|
||||||
|
* protocols.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class List extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* @param xml The XMLStreamWriter to use to write the XML.
|
||||||
|
* @param protocol The ProtocolInfo object to read parameters and protocol
|
||||||
|
* information from.
|
||||||
|
* @throws XMLStreamException If an error occurs while writing the XML.
|
||||||
|
*/
|
||||||
|
private void writeProtocol(XMLStreamWriter xml, ProtocolInfo protocol)
|
||||||
|
throws XMLStreamException {
|
||||||
|
|
||||||
|
// Write protocol
|
||||||
|
xml.writeStartElement("protocol");
|
||||||
|
xml.writeAttribute("name", protocol.getName());
|
||||||
|
xml.writeAttribute("title", protocol.getTitle());
|
||||||
|
|
||||||
|
// Write parameters
|
||||||
|
for (ProtocolParameter param : protocol.getParameters()) {
|
||||||
|
|
||||||
|
// Write param tag
|
||||||
|
xml.writeStartElement("param");
|
||||||
|
xml.writeAttribute("name", param.getName());
|
||||||
|
xml.writeAttribute("title", param.getTitle());
|
||||||
|
|
||||||
|
// Write type
|
||||||
|
switch (param.getType()) {
|
||||||
|
|
||||||
|
// Text parameter
|
||||||
|
case TEXT:
|
||||||
|
xml.writeAttribute("type", "text");
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Password parameter
|
||||||
|
case PASSWORD:
|
||||||
|
xml.writeAttribute("type", "password");
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Numeric parameter
|
||||||
|
case NUMERIC:
|
||||||
|
xml.writeAttribute("type", "numeric");
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Boolean parameter
|
||||||
|
case BOOLEAN:
|
||||||
|
xml.writeAttribute("type", "boolean");
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Enumerated parameter
|
||||||
|
case ENUM:
|
||||||
|
xml.writeAttribute("type", "enum");
|
||||||
|
break;
|
||||||
|
|
||||||
|
// If unknown, fail explicitly
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Parameter type not supported: " + param.getType());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write options
|
||||||
|
for (ProtocolParameterOption option : param.getOptions()) {
|
||||||
|
xml.writeStartElement("option");
|
||||||
|
xml.writeAttribute("value", option.getValue());
|
||||||
|
xml.writeCharacters(option.getTitle());
|
||||||
|
xml.writeEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
// End parameter
|
||||||
|
xml.writeEndElement();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// End protocol
|
||||||
|
xml.writeEndElement();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void authenticatedService(
|
||||||
|
UserContext context,
|
||||||
|
HttpServletRequest request, HttpServletResponse response)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Do not cache
|
||||||
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
|
|
||||||
|
// Write actual XML
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Write XML content type
|
||||||
|
response.setHeader("Content-Type", "text/xml");
|
||||||
|
|
||||||
|
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
|
||||||
|
XMLStreamWriter xml = outputFactory.createXMLStreamWriter(response.getWriter());
|
||||||
|
|
||||||
|
// Begin document
|
||||||
|
xml.writeStartDocument();
|
||||||
|
xml.writeStartElement("protocols");
|
||||||
|
|
||||||
|
// Read from classpath
|
||||||
|
InputStream stream = List.class.getResourceAsStream(
|
||||||
|
"/net/sourceforge/guacamole/net/protocols/vnc.xml");
|
||||||
|
if (stream == null)
|
||||||
|
throw new IOException("Could not read VNC XML.");
|
||||||
|
|
||||||
|
// Parse and write protocol
|
||||||
|
ProtocolInfo protocol = getProtocol(stream);
|
||||||
|
writeProtocol(xml, protocol);
|
||||||
|
|
||||||
|
// End document
|
||||||
|
xml.writeEndElement();
|
||||||
|
xml.writeEndDocument();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (XMLStreamException e) {
|
||||||
|
throw new GuacamoleServerException(
|
||||||
|
"Unable to write protocol list XML.", e);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new GuacamoleServerException(
|
||||||
|
"I/O error writing protocol list XML.", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Servlets dedicated to CRUD operations related to protocols.
|
||||||
|
*/
|
||||||
|
package net.sourceforge.guacamole.net.basic.crud.protocols;
|
||||||
|
|
@@ -0,0 +1,13 @@
|
|||||||
|
<protocol name="vnc" title="VNC">
|
||||||
|
|
||||||
|
<param name="hostname" type="text" title="Hostname"/>
|
||||||
|
<param name="port" type="numeric" title="Port"/>
|
||||||
|
<param name="read-only" type="boolean" title="Read-only"/>
|
||||||
|
<param name="color-depth" type="text" title="Color depth">
|
||||||
|
<option value="8">256 color</option>
|
||||||
|
<option value="16">Low color (16-bit)</option>
|
||||||
|
<option value="24">True color (24-bit)</option>
|
||||||
|
<option value="32">True color (32-bit)</option>
|
||||||
|
</param>
|
||||||
|
|
||||||
|
</protocol>
|
@@ -154,6 +154,17 @@
|
|||||||
<url-pattern>/permissions</url-pattern>
|
<url-pattern>/permissions</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<!-- Protocol List Servlet -->
|
||||||
|
<servlet>
|
||||||
|
<description>Protocol list servlet.</description>
|
||||||
|
<servlet-name>Protocols</servlet-name>
|
||||||
|
<servlet-class>net.sourceforge.guacamole.net.basic.crud.protocols.List</servlet-class>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>Protocols</servlet-name>
|
||||||
|
<url-pattern>/protocols</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<!-- Guacamole Tunnel Servlet -->
|
<!-- Guacamole Tunnel Servlet -->
|
||||||
<servlet>
|
<servlet>
|
||||||
<description>Tunnel servlet.</description>
|
<description>Tunnel servlet.</description>
|
||||||
|
Reference in New Issue
Block a user