mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53:21 +00:00 
			
		
		
		
	GUAC-586: Display ALL users in the user list. Navigate to the first data source with creation permission when "New User" is clicked.
This commit is contained in:
		
							
								
								
									
										56
									
								
								guacamole/src/main/webapp/app/manage/types/ManageableUser.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								guacamole/src/main/webapp/app/manage/types/ManageableUser.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2015 Glyptodon LLC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * A service for defining the ManageableUser class. | ||||||
|  |  */ | ||||||
|  | angular.module('manage').factory('ManageableUser', [function defineManageableUser() { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * A pairing of an @link{User} with the identifier of its corresponding | ||||||
|  |      * data source. | ||||||
|  |      * | ||||||
|  |      * @constructor | ||||||
|  |      * @param {Object|ManageableUser} template | ||||||
|  |      */ | ||||||
|  |     var ManageableUser = function ManageableUser(template) { | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * The unique identifier of the data source containing this user. | ||||||
|  |          * | ||||||
|  |          * @type String | ||||||
|  |          */ | ||||||
|  |         this.dataSource = template.dataSource; | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * The @link{User} object represented by this ManageableUser and | ||||||
|  |          * contained within the associated data source. | ||||||
|  |          * | ||||||
|  |          * @type User | ||||||
|  |          */ | ||||||
|  |         this.user = template.user; | ||||||
|  |  | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     return ManageableUser; | ||||||
|  |  | ||||||
|  | }]); | ||||||
| @@ -37,8 +37,8 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings | |||||||
|         controller: ['$scope', '$injector', function settingsUsersController($scope, $injector) { |         controller: ['$scope', '$injector', function settingsUsersController($scope, $injector) { | ||||||
|  |  | ||||||
|             // Required types |             // Required types | ||||||
|  |             var ManageableUser  = $injector.get('ManageableUser'); | ||||||
|             var PermissionSet   = $injector.get('PermissionSet'); |             var PermissionSet   = $injector.get('PermissionSet'); | ||||||
|             var User            = $injector.get('User'); |  | ||||||
|  |  | ||||||
|             // Required services |             // Required services | ||||||
|             var $location              = $injector.get('$location'); |             var $location              = $injector.get('$location'); | ||||||
| @@ -63,36 +63,19 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings | |||||||
|             }; |             }; | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * The data source from which the list of users should be pulled. |              * The identifiers of all data sources accessible by the current | ||||||
|              * For the time being, this is just the data source which |              * user. | ||||||
|              * authenticated the current user. |  | ||||||
|              * |              * | ||||||
|              * @type String |              * @type String[] | ||||||
|              */ |              */ | ||||||
|             $scope.dataSource = authenticationService.getDataSource(); |             var dataSources = authenticationService.getAvailableDataSources(); | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * All visible users. |              * All visible users, along with their corresponding data sources. | ||||||
|              * |              * | ||||||
|              * @type User[] |              * @type ManageableUser[] | ||||||
|              */ |              */ | ||||||
|             $scope.users = null; |             $scope.manageableUsers = null; | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * Whether the current user can manage users. If the current |  | ||||||
|              * permissions have not yet been loaded, this will be null. |  | ||||||
|              * |  | ||||||
|              * @type Boolean |  | ||||||
|              */ |  | ||||||
|             $scope.canManageUsers = null; |  | ||||||
|  |  | ||||||
|             /** |  | ||||||
|              * Whether the current user can create new users. If the current |  | ||||||
|              * permissions have not yet been loaded, this will be null. |  | ||||||
|              * |  | ||||||
|              * @type Boolean |  | ||||||
|              */ |  | ||||||
|             $scope.canCreateUsers = null; |  | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * The name of the new user to create, if any, when user creation |              * The name of the new user to create, if any, when user creation | ||||||
| @@ -103,10 +86,11 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings | |||||||
|             $scope.newUsername = ""; |             $scope.newUsername = ""; | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * All permissions associated with the current user, or null if the |              * Map of data source identifiers to all permissions associated | ||||||
|  |              * with the current user within that data source, or null if the | ||||||
|              * user's permissions have not yet been loaded. |              * user's permissions have not yet been loaded. | ||||||
|              * |              * | ||||||
|              * @type PermissionSet |              * @type Object.<String, PermissionSet> | ||||||
|              */ |              */ | ||||||
|             $scope.permissions = null; |             $scope.permissions = null; | ||||||
|  |  | ||||||
| @@ -119,82 +103,144 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings | |||||||
|              */ |              */ | ||||||
|             $scope.isLoaded = function isLoaded() { |             $scope.isLoaded = function isLoaded() { | ||||||
|  |  | ||||||
|                 return $scope.users                     !== null |                 return $scope.manageableUsers !== null | ||||||
|                     && $scope.permissions               !== null |                     && $scope.permissions     !== null; | ||||||
|                     && $scope.canManageUsers            !== null |  | ||||||
|                     && $scope.canCreateUsers            !== null; |             }; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns the identifier of the data source that should be used by | ||||||
|  |              * default when creating a new user. | ||||||
|  |              * | ||||||
|  |              * @return {String} | ||||||
|  |              *     The identifier of the data source that should be used by | ||||||
|  |              *     default when creating a new user, or null if user creation | ||||||
|  |              *     is not allowed. | ||||||
|  |              */ | ||||||
|  |             var getDefaultDataSource = function getDefaultDataSource() { | ||||||
|  |  | ||||||
|  |                 // Abort if permissions have not yet loaded | ||||||
|  |                 if (!$scope.permissions) | ||||||
|  |                     return null; | ||||||
|  |  | ||||||
|  |                 // For each data source | ||||||
|  |                 for (var dataSource in $scope.permissions) { | ||||||
|  |  | ||||||
|  |                     // Retrieve corresponding permission set | ||||||
|  |                     var permissionSet = $scope.permissions[dataSource]; | ||||||
|  |  | ||||||
|  |                     // Can create users if adminstrator or have explicit permission | ||||||
|  |                     if (PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.ADMINISTER) | ||||||
|  |                      || PermissionSet.hasSystemPermission(permissionSet, PermissionSet.SystemPermissionType.CREATE_USER)) | ||||||
|  |                         return dataSource; | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // No data sources allow user creation | ||||||
|  |                 return null; | ||||||
|  |  | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns whether the current user can create new users within at | ||||||
|  |              * least one data source. | ||||||
|  |              * | ||||||
|  |              * @return {Boolean} | ||||||
|  |              *     true if the current user can create new users within at | ||||||
|  |              *     least one data source, false otherwise. | ||||||
|  |              */ | ||||||
|  |             $scope.canCreateUsers = function canCreateUsers() { | ||||||
|  |                 return getDefaultDataSource() !== null; | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Returns whether the current user can create new users or make | ||||||
|  |              * changes to existing users within at least one data source. The | ||||||
|  |              * user management interface as a whole is useless if this function | ||||||
|  |              * returns false. | ||||||
|  |              * | ||||||
|  |              * @return {Boolean} | ||||||
|  |              *     true if the current user can create new users or make | ||||||
|  |              *     changes to existing users within at least one data source, | ||||||
|  |              *     false otherwise. | ||||||
|  |              */ | ||||||
|  |             var canManageUsers = function canManageUsers() { | ||||||
|  |  | ||||||
|  |                 // Abort if permissions have not yet loaded | ||||||
|  |                 if (!$scope.permissions) | ||||||
|  |                     return false; | ||||||
|  |  | ||||||
|  |                 // Creating users counts as management | ||||||
|  |                 if ($scope.canCreateUsers()) | ||||||
|  |                     return true; | ||||||
|  |  | ||||||
|  |                 // For each data source | ||||||
|  |                 for (var dataSource in $scope.permissions) { | ||||||
|  |  | ||||||
|  |                     // Retrieve corresponding permission set | ||||||
|  |                     var permissionSet = $scope.permissions[dataSource]; | ||||||
|  |  | ||||||
|  |                     // Can manage users if granted explicit update or delete | ||||||
|  |                     if (PermissionSet.hasUserPermission(permissionSet, PermissionSet.ObjectPermissionType.UPDATE) | ||||||
|  |                      || PermissionSet.hasUserPermission(permissionSet, PermissionSet.ObjectPermissionType.DELETE)) | ||||||
|  |                         return true; | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // No data sources allow management of users | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|             // Retrieve current permissions |             // Retrieve current permissions | ||||||
|             permissionService.getPermissions($scope.dataSource, currentUsername) |             permissionService.getAllPermissions(dataSources, currentUsername) | ||||||
|             .success(function permissionsRetrieved(permissions) { |             .then(function permissionsRetrieved(permissions) { | ||||||
|  |  | ||||||
|  |                 // Store retrieved permissions | ||||||
|                 $scope.permissions = permissions; |                 $scope.permissions = permissions; | ||||||
|  |  | ||||||
|                 // Determine whether the current user can create new users |  | ||||||
|                 $scope.canCreateUsers = |  | ||||||
|                        PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER) |  | ||||||
|                     || PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.CREATE_USER); |  | ||||||
|  |  | ||||||
|                 // Determine whether the current user can manage other users |  | ||||||
|                 $scope.canManageUsers = |  | ||||||
|                        $scope.canCreateUsers |  | ||||||
|                     || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.UPDATE) |  | ||||||
|                     || PermissionSet.hasUserPermission(permissions, PermissionSet.ObjectPermissionType.DELETE); |  | ||||||
|  |  | ||||||
|                 // Return to home if there's nothing to do here |                 // Return to home if there's nothing to do here | ||||||
|                 if (!$scope.canManageUsers) |                 if (!canManageUsers()) | ||||||
|                     $location.path('/'); |                     $location.path('/'); | ||||||
|  |  | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             // Retrieve all users for whom we have UPDATE or DELETE permission |             // Retrieve all users for whom we have UPDATE or DELETE permission | ||||||
|             userService.getUsers($scope.dataSource, [ |             userService.getAllUsers(dataSources, [ | ||||||
|                 PermissionSet.ObjectPermissionType.UPDATE, |                 PermissionSet.ObjectPermissionType.UPDATE, | ||||||
|                 PermissionSet.ObjectPermissionType.DELETE |                 PermissionSet.ObjectPermissionType.DELETE | ||||||
|             ]) |             ]) | ||||||
|             .success(function usersReceived(users) { |             .then(function usersReceived(userArrays) { | ||||||
|  |  | ||||||
|                 // Display only other users, not self |                 var addedUsers = {}; | ||||||
|                 $scope.users = users.filter(function isNotSelf(user) { |                 $scope.manageableUsers = []; | ||||||
|                     return user.username !== currentUsername; |  | ||||||
|  |                 // For each user in each data source | ||||||
|  |                 angular.forEach(dataSources, function addUserList(dataSource) { | ||||||
|  |                     angular.forEach(userArrays[dataSource], function addUser(user) { | ||||||
|  |  | ||||||
|  |                         // Do not add the same user twice | ||||||
|  |                         if (addedUsers[user.username]) | ||||||
|  |                             return; | ||||||
|  |  | ||||||
|  |                         // Add user to overall list | ||||||
|  |                         addedUsers[user.username] = user; | ||||||
|  |                         $scope.manageableUsers.push(new ManageableUser ({ | ||||||
|  |                             'dataSource' : dataSource, | ||||||
|  |                             'user'       : user | ||||||
|  |                         })); | ||||||
|  |  | ||||||
|  |                     }); | ||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             /** |             /** | ||||||
|              * Creates a new user having the username specified in the user |              * Navigates to an interface for creating a new user having the | ||||||
|              * creation interface. |              * username specified. | ||||||
|              */ |              */ | ||||||
|             $scope.newUser = function newUser() { |             $scope.newUser = function newUser() { | ||||||
|  |                 $location.url('/manage/' + encodeURIComponent(getDefaultDataSource()) + '/users/' + encodeURIComponent($scope.newUsername)); | ||||||
|                 // Create user skeleton |  | ||||||
|                 var user = new User({ |  | ||||||
|                     username: $scope.newUsername || '' |  | ||||||
|                 }); |  | ||||||
|  |  | ||||||
|                 // Create specified user |  | ||||||
|                 userService.createUser($scope.dataSource, user) |  | ||||||
|  |  | ||||||
|                 // Add user to visible list upon success |  | ||||||
|                 .success(function userCreated() { |  | ||||||
|                     $scope.users.push(user); |  | ||||||
|                 }) |  | ||||||
|  |  | ||||||
|                 // Notify of any errors |  | ||||||
|                 .error(function userCreationFailed(error) { |  | ||||||
|                     guacNotification.showStatus({ |  | ||||||
|                         'className'  : 'error', |  | ||||||
|                         'title'      : 'SETTINGS_USERS.DIALOG_HEADER_ERROR', |  | ||||||
|                         'text'       : error.message, |  | ||||||
|                         'actions'    : [ ACKNOWLEDGE_ACTION ] |  | ||||||
|                     }); |  | ||||||
|                 }); |  | ||||||
|  |  | ||||||
|                 // Reset username |  | ||||||
|                 $scope.newUsername = ""; |  | ||||||
|  |  | ||||||
|             }; |             }; | ||||||
|              |              | ||||||
|         }] |         }] | ||||||
|   | |||||||
| @@ -25,24 +25,25 @@ | |||||||
|     <p>{{'SETTINGS_USERS.HELP_USERS' | translate}}</p> |     <p>{{'SETTINGS_USERS.HELP_USERS' | translate}}</p> | ||||||
|  |  | ||||||
|     <!-- Form action buttons --> |     <!-- Form action buttons --> | ||||||
|     <div class="action-buttons" ng-show="canCreateUsers"> |     <div class="action-buttons" ng-show="canCreateUsers()"> | ||||||
|         <input type="text" ng-model="newUsername" class="name username" autocorrect="off" autocapitalize="off"/> |         <input type="text" ng-model="newUsername" class="name username" autocorrect="off" autocapitalize="off"/> | ||||||
|         <button class="add-user" ng-click="newUser()">{{'SETTINGS_USERS.ACTION_NEW_USER' | translate}}</button> |         <button class="add-user" ng-click="newUser()">{{'SETTINGS_USERS.ACTION_NEW_USER' | translate}}</button> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <!-- List of users this user has access to --> |     <!-- List of users this user has access to --> | ||||||
|     <div class="user-list"> |     <div class="user-list"> | ||||||
|         <div ng-repeat="user in userPage" class="user list-item"> |         <div ng-repeat="manageableUser in manageableUserPage" class="user list-item"> | ||||||
|             <a ng-href="#/manage/{{dataSource}}/users/{{user.username}}"> |             <a ng-href="#/manage/{{manageableUser.dataSource}}/users/{{manageableUser.user.username}}"> | ||||||
|                 <div class="caption"> |                 <div class="caption"> | ||||||
|                     <div class="icon user"></div> |                     <div class="icon user"></div> | ||||||
|                     <span class="name">{{user.username}}</span> |                     <span class="name">{{manageableUser.user.username}}</span> | ||||||
|                 </div> |                 </div> | ||||||
|             </a> |             </a> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <!-- Pager controls for user list --> |     <!-- Pager controls for user list --> | ||||||
|     <guac-pager page="userPage" page-size="25" items="users | orderBy : 'username'"></guac-pager> |     <guac-pager page="manageableUserPage" page-size="25" | ||||||
|  |                 items="manageableUsers | orderBy : 'user.username'"></guac-pager> | ||||||
|  |  | ||||||
| </div> | </div> | ||||||
		Reference in New Issue
	
	Block a user