mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 13:41:21 +00:00
Store config permissions in XML attributes (#268).
This commit is contained in:
@@ -28,8 +28,16 @@ import javax.xml.stream.XMLOutputFactory;
|
|||||||
import javax.xml.stream.XMLStreamException;
|
import javax.xml.stream.XMLStreamException;
|
||||||
import javax.xml.stream.XMLStreamWriter;
|
import javax.xml.stream.XMLStreamWriter;
|
||||||
import net.sourceforge.guacamole.GuacamoleException;
|
import net.sourceforge.guacamole.GuacamoleException;
|
||||||
|
import net.sourceforge.guacamole.GuacamoleSecurityException;
|
||||||
import net.sourceforge.guacamole.net.auth.GuacamoleConfigurationDirectory;
|
import net.sourceforge.guacamole.net.auth.GuacamoleConfigurationDirectory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.PermissionDirectory;
|
||||||
|
import net.sourceforge.guacamole.net.auth.User;
|
||||||
import net.sourceforge.guacamole.net.auth.UserContext;
|
import net.sourceforge.guacamole.net.auth.UserContext;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.GuacamoleConfigurationDirectoryPermission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.GuacamoleConfigurationPermission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.ObjectPermission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.Permission;
|
||||||
|
import net.sourceforge.guacamole.net.auth.permission.SystemPermission;
|
||||||
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,6 +48,72 @@ import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
|
|||||||
*/
|
*/
|
||||||
public class ConfigurationList extends AuthenticatingHttpServlet {
|
public class ConfigurationList extends AuthenticatingHttpServlet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given user has permission to perform the given
|
||||||
|
* system operation. Security exceptions are handled appropriately - only
|
||||||
|
* non-security exceptions pass through.
|
||||||
|
*
|
||||||
|
* @param permissions The PermissionsDirectory to check.
|
||||||
|
* @param user The user whose permissions should be verified.
|
||||||
|
* @param type The type of operation to check for permission for.
|
||||||
|
* @return true if permission is granted, false otherwise.
|
||||||
|
*
|
||||||
|
* @throws GuacamoleException If an error occurs while checking permissions.
|
||||||
|
*/
|
||||||
|
private boolean hasConfigPermission(PermissionDirectory permissions,
|
||||||
|
User user, SystemPermission.Type type)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Build permission
|
||||||
|
Permission permission =
|
||||||
|
new GuacamoleConfigurationDirectoryPermission(type);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Return result of permission check, if possible
|
||||||
|
return permissions.hasPermission(user, permission);
|
||||||
|
}
|
||||||
|
catch (GuacamoleSecurityException e) {
|
||||||
|
// If cannot check due to security restrictions, no permission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given user has permission to perform the given
|
||||||
|
* object operation. Security exceptions are handled appropriately - only
|
||||||
|
* non-security exceptions pass through.
|
||||||
|
*
|
||||||
|
* @param permissions The PermissionsDirectory to check.
|
||||||
|
* @param user The user whose permissions should be verified.
|
||||||
|
* @param type The type of operation to check for permission for.
|
||||||
|
* @param identifier The identifier of the configuration the operation
|
||||||
|
* would be performed upon.
|
||||||
|
* @return true if permission is granted, false otherwise.
|
||||||
|
*
|
||||||
|
* @throws GuacamoleException If an error occurs while checking permissions.
|
||||||
|
*/
|
||||||
|
private boolean hasConfigPermission(PermissionDirectory permissions,
|
||||||
|
User user, ObjectPermission.Type type, String identifier)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Build permission
|
||||||
|
Permission permission = new GuacamoleConfigurationPermission(
|
||||||
|
type,
|
||||||
|
identifier
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Return result of permission check, if possible
|
||||||
|
return permissions.hasPermission(user, permission);
|
||||||
|
}
|
||||||
|
catch (GuacamoleSecurityException e) {
|
||||||
|
// If cannot check due to security restrictions, no permission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void authenticatedService(
|
protected void authenticatedService(
|
||||||
UserContext context,
|
UserContext context,
|
||||||
@@ -68,6 +142,19 @@ public class ConfigurationList extends AuthenticatingHttpServlet {
|
|||||||
throw new ServletException("Unable to retrieve configurations.", e);
|
throw new ServletException("Unable to retrieve configurations.", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to get permission directory
|
||||||
|
PermissionDirectory permissions = null;
|
||||||
|
try {
|
||||||
|
permissions = context.getPermissionDirectory();
|
||||||
|
}
|
||||||
|
catch (GuacamoleSecurityException e) {
|
||||||
|
// Soft fail - can't check permissions ... assume have READ and
|
||||||
|
// nothing else
|
||||||
|
}
|
||||||
|
catch (GuacamoleException e) {
|
||||||
|
throw new ServletException("Unable to retrieve permissions.", e);
|
||||||
|
}
|
||||||
|
|
||||||
// Write actual XML
|
// Write actual XML
|
||||||
try {
|
try {
|
||||||
|
|
||||||
@@ -89,6 +176,31 @@ public class ConfigurationList extends AuthenticatingHttpServlet {
|
|||||||
xml.writeAttribute("id", entry.getKey());
|
xml.writeAttribute("id", entry.getKey());
|
||||||
xml.writeAttribute("protocol", config.getProtocol());
|
xml.writeAttribute("protocol", config.getProtocol());
|
||||||
|
|
||||||
|
// Save config create permission attribute
|
||||||
|
if (hasConfigPermission(permissions, context.self(),
|
||||||
|
SystemPermission.Type.CREATE))
|
||||||
|
xml.writeAttribute("create", "yes");
|
||||||
|
|
||||||
|
// Check permissions and set attributes appropriately
|
||||||
|
if (permissions != null) {
|
||||||
|
|
||||||
|
// Save update permission attribute
|
||||||
|
if (hasConfigPermission(permissions, context.self(),
|
||||||
|
ObjectPermission.Type.UPDATE, entry.getKey()))
|
||||||
|
xml.writeAttribute("update", "yes");
|
||||||
|
|
||||||
|
// Save admin permission attribute
|
||||||
|
if (hasConfigPermission(permissions, context.self(),
|
||||||
|
ObjectPermission.Type.ADMINSTER, entry.getKey()))
|
||||||
|
xml.writeAttribute("admin", "yes");
|
||||||
|
|
||||||
|
// Save delete permission attribute
|
||||||
|
if (hasConfigPermission(permissions, context.self(),
|
||||||
|
ObjectPermission.Type.DELETE, entry.getKey()))
|
||||||
|
xml.writeAttribute("delete", "yes");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// End document
|
// End document
|
||||||
@@ -99,6 +211,9 @@ public class ConfigurationList extends AuthenticatingHttpServlet {
|
|||||||
catch (XMLStreamException e) {
|
catch (XMLStreamException e) {
|
||||||
throw new IOException("Unable to write configuration list XML.", e);
|
throw new IOException("Unable to write configuration list XML.", e);
|
||||||
}
|
}
|
||||||
|
catch (GuacamoleException e) {
|
||||||
|
throw new ServletException("Unable to read configurations.", e);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user