mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	Add support for connecting to groups.
This commit is contained in:
		| @@ -25,11 +25,13 @@ import javax.servlet.ServletException; | |||||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
| import javax.servlet.http.HttpSession; | import javax.servlet.http.HttpSession; | ||||||
|  | import net.sourceforge.guacamole.GuacamoleClientException; | ||||||
| import net.sourceforge.guacamole.GuacamoleException; | import net.sourceforge.guacamole.GuacamoleException; | ||||||
| import net.sourceforge.guacamole.GuacamoleSecurityException; | import net.sourceforge.guacamole.GuacamoleSecurityException; | ||||||
| import net.sourceforge.guacamole.net.GuacamoleSocket; | import net.sourceforge.guacamole.net.GuacamoleSocket; | ||||||
| import net.sourceforge.guacamole.net.GuacamoleTunnel; | import net.sourceforge.guacamole.net.GuacamoleTunnel; | ||||||
| import net.sourceforge.guacamole.net.auth.Connection; | import net.sourceforge.guacamole.net.auth.Connection; | ||||||
|  | import net.sourceforge.guacamole.net.auth.ConnectionGroup; | ||||||
| import net.sourceforge.guacamole.net.auth.Credentials; | import net.sourceforge.guacamole.net.auth.Credentials; | ||||||
| import net.sourceforge.guacamole.net.auth.Directory; | import net.sourceforge.guacamole.net.auth.Directory; | ||||||
| import net.sourceforge.guacamole.net.auth.UserContext; | import net.sourceforge.guacamole.net.auth.UserContext; | ||||||
| @@ -56,6 +58,63 @@ public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet { | |||||||
|      */ |      */ | ||||||
|     private Logger logger = LoggerFactory.getLogger(BasicGuacamoleTunnelServlet.class); |     private Logger logger = LoggerFactory.getLogger(BasicGuacamoleTunnelServlet.class); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * All supported identifier types. | ||||||
|  |      */ | ||||||
|  |     private static enum IdentifierType { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * The unique identifier of a connection. | ||||||
|  |          */ | ||||||
|  |         CONNECTION("c/"), | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * The unique identifier of a connection group. | ||||||
|  |          */ | ||||||
|  |         CONNECTION_GROUP("g/"); | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * The prefix which precedes an identifier of this type. | ||||||
|  |          */ | ||||||
|  |         final String PREFIX; | ||||||
|  |          | ||||||
|  |         /** | ||||||
|  |          * Defines an IdentifierType having the given prefix. | ||||||
|  |          * @param prefix The prefix which will precede any identifier of this | ||||||
|  |          *               type, thus differentiating it from other identifier | ||||||
|  |          *               types. | ||||||
|  |          */ | ||||||
|  |         IdentifierType(String prefix) { | ||||||
|  |             PREFIX = prefix; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * Given an identifier, determines the corresponding identifier type. | ||||||
|  |          *  | ||||||
|  |          * @param identifier The identifier whose type should be identified. | ||||||
|  |          * @return The identified identifier type. | ||||||
|  |          */ | ||||||
|  |         static IdentifierType getType(String identifier) { | ||||||
|  |  | ||||||
|  |             // If null, no known identifier | ||||||
|  |             if (identifier == null) | ||||||
|  |                 return null; | ||||||
|  |  | ||||||
|  |             // Connection identifiers | ||||||
|  |             if (identifier.startsWith(CONNECTION.PREFIX)) | ||||||
|  |                 return CONNECTION; | ||||||
|  |              | ||||||
|  |             // Connection group identifiers | ||||||
|  |             if (identifier.startsWith(CONNECTION_GROUP.PREFIX)) | ||||||
|  |                 return CONNECTION_GROUP; | ||||||
|  |              | ||||||
|  |             // Otherwise, unknown | ||||||
|  |             return null; | ||||||
|  |              | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |     }; | ||||||
|  |      | ||||||
|     @Override |     @Override | ||||||
|     protected void authenticatedService( |     protected void authenticatedService( | ||||||
|             UserContext context, |             UserContext context, | ||||||
| @@ -183,6 +242,14 @@ public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet { | |||||||
|  |  | ||||||
|             // Get ID of connection |             // Get ID of connection | ||||||
|             String id = request.getParameter("id"); |             String id = request.getParameter("id"); | ||||||
|  |             IdentifierType id_type = IdentifierType.getType(id); | ||||||
|  |  | ||||||
|  |             // Do not continue if unable to determine type | ||||||
|  |             if (id_type == null) | ||||||
|  |                 throw new GuacamoleClientException("Illegal identifier - unknown type."); | ||||||
|  |  | ||||||
|  |             // Remove prefix | ||||||
|  |             id = id.substring(id_type.PREFIX.length()); | ||||||
|  |  | ||||||
|             // Get credentials |             // Get credentials | ||||||
|             final Credentials credentials = getCredentials(httpSession); |             final Credentials credentials = getCredentials(httpSession); | ||||||
| @@ -194,19 +261,6 @@ public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet { | |||||||
|             if (context == null || credentials == null) |             if (context == null || credentials == null) | ||||||
|                 throw new GuacamoleSecurityException("Cannot connect - user not logged in."); |                 throw new GuacamoleSecurityException("Cannot connect - user not logged in."); | ||||||
|  |  | ||||||
|             // Get connection directory |  | ||||||
|             Directory<String, Connection> directory = |  | ||||||
|                 context.getRootConnectionGroup().getConnectionDirectory(); |  | ||||||
|  |  | ||||||
|             // Get authorized connection |  | ||||||
|             Connection connection = directory.get(id); |  | ||||||
|             if (connection == null) { |  | ||||||
|                 logger.warn("Connection id={} not found.", id); |  | ||||||
|                 throw new GuacamoleSecurityException("Requested connection is not authorized."); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             logger.info("Successful connection from {} to \"{}\".", request.getRemoteAddr(), id); |  | ||||||
|  |  | ||||||
|             // Get client information |             // Get client information | ||||||
|             GuacamoleClientInformation info = new GuacamoleClientInformation(); |             GuacamoleClientInformation info = new GuacamoleClientInformation(); | ||||||
|  |  | ||||||
| @@ -230,8 +284,55 @@ public class BasicGuacamoleTunnelServlet extends AuthenticatingHttpServlet { | |||||||
|             if (video_mimetypes != null) |             if (video_mimetypes != null) | ||||||
|                 info.getVideoMimetypes().addAll(Arrays.asList(video_mimetypes)); |                 info.getVideoMimetypes().addAll(Arrays.asList(video_mimetypes)); | ||||||
|  |  | ||||||
|             // Connect socket |             // Create connected socket from identifier | ||||||
|             GuacamoleSocket socket = connection.connect(info); |             GuacamoleSocket socket; | ||||||
|  |             switch (id_type) { | ||||||
|  |  | ||||||
|  |                 // Connection identifiers | ||||||
|  |                 case CONNECTION: { | ||||||
|  |  | ||||||
|  |                     // Get connection directory | ||||||
|  |                     Directory<String, Connection> directory = | ||||||
|  |                         context.getRootConnectionGroup().getConnectionDirectory(); | ||||||
|  |  | ||||||
|  |                     // Get authorized connection | ||||||
|  |                     Connection connection = directory.get(id); | ||||||
|  |                     if (connection == null) { | ||||||
|  |                         logger.warn("Connection id={} not found.", id); | ||||||
|  |                         throw new GuacamoleSecurityException("Requested connection is not authorized."); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     // Connect socket | ||||||
|  |                     socket = connection.connect(info); | ||||||
|  |                     logger.info("Successful connection from {} to \"{}\".", request.getRemoteAddr(), id); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Connection group identifiers | ||||||
|  |                 case CONNECTION_GROUP: { | ||||||
|  |  | ||||||
|  |                     // Get connection group directory | ||||||
|  |                     Directory<String, ConnectionGroup> directory = | ||||||
|  |                         context.getRootConnectionGroup().getConnectionGroupDirectory(); | ||||||
|  |  | ||||||
|  |                     // Get authorized connection group | ||||||
|  |                     ConnectionGroup group = directory.get(id); | ||||||
|  |                     if (group == null) { | ||||||
|  |                         logger.warn("Connection group id={} not found.", id); | ||||||
|  |                         throw new GuacamoleSecurityException("Requested connection group is not authorized."); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     // Connect socket | ||||||
|  |                     socket = group.connect(info); | ||||||
|  |                     logger.info("Successful connection from {} to group \"{}\".", request.getRemoteAddr(), id); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Fail if unsupported type | ||||||
|  |                 default: | ||||||
|  |                     throw new GuacamoleClientException("Connection not supported for provided identifier type."); | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |  | ||||||
|             // Associate socket with tunnel |             // Associate socket with tunnel | ||||||
|             GuacamoleTunnel tunnel = new GuacamoleTunnel(socket) { |             GuacamoleTunnel tunnel = new GuacamoleTunnel(socket) { | ||||||
|   | |||||||
| @@ -108,6 +108,32 @@ GuacUI.removeClass = function(element, classname) { | |||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Opens the connection group having the given ID in a new tab/window. | ||||||
|  |  *  | ||||||
|  |  * @param {String} id The ID of the connection group to open. | ||||||
|  |  * @param {String} parameters Any parameters that should be added to the URL, | ||||||
|  |  *                            for sake of authentication. | ||||||
|  |  */ | ||||||
|  | GuacUI.openConnectionGroup = function(id, parameters) { | ||||||
|  |  | ||||||
|  |     // Get URL | ||||||
|  |     var url = "client.xhtml?id=g/" + encodeURIComponent(id); | ||||||
|  |  | ||||||
|  |     // Add parameters, if given | ||||||
|  |     if (parameters) | ||||||
|  |         url += "&" + parameters; | ||||||
|  |  | ||||||
|  |     // Attempt to focus existing window | ||||||
|  |     var current = window.open(null, id); | ||||||
|  |  | ||||||
|  |     // If window did not already exist, set up as | ||||||
|  |     // Guacamole client | ||||||
|  |     if (!current.GuacUI) | ||||||
|  |         window.open(url, id); | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Opens the connection having the given ID in a new tab/window. |  * Opens the connection having the given ID in a new tab/window. | ||||||
|  *  |  *  | ||||||
| @@ -118,7 +144,7 @@ GuacUI.removeClass = function(element, classname) { | |||||||
| GuacUI.openConnection = function(id, parameters) { | GuacUI.openConnection = function(id, parameters) { | ||||||
|  |  | ||||||
|     // Get URL |     // Get URL | ||||||
|     var url = "client.xhtml?id=" + encodeURIComponent(id); |     var url = "client.xhtml?id=c/" + encodeURIComponent(id); | ||||||
|  |  | ||||||
|     // Add parameters, if given |     // Add parameters, if given | ||||||
|     if (parameters) |     if (parameters) | ||||||
|   | |||||||
| @@ -197,6 +197,15 @@ GuacamoleRootUI.reset = function() { | |||||||
|         GuacUI.openConnection(connection.id, GuacamoleRootUI.parameters); |         GuacUI.openConnection(connection.id, GuacamoleRootUI.parameters); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     // Open connection groups when clicked | ||||||
|  |     group_view.ongroupclick = function(group) { | ||||||
|  |          | ||||||
|  |         // Connect if balancing | ||||||
|  |         if (group.type === GuacamoleService.ConnectionGroup.Type.BALANCING) | ||||||
|  |             GuacUI.openConnectionGroup(group.id, GuacamoleRootUI.parameters); | ||||||
|  |          | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     // Save all connections for later reference |     // Save all connections for later reference | ||||||
|     GuacamoleRootUI.connections = group_view.connections; |     GuacamoleRootUI.connections = group_view.connections; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user