mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 17:13:21 +00:00 
			
		
		
		
	GUACAMOLE-5: Display share links within Guacamole menu. Persist within ManagedClient.
This commit is contained in:
		| @@ -28,7 +28,6 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams | ||||
|     var ManagedClientState = $injector.get('ManagedClientState'); | ||||
|     var ManagedFilesystem  = $injector.get('ManagedFilesystem'); | ||||
|     var ScrollState        = $injector.get('ScrollState'); | ||||
|     var UserCredentials    = $injector.get('UserCredentials'); | ||||
|  | ||||
|     // Required services | ||||
|     var $location             = $injector.get('$location'); | ||||
| @@ -435,26 +434,42 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams | ||||
|     /** | ||||
|      * Produces a sharing link for the current connection using the given | ||||
|      * sharing profile. The resulting sharing link, and any required login | ||||
|      * information, will be displayed to the user once the various underlying | ||||
|      * service calls succeed. | ||||
|      * information, will be displayed to the user within the Guacamole menu. | ||||
|      * | ||||
|      * @param {SharingProfile} sharingProfile | ||||
|      *     The sharing profile to use to generate the sharing link. | ||||
|      */ | ||||
|     $scope.share = function share(sharingProfile) { | ||||
|         ManagedClient.createShareLink($scope.client, sharingProfile); | ||||
|     }; | ||||
|  | ||||
|         // Retrieve sharing credentials for the sake of generating a share link | ||||
|         tunnelService.getSharingCredentials($scope.client.tunnel.uuid, sharingProfile.identifier) | ||||
|         .success(function sharingCredentialsReceived(sharingCredentials) { | ||||
|     /** | ||||
|      * Returns whether the current connection has any associated share links. | ||||
|      * | ||||
|      * @returns {Boolean} | ||||
|      *     true if the current connection has at least one associated share | ||||
|      *     link, false otherwise. | ||||
|      */ | ||||
|     $scope.isShared = function isShared() { | ||||
|         return ManagedClient.isShared($scope.client); | ||||
|     }; | ||||
|  | ||||
|             // TODONT: COMPLETE HACK: Shove the share link into the clipboard | ||||
|             var href = UserCredentials.getLink(sharingCredentials); | ||||
|             $scope.client.clipboardData = { | ||||
|                 'type' : 'text/plain', | ||||
|                 'data' : href | ||||
|             }; | ||||
|     /** | ||||
|      * Returns the total number of share links associated with the current | ||||
|      * connection. | ||||
|      * | ||||
|      * @returns {Number} | ||||
|      *     The total number of share links associated with the current | ||||
|      *     connection. | ||||
|      */ | ||||
|     $scope.getShareLinkCount = function getShareLinkCount() { | ||||
|  | ||||
|         }); | ||||
|         // Count total number of links within the ManagedClient's share link map | ||||
|         var linkCount = 0; | ||||
|         for (var dummy in $scope.client.shareLinks) | ||||
|             linkCount++; | ||||
|  | ||||
|         return linkCount; | ||||
|  | ||||
|     }; | ||||
|  | ||||
|   | ||||
| @@ -171,3 +171,31 @@ | ||||
| #guac-menu #devices .device.filesystem { | ||||
|     background-image: url('images/drive.png'); | ||||
| } | ||||
|  | ||||
| #guac-menu #share-links { | ||||
|  | ||||
|     padding: 1em; | ||||
|     border: 1px solid rgba(0, 0, 0, 0.125); | ||||
|     background: rgba(0, 0, 0, 0.04); | ||||
|  | ||||
|     font-size: 0.8em; | ||||
|  | ||||
| } | ||||
|  | ||||
| #guac-menu #share-links h3 { | ||||
|     padding-bottom: 0; | ||||
| } | ||||
|  | ||||
| #guac-menu #share-links th { | ||||
|     white-space: nowrap; | ||||
| } | ||||
|  | ||||
| #guac-menu #share-links a[href] { | ||||
|  | ||||
|     display: block; | ||||
|     padding: 0 1em; | ||||
|  | ||||
|     font-family: monospace; | ||||
|     font-weight: bold; | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -44,7 +44,7 @@ | ||||
|             <div class="header"> | ||||
|                 <h2>{{client.name}}</h2> | ||||
|                 <div class="share-menu" ng-show="canShareConnection()"> | ||||
|                     <guac-menu title="'CLIENT.ACTION_SHARE' | translate"> | ||||
|                     <guac-menu menu-title="'CLIENT.ACTION_SHARE' | translate"> | ||||
|                         <ul ng-repeat="sharingProfile in sharingProfiles"> | ||||
|                             <li><a ng-click="share(sharingProfile)">{{sharingProfile.name}}</a></li> | ||||
|                         </ul> | ||||
| @@ -56,6 +56,22 @@ | ||||
|             <!-- Scrollable body --> | ||||
|             <div class="menu-body" guac-touch-drag="menuDrag" guac-scroll="menu.scrollState"> | ||||
|  | ||||
|                 <!-- Connection sharing --> | ||||
|                 <div class="menu-section" id="share-links" ng-show="isShared()"> | ||||
|                     <div class="content"> | ||||
|                         <h3>{{'CLIENT.INFO_CONNECTION_SHARED' | translate}}</h3> | ||||
|                         <p class="description" | ||||
|                            translate="CLIENT.HELP_SHARE_LINK" | ||||
|                            translate-values="{LINKS : getShareLinkCount()}"></p> | ||||
|                         <table> | ||||
|                             <tr ng-repeat="link in client.shareLinks | orderBy: name"> | ||||
|                                 <th>{{link.name}}</th> | ||||
|                                 <td><a href="{{link.href}}" target="_blank">{{link.href}}</a></td> | ||||
|                             </tr> | ||||
|                         </table> | ||||
|                     </div> | ||||
|                 </div> | ||||
|  | ||||
|                 <!-- Clipboard --> | ||||
|                 <div class="menu-section" id="clipboard-settings"> | ||||
|                     <h3>{{'CLIENT.SECTION_HEADER_CLIPBOARD' | translate}}</h3> | ||||
|   | ||||
| @@ -31,6 +31,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', | ||||
|     var ManagedDisplay       = $injector.get('ManagedDisplay'); | ||||
|     var ManagedFilesystem    = $injector.get('ManagedFilesystem'); | ||||
|     var ManagedFileUpload    = $injector.get('ManagedFileUpload'); | ||||
|     var ManagedShareLink     = $injector.get('ManagedShareLink'); | ||||
|  | ||||
|     // Required services | ||||
|     var $document              = $injector.get('$document'); | ||||
| @@ -125,6 +126,15 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', | ||||
|          */ | ||||
|         this.filesystems = template.filesystems || []; | ||||
|  | ||||
|         /** | ||||
|          * All available share links generated for the this ManagedClient via | ||||
|          * ManagedClient.createShareLink(). Each resulting share link is stored | ||||
|          * under the identifier of its corresponding SharingProfile. | ||||
|          * | ||||
|          * @type Object.<String, ManagedShareLink> | ||||
|          */ | ||||
|         this.shareLinks = template.shareLinks || {}; | ||||
|  | ||||
|         /** | ||||
|          * The current state of the Guacamole client (idle, connecting, | ||||
|          * connected, terminated with error, etc.). | ||||
| @@ -585,6 +595,62 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Produces a sharing link for the given ManagedClient using the given | ||||
|      * sharing profile. The resulting sharing link, and any required login | ||||
|      * information, can be retrieved from the <code>shareLinks</code> property | ||||
|      * of the given ManagedClient once the various underlying service calls | ||||
|      * succeed. | ||||
|      * | ||||
|      * @param {ManagedClient} client | ||||
|      *     The ManagedClient which will be shared via the generated sharing | ||||
|      *     link. | ||||
|      * | ||||
|      * @param {SharingProfile} sharingProfile | ||||
|      *     The sharing profile to use to generate the sharing link. | ||||
|      * | ||||
|      * @returns {Promise} | ||||
|      *     A Promise which is resolved once the sharing link has been | ||||
|      *     successfully generated, and rejected if generating the link fails. | ||||
|      */ | ||||
|     ManagedClient.createShareLink = function createShareLink(client, sharingProfile) { | ||||
|  | ||||
|         // Retrieve sharing credentials for the sake of generating a share link | ||||
|         var credentialRequest = tunnelService.getSharingCredentials( | ||||
|                 client.tunnel.uuid, sharingProfile.identifier); | ||||
|  | ||||
|         // Add a new share link once the credentials are ready | ||||
|         credentialRequest.success(function sharingCredentialsReceived(sharingCredentials) { | ||||
|             client.shareLinks[sharingProfile.identifier] = | ||||
|                 ManagedShareLink.getInstance(sharingProfile, sharingCredentials); | ||||
|         }); | ||||
|  | ||||
|         return credentialRequest; | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Returns whether the given ManagedClient is being shared. A ManagedClient | ||||
|      * is shared if it has any associated share links. | ||||
|      * | ||||
|      * @param {ManagedClient} client | ||||
|      *     The ManagedClient to check. | ||||
|      * | ||||
|      * @returns {Boolean} | ||||
|      *     true if the ManagedClient has at least one associated share link, | ||||
|      *     false otherwise. | ||||
|      */ | ||||
|     ManagedClient.isShared = function isShared(client) { | ||||
|  | ||||
|         // The connection is shared if at least one share link exists | ||||
|         for (var dummy in client.shareLinks) | ||||
|             return true; | ||||
|  | ||||
|         // No share links currently exist | ||||
|         return false; | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     return ManagedClient; | ||||
|  | ||||
| }]); | ||||
							
								
								
									
										105
									
								
								guacamole/src/main/webapp/app/client/types/ManagedShareLink.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								guacamole/src/main/webapp/app/client/types/ManagedShareLink.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| /* | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Provides the ManagedShareLink class used by ManagedClient to represent | ||||
|  * generated connection sharing links. | ||||
|  */ | ||||
| angular.module('client').factory('ManagedShareLink', ['$injector', | ||||
|     function defineManagedShareLink($injector) { | ||||
|  | ||||
|     // Required types | ||||
|     var UserCredentials = $injector.get('UserCredentials'); | ||||
|  | ||||
|     /** | ||||
|      * Object which represents a link which can be used to gain access to an | ||||
|      * active Guacamole connection. | ||||
|      *  | ||||
|      * @constructor | ||||
|      * @param {ManagedShareLink|Object} [template={}] | ||||
|      *     The object whose properties should be copied within the new | ||||
|      *     ManagedShareLink. | ||||
|      */ | ||||
|     var ManagedShareLink = function ManagedShareLink(template) { | ||||
|  | ||||
|         // Use empty object by default | ||||
|         template = template || {}; | ||||
|  | ||||
|         /** | ||||
|          * The human-readable display name of this share link. | ||||
|          * | ||||
|          * @type String | ||||
|          */ | ||||
|         this.name = template.name; | ||||
|  | ||||
|         /** | ||||
|          * The actual URL of the link which can be used to access the shared | ||||
|          * connection. | ||||
|          * | ||||
|          * @type String | ||||
|          */ | ||||
|         this.href = template.href; | ||||
|  | ||||
|         /** | ||||
|          * The sharing profile which was used to generate the share link. | ||||
|          * | ||||
|          * @type SharingProfile | ||||
|          */ | ||||
|         this.sharingProfile = template.sharingProfile; | ||||
|  | ||||
|         /** | ||||
|          * The credentials from which the share link was derived. | ||||
|          * | ||||
|          * @type UserCredentials | ||||
|          */ | ||||
|         this.sharingCredentials = template.sharingCredentials; | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new ManagedShareLink from a set of UserCredentials and the | ||||
|      * SharingProfile which was used to generate those UserCredentials. | ||||
|      *  | ||||
|      * @param {SharingProfile} sharingProfile | ||||
|      *     The SharingProfile which was used, via the REST API, to generate the | ||||
|      *     given UserCredentials. | ||||
|      *  | ||||
|      * @param {UserCredentials} sharingCredentials | ||||
|      *     The UserCredentials object returned by the REST API in response to a | ||||
|      *     request to share a connection using the given SharingProfile. | ||||
|      * | ||||
|      * @return {ManagedShareLink} | ||||
|      *     A new ManagedShareLink object can be used to access the connection | ||||
|      *     shared via the given SharingProfile and resulting UserCredentials. | ||||
|      */ | ||||
|     ManagedShareLink.getInstance = function getInstance(sharingProfile, sharingCredentials) { | ||||
|  | ||||
|         // Generate new share link using the given profile and credentials | ||||
|         return new ManagedShareLink({ | ||||
|             'name'               : sharingProfile.name, | ||||
|             'href'               : UserCredentials.getLink(sharingCredentials), | ||||
|             'sharingProfile'     : sharingProfile, | ||||
|             'sharingCredentials' : sharingCredentials | ||||
|         }); | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     return ManagedShareLink; | ||||
|  | ||||
| }]); | ||||
		Reference in New Issue
	
	Block a user