diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java index 046cee1e2..80c75dbbb 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/activeconnection/ActiveConnectionService.java @@ -166,6 +166,14 @@ public class ActiveConnectionService } + @Override + public void updateExternalObject(ModeledAuthenticatedUser user, ActiveConnection object) throws GuacamoleException { + + // Updating active connections is not implemented + throw new GuacamoleSecurityException("Permission denied."); + + } + /** * Retrieve the permission set for the specified user that relates * to access to active connections. diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java index 590e01e9f..29d40cc49 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/DirectoryObjectService.java @@ -116,6 +116,24 @@ public interface DirectoryObjectService { void deleteObject(ModeledAuthenticatedUser user, String identifier) throws GuacamoleException; + /** + * Updates the object corresponding to the given external representation, + * applying any changes that have been made. If no such object exists, + * this function has no effect. + * + * @param user + * The user updating the object. + * + * @param object + * The external object to apply updates from. + * + * @throws GuacamoleException + * If the user lacks permission to update the object, or an error + * occurs while updating the object. + */ + void updateExternalObject(ModeledAuthenticatedUser user, ExternalType object) + throws GuacamoleException; + /** * Updates the given object, applying any changes that have been made. If * no such object exists, this function has no effect. diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java index 80bc7eb5c..75c25926b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ModeledDirectoryObjectService.java @@ -511,6 +511,20 @@ public abstract class ModeledDirectoryObjectService getIdentifiers(ModeledAuthenticatedUser user) throws GuacamoleException { diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java index c3052b1b4..69eb1fd36 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ObjectModel.java @@ -21,6 +21,8 @@ package org.apache.guacamole.auth.jdbc.base; import java.util.Collection; +import org.apache.guacamole.GuacamoleException; + /** * Object representation of a Guacamole object, such as a user or connection, * as represented in the database. @@ -75,7 +77,7 @@ public abstract class ObjectModel { * * @return * The ID of this object in the database, or null if this object was - * not retrieved from the database. + * not retrieved from or intended to update the database. */ public Integer getObjectID() { return objectID; @@ -91,6 +93,31 @@ public abstract class ObjectModel { this.objectID = objectID; } + /** + * Given a text identifier, attempt to convert to an integer database ID. + * If the identifier is valid, the database ID will be set to this value. + * Otherwise, a GuacamoleException will be thrown. + * + * @param identifier + * The identifier to convert to an integer and set on the database + * model, if valid. + * + * @throws GuacamoleException + * If the provided identifier is not a valid integer. + */ + public void setObjectID(String identifier) throws GuacamoleException { + + // Try to convert the provided identifier to an integer ID + try { + setObjectID(Integer.parseInt(identifier)); + } + + catch (NumberFormatException e) { + throw new GuacamoleException( + "Database identifiers must be integers."); + } + } + /** * Returns a map of attribute name/value pairs for all attributes associated * with this model which do not have explicit mappings to actual model diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java index 775628889..b2f3e2bea 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionDirectory.java @@ -71,16 +71,15 @@ public class ConnectionDirectory extends JDBCDirectory { // If the provided connection is already an internal type, update // using the internal method - if (object instanceof ModeledConnection) { - ModeledConnection connection = (ModeledConnection) object; - connectionService.updateObject(getCurrentUser(), connection); - } + if (object instanceof ModeledConnection) + connectionService.updateObject( + getCurrentUser(), (ModeledConnection) object); // If the type is not already the expected internal type, use the // external update method - else { + else connectionService.updateExternalObject(getCurrentUser(), object); - } + } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java index da454025d..03413650b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionModel.java @@ -387,9 +387,4 @@ public class ConnectionModel extends ChildObjectModel { } - @Override - public void setIdentifier(String identifier) { - throw new UnsupportedOperationException("Connection identifiers are derived from IDs. They cannot be set."); - } - } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java index b3ed89ce8..cdf2afb76 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ConnectionService.java @@ -110,14 +110,19 @@ public class ConnectionService extends ModeledChildDirectoryObjectService