diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java index d59f8c52c..712a82f62 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionObjectTranslator.java @@ -22,6 +22,7 @@ package org.apache.guacamole.rest.activeconnection; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.GuacamoleUnsupportedException; import org.apache.guacamole.net.auth.ActiveConnection; +import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; /** @@ -30,7 +31,7 @@ import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; * toExternalObject() is implemented here. */ public class ActiveConnectionObjectTranslator - implements DirectoryObjectTranslator { + extends DirectoryObjectTranslator { @Override public APIActiveConnection toExternalObject(ActiveConnection object) @@ -56,4 +57,10 @@ public class ActiveConnectionObjectTranslator } + @Override + public void filterExternalObject(UserContext context, + APIActiveConnection object) throws GuacamoleException { + // Nothing to filter on ActiveConnections (no attributes) + } + } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java index e72e674a3..47ba3d42b 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/activeconnection/ActiveConnectionResource.java @@ -89,7 +89,7 @@ public class ActiveConnectionResource @Assisted Directory directory, @Assisted ActiveConnection activeConnection, DirectoryObjectTranslator translator) { - super(directory, activeConnection, translator); + super(userContext, directory, activeConnection, translator); this.userContext = userContext; this.activeConnection = activeConnection; } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java index 112c71aa2..416fb4a63 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionObjectTranslator.java @@ -21,6 +21,7 @@ package org.apache.guacamole.rest.connection; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.Connection; +import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.protocol.GuacamoleConfiguration; import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; @@ -29,7 +30,7 @@ import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; * objects. */ public class ConnectionObjectTranslator - implements DirectoryObjectTranslator { + extends DirectoryObjectTranslator { @Override public APIConnection toExternalObject(Connection object) @@ -59,4 +60,14 @@ public class ConnectionObjectTranslator } + @Override + public void filterExternalObject(UserContext userContext, + APIConnection object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getConnectionAttributes(), object.getAttributes())); + + } + } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java index b1ddcfc47..0b63b66e5 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connection/ConnectionResource.java @@ -100,7 +100,7 @@ public class ConnectionResource extends DirectoryObjectResource directory, @Assisted Connection connection, DirectoryObjectTranslator translator) { - super(directory, connection, translator); + super(userContext, directory, connection, translator); this.userContext = userContext; this.connection = connection; } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java index 18de4dc0e..3c0ed38d6 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupObjectTranslator.java @@ -21,6 +21,7 @@ package org.apache.guacamole.rest.connectiongroup; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.ConnectionGroup; +import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; /** @@ -28,7 +29,7 @@ import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; * APIConnectionGroup objects. */ public class ConnectionGroupObjectTranslator - implements DirectoryObjectTranslator { + extends DirectoryObjectTranslator { @Override public APIConnectionGroup toExternalObject(ConnectionGroup object) @@ -53,4 +54,15 @@ public class ConnectionGroupObjectTranslator } + @Override + public void filterExternalObject(UserContext userContext, + APIConnectionGroup object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getConnectionGroupAttributes(), + object.getAttributes())); + + } + } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java index 9e7c9866a..f91b8ebb9 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/connectiongroup/ConnectionGroupResource.java @@ -79,7 +79,7 @@ public class ConnectionGroupResource @Assisted Directory directory, @Assisted ConnectionGroup connectionGroup, DirectoryObjectTranslator translator) { - super(directory, connectionGroup, translator); + super(userContext, directory, connectionGroup, translator); this.userContext = userContext; this.connectionGroup = connectionGroup; } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java index b5277b3f9..7b354a226 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryObjectResource.java @@ -29,6 +29,7 @@ import org.apache.guacamole.GuacamoleClientException; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.Directory; import org.apache.guacamole.net.auth.Identifiable; +import org.apache.guacamole.net.auth.UserContext; /** * A REST resource which abstracts the operations available on an existing @@ -50,6 +51,12 @@ import org.apache.guacamole.net.auth.Identifiable; @Consumes(MediaType.APPLICATION_JSON) public abstract class DirectoryObjectResource { + /** + * The UserContext associated with the Directory containing the object + * represented by this DirectoryObjectResource. + */ + private final UserContext userContext; + /** * The Directory which contains the object represented by this * DirectoryObjectResource. @@ -71,6 +78,9 @@ public abstract class DirectoryObjectResource directory, InternalType object, + public DirectoryObjectResource(UserContext userContext, + Directory directory, InternalType object, DirectoryObjectTranslator translator) { + this.userContext = userContext; this.directory = directory; this.object = object; this.translator = translator; @@ -121,6 +133,9 @@ public abstract class DirectoryObjectResource { +public abstract class DirectoryObjectTranslator { /** * Converts the given object to an object which is intended to be used in @@ -51,7 +57,7 @@ public interface DirectoryObjectTranslator filterAttributes(Collection
schema, + Map attributes) { + + Map filtered = new HashMap(); + + // Grab all attribute value strictly for defined fields + for (Form form : schema) { + for (Field field : form.getFields()) { + + // Pull the associated attribute value from given map + String attributeName = field.getName(); + String attributeValue = attributes.get(attributeName); + + // Include attribute value within filtered map only if + // (1) defined and (2) present within provided map + if (attributeValue != null) + filtered.put(attributeName, attributeValue); + + } + } + + return filtered; + + } } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java index 2af0e26df..3cbd4817d 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/directory/DirectoryResource.java @@ -222,6 +222,9 @@ public abstract class DirectoryResource { + extends DirectoryObjectTranslator { @Override public APISharingProfile toExternalObject(SharingProfile object) @@ -53,4 +54,15 @@ public class SharingProfileObjectTranslator } + @Override + public void filterExternalObject(UserContext userContext, + APISharingProfile object) throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes( + userContext.getSharingProfileAttributes(), + object.getAttributes())); + + } + } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java index 1f18d0f94..7b96de904 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/sharingprofile/SharingProfileResource.java @@ -82,7 +82,7 @@ public class SharingProfileResource @Assisted Directory directory, @Assisted SharingProfile sharingProfile, DirectoryObjectTranslator translator) { - super(directory, sharingProfile, translator); + super(userContext, directory, sharingProfile, translator); this.userContext = userContext; this.sharingProfile = sharingProfile; } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java index 35bce6681..8536b3507 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserObjectTranslator.java @@ -21,13 +21,14 @@ package org.apache.guacamole.rest.user; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.User; +import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.rest.directory.DirectoryObjectTranslator; /** * Translator which converts between User objects and APIUser objects. */ public class UserObjectTranslator - implements DirectoryObjectTranslator { + extends DirectoryObjectTranslator { @Override public APIUser toExternalObject(User object) @@ -54,4 +55,14 @@ public class UserObjectTranslator } + @Override + public void filterExternalObject(UserContext userContext, APIUser object) + throws GuacamoleException { + + // Filter object attributes by defined schema + object.setAttributes(filterAttributes(userContext.getUserAttributes(), + object.getAttributes())); + + } + } diff --git a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java index 75a49dbbf..06bab9f43 100644 --- a/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java +++ b/guacamole/src/main/java/org/apache/guacamole/rest/user/UserResource.java @@ -92,7 +92,7 @@ public class UserResource @Assisted Directory directory, @Assisted User user, DirectoryObjectTranslator translator) { - super(directory, user, translator); + super(userContext, directory, user, translator); this.userContext = userContext; this.directory = directory; this.user = user;