GUACAMOLE-5: Add sharing support to the Guacamole client UI.

This commit is contained in:
Michael Jumper
2016-07-25 02:28:56 -07:00
parent 3484d32302
commit 91254f7f98
3 changed files with 79 additions and 0 deletions

View File

@@ -28,6 +28,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
var ManagedClientState = $injector.get('ManagedClientState'); var ManagedClientState = $injector.get('ManagedClientState');
var ManagedFilesystem = $injector.get('ManagedFilesystem'); var ManagedFilesystem = $injector.get('ManagedFilesystem');
var ScrollState = $injector.get('ScrollState'); var ScrollState = $injector.get('ScrollState');
var UserCredentials = $injector.get('UserCredentials');
// Required services // Required services
var $location = $injector.get('$location'); var $location = $injector.get('$location');
@@ -36,6 +37,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
var guacClientManager = $injector.get('guacClientManager'); var guacClientManager = $injector.get('guacClientManager');
var guacNotification = $injector.get('guacNotification'); var guacNotification = $injector.get('guacNotification');
var preferenceService = $injector.get('preferenceService'); var preferenceService = $injector.get('preferenceService');
var tunnelService = $injector.get('tunnelService');
var userPageService = $injector.get('userPageService'); var userPageService = $injector.get('userPageService');
/** /**
@@ -235,6 +237,15 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
*/ */
$scope.client = guacClientManager.getManagedClient($routeParams.id, $routeParams.params); $scope.client = guacClientManager.getManagedClient($routeParams.id, $routeParams.params);
/**
* Map of all available sharing profiles for the current connection by
* their identifiers. If this information is not yet available, or no such
* sharing profiles exist, this will be an empty object.
*
* @type Object.<String, SharingProfile>
*/
$scope.sharingProfiles = {};
/** /**
* Map of all currently pressed keys by keysym. If a particular key is * Map of all currently pressed keys by keysym. If a particular key is
* currently pressed, the value stored under that key's keysym within this * currently pressed, the value stored under that key's keysym within this
@@ -406,6 +417,47 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
}); });
// Pull sharing profiles once the tunnel UUID is known
$scope.$watch('client.tunnel.uuid', function retrieveSharingProfiles(uuid) {
// Only pull sharing profiles if tunnel UUID is actually available
if (!uuid)
return;
// Pull sharing profiles for the current connection
tunnelService.getSharingProfiles(uuid)
.success(function sharingProfilesRetrieved(sharingProfiles) {
$scope.sharingProfiles = sharingProfiles;
});
});
/**
* 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.
*
* @param {SharingProfile} sharingProfile
* The sharing profile to use to generate the sharing link.
*/
$scope.share = function share(sharingProfile) {
// Retrieve sharing credentials for the sake of generating a share link
tunnelService.getSharingCredentials($scope.client.tunnel.uuid, sharingProfile.identifier)
.success(function sharingCredentialsReceived(sharingCredentials) {
// TODONT: COMPLETE HACK: Shove the share link into the clipboard
var href = UserCredentials.getLink(sharingCredentials);
$scope.client.clipboardData = {
'type' : 'text/plain',
'data' : href
};
});
};
// Track pressed keys, opening the Guacamole menu after Ctrl+Alt+Shift // Track pressed keys, opening the Guacamole menu after Ctrl+Alt+Shift
$scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) { $scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) {
@@ -762,6 +814,26 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
}; };
/**
* Returns whether the current user can share the current connection with
* other users. A connection can be shared if and only if there is at least
* one associated sharing profile.
*
* @returns {Boolean}
* true if the current user can share the current connection with other
* users, false otherwise.
*/
$scope.canShareConnection = function canShareConnection() {
// If there is at least one sharing profile, the connection can be shared
for (var dummy in $scope.sharingProfiles)
return true;
// Otherwise, sharing is not possible
return false;
};
// Clean up when view destroyed // Clean up when view destroyed
$scope.$on('$destroy', function clientViewDestroyed() { $scope.$on('$destroy', function clientViewDestroyed() {

View File

@@ -43,6 +43,11 @@
<!-- Stationary header --> <!-- Stationary header -->
<div class="header"> <div class="header">
<h2>{{client.name}}</h2> <h2>{{client.name}}</h2>
<guac-menu title="'CLIENT.ACTION_SHARE' | translate" ng-show="canShareConnection()">
<ul ng-repeat="sharingProfile in sharingProfiles">
<li><a ng-click="share(sharingProfile)">{{sharingProfile.name}}</a></li>
</ul>
</guac-menu>
<guac-user-menu local-actions="clientMenuActions"></guac-user-menu> <guac-user-menu local-actions="clientMenuActions"></guac-user-menu>
</div> </div>

View File

@@ -24,6 +24,7 @@
"ACTION_NAVIGATE_HOME" : "Home", "ACTION_NAVIGATE_HOME" : "Home",
"ACTION_SAVE" : "Save", "ACTION_SAVE" : "Save",
"ACTION_SEARCH" : "Search", "ACTION_SEARCH" : "Search",
"ACTION_SHARE" : "Share",
"ACTION_UPDATE_PASSWORD" : "Update Password", "ACTION_UPDATE_PASSWORD" : "Update Password",
"ACTION_VIEW_HISTORY" : "History", "ACTION_VIEW_HISTORY" : "History",
@@ -55,6 +56,7 @@
"ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME", "ACTION_NAVIGATE_HOME" : "@:APP.ACTION_NAVIGATE_HOME",
"ACTION_RECONNECT" : "Reconnect", "ACTION_RECONNECT" : "Reconnect",
"ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE", "ACTION_SAVE_FILE" : "@:APP.ACTION_SAVE",
"ACTION_SHARE" : "@:APP.ACTION_SHARE",
"ACTION_UPLOAD_FILES" : "Upload Files", "ACTION_UPLOAD_FILES" : "Upload Files",
"DIALOG_HEADER_CONNECTING" : "Connecting", "DIALOG_HEADER_CONNECTING" : "Connecting",