From e584447a6973ec24aefa0fae57eef6dc5d00b5dd Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 24 Feb 2015 17:29:39 -0800 Subject: [PATCH] GUAC-1101: Load connection parameters upon request. --- .../mysql/MySQLAuthenticationProvider.java | 2 +- .../net/auth/mysql/MySQLConnection.java | 33 +++-- .../mysql/MySQLGuacamoleConfiguration.java | 131 ++++++++++++++++++ .../auth/mysql/service/ConnectionService.java | 35 +++++ 4 files changed, 192 insertions(+), 9 deletions(-) create mode 100644 extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLGuacamoleConfiguration.java diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLAuthenticationProvider.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLAuthenticationProvider.java index 975e42bee..c2e75c7fa 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLAuthenticationProvider.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLAuthenticationProvider.java @@ -45,7 +45,6 @@ import net.sourceforge.guacamole.net.auth.mysql.service.SaltService; import net.sourceforge.guacamole.net.auth.mysql.service.SecureRandomSaltService; import net.sourceforge.guacamole.net.auth.mysql.service.SystemPermissionService; import net.sourceforge.guacamole.net.auth.mysql.service.UserService; -import org.glyptodon.guacamole.properties.GuacamoleProperties; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.glyptodon.guacamole.environment.Environment; import org.glyptodon.guacamole.environment.LocalEnvironment; @@ -151,6 +150,7 @@ public class MySQLAuthenticationProvider implements AuthenticationProvider { bind(Environment.class).toInstance(environment); bind(ConnectionDirectory.class); bind(MySQLConnection.class); + bind(MySQLGuacamoleConfiguration.class); bind(MySQLUser.class); bind(MySQLUserContext.class); bind(MySQLRootConnectionGroup.class); diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLConnection.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLConnection.java index aa33e0b68..d1d713ae5 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLConnection.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/MySQLConnection.java @@ -23,6 +23,7 @@ package net.sourceforge.guacamole.net.auth.mysql; import com.google.inject.Inject; +import com.google.inject.Provider; import java.util.Collections; import java.util.List; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionModel; @@ -57,6 +58,17 @@ public class MySQLConnection implements Connection, DirectoryObject configProvider; + + /** + * The manually-set GuacamoleConfiguration, if any. + */ + private GuacamoleConfiguration config = null; /** * Creates a new, empty MySQLConnection. @@ -86,8 +98,9 @@ public class MySQLConnection implements Connection, DirectoryObject parameters = null; + + /** + * Creates a new, empty MySQLGuacamoleConfiguration. + */ + public MySQLGuacamoleConfiguration() { + } + + /** + * Initializes this configuration, associating it with the current + * authenticated user and populating it with data from the given model + * object. + * + * @param currentUser + * The user that created or retrieved this configuration. + * + * @param connectionModel + * The model object backing this configuration. + */ + public void init(AuthenticatedUser currentUser, ConnectionModel connectionModel) { + this.currentUser = currentUser; + this.connectionModel = connectionModel; + } + + @Override + public String getConnectionID() { + return connectionModel.getIdentifier(); + } + + @Override + public void setConnectionID(String connectionID) { + throw new UnsupportedOperationException("The ID of this GuacamoleConfiguration is immutable."); + } + + @Override + public String getProtocol() { + return connectionModel.getProtocol(); + } + + @Override + public void setProtocol(String protocol) { + super.setProtocol(protocol); + connectionModel.setProtocol(protocol); + } + + + @Override + public void setParameters(Map parameters) { + this.parameters = parameters; + super.setParameters(parameters); + } + + @Override + public Map getParameters() { + + // Retrieve visible parameters, if not overridden by setParameters() + if (parameters == null) { + + // Retrieve all visible parameters + Map visibleParameters = + connectionService.retrieveParameters(currentUser, connectionModel.getIdentifier()); + + // Use retrieved parameters to back future operations + super.setParameters(visibleParameters); + + } + + return super.getParameters(); + + } + +} diff --git a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java index ecc450b99..bcfe38404 100644 --- a/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java +++ b/extensions/guacamole-auth-mysql/src/main/java/net/sourceforge/guacamole/net/auth/mysql/service/ConnectionService.java @@ -25,6 +25,8 @@ package net.sourceforge.guacamole.net.auth.mysql.service; import com.google.inject.Inject; import com.google.inject.Provider; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import net.sourceforge.guacamole.net.auth.mysql.AuthenticatedUser; import net.sourceforge.guacamole.net.auth.mysql.MySQLConnection; @@ -180,6 +182,39 @@ public class ConnectionService extends DirectoryObjectService retrieveParameters(AuthenticatedUser user, + String identifier) { + + // FIXME: Check permissions + + Map parameterMap = new HashMap(); + + // Convert associated parameters to map + Collection parameters = parameterMapper.select(identifier); + for (ParameterModel parameter : parameters) + parameterMap.put(parameter.getName(), parameter.getValue()); + + return parameterMap; + + } + /** * Connects to the given connection as the given user, using the given * client information. If the user does not have permission to read the