From 7ea4af7016152ceb9154e9c2aa54bf5d25caab17 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 16 Jul 2016 00:37:52 -0700 Subject: [PATCH] GUACAMOLE-5: Provide direct access via REST to the sharing profiles available for the active connection of a given tunnel. --- .../rest/connection/ConnectionResource.java | 43 ++++++++++ .../webapp/app/rest/services/tunnelService.js | 30 +++++++ .../webapp/app/rest/types/SharingProfile.js | 85 +++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 guacamole/src/main/webapp/app/rest/types/SharingProfile.js diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java index 9238af15e..4d257701d 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java @@ -19,6 +19,7 @@ package org.apache.guacamole.rest.connection; +import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; import java.util.ArrayList; @@ -34,6 +35,8 @@ import org.apache.guacamole.GuacamoleSecurityException; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; +import org.apache.guacamole.rest.directory.DirectoryView; +import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.net.auth.permission.ObjectPermission; @@ -44,6 +47,9 @@ import org.apache.guacamole.rest.history.APIConnectionRecord; import org.apache.guacamole.protocol.GuacamoleConfiguration; import org.apache.guacamole.rest.directory.DirectoryObjectResource; import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; +import org.apache.guacamole.rest.directory.DirectoryResource; +import org.apache.guacamole.rest.directory.DirectoryResourceFactory; +import org.apache.guacamole.rest.sharingprofile.APISharingProfile; /** * A REST resource which abstracts the operations available on an existing @@ -66,6 +72,14 @@ public class ConnectionResource extends DirectoryObjectResource + sharingProfileDirectoryResourceFactory; + /** * Creates a new ConnectionResource which exposes the operations and * subresources available for the given Connection. @@ -152,4 +166,33 @@ public class ConnectionResource extends DirectoryObjectResource + getSharingProfileDirectoryResource() throws GuacamoleException { + + // Produce subset of all SharingProfiles, containing only those which + // are associated with this connection + Directory sharingProfiles = new DirectoryView( + userContext.getSharingProfileDirectory(), + connection.getSharingProfileIdentifiers() + ); + + // Return a new resource which provides access to only those SharingProfiles + return sharingProfileDirectoryResourceFactory.create(userContext, sharingProfiles); + + } + } diff --git a/guacamole/src/main/webapp/app/rest/services/tunnelService.js b/guacamole/src/main/webapp/app/rest/services/tunnelService.js index 1395b2581..b9dc0cd47 100644 --- a/guacamole/src/main/webapp/app/rest/services/tunnelService.js +++ b/guacamole/src/main/webapp/app/rest/services/tunnelService.js @@ -68,6 +68,36 @@ angular.module('rest').factory('tunnelService', ['$injector', }; + /** + * Retrieves the set of sharing profiles that the current user can use to + * share the active connection of the given tunnel. + * + * @param {String} tunnel + * The UUID of the tunnel associated with the Guacamole connection + * whose sharing profiles are being retrieved. + * + * @returns {Promise.>} + * A promise which will resolve with a map of @link{SharingProfile} + * objects where each key is the identifier of the corresponding + * sharing profile. + */ + service.getSharingProfiles = function getSharingProfiles(tunnel) { + + // Build HTTP parameters set + var httpParameters = { + token : authenticationService.getCurrentToken() + }; + + // Retrieve all associated sharing profiles + return $http({ + method : 'GET', + url : 'api/session/tunnels/' + encodeURIComponent(tunnel) + + '/activeConnection/connection/sharingProfiles', + params : httpParameters + }); + + }; + /** * Makes a request to the REST API to generate credentials which have * access strictly to the active connection associated with the given diff --git a/guacamole/src/main/webapp/app/rest/types/SharingProfile.js b/guacamole/src/main/webapp/app/rest/types/SharingProfile.js new file mode 100644 index 000000000..ea8287d0a --- /dev/null +++ b/guacamole/src/main/webapp/app/rest/types/SharingProfile.js @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Service which defines the SharingProfile class. + */ +angular.module('rest').factory('SharingProfile', [function defineSharingProfile() { + + /** + * The object returned by REST API calls when representing the data + * associated with a sharing profile. + * + * @constructor + * @param {SharingProfile|Object} [template={}] + * The object whose properties should be copied within the new + * SharingProfile. + */ + var SharingProfile = function SharingProfile(template) { + + // Use empty object by default + template = template || {}; + + /** + * The unique identifier associated with this sharing profile. + * + * @type String + */ + this.identifier = template.identifier; + + /** + * The unique identifier of the connection that this sharing profile + * can be used to share. + * + * @type String + */ + this.primaryConnectionIdentifier = template.primaryConnectionIdentifier; + + /** + * The human-readable name of this sharing profile, which is not + * necessarily unique. + * + * @type String + */ + this.name = template.name; + + /** + * Connection configuration parameters, as dictated by the protocol in + * use by the primary connection, arranged as name/value pairs. This + * information may not be available until directly queried. If this + * information is unavailable, this property will be null or undefined. + * + * @type Object. + */ + this.parameters = template.parameters; + + /** + * Arbitrary name/value pairs which further describe this sharing + * profile. The semantics and validity of these attributes are dictated + * by the extension which defines them. + * + * @type Object. + */ + this.attributes = {}; + + }; + + return SharingProfile; + +}]); \ No newline at end of file