mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 00:53: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