GUAC-932: Refactor existing REST service JS into single 'rest' module.

This commit is contained in:
Michael Jumper
2014-12-11 15:03:57 -08:00
parent dea213e9a1
commit 6d6bf889f2
19 changed files with 17 additions and 120 deletions

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2014 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.
*/
/**
* The module for code relating to communication with the REST API of the
* Guacamole web application.
*/
angular.module('rest', ['auth']);

View File

@@ -0,0 +1,130 @@
/*
* Copyright (C) 2014 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.
*/
/**
* The DAO for connection group operations agains the REST API.
*/
angular.module('rest').factory('connectionGroupDAO', ['$http', 'authenticationService',
function connectionGrouDAO($http, authenticationService) {
/**
* The ID of the root connection group.
*/
var ROOT_CONNECTION_GROUP_ID = "ROOT";
var service = {};
/**
* Makes a request to the REST API to get the list of connection groups,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} parentID The parent ID for the connection group.
* If not passed in, it will query a list of the
* connection groups in the root group.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getConnectionGroups = function getConnectionGroups(parentID) {
var parentIDParam = "";
if(parentID !== undefined)
parentIDParam = "&parentID=" + parentID;
return $http.get("api/connectionGroup?token=" + authenticationService.getCurrentToken() + parentIDParam);
};
/**
* Makes a request to the REST API to get an individual connection group,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} connectionGroupID The ID for the connection group.
* If not passed in, it will query the
* root connection group.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getConnectionGroup = function getConnectionGroup(connectionGroupID) {
// Use the root connection group ID if no ID is passed in
connectionGroupID = connectionGroupID || ROOT_CONNECTION_GROUP_ID;
return $http.get("api/connectionGroup/" + connectionGroupID + "?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to save a connection group,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} connectionGroup The connection group to update
*
* @returns {promise} A promise for the HTTP call.
*/
service.saveConnectionGroup = function saveConnectionGroup(connectionGroup) {
// This is a new connection group
if(!connectionGroup.identifier) {
return $http.post("api/connectionGroup/?token=" + authenticationService.getCurrentToken(), connectionGroup).success(
function setConnectionGroupID(connectionGroupID){
// Set the identifier on the new connection
connectionGroup.identifier = connectionGroupID;
return connectionGroupID;
});
} else {
return $http.post(
"api/connectionGroup/" + connectionGroup.identifier +
"?token=" + authenticationService.getCurrentToken(),
connectionGroup);
}
};
/**
* Makes a request to the REST API to move a connection group to a different group,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} connectionGroup The connection group to move.
*
* @returns {promise} A promise for the HTTP call.
*/
service.moveConnectionGroup = function moveConnectionGroup(connectionGroup) {
return $http.put(
"api/connectionGroup/" + connectionGroup.identifier +
"?token=" + authenticationService.getCurrentToken() +
"&parentID=" + connectionGroup.parentIdentifier,
connectionGroup);
};
/**
* Makes a request to the REST API to delete a connection group,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} connectionGroup The connection group to delete
*
* @returns {promise} A promise for the HTTP call.
*/
service.deleteConnectionGroup = function deleteConnectionGroup(connectionGroup) {
return $http['delete'](
"api/connectionGroup/" + connectionGroup.identifier +
"?token=" + authenticationService.getCurrentToken());
};
return service;
}]);

View File

@@ -0,0 +1,231 @@
/*
* Copyright (C) 2014 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 performing useful connection group related functionaltiy.
*/
angular.module('rest').factory('connectionGroupService', ['$injector', function connectionGroupService($injector) {
var connectionGroupDAO = $injector.get('connectionGroupDAO');
var connectionService = $injector.get('connectionService');
var permissionCheckService = $injector.get('permissionCheckService');
var $q = $injector.get('$q');
var displayObjectPreparationService = $injector.get('displayObjectPreparationService');
var service = {};
// Add all groups from this group to the parent group child list
function addToParent(connectionGroup, parentGroup, context, includeConnections) {
// Include connections by default
if(typeof includeConnections === 'undefined')
includeConnections = true;
parentGroup.children.push(connectionGroup);
// Prepare this group for display
displayObjectPreparationService.prepareConnectionGroup(connectionGroup);
if(includeConnections) {
// Get all connections in the group and add them under this connection group
context.openRequest();
connectionService.getConnections(connectionGroup.identifier).success(function fetchConnections(connections) {
for(var i = 0; i < connections.length; i++) {
connections[i].isConnection = true;
connectionGroup.children.push(connections[i]);
}
context.closeRequest();
});
}
// Get all connection groups in the group and repeat
context.openRequest();
connectionGroupDAO.getConnectionGroups(connectionGroup.identifier).success(function fetchConnectionGroups(connectionGroups) {
for(var i = 0; i < connectionGroups.length; i++) {
addToParent(connectionGroups[i], connectionGroup, context, includeConnections);
}
context.closeRequest();
});
}
/**
* Queries all connections and connection groups under the connection group
* with the provided parent ID, and returns them in a heirarchical structure
* with convinient display properties set on the objects.
*
* @param {array} items The root list of connections and groups. Should be an
* initally empty array that will get filled in as the
* connections and groups are loaded.
*
* @param {string} parentID The parent ID for the connection group.
* If not passed in, it will begin with
* the root connection group.
*
* @param {boolean} includeConnections Whether or not to include connections
* in the structure. Defaults to true.
*
* @param {boolean} includeRoot Whether or not to include the root connection group
* in the structure. Defaults to false.
*
* @return {promise} A promise that will be fulfilled when all connections
* and groups have been loaded.
*/
service.getAllGroupsAndConnections = function getAllGroupsAndConnections(items, parentID, includeConnections, includeRoot) {
// Include connections by default
if(typeof includeConnections === 'undefined')
includeConnections = true;
var context = {
// The number of requets to the server currently open
openRequests : 0,
// Create the promise
finishedFetching : $q.defer(),
// Notify the caller that the promise has been completed
complete : function complete() {
this.finishedFetching.resolve(items);
},
/**
* Indicate that a request has been started.
*/
openRequest : function openRequest() {
this.openRequests++;
},
/**
* Indicate that a request has been completed. If this was the last
* open request, fulfill the promise.
*/
closeRequest : function closeRequest() {
if(--this.openRequests === 0)
this.complete();
}
};
// Include the root only if it was asked for
if(includeRoot) {
context.openRequest();
connectionGroupDAO.getConnectionGroup(parentID).success(function setRootGroup (rootGroup) {
items.push(rootGroup);
rootGroup.children = [];
getChildrenOfRootGroup(rootGroup.children);
context.closeRequest();
});
} else {
getChildrenOfRootGroup(items);
}
// Get the children of the root group
function getChildrenOfRootGroup(children) {
context.openRequest();
connectionGroupDAO.getConnectionGroups(parentID).success(function fetchRootConnectionGroups(connectionGroups) {
for(var i = 0; i < connectionGroups.length; i++) {
addToParent(connectionGroups[i], {children: children}, context, includeConnections);
}
if(includeConnections) {
// Get all connections in the root group and add them under this connection group
context.openRequest();
connectionService.getConnections().success(function fetchRootConnections(connections) {
for(var i = 0; i < connections.length; i++) {
// Prepare this connection for display
displayObjectPreparationService.prepareConnection(connections[i]);
children.push(connections[i]);
}
context.closeRequest();
});
}
context.closeRequest();
});
}
// Return the promise
return context.finishedFetching.promise;
};
/**
* Filters the list of connections and groups using the provided permissions.
*
* @param {array} items The heirarchical list of groups and connections.
*
* @param {object} permissionList The list of permissions to use
* when filtering.
*
* @param {object} permissionCriteria A map of object type to permission type(s)
* required for that object type.
*
* @return {array} The filtered list.
*/
service.filterConnectionsAndGroupByPermission = function filterConnectionsAndGroupByPermission(items, permissionList, permissionCriteria) {
var requiredConnectionPermission = permissionCriteria.CONNECTION;
var requiredConnectionGroupPermission = permissionCriteria.CONNECTION_GROUP;
for(var i = 0; i < items.length; i++) {
var item = items[i];
if(item.isConnection && requiredConnectionPermission) {
/*
* If item is a connection and a permission is required for this
* item, check now to see if the permission exists. If not,
* remove the item.
*/
if(!permissionCheckService.checkPermission(permissionList,
"CONNECTION", item.identifier, requiredConnectionPermission)) {
items.splice(i, 1);
continue;
}
}
else {
/*
* If item is a group and a permission is required for this
* item, check now to see if the permission exists. If not,
* remove the item.
*/
if(requiredConnectionGroupPermission) {
if(!permissionCheckService.checkPermission(permissionList,
"CONNECTION_GROUP", item.identifier, requiredConnectionGroupPermission)) {
items.splice(i, 1);
continue;
}
}
// Filter the children of this connection group as well
if(item.children && item.children.length)
service.filterConnectionsAndGroupByPermission(items.children);
}
}
return items;
};
return service;
}]);

View File

@@ -0,0 +1,148 @@
/*
* Copyright (C) 2014 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.
*/
/**
* Service for operating on connections via the REST API.
*/
angular.module('rest').factory('connectionService', ['$http', 'authenticationService',
function connectionService($http, authenticationService) {
var service = {};
/**
* Makes a request to the REST API to get a single connection, returning a
* promise that provides the corresponding @link{Connection} if successful.
*
* @param {String} id The ID of the connection.
* @returns {Promise.<Connection>}
* A promise which will resolve with a @link{Connection} upon success.
*
* @example
*
* connectionService.getConnection('myConnection').success(function(connection) {
* // Do something with the connection
* });
*/
service.getConnection = function getConnection(id) {
return $http.get("api/connection/" + id + "?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to get the list of connections,
* returning a promise that can be used for processing the results of the
* call.
*
* @param {string} parentID The parent ID for the connection.
* If not passed in, it will query a list of the
* connections in the root group.
*
* @returns {Promise.<Connection[]>}
* A promise which will resolve with an array of @link{Connection}
* objects upon success.
*/
service.getConnections = function getConnections(parentID) {
var parentIDParam = "";
if(parentID !== undefined)
parentIDParam = "&parentID=" + parentID;
return $http.get("api/connection?token=" + authenticationService.getCurrentToken() + parentIDParam);
};
/**
* Makes a request to the REST API to save a connection, returning a
* promise that can be used for processing the results of the call.
*
* @param {Connection} connection The connection to update
*
* @returns {Promise}
* A promise for the HTTP call which will succeed if and only if the
* save operation is successful.
*/
service.saveConnection = function saveConnection(connection) {
/*
* FIXME: This should not be necessary. Perhaps the need for this is a
* sign that history should be queried separately, and not reside as
* part of the connection object?
*/
// Do not try to save the connection history records
var connectionToSave = angular.copy(connection);
delete connectionToSave.history;
// This is a new connection
if(!connectionToSave.identifier) {
return $http.post("api/connection/?token=" + authenticationService.getCurrentToken(), connectionToSave).success(
function setConnectionID(connectionID){
// Set the identifier on the new connection
connection.identifier = connectionID; // FIXME: Functions with side effects = bad
return connectionID; // FIXME: Why? Where does this value go?
});
} else {
return $http.post(
"api/connection/" + connectionToSave.identifier +
"?token=" + authenticationService.getCurrentToken(),
connectionToSave);
}
};
/**
* FIXME: Why is this different from save?
*
* Makes a request to the REST API to move a connection to a different
* group, returning a promise that can be used for processing the results
* of the call.
*
* @param {Connection} connection The connection to move.
*
* @returns {Promise}
* A promise for the HTTP call which will succeed if and only if the
* move operation is successful.
*/
service.moveConnection = function moveConnection(connection) {
return $http.put(
"api/connection/" + connection.identifier +
"?token=" + authenticationService.getCurrentToken() +
"&parentID=" + connection.parentIdentifier,
connection);
};
/**
* Makes a request to the REST API to delete a connection,
* returning a promise that can be used for processing the results of the call.
*
* @param {Connection} connection The connection to delete
*
* @returns {Promise}
* A promise for the HTTP call which will succeed if and only if the
* delete operation is successful.
*/
service.deleteConnection = function deleteConnection(connection) {
return $http['delete'](
"api/connection/" + connection.identifier +
"?token=" + authenticationService.getCurrentToken());
};
return service;
}]);

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) 2014 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 checking if a specific permission exists
* in a given list of permissions.
*/
angular.module('rest').factory('permissionCheckService', [
function permissionCheckService() {
var service = {};
/**
* A service for checking if the given permission list contains the given
* permission, defined by the objectType, objectID, and permissionType.
* If the objectType or objectID are not passed, they will not be checked.
*
* For example, checkPermission(list, "CONNECTION", undefined, "READ") would
* check if the permission list contains permission to read any connection.
*
* @param {array} permissions The array of permissions to check.
* @param {string} objectType The object type for the permission.
* If not passed, this will not be checked.
* @param {string} objectID The ID of the object the permission is for.
* If not passed, this will not be checked.
* @param {string} permissionType The actual permission type to check for.
* @returns {boolean} True if the given permissions contain the requested permission, false otherwise.
*/
service.checkPermission = function checkPermission(permissions, objectType, objectID, permissionType) {
// Loop through all the permissions and check if any of them match the given parameters
for(var i = 0; i < permissions.length; i++) {
var permission = permissions[i];
if(objectType === "SYSTEM") {
// System permissions have no object ID, we only need to check the type.
if(permission.permissionType === permissionType)
return true;
}
else {
// Object permissions need to match the object ID and type if given.
if(permission.permissionType === permissionType &&
(!objectType || permission.objectType === objectType) &&
(!objectID || permission.objectID === objectID))
return true;
}
}
// Didn't find any that matched
return false;
}
return service;
}]);

View File

@@ -0,0 +1,115 @@
/*
* Copyright (C) 2014 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.
*/
/**
* The DAO for permission operations agains the REST API.
*/
angular.module('rest').factory('permissionDAO', ['$http', 'authenticationService',
function permissionDAO($http, authenticationService) {
var service = {};
/**
* Makes a request to the REST API to get the list of permissions for a given user,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} userID The ID of the user to retrieve the permissions for.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getPermissions = function getPermissions(userID) {
return $http.get("api/permission/" + userID + "/?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to add a permission for a given user,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} userID The ID of the user to add the permission for.
* @param {object} permission The permission to add.
*
* @returns {promise} A promise for the HTTP call.
*/
service.addPermission = function addPermission(userID, permission) {
return $http.post("api/permission/" + userID + "/?token=" + authenticationService.getCurrentToken(), permission);
};
/**
* Makes a request to the REST API to remove a permission for a given user,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} userID The ID of the user to remove the permission for.
* @param {object} permission The permission to remove.
*
* @returns {promise} A promise for the HTTP call.
*/
service.removePermission = function removePermission(userID, permission) {
return $http.post("api/permission/remove/" + userID + "/?token=" + authenticationService.getCurrentToken(), permission);
};
/**
* Makes a request to the REST API to modify the permissions for a given user,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} userID The ID of the user to remove the permission for.
* @param {array} permissionsToAdd The permissions to add.
* @param {array} permissionsToRemove The permissions to remove.
*
* @returns {promise} A promise for the HTTP call.
*/
service.patchPermissions = function patchPermissions(userID, permissionsToAdd, permissionsToRemove) {
var permissionPatch = [];
// Add all the add operations to the patch
for(var i = 0; i < permissionsToAdd.length; i++ ) {
permissionPatch.push({
op : "add",
path : userID,
value : permissionsToAdd[i]
});
}
// Add all the remove operations to the patch
for(var i = 0; i < permissionsToRemove.length; i++ ) {
permissionPatch.push({
op : "remove",
path : userID,
value : permissionsToRemove[i]
});
}
// Make the HTTP call
return $http({
method : 'PATCH',
url : "api/permission/?token=" + authenticationService.getCurrentToken(),
data : permissionPatch
});
}
return service;
}]);

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2014 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.
*/
/**
* The DAO for protocol operations agains the REST API.
*/
angular.module('rest').factory('protocolDAO', ['$http', function protocolDAO($http) {
var service = {};
/**
* Makes a request to the REST API to get the list of protocols,
* returning a promise that can be used for processing the results of the call.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getProtocols = function getProtocols() {
return $http.get("api/protocol");
};
return service;
}]);

View File

@@ -0,0 +1,100 @@
/*
* Copyright (C) 2014 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.
*/
/**
* The DAO for connection operations agains the REST API.
*/
angular.module('rest').factory('userDAO', ['$http', 'authenticationService',
function userDAO($http, authenticationService) {
var service = {};
/**
* Makes a request to the REST API to get the list of users,
* returning a promise that can be used for processing the results of the call.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getUsers = function getUsers() {
return $http.get("api/user?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to get the list of users,
* returning a promise that can be used for processing the results of the call.
*
* @param {string} userID The ID of the user to retrieve.
*
* @returns {promise} A promise for the HTTP call.
*/
service.getUser = function getUser(userID) {
return $http.get("api/user/" + userID + "/?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to delete a user,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} user The user to delete.
*
* @returns {promise} A promise for the HTTP call.
*/
service.deleteUser = function deleteUser(user) {
return $http['delete'](
"api/user/" + user.username +
"?token=" + authenticationService.getCurrentToken());
};
/**
* Makes a request to the REST API to create a user,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} user The user to create.
*
* @returns {promise} A promise for the HTTP call.
*/
service.createUser = function createUser(user) {
return $http.post(
"api/user/"
+ "?token=" + authenticationService.getCurrentToken(),
user
);
}
/**
* Makes a request to the REST API to save a user,
* returning a promise that can be used for processing the results of the call.
*
* @param {object} user The user to update.
*
* @returns {promise} A promise for the HTTP call.
*/
service.saveUser = function saveUser(user) {
return $http.post(
"api/user/" + user.username +
"?token=" + authenticationService.getCurrentToken(),
user);
};
return service;
}]);

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) 2014 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 performing useful user related functionaltiy.
*/
angular.module('rest').factory('userService', ['$injector', function userService($injector) {
var permissionCheckService = $injector.get('permissionCheckService');
var service = {};
/**
* Filters the list of users using the provided permissions.
*
* @param {array} users The user list.
*
* @param {object} permissionList The list of permissions to use
* when filtering.
*
* @param {object} permissionCriteria The required permission for each user.
*
* @return {array} The filtered list.
*/
service.filterUsersByPermission = function filterUsersByPermission(users, permissionList, permissionCriteria) {
for(var i = 0; i < users.length; i++) {
if(!permissionCheckService.checkPermission(permissionList,
"USER", user.username, permissionCriteria)) {
items.splice(i, 1);
continue;
}
}
return users;
};
return service;
}]);

View File

@@ -0,0 +1,96 @@
/*
* Copyright (C) 2014 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.
*/
/**
* Service which defines the Connection class.
*/
angular.module('rest').factory('Connection', [function defineConnection() {
/**
* The object returned by REST API calls when representing the data
* associated with a connection.
*
* @constructor
* @param {Connection|Object} [template={}]
* The object whose properties should be copied within the new
* Connection.
*/
var Connection = function Connection(template) {
// Use empty object by default
template = template || {};
/**
* The unique identifier associated with this connection.
*
* @type String
*/
this.identifier = template.identifier;
/**
* The unique identifier of the connection group that contains this
* connection.
*
* @type String
*/
this.parentIdentifier = template.parentIdentifier;
/**
* The human-readable name of this connection, which is not necessarily
* unique.
*
* @type String
*/
this.name = template.name;
/**
* The name of the protocol associated with this connection, such as
* "vnc" or "rdp".
*
* @type String
*/
this.protocol = template.protocol;
/**
* All previous and current usages of this connection, along with
* associated users.
*
* @type ConnectionHistoryEntry[]
*/
this.history = template.history || [];
/**
* Connection configuration parameters, as dictated by the protocol in
* use, arranged as name/value pairs. This information may not be
* available if the current user lacks permission to update
* connection parameters, even if they otherwise have permission to
* read and use the connection.
*
* @type Object.<String, String>
*/
this.parameters = template.parameters || {};
};
return Connection;
}]);

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2014 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.
*/
/**
* Service which defines the ConnectionHistoryEntry class.
*/
angular.module('rest').factory('ConnectionHistoryEntry', [function defineConnectionHistoryEntry() {
/**
* The object returned by REST API calls when representing the data
* associated with an entry in a connection's usage history. Each history
* entry represents the time at which a particular started using a
* connection and, if applicable, the time that usage stopped.
*
* @constructor
* @param {ConnectionHistoryEntry|Object} [template={}]
* The object whose properties should be copied within the new
* ConnectionHistoryEntry.
*/
var ConnectionHistoryEntry = function ConnectionHistoryEntry(template) {
// Use empty object by default
template = template || {};
/**
* The time that usage began, in seconds since 1970-01-01 00:00:00 UTC.
*
* @type Number
*/
this.startDate = template.startDate;
/**
* The time that usage ended, in seconds since 1970-01-01 00:00:00 UTC.
* The absence of an endDate does NOT necessarily indicate that the
* connection is still in use, particularly if the server was shutdown
* or restarted before the history entry could be updated. To determine
* whether a connection is still active, check the active property of
* this history entry.
*
* @type Number
*/
this.endDate = template.endDate;
/**
* The username of the user associated with this particular usage of
* the connection.
*
* @type String
*/
this.username = template.username;
/**
* Whether this usage of the connection is still active. Note that this
* is the only accurate way to check for connection activity; the
* absence of endDate does not necessarily imply the connection is
* active, as the history entry may simply be incomplete.
*
* @type Boolean
*/
this.active = template.active;
};
return ConnectionHistoryEntry;
}]);