GUACAMOLE-526: Handle rejections for absolutely all promises.

This commit is contained in:
Michael Jumper
2018-04-26 22:15:17 -07:00
parent f6d5e5662b
commit 266b445c21
23 changed files with 118 additions and 276 deletions

View File

@@ -190,7 +190,7 @@ angular.module('auth').factory('authenticationService', ['$injector',
})
// If authentication fails, propogate failure to returned promise
['catch'](function authenticationFailed(error) {
['catch'](requestService.createErrorCallback(function authenticationFailed(error) {
// Request credentials if provided credentials were invalid
if (error.type === Error.Type.INVALID_CREDENTIALS)
@@ -203,7 +203,7 @@ angular.module('auth').factory('authenticationService', ['$injector',
// Authentication failed
throw error;
});
}));
};

View File

@@ -37,6 +37,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
var guacNotification = $injector.get('guacNotification');
var iconService = $injector.get('iconService');
var preferenceService = $injector.get('preferenceService');
var requestService = $injector.get('requestService');
var tunnelService = $injector.get('tunnelService');
var userPageService = $injector.get('userPageService');
@@ -161,7 +162,9 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
name : "CLIENT.ACTION_LOGOUT",
className : "logout button",
callback : function logoutCallback() {
authenticationService.logout()['finally'](function logoutComplete() {
authenticationService.logout()
['catch'](requestService.IGNORE)
['finally'](function logoutComplete() {
$location.url('/');
});
}
@@ -188,7 +191,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
};
}
});
}, requestService.WARN);
/**
* Action which replaces the current client with a newly-connected client.
@@ -466,7 +469,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
tunnelService.getSharingProfiles(uuid)
.then(function sharingProfilesRetrieved(sharingProfiles) {
$scope.sharingProfiles = sharingProfiles;
});
}, requestService.WARN);
});
@@ -614,6 +617,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
// Re-authenticate to verify auth status at end of connection
authenticationService.updateCurrentToken($location.search())
['catch'](requestService.IGNORE)
// Show the requested status once the authentication check has finished
['finally'](function authenticationCheckComplete() {
@@ -714,7 +718,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
// Sync with local clipboard
clipboardService.getLocalClipboard().then(function clipboardRead(data) {
$scope.$broadcast('guacClipboard', data);
})['catch'](angular.noop);
}, angular.noop);
// Hide status notification
guacNotification.showStatus(false);

View File

@@ -272,7 +272,7 @@ angular.module('client').directive('guacFileBrowser', [function guacFileBrowser(
});
}); // end retrieve file template
}, angular.noop); // end retrieve file template
// Refresh file browser when any upload completes
$scope.$on('guacUploadComplete', function uploadComplete(event, filename) {

View File

@@ -42,6 +42,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
var authenticationService = $injector.get('authenticationService');
var connectionGroupService = $injector.get('connectionGroupService');
var connectionService = $injector.get('connectionService');
var requestService = $injector.get('requestService');
var tunnelService = $injector.get('tunnelService');
var guacAudio = $injector.get('guacAudio');
var guacHistory = $injector.get('guacHistory');
@@ -514,7 +515,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
connectionService.getConnection(clientIdentifier.dataSource, clientIdentifier.id)
.then(function connectionRetrieved(connection) {
managedClient.name = managedClient.title = connection.name;
});
}, requestService.WARN);
}
// If using a connection group, pull connection name
@@ -522,7 +523,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
connectionGroupService.getConnectionGroup(clientIdentifier.dataSource, clientIdentifier.id)
.then(function connectionGroupRetrieved(group) {
managedClient.name = managedClient.title = group.name;
});
}, requestService.WARN);
}
return managedClient;
@@ -634,7 +635,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
credentialRequest.then(function sharingCredentialsReceived(sharingCredentials) {
client.shareLinks[sharingProfile.identifier] =
ManagedShareLink.getInstance(sharingProfile, sharingCredentials);
});
}, requestService.WARN);
return credentialRequest;

View File

@@ -28,6 +28,7 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector'
var ManagedFileTransferState = $injector.get('ManagedFileTransferState');
// Required services
var requestService = $injector.get('requestService');
var tunnelService = $injector.get('tunnelService');
/**
@@ -171,7 +172,7 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector'
},
// Notify if upload fails
function uploadFailed(error) {
requestService.createErrorCallback(function uploadFailed(error) {
// Use provide status code if the error is coming from the stream
if (error.type === Error.Type.STREAM_ERROR)
@@ -185,7 +186,7 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector'
ManagedFileTransferState.StreamState.ERROR,
Guacamole.Status.Code.INTERNAL_ERROR);
});
}));
// Ignore all further acks
stream.onack = null;

View File

@@ -60,6 +60,7 @@ angular.module('form').directive('guacFormField', [function formField() {
controller: ['$scope', '$injector', '$element', function formFieldController($scope, $injector, $element) {
// Required services
var $log = $injector.get('$log');
var formService = $injector.get('formService');
var translationStringService = $injector.get('translationStringService');
@@ -116,7 +117,9 @@ angular.module('form').directive('guacFormField', [function formField() {
// Append field content
if (field) {
formService.insertFieldElement(fieldContent[0],
field.type, $scope);
field.type, $scope)['catch'](function fieldCreationFailed() {
$log.warn('Failed to retrieve field with type "' + field.type + '"');
});
}
});

View File

@@ -94,6 +94,7 @@ angular.module('groupList').directive('guacGroupList', [function guacGroupList()
// Required services
var activeConnectionService = $injector.get('activeConnectionService');
var dataSourceService = $injector.get('dataSourceService');
var requestService = $injector.get('requestService');
// Required types
var GroupListItem = $injector.get('GroupListItem');
@@ -221,7 +222,7 @@ angular.module('groupList').directive('guacGroupList', [function guacGroupList()
});
});
});
}, requestService.WARN);
}

View File

@@ -32,6 +32,7 @@ angular.module('home').controller('homeController', ['$scope', '$injector',
var authenticationService = $injector.get('authenticationService');
var connectionGroupService = $injector.get('connectionGroupService');
var dataSourceService = $injector.get('dataSourceService');
var requestService = $injector.get('requestService');
/**
* Map of data source identifier to the root connection group of that data
@@ -126,6 +127,6 @@ angular.module('home').controller('homeController', ['$scope', '$injector',
)
.then(function rootGroupsRetrieved(rootConnectionGroups) {
$scope.rootConnectionGroups = rootConnectionGroups;
});
}, requestService.WARN);
}]);

View File

@@ -137,7 +137,7 @@ angular.module('index').controller('indexController', ['$scope', '$injector',
var checkClipboard = function checkClipboard() {
clipboardService.getLocalClipboard().then(function clipboardRead(data) {
$scope.$broadcast('guacClipboard', data);
})['catch'](angular.noop);
}, angular.noop);
};
// Attempt to read the clipboard if it may have changed

View File

@@ -77,7 +77,7 @@ angular.module('list').directive('guacUserItem', [function guacUserItem() {
$translate('LIST.TEXT_ANONYMOUS_USER')
.then(function retrieveAnonymousDisplayName(anonymousDisplayName) {
$scope.displayName = anonymousDisplayName;
});
}, angular.noop);
}
// For all other users, use the username verbatim

View File

@@ -68,6 +68,7 @@ angular.module('login').directive('guacLogin', [function guacLogin() {
// Required services
var $route = $injector.get('$route');
var authenticationService = $injector.get('authenticationService');
var requestService = $injector.get('requestService');
/**
* A description of the error that occurred during login, if any.
@@ -153,7 +154,7 @@ angular.module('login').directive('guacLogin', [function guacLogin() {
})
// Reset upon failure
['catch'](function loginFailed(error) {
['catch'](requestService.createErrorCallback(function loginFailed(error) {
// Clear out passwords if the credentials were rejected for any reason
if (error.type !== Error.Type.INSUFFICIENT_CREDENTIALS) {
@@ -178,7 +179,7 @@ angular.module('login').directive('guacLogin', [function guacLogin() {
});
}
});
}));
};

View File

@@ -38,21 +38,10 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
var connectionService = $injector.get('connectionService');
var connectionGroupService = $injector.get('connectionGroupService');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var schemaService = $injector.get('schemaService');
var translationStringService = $injector.get('translationStringService');
/**
* An action to be provided along with the object sent to showStatus which
* closes the currently-shown status dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "MANAGE_CONNECTION.ACTION_ACKNOWLEDGE",
// Handle action
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* The unique identifier of the data source containing the connection being
* edited.
@@ -186,7 +175,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
schemaService.getConnectionAttributes($scope.selectedDataSource)
.then(function attributesReceived(attributes) {
$scope.attributes = attributes;
});
}, requestService.WARN);
// Pull connection group hierarchy
connectionGroupService.getConnectionGroupTree(
@@ -196,7 +185,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
)
.then(function connectionGroupReceived(rootGroup) {
$scope.rootGroup = rootGroup;
});
}, requestService.WARN);
// Query the user's permissions for the current connection
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
@@ -226,18 +215,18 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
)
);
});
}, requestService.WARN);
// Get protocol metadata
schemaService.getProtocols($scope.selectedDataSource)
.then(function protocolsReceived(protocols) {
$scope.protocols = protocols;
});
}, requestService.WARN);
// Get history date format
$translate('MANAGE_CONNECTION.FORMAT_HISTORY_START').then(function historyDateFormatReceived(historyDateFormat) {
$scope.historyDateFormat = historyDateFormat;
});
}, angular.noop);
// If we are editing an existing connection, pull its data
if (identifier) {
@@ -246,7 +235,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
connectionService.getConnection($scope.selectedDataSource, identifier)
.then(function connectionRetrieved(connection) {
$scope.connection = connection;
});
}, requestService.WARN);
// Pull connection history
connectionService.getConnectionHistory($scope.selectedDataSource, identifier)
@@ -258,13 +247,13 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
$scope.historyEntryWrappers.push(new HistoryEntryWrapper(historyEntry));
});
});
}, requestService.WARN);
// Pull connection parameters
connectionService.getConnectionParameters($scope.selectedDataSource, identifier)
.then(function parametersReceived(parameters) {
$scope.parameters = parameters;
});
}, requestService.WARN);
}
// If we are cloning an existing connection, pull its data instead
@@ -277,7 +266,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
// Clear the identifier field because this connection is new
delete $scope.connection.identifier;
});
}, requestService.WARN);
// Do not pull connection history
$scope.historyEntryWrappers = [];
@@ -286,7 +275,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
connectionService.getConnectionParameters($scope.selectedDataSource, cloneSourceIdentifier)
.then(function parametersReceived(parameters) {
$scope.parameters = parameters;
});
}, requestService.WARN);
}
// If we are creating a new connection, populate skeleton connection data
@@ -390,17 +379,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
connectionService.saveConnection($scope.selectedDataSource, $scope.connection)
.then(function savedConnection() {
$location.url('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
.error(function connectionSaveFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_CONNECTION.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};
@@ -440,17 +419,7 @@ angular.module('manage').controller('manageConnectionController', ['$scope', '$i
connectionService.deleteConnection($scope.selectedDataSource, $scope.connection)
.then(function deletedConnection() {
$location.path('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
.error(function connectionDeletionFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_CONNECTION.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};

View File

@@ -34,20 +34,9 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
var connectionGroupService = $injector.get('connectionGroupService');
var guacNotification = $injector.get('guacNotification');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var schemaService = $injector.get('schemaService');
/**
* An action to be provided along with the object sent to showStatus which
* closes the currently-shown status dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "MANAGE_CONNECTION_GROUP.ACTION_ACKNOWLEDGE",
// Handle action
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* The unique identifier of the data source containing the connection group
* being edited.
@@ -131,7 +120,7 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
schemaService.getConnectionGroupAttributes($scope.selectedDataSource)
.then(function attributesReceived(attributes) {
$scope.attributes = attributes;
});
}, requestService.WARN);
// Query the user's permissions for the current connection group
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
@@ -152,7 +141,7 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
|| PermissionSet.hasConnectionGroupPermission(permissions, PermissionSet.ObjectPermissionType.DELETE, identifier)
);
});
}, requestService.WARN);
// Pull connection group hierarchy
@@ -163,14 +152,14 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
)
.then(function connectionGroupReceived(rootGroup) {
$scope.rootGroup = rootGroup;
});
}, requestService.WARN);
// If we are editing an existing connection group, pull its data
if (identifier) {
connectionGroupService.getConnectionGroup($scope.selectedDataSource, identifier)
.then(function connectionGroupReceived(connectionGroup) {
$scope.connectionGroup = connectionGroup;
});
}, requestService.WARN);
}
// If we are creating a new connection group, populate skeleton connection group data
@@ -232,17 +221,7 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
connectionGroupService.saveConnectionGroup($scope.selectedDataSource, $scope.connectionGroup)
.then(function savedConnectionGroup() {
$location.path('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
['catch'](function connectionGroupSaveFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_CONNECTION_GROUP.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};
@@ -282,17 +261,7 @@ angular.module('manage').controller('manageConnectionGroupController', ['$scope'
connectionGroupService.deleteConnectionGroup($scope.selectedDataSource, $scope.connectionGroup)
.then(function deletedConnectionGroup() {
$location.path('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
['catch'](function connectionGroupDeletionFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_CONNECTION_GROUP.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};

View File

@@ -34,22 +34,11 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
var connectionService = $injector.get('connectionService');
var guacNotification = $injector.get('guacNotification');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var schemaService = $injector.get('schemaService');
var sharingProfileService = $injector.get('sharingProfileService');
var translationStringService = $injector.get('translationStringService');
/**
* An action which can be provided along with the object sent to showStatus
* to allow the user to acknowledge (and close) the currently-shown status
* dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "MANAGE_SHARING_PROFILE.ACTION_ACKNOWLEDGE",
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* An action to be provided along with the object sent to showStatus which
* closes the currently-shown status dialog, effectively canceling the
@@ -172,7 +161,7 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
schemaService.getSharingProfileAttributes($scope.selectedDataSource)
.then(function attributesReceived(attributes) {
$scope.attributes = attributes;
});
}, requestService.WARN);
// Query the user's permissions for the current sharing profile
permissionService.getEffectivePermissions($scope.selectedDataSource, authenticationService.getCurrentUsername())
@@ -208,13 +197,13 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
)
);
});
}, requestService.WARN);
// Get protocol metadata
schemaService.getProtocols($scope.selectedDataSource)
.then(function protocolsReceived(protocols) {
$scope.protocols = protocols;
});
}, requestService.WARN);
// If we are editing an existing sharing profile, pull its data
if (identifier) {
@@ -223,13 +212,13 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
sharingProfileService.getSharingProfile($scope.selectedDataSource, identifier)
.then(function sharingProfileRetrieved(sharingProfile) {
$scope.sharingProfile = sharingProfile;
});
}, requestService.WARN);
// Pull sharing profile parameters
sharingProfileService.getSharingProfileParameters($scope.selectedDataSource, identifier)
.then(function parametersReceived(parameters) {
$scope.parameters = parameters;
});
}, requestService.WARN);
}
@@ -246,13 +235,13 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
// Clear the identifier field because this sharing profile is new
delete $scope.sharingProfile.identifier;
});
}, requestService.WARN);
// Pull sharing profile parameters from cloned sharing profile
sharingProfileService.getSharingProfileParameters($scope.selectedDataSource, cloneSourceIdentifier)
.then(function parametersReceived(parameters) {
$scope.parameters = parameters;
});
}, requestService.WARN);
}
@@ -276,7 +265,7 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
connectionService.getConnection($scope.selectedDataSource, identifier)
.then(function connectionRetrieved(connection) {
$scope.primaryConnection = connection;
});
}, requestService.WARN);
});
@@ -353,17 +342,7 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
sharingProfileService.saveSharingProfile($scope.selectedDataSource, $scope.sharingProfile)
.then(function savedSharingProfile() {
$location.url('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
['catch'](function sharingProfileSaveFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_SHARING_PROFILE.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};
@@ -391,17 +370,7 @@ angular.module('manage').controller('manageSharingProfileController', ['$scope',
sharingProfileService.deleteSharingProfile($scope.selectedDataSource, $scope.sharingProfile)
.then(function deletedSharingProfile() {
$location.path('/settings/' + encodeURIComponent($scope.selectedDataSource) + '/connections');
})
// Notify of any errors
['catch'](function sharingProfileDeletionFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_SHARING_PROFILE.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};

View File

@@ -39,6 +39,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
var dataSourceService = $injector.get('dataSourceService');
var guacNotification = $injector.get('guacNotification');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var schemaService = $injector.get('schemaService');
var translationStringService = $injector.get('translationStringService');
var userService = $injector.get('userService');
@@ -531,7 +532,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
// Pull user attribute schema
schemaService.getUserAttributes(selectedDataSource).then(function attributesReceived(attributes) {
$scope.attributes = attributes;
});
}, requestService.WARN);
// Pull user data and permissions if we are editing an existing user
if (username) {
@@ -550,7 +551,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
'username' : username
});
});
}, requestService.WARN);
// The current user will be associated with username of the existing
// user in the retrieved permission set
@@ -562,9 +563,9 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
})
// If permissions cannot be retrieved, use empty permissions
['catch'](function permissionRetrievalFailed() {
['catch'](requestService.createErrorCallback(function permissionRetrievalFailed() {
$scope.permissionFlags = new PermissionFlagSet();
});
}));
}
// If we are cloning an existing user, pull his/her data instead
@@ -577,7 +578,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
$scope.users = {};
$scope.user = users[selectedDataSource];
});
}, requestService.WARN);
// The current user will be associated with cloneSourceUsername in the
// retrieved permission set
@@ -591,9 +592,9 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
})
// If permissions cannot be retrieved, use empty permissions
['catch'](function permissionRetrievalFailed() {
['catch'](requestService.createErrorCallback(function permissionRetrievalFailed() {
$scope.permissionFlags = new PermissionFlagSet();
});
}));
}
// Use skeleton data if we are creating a new user
@@ -676,7 +677,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
$scope.rootGroups[dataSource] = GroupListItem.fromConnectionGroup(dataSource, rootGroup);
});
});
}, requestService.WARN);
// Query the user's permissions for the current user
dataSourceService.apply(
@@ -686,7 +687,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
)
.then(function permissionsReceived(permissions) {
$scope.permissions = permissions;
});
}, requestService.WARN);
// Update default expanded state whenever connection groups and associated
// permissions change
@@ -1140,30 +1141,9 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
permissionService.patchPermissions(selectedDataSource, $scope.user.username, permissionsAdded, permissionsRemoved)
.then(function patchedUserPermissions() {
$location.url('/settings/users');
})
}, requestService.SHOW_NOTIFICATION);
// Notify of any errors
['catch'](function userPermissionsPatchFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_USER.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'values' : error.translationValues,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
})
// Notify of any errors
.error(function userSaveFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_USER.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};
@@ -1203,17 +1183,7 @@ angular.module('manage').controller('manageUserController', ['$scope', '$injecto
userService.deleteUser(selectedDataSource, $scope.user)
.then(function deletedUser() {
$location.path('/settings/users');
})
// Notify of any errors
['catch'](function userDeletionFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'MANAGE_USER.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};

View File

@@ -50,6 +50,7 @@ angular.module('navigation').directive('guacUserMenu', [function guacUserMenu()
var $location = $injector.get('$location');
var $route = $injector.get('$route');
var authenticationService = $injector.get('authenticationService');
var requestService = $injector.get('requestService');
var userService = $injector.get('userService');
var userPageService = $injector.get('userPageService');
@@ -110,7 +111,7 @@ angular.module('navigation').directive('guacUserMenu', [function guacUserMenu()
var email = user.attributes[User.Attributes.EMAIL_ADDRESS];
$scope.userURL = email ? 'mailto:' + email : null;
});
}, requestService.WARN);
/**
* The available main pages for the current user.
@@ -141,7 +142,9 @@ angular.module('navigation').directive('guacUserMenu', [function guacUserMenu()
* after logout completes.
*/
$scope.logout = function logout() {
authenticationService.logout()['finally'](function logoutComplete() {
authenticationService.logout()
['catch'](requestService.IGNORE)
['finally'](function logoutComplete() {
if ($location.path() !== '/')
$location.url('/');
else

View File

@@ -35,6 +35,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
var connectionGroupService = $injector.get('connectionGroupService');
var dataSourceService = $injector.get('dataSourceService');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var translationStringService = $injector.get('translationStringService');
var service = {};
@@ -142,7 +143,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
/**
* Returns a promise which resolves with an appropriate home page for the
* current user.
* current user. The promise will not be rejected.
*
* @returns {Promise.<Page>}
* A promise which resolves with the user's default home page.
@@ -169,7 +170,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
})
.then(function rootConnectionGroupsPermissionsRetrieved(data) {
deferred.resolve(generateHomePage(data.rootGroups,data.permissionsSets));
});
}, requestService.WARN);
return deferred.promise;
@@ -317,7 +318,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
/**
* Returns a promise which resolves to an array of all settings pages that
* the current user can visit. This can include any of the various manage
* pages.
* pages. The promise will not be rejected.
*
* @returns {Promise.<Page[]>}
* A promise which resolves to an array of all settings pages that the
@@ -337,7 +338,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
// Resolve promise using settings pages derived from permissions
.then(function permissionsRetrieved(permissions) {
deferred.resolve(generateSettingsPages(permissions));
});
}, requestService.WARN);
return deferred.promise;
@@ -387,7 +388,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
* Returns a promise which resolves to an array of all main pages that the
* current user can visit. This can include the home page, manage pages,
* etc. In the case that there are no applicable pages of this sort, it may
* return a client page.
* return a client page. The promise will not be rejected.
*
* @returns {Promise.<Page[]>}
* A promise which resolves to an array of all main pages that the
@@ -418,7 +419,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
.then(function rootConnectionGroupsRetrieved(retrievedRootGroups) {
rootGroups = retrievedRootGroups;
resolveMainPages();
});
}, requestService.WARN);
// Retrieve current permissions
dataSourceService.apply(
@@ -431,7 +432,7 @@ angular.module('navigation').factory('userPageService', ['$injector',
.then(function permissionsRetrieved(retrievedPermissions) {
permissions = retrievedPermissions;
resolveMainPages();
});
}, requestService.WARN);
return deferred.promise;

View File

@@ -28,6 +28,7 @@ angular.module('rest').factory('dataSourceService', ['$injector',
// Required services
var $q = $injector.get('$q');
var requestService = $injector.get('requestService');
// Service containing all caches
var service = {};
@@ -92,7 +93,7 @@ angular.module('rest').factory('dataSourceService', ['$injector',
},
// Fail on any errors (except "NOT FOUND")
function immediateRequestFailed(error) {
requestService.createErrorCallback(function immediateRequestFailed(error) {
if (error.type === Error.Type.NOT_FOUND)
deferredRequest.resolve();
@@ -101,7 +102,7 @@ angular.module('rest').factory('dataSourceService', ['$injector',
else
deferredRequest.reject(error);
});
}));
});
@@ -111,9 +112,9 @@ angular.module('rest').factory('dataSourceService', ['$injector',
},
// Reject if at least one request fails
function requestFailed(response) {
deferred.reject(response);
});
requestService.createErrorCallback(function requestFailed(error) {
deferred.reject(error);
}));
return deferred.promise;

View File

@@ -44,6 +44,7 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function
var $translate = $injector.get('$translate');
var csvService = $injector.get('csvService');
var historyService = $injector.get('historyService');
var requestService = $injector.get('requestService');
/**
* The identifier of the currently-selected data source.
@@ -95,7 +96,7 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function
// Store received date format
$scope.dateFormat = retrievedDateFormat;
});
}, angular.noop);
/**
* Returns true if the connection history records have been loaded,
@@ -177,7 +178,7 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function
$scope.historyEntryWrappers.push(new ConnectionHistoryEntryWrapper(historyEntry));
});
});
}, requestService.WARN);
};
@@ -227,7 +228,7 @@ angular.module('settings').directive('guacSettingsConnectionHistory', [function
// Save the result
saveAs(csvService.toBlob(records), translations['SETTINGS_CONNECTION_HISTORY.FILENAME_HISTORY_CSV']);
});
}, angular.noop);
};

View File

@@ -46,6 +46,7 @@ angular.module('settings').directive('guacSettingsConnections', [function guacSe
var dataSourceService = $injector.get('dataSourceService');
var guacNotification = $injector.get('guacNotification');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
/**
* The identifier of the current user.
@@ -54,18 +55,6 @@ angular.module('settings').directive('guacSettingsConnections', [function guacSe
*/
var currentUsername = authenticationService.getCurrentUsername();
/**
* An action to be provided along with the object sent to
* showStatus which closes the currently-shown status dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "SETTINGS_CONNECTIONS.ACTION_ACKNOWLEDGE",
// Handle action
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* The identifier of the currently-selected data source.
*
@@ -426,9 +415,9 @@ angular.module('settings').directive('guacSettingsConnections', [function guacSe
)
.then(function connectionGroupsReceived(rootGroups) {
$scope.rootGroups = rootGroups;
});
}, requestService.WARN);
}); // end retrieve permissions
}, requestService.WARN); // end retrieve permissions
}]
};

View File

@@ -42,6 +42,7 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
var languageService = $injector.get('languageService');
var permissionService = $injector.get('permissionService');
var preferenceService = $injector.get('preferenceService');
var requestService = $injector.get('requestService');
var userService = $injector.get('userService');
/**
@@ -164,17 +165,7 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
},
actions : [ ACKNOWLEDGE_ACTION ]
});
})
// Notify of any errors
['catch'](function passwordUpdateFailed(error) {
guacNotification.showStatus({
className : 'error',
title : 'SETTINGS_PREFERENCES.DIALOG_HEADER_ERROR',
text : error.translatableMessage,
actions : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};
@@ -186,8 +177,8 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
key: key,
value: languages[key]
};
})
});
}, requestService.WARN);
// Retrieve current permissions
permissionService.getEffectivePermissions(dataSource, username)
@@ -198,9 +189,9 @@ angular.module('settings').directive('guacSettingsPreferences', [function guacSe
PermissionSet.ObjectPermissionType.UPDATE, username);
})
['catch'](function permissionsFailed(error) {
['catch'](requestService.createErrorCallback(function permissionsFailed(error) {
$scope.canChangePassword = false;
});
}));
/**
* Returns whether critical data has completed being loaded.

View File

@@ -47,6 +47,7 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
var connectionGroupService = $injector.get('connectionGroupService');
var dataSourceService = $injector.get('dataSourceService');
var guacNotification = $injector.get('guacNotification');
var requestService = $injector.get('requestService');
/**
* The identifiers of all data sources accessible by the current
@@ -219,7 +220,7 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
// Attempt to produce wrapped list of active connections
wrapAllActiveConnections();
});
}, requestService.WARN);
// Query active sessions
dataSourceService.apply(
@@ -234,7 +235,7 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
// Attempt to produce wrapped list of active connections
wrapAllActiveConnections();
});
}, requestService.WARN);
// Get session date format
$translate('SETTINGS_SESSIONS.FORMAT_STARTDATE').then(function sessionDateFormatReceived(retrievedSessionDateFormat) {
@@ -245,7 +246,7 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
// Attempt to produce wrapped list of active connections
wrapAllActiveConnections();
});
}, angular.noop);
/**
* Returns whether critical data has completed being loaded.
@@ -258,18 +259,6 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
return $scope.wrappers !== null;
};
/**
* An action to be provided along with the object sent to
* showStatus which closes the currently-shown status dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "SETTINGS_SESSIONS.ACTION_ACKNOWLEDGE",
// Handle action
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* An action to be provided along with the object sent to
* showStatus which closes the currently-shown status dialog.
@@ -327,17 +316,7 @@ angular.module('settings').directive('guacSettingsSessions', [function guacSetti
// Clear selection
allSelectedWrappers = {};
},
// Notify of any errors
function activeConnectionDeletionFailed(error) {
guacNotification.showStatus({
'className' : 'error',
'title' : 'SETTINGS_SESSIONS.DIALOG_HEADER_ERROR',
'text' : error.translatableMessage,
'actions' : [ ACKNOWLEDGE_ACTION ]
});
});
}, requestService.SHOW_NOTIFICATION);
};

View File

@@ -43,25 +43,13 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
var $translate = $injector.get('$translate');
var authenticationService = $injector.get('authenticationService');
var dataSourceService = $injector.get('dataSourceService');
var guacNotification = $injector.get('guacNotification');
var permissionService = $injector.get('permissionService');
var requestService = $injector.get('requestService');
var userService = $injector.get('userService');
// Identifier of the current user
var currentUsername = authenticationService.getCurrentUsername();
/**
* An action to be provided along with the object sent to
* showStatus which closes the currently-shown status dialog.
*/
var ACKNOWLEDGE_ACTION = {
name : "SETTINGS_USERS.ACTION_ACKNOWLEDGE",
// Handle action
callback : function acknowledgeCallback() {
guacNotification.showStatus(false);
}
};
/**
* The identifiers of all data sources accessible by the current
* user.
@@ -129,7 +117,7 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
// Store received date format
$scope.dateFormat = retrievedDateFormat;
});
}, angular.noop);
/**
* Returns whether critical data has completed being loaded.
@@ -287,9 +275,9 @@ angular.module('settings').directive('guacSettingsUsers', [function guacSettings
});
});
});
}, requestService.WARN);
});
}, requestService.WARN);
}]
};