mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-09 06:31:22 +00:00
Remove central guac-dev repo reference. Refactor net.sourceforge.guacamole to org.glyptodon.guacamole. Extensions are remaining with their classes in net.sourceforge.guacamole for compatibility's sake until we have a better system for extensions.
This commit is contained in:
@@ -0,0 +1,206 @@
|
||||
|
||||
package org.glyptodon.guacamole.protocol;
|
||||
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is guacamole-common.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Michael Jumper.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
import java.util.List;
|
||||
import org.glyptodon.guacamole.GuacamoleException;
|
||||
import org.glyptodon.guacamole.GuacamoleServerException;
|
||||
import org.glyptodon.guacamole.io.GuacamoleReader;
|
||||
import org.glyptodon.guacamole.io.GuacamoleWriter;
|
||||
import org.glyptodon.guacamole.net.GuacamoleSocket;
|
||||
|
||||
/**
|
||||
* A GuacamoleSocket which pre-configures the connection based on a given
|
||||
* GuacamoleConfiguration, completing the initial protocol handshake before
|
||||
* accepting data for read or write.
|
||||
*
|
||||
* This is useful for forcing a connection to the Guacamole proxy server with
|
||||
* a specific configuration while disallowing the client that will be using
|
||||
* this GuacamoleSocket from manually controlling the initial protocol
|
||||
* handshake.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class ConfiguredGuacamoleSocket implements GuacamoleSocket {
|
||||
|
||||
/**
|
||||
* The wrapped socket.
|
||||
*/
|
||||
private GuacamoleSocket socket;
|
||||
|
||||
/**
|
||||
* The configuration to use when performing the Guacamole protocol
|
||||
* handshake.
|
||||
*/
|
||||
private GuacamoleConfiguration config;
|
||||
|
||||
/**
|
||||
* Creates a new ConfiguredGuacamoleSocket which uses the given
|
||||
* GuacamoleConfiguration to complete the initial protocol handshake over
|
||||
* the given GuacamoleSocket. A default GuacamoleClientInformation object
|
||||
* is used to provide basic client information.
|
||||
*
|
||||
* @param socket The GuacamoleSocket to wrap.
|
||||
* @param config The GuacamoleConfiguration to use to complete the initial
|
||||
* protocol handshake.
|
||||
* @throws GuacamoleException If an error occurs while completing the
|
||||
* initial protocol handshake.
|
||||
*/
|
||||
public ConfiguredGuacamoleSocket(GuacamoleSocket socket,
|
||||
GuacamoleConfiguration config) throws GuacamoleException {
|
||||
this(socket, config, new GuacamoleClientInformation());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new ConfiguredGuacamoleSocket which uses the given
|
||||
* GuacamoleConfiguration and GuacamoleClientInformation to complete the
|
||||
* initial protocol handshake over the given GuacamoleSocket.
|
||||
*
|
||||
* @param socket The GuacamoleSocket to wrap.
|
||||
* @param config The GuacamoleConfiguration to use to complete the initial
|
||||
* protocol handshake.
|
||||
* @param info The GuacamoleClientInformation to use to complete the initial
|
||||
* protocol handshake.
|
||||
* @throws GuacamoleException If an error occurs while completing the
|
||||
* initial protocol handshake.
|
||||
*/
|
||||
public ConfiguredGuacamoleSocket(GuacamoleSocket socket,
|
||||
GuacamoleConfiguration config,
|
||||
GuacamoleClientInformation info) throws GuacamoleException {
|
||||
|
||||
this.socket = socket;
|
||||
this.config = config;
|
||||
|
||||
// Get reader and writer
|
||||
GuacamoleReader reader = socket.getReader();
|
||||
GuacamoleWriter writer = socket.getWriter();
|
||||
|
||||
// Send protocol
|
||||
writer.writeInstruction(new GuacamoleInstruction("select", config.getProtocol()));
|
||||
|
||||
// Wait for server args
|
||||
GuacamoleInstruction instruction;
|
||||
do {
|
||||
|
||||
// Read instruction, fail if end-of-stream
|
||||
instruction = reader.readInstruction();
|
||||
if (instruction == null)
|
||||
throw new GuacamoleServerException("End of stream during initial handshake.");
|
||||
|
||||
} while (!instruction.getOpcode().equals("args"));
|
||||
|
||||
// Build args list off provided names and config
|
||||
List<String> arg_names = instruction.getArgs();
|
||||
String[] arg_values = new String[arg_names.size()];
|
||||
for (int i=0; i<arg_names.size(); i++) {
|
||||
|
||||
// Retrieve argument name
|
||||
String arg_name = arg_names.get(i);
|
||||
|
||||
// Get defined value for name
|
||||
String value = config.getParameter(arg_name);
|
||||
|
||||
// If value defined, set that value
|
||||
if (value != null) arg_values[i] = value;
|
||||
|
||||
// Otherwise, leave value blank
|
||||
else arg_values[i] = "";
|
||||
|
||||
}
|
||||
|
||||
// Send size
|
||||
writer.writeInstruction(
|
||||
new GuacamoleInstruction(
|
||||
"size",
|
||||
Integer.toString(info.getOptimalScreenWidth()),
|
||||
Integer.toString(info.getOptimalScreenHeight())
|
||||
)
|
||||
);
|
||||
|
||||
// Send supported audio formats
|
||||
writer.writeInstruction(
|
||||
new GuacamoleInstruction(
|
||||
"audio",
|
||||
info.getAudioMimetypes().toArray(new String[0])
|
||||
));
|
||||
|
||||
// Send supported video formats
|
||||
writer.writeInstruction(
|
||||
new GuacamoleInstruction(
|
||||
"video",
|
||||
info.getVideoMimetypes().toArray(new String[0])
|
||||
));
|
||||
|
||||
// Send args
|
||||
writer.writeInstruction(new GuacamoleInstruction("connect", arg_values));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the GuacamoleConfiguration used to configure this
|
||||
* ConfiguredGuacamoleSocket.
|
||||
*
|
||||
* @return The GuacamoleConfiguration used to configure this
|
||||
* ConfiguredGuacamoleSocket.
|
||||
*/
|
||||
public GuacamoleConfiguration getConfiguration() {
|
||||
return config;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuacamoleWriter getWriter() {
|
||||
return socket.getWriter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuacamoleReader getReader() {
|
||||
return socket.getReader();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws GuacamoleException {
|
||||
socket.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpen() {
|
||||
return socket.isOpen();
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,125 @@
|
||||
|
||||
package org.glyptodon.guacamole.protocol;
|
||||
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is guacamole-common.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Michael Jumper.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* An abstract representation of Guacamole client information, including all
|
||||
* information required by the Guacamole protocol during the preamble.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class GuacamoleClientInformation {
|
||||
|
||||
/**
|
||||
* The optimal screen width requested by the client, in pixels.
|
||||
*/
|
||||
private int optimalScreenWidth = 1024;
|
||||
|
||||
/**
|
||||
* The optimal screen height requested by the client, in pixels.
|
||||
*/
|
||||
private int optimalScreenHeight = 768;
|
||||
|
||||
/**
|
||||
* The list of audio mimetypes reported by the client to be supported.
|
||||
*/
|
||||
private List<String> audioMimetypes = new ArrayList<String>();
|
||||
|
||||
/**
|
||||
* The list of audio mimetypes reported by the client to be supported.
|
||||
*/
|
||||
private List<String> videoMimetypes = new ArrayList<String>();
|
||||
|
||||
/**
|
||||
* Returns the optimal screen width requested by the client, in pixels.
|
||||
* @return The optimal screen width requested by the client, in pixels.
|
||||
*/
|
||||
public int getOptimalScreenWidth() {
|
||||
return optimalScreenWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the client's optimal screen width.
|
||||
* @param optimalScreenWidth The optimal screen width of the client.
|
||||
*/
|
||||
public void setOptimalScreenWidth(int optimalScreenWidth) {
|
||||
this.optimalScreenWidth = optimalScreenWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the optimal screen height requested by the client, in pixels.
|
||||
* @return The optimal screen height requested by the client, in pixels.
|
||||
*/
|
||||
public int getOptimalScreenHeight() {
|
||||
return optimalScreenHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the client's optimal screen height.
|
||||
* @param optimalScreenHeight The optimal screen height of the client.
|
||||
*/
|
||||
public void setOptimalScreenHeight(int optimalScreenHeight) {
|
||||
this.optimalScreenHeight = optimalScreenHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of audio mimetypes supported by the client. To add or
|
||||
* removed supported mimetypes, the list returned by this function can be
|
||||
* modified.
|
||||
*
|
||||
* @return The set of audio mimetypes supported by the client.
|
||||
*/
|
||||
public List<String> getAudioMimetypes() {
|
||||
return audioMimetypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of video mimetypes supported by the client. To add or
|
||||
* removed supported mimetypes, the list returned by this function can be
|
||||
* modified.
|
||||
*
|
||||
* @return The set of video mimetypes supported by the client.
|
||||
*/
|
||||
public List<String> getVideoMimetypes() {
|
||||
return videoMimetypes;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,125 @@
|
||||
|
||||
package org.glyptodon.guacamole.protocol;
|
||||
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is guacamole-common.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Michael Jumper.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* All information necessary to complete the initial protocol handshake of a
|
||||
* Guacamole session.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class GuacamoleConfiguration implements Serializable {
|
||||
|
||||
/**
|
||||
* Identifier unique to this version of GuacamoleConfiguration.
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* The name of the protocol associated with this configuration.
|
||||
*/
|
||||
private String protocol;
|
||||
|
||||
/**
|
||||
* Map of all associated parameter values, indexed by parameter name.
|
||||
*/
|
||||
private Map<String, String> parameters = new HashMap<String, String>();
|
||||
|
||||
/**
|
||||
* Returns the name of the protocol to be used.
|
||||
* @return The name of the protocol to be used.
|
||||
*/
|
||||
public String getProtocol() {
|
||||
return protocol;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the protocol to be used.
|
||||
* @param protocol The name of the protocol to be used.
|
||||
*/
|
||||
public void setProtocol(String protocol) {
|
||||
this.protocol = protocol;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value set for the parameter with the given name, if any.
|
||||
* @param name The name of the parameter to return the value for.
|
||||
* @return The value of the parameter with the given name, or null if
|
||||
* that parameter has not been set.
|
||||
*/
|
||||
public String getParameter(String name) {
|
||||
return parameters.get(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value for the parameter with the given name.
|
||||
*
|
||||
* @param name The name of the parameter to set the value for.
|
||||
* @param value The value to set for the parameter with the given name.
|
||||
*/
|
||||
public void setParameter(String name, String value) {
|
||||
parameters.put(name, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the value set for the parameter with the given name.
|
||||
*
|
||||
* @param name The name of the parameter to remove the value of.
|
||||
*/
|
||||
public void unsetParameter(String name) {
|
||||
parameters.remove(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a set of all currently defined parameter names. Each name
|
||||
* corresponds to a parameter that has a value set on this
|
||||
* GuacamoleConfiguration via setParameter().
|
||||
*
|
||||
* @return A set of all currently defined parameter names.
|
||||
*/
|
||||
public Set<String> getParameterNames() {
|
||||
return Collections.unmodifiableSet(parameters.keySet());
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,127 @@
|
||||
|
||||
package org.glyptodon.guacamole.protocol;
|
||||
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is guacamole-common.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Michael Jumper.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2010
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* An abstract representation of a Guacamole instruction, as defined by the
|
||||
* Guacamole protocol.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class GuacamoleInstruction {
|
||||
|
||||
/**
|
||||
* The opcode of this instruction.
|
||||
*/
|
||||
private String opcode;
|
||||
|
||||
/**
|
||||
* All arguments of this instruction, in order.
|
||||
*/
|
||||
private List<String> args;
|
||||
|
||||
/**
|
||||
* Creates a new GuacamoleInstruction having the given Operation and
|
||||
* list of arguments values.
|
||||
*
|
||||
* @param opcode The opcode of the instruction to create.
|
||||
* @param args The list of argument values to provide in the new
|
||||
* instruction if any.
|
||||
*/
|
||||
public GuacamoleInstruction(String opcode, String... args) {
|
||||
this.opcode = opcode;
|
||||
this.args = Collections.unmodifiableList(Arrays.asList(args));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the opcode associated with this GuacamoleInstruction.
|
||||
* @return The opcode associated with this GuacamoleInstruction.
|
||||
*/
|
||||
public String getOpcode() {
|
||||
return opcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a List of all argument values specified for this
|
||||
* GuacamoleInstruction. Note that the List returned is immutable.
|
||||
* Attempts to modify the list will result in exceptions.
|
||||
*
|
||||
* @return A List of all argument values specified for this
|
||||
* GuacamoleInstruction.
|
||||
*/
|
||||
public List<String> getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this GuacamoleInstruction in the form it would be sent over the
|
||||
* Guacamole protocol.
|
||||
*
|
||||
* @return This GuacamoleInstruction in the form it would be sent over the
|
||||
* Guacamole protocol.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
StringBuilder buff = new StringBuilder();
|
||||
|
||||
// Write opcode
|
||||
buff.append(opcode.length());
|
||||
buff.append('.');
|
||||
buff.append(opcode);
|
||||
|
||||
// Write argument values
|
||||
for (String value : args) {
|
||||
buff.append(',');
|
||||
buff.append(value.length());
|
||||
buff.append('.');
|
||||
buff.append(value);
|
||||
}
|
||||
|
||||
// Write terminator
|
||||
buff.append(';');
|
||||
|
||||
return buff.toString();
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,6 @@
|
||||
|
||||
/**
|
||||
* Classes relating directly to the Guacamole protocol.
|
||||
*/
|
||||
package org.glyptodon.guacamole.protocol;
|
||||
|
Reference in New Issue
Block a user