mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-08 06:01:22 +00:00
Implement GuacamoleService.ConnectionGroup. Migrate GuacamoleService.Connections.list to new XML format.
This commit is contained in:
@@ -22,6 +22,74 @@
|
|||||||
*/
|
*/
|
||||||
var GuacamoleService = GuacamoleService || {};
|
var GuacamoleService = GuacamoleService || {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An arbitary Guacamole connection group, having the given type, ID and name.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @param {Number} type The type of this connection group - either ORGANIZATIONAL
|
||||||
|
* or BALANCING.
|
||||||
|
* @param {String} id An arbitrary ID, likely assigned by the auth provider.
|
||||||
|
* @param {String} name The human-readable name of this group.
|
||||||
|
*/
|
||||||
|
GuacamoleService.ConnectionGroup = function(type, id, name) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of this connection group.
|
||||||
|
* @type Number
|
||||||
|
*/
|
||||||
|
this.type = type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique ID of this connection group.
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.id = id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The human-readable name associated with this connection group.
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.name = name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All connection groups contained within this group.
|
||||||
|
* @type GuacamoleService.ConnectionGroup[]
|
||||||
|
*/
|
||||||
|
this.groups = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All connections contained within this group.
|
||||||
|
* @type GuacamoleService.Connection[]
|
||||||
|
*/
|
||||||
|
this.connections = [];
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of all possible types for ConnectionGroups.
|
||||||
|
*/
|
||||||
|
GuacamoleService.ConnectionGroup.Type = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Organizational groups exist solely to hold connections or other groups,
|
||||||
|
* and provide no other semantics.
|
||||||
|
*
|
||||||
|
* @type Number
|
||||||
|
*/
|
||||||
|
"ORGANIZATIONAL" : 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Balancing groups act as connections. Users that have READ permission on
|
||||||
|
* balancing groups can use the group as if it were a connection, and that
|
||||||
|
* group will choose an appropriate connection within itself for that user
|
||||||
|
* to use.
|
||||||
|
*
|
||||||
|
* @type Number
|
||||||
|
*/
|
||||||
|
"BALANCING" : 1
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An arbitrary Guacamole connection, consisting of an ID/protocol pair.
|
* An arbitrary Guacamole connection, consisting of an ID/protocol pair.
|
||||||
*
|
*
|
||||||
@@ -52,23 +120,13 @@ GuacamoleService.Connection = function(protocol, id, name) {
|
|||||||
*/
|
*/
|
||||||
this.parameters = {};
|
this.parameters = {};
|
||||||
|
|
||||||
/**
|
|
||||||
* The hierarchy of groups containing this connection. The first element
|
|
||||||
* in this array is the highest-level group. If the connection is within
|
|
||||||
* the root group, this array will be empty.
|
|
||||||
*
|
|
||||||
* @type String[]
|
|
||||||
*/
|
|
||||||
this.path = name.split("/");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of this connection. This name is arbitrary and local to the
|
* The name of this connection. This name is arbitrary and local to the
|
||||||
* group containing the connection. If the connection is in the root
|
* group containing the connection.
|
||||||
* group, this name will be effectively equal to the ID.
|
|
||||||
*
|
*
|
||||||
* @type String
|
* @type String
|
||||||
*/
|
*/
|
||||||
this.name = guac_connection.path.pop();
|
this.name = name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An array of GuacamoleService.Connection.Record listing the usage
|
* An array of GuacamoleService.Connection.Record listing the usage
|
||||||
@@ -249,24 +307,153 @@ GuacamoleService.handleResponse = function(xhr) {
|
|||||||
GuacamoleService.Connections = {
|
GuacamoleService.Connections = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparator which compares two GuacamoleService.Connection objects.
|
* Comparator which compares two arbitrary objects by their name property.
|
||||||
*/
|
*/
|
||||||
"comparator" : function(a, b) {
|
"comparator" : function(a, b) {
|
||||||
return a.name.localeCompare(b.name);
|
return a.name.localeCompare(b.name);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array of Connections for which the current user has access.
|
* Returns the root connection group, containing a hierarchy of all other
|
||||||
|
* groups and connections for which the current user has access.
|
||||||
*
|
*
|
||||||
* @param {String} parameters Any parameters which should be passed to the
|
* @param {String} parameters Any parameters which should be passed to the
|
||||||
* server for the sake of authentication
|
* server for the sake of authentication
|
||||||
* (optional).
|
* (optional).
|
||||||
* @return {GuacamoleService.Connection[]} An array of Connections for
|
* @return {GuacamoleService.ConnectionGroup} The root group, containing
|
||||||
|
* a hierarchy of all other
|
||||||
|
* groups and connections to
|
||||||
* which the current user has
|
* which the current user has
|
||||||
* access.
|
* access.
|
||||||
*/
|
*/
|
||||||
"list" : function(parameters) {
|
"list" : function(parameters) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the contents of the given connection element within XML,
|
||||||
|
* returning a corresponding GuacamoleService.Connection.
|
||||||
|
*
|
||||||
|
* @param {Element} element
|
||||||
|
* @return {GuacamoleService.Connection} The connection represented by
|
||||||
|
* the element just parsed.
|
||||||
|
*/
|
||||||
|
function parseConnection(element) {
|
||||||
|
|
||||||
|
var i;
|
||||||
|
|
||||||
|
var connection = new GuacamoleService.Connection(
|
||||||
|
element.getAttribute("protocol"),
|
||||||
|
element.getAttribute("id"),
|
||||||
|
element.getAttribute("name")
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add parameter values for each parmeter received
|
||||||
|
var paramElements = element.getElementsByTagName("param");
|
||||||
|
for (i=0; i<paramElements.length; i++) {
|
||||||
|
|
||||||
|
var paramElement = paramElements[i];
|
||||||
|
var name = paramElement.getAttribute("name");
|
||||||
|
|
||||||
|
connection.parameters[name] = paramElement.textContent;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse history, if available
|
||||||
|
var historyElements = element.getElementsByTagName("history");
|
||||||
|
if (historyElements.length === 1) {
|
||||||
|
|
||||||
|
// For each record in history
|
||||||
|
var history = historyElements[0];
|
||||||
|
var recordElements = history.getElementsByTagName("record");
|
||||||
|
for (i=0; i<recordElements.length; i++) {
|
||||||
|
|
||||||
|
// Get record
|
||||||
|
var recordElement = recordElements[i];
|
||||||
|
var record = new GuacamoleService.Connection.Record(
|
||||||
|
recordElement.textContent,
|
||||||
|
parseInt(recordElement.getAttribute("start")),
|
||||||
|
parseInt(recordElement.getAttribute("end")),
|
||||||
|
recordElement.getAttribute("active") === "yes"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Append to connection history
|
||||||
|
connection.history.push(record);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return parsed connection
|
||||||
|
return connection;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively parse the contents of the given group element within XML,
|
||||||
|
* returning a corresponding GuacamoleService.ConnectionGroup.
|
||||||
|
*
|
||||||
|
* @param {Element} element
|
||||||
|
* @return {GuacamoleService.ConnectionGroup} The connection group
|
||||||
|
* represented by the element
|
||||||
|
* just parsed.
|
||||||
|
*/
|
||||||
|
function parseGroup(element) {
|
||||||
|
|
||||||
|
var id = element.getAttribute("id");
|
||||||
|
var name = element.getAttribute("name");
|
||||||
|
var type_string = element.getAttribute("name");
|
||||||
|
|
||||||
|
// Translate type name
|
||||||
|
var type;
|
||||||
|
if (type_string === "organizational")
|
||||||
|
type = GuacamoleService.ConnectionGroup.Type.ORGANIZATIONAL;
|
||||||
|
else if (type_string === "balancing")
|
||||||
|
type = GuacamoleService.ConnectionGroup.Type.BALANCING;
|
||||||
|
|
||||||
|
// Create corresponding group
|
||||||
|
var group = new GuacamoleService.ConnectionGroup(type, id, name);
|
||||||
|
|
||||||
|
// For each child element
|
||||||
|
var current = element.firstChild;
|
||||||
|
while (current !== null) {
|
||||||
|
|
||||||
|
var i, child;
|
||||||
|
var children = current.childNodes;
|
||||||
|
|
||||||
|
if (current.localName === "connections") {
|
||||||
|
|
||||||
|
// Parse all child connections
|
||||||
|
for (i=0; i<children.length; i++) {
|
||||||
|
var child = children[i];
|
||||||
|
if (child.localName === "connection")
|
||||||
|
group.connections.push(parseConnection(child));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (current.localName === "groups") {
|
||||||
|
|
||||||
|
// Parse all child groups
|
||||||
|
for (i=0; i<children.length; i++) {
|
||||||
|
var child = children[i];
|
||||||
|
if (child.localName === "group")
|
||||||
|
group.groups.push(parseGroup(child));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next element
|
||||||
|
current = current.nextSibling;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort groups and connections
|
||||||
|
group.groups.sort(GuacamoleService.Connections.comparator);
|
||||||
|
group.connections.sort(GuacamoleService.Connections.comparator);
|
||||||
|
|
||||||
|
// Return created group
|
||||||
|
return group;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Construct request URL
|
// Construct request URL
|
||||||
var list_url = "connections";
|
var list_url = "connections";
|
||||||
if (parameters) list_url += "?" + parameters;
|
if (parameters) list_url += "?" + parameters;
|
||||||
@@ -278,68 +465,7 @@ GuacamoleService.Connections = {
|
|||||||
|
|
||||||
// Handle response
|
// Handle response
|
||||||
GuacamoleService.handleResponse(xhr);
|
GuacamoleService.handleResponse(xhr);
|
||||||
|
return parseGroup(xhr.responseXML.documentElement);
|
||||||
// Otherwise, get list
|
|
||||||
var connections = new Array();
|
|
||||||
|
|
||||||
var connectionElements = xhr.responseXML.getElementsByTagName("connection");
|
|
||||||
for (var i=0; i<connectionElements.length; i++) {
|
|
||||||
|
|
||||||
// Create connection for each connection element
|
|
||||||
var connectionElement = connectionElements[i];
|
|
||||||
var connection = new GuacamoleService.Connection(
|
|
||||||
connectionElement.getAttribute("protocol"),
|
|
||||||
connectionElement.getAttribute("id"),
|
|
||||||
connectionElement.getAttribute("name")
|
|
||||||
)
|
|
||||||
|
|
||||||
var j;
|
|
||||||
|
|
||||||
// Add parameter values for each pameter received
|
|
||||||
var paramElements = connectionElement.getElementsByTagName("param");
|
|
||||||
for (j=0; j<paramElements.length; j++) {
|
|
||||||
|
|
||||||
var paramElement = paramElements[j];
|
|
||||||
var name = paramElement.getAttribute("name");
|
|
||||||
|
|
||||||
connection.parameters[name] = paramElement.textContent;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse history, if available
|
|
||||||
var historyElements = connectionElement.getElementsByTagName("history");
|
|
||||||
if (historyElements.length == 1) {
|
|
||||||
|
|
||||||
// For each record in history
|
|
||||||
var history = historyElements[0];
|
|
||||||
var recordElements = history.getElementsByTagName("record");
|
|
||||||
for (j=0; j<recordElements.length; j++) {
|
|
||||||
|
|
||||||
// Get record
|
|
||||||
var recordElement = recordElements[j];
|
|
||||||
var record = new GuacamoleService.Connection.Record(
|
|
||||||
recordElement.textContent,
|
|
||||||
parseInt(recordElement.getAttribute("start")),
|
|
||||||
parseInt(recordElement.getAttribute("end")),
|
|
||||||
recordElement.getAttribute("active") == "yes"
|
|
||||||
);
|
|
||||||
|
|
||||||
// Append to connection history
|
|
||||||
connection.history.push(record);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add connection
|
|
||||||
connections.push(connection);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort connections by ID
|
|
||||||
connections.sort(GuacamoleService.Connections.comparator);
|
|
||||||
|
|
||||||
return connections;
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user