GUAC-1101: Load connection parameters upon request.

This commit is contained in:
Michael Jumper
2015-02-24 17:29:39 -08:00
parent 14ebda6b37
commit e584447a69
4 changed files with 192 additions and 9 deletions

View File

@@ -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.SecureRandomSaltService;
import net.sourceforge.guacamole.net.auth.mysql.service.SystemPermissionService; import net.sourceforge.guacamole.net.auth.mysql.service.SystemPermissionService;
import net.sourceforge.guacamole.net.auth.mysql.service.UserService; import net.sourceforge.guacamole.net.auth.mysql.service.UserService;
import org.glyptodon.guacamole.properties.GuacamoleProperties;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.glyptodon.guacamole.environment.Environment; import org.glyptodon.guacamole.environment.Environment;
import org.glyptodon.guacamole.environment.LocalEnvironment; import org.glyptodon.guacamole.environment.LocalEnvironment;
@@ -151,6 +150,7 @@ public class MySQLAuthenticationProvider implements AuthenticationProvider {
bind(Environment.class).toInstance(environment); bind(Environment.class).toInstance(environment);
bind(ConnectionDirectory.class); bind(ConnectionDirectory.class);
bind(MySQLConnection.class); bind(MySQLConnection.class);
bind(MySQLGuacamoleConfiguration.class);
bind(MySQLUser.class); bind(MySQLUser.class);
bind(MySQLUserContext.class); bind(MySQLUserContext.class);
bind(MySQLRootConnectionGroup.class); bind(MySQLRootConnectionGroup.class);

View File

@@ -23,6 +23,7 @@
package net.sourceforge.guacamole.net.auth.mysql; package net.sourceforge.guacamole.net.auth.mysql;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionModel; import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionModel;
@@ -57,6 +58,17 @@ public class MySQLConnection implements Connection, DirectoryObject<ConnectionMo
*/ */
@Inject @Inject
private ConnectionService connectionService; private ConnectionService connectionService;
/**
* Provider for lazy-loaded, permission-controlled configurations.
*/
@Inject
private Provider<MySQLGuacamoleConfiguration> configProvider;
/**
* The manually-set GuacamoleConfiguration, if any.
*/
private GuacamoleConfiguration config = null;
/** /**
* Creates a new, empty MySQLConnection. * Creates a new, empty MySQLConnection.
@@ -86,8 +98,9 @@ public class MySQLConnection implements Connection, DirectoryObject<ConnectionMo
} }
@Override @Override
public void setModel(ConnectionModel userModel) { public void setModel(ConnectionModel connectionModel) {
this.connectionModel = userModel; this.connectionModel = connectionModel;
this.config = null;
} }
@Override @Override
@@ -137,20 +150,24 @@ public class MySQLConnection implements Connection, DirectoryObject<ConnectionMo
@Override @Override
public GuacamoleConfiguration getConfiguration() { public GuacamoleConfiguration getConfiguration() {
GuacamoleConfiguration config = new GuacamoleConfiguration(); // If configuration has been manually set, return that
config.setProtocol(connectionModel.getProtocol()); if (config != null)
return config;
/* FIXME: Set parameters, if available */ // Otherwise, return permission-controlled configuration
MySQLGuacamoleConfiguration restrictedConfig = configProvider.get();
restrictedConfig.init(currentUser, connectionModel);
return restrictedConfig;
return config;
} }
@Override @Override
public void setConfiguration(GuacamoleConfiguration config) { public void setConfiguration(GuacamoleConfiguration config) {
/* FIXME: Set parameters, if available */ // Store manually-set configuration internally
this.config = config;
// Update model
connectionModel.setProtocol(config.getProtocol()); connectionModel.setProtocol(config.getProtocol());
} }

View File

@@ -0,0 +1,131 @@
/*
* Copyright (C) 2015 Glyptodon LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package net.sourceforge.guacamole.net.auth.mysql;
import com.google.inject.Inject;
import java.util.Map;
import net.sourceforge.guacamole.net.auth.mysql.model.ConnectionModel;
import net.sourceforge.guacamole.net.auth.mysql.service.ConnectionService;
import org.glyptodon.guacamole.protocol.GuacamoleConfiguration;
/**
* Implementation of GuacamoleConfiguration which loads parameter values only
* if necessary, and only if allowed.
*
* @author Michael Jumper
*/
public class MySQLGuacamoleConfiguration extends GuacamoleConfiguration {
/**
* The user this configuration belongs to. Access is based on his/her
* permission settings.
*/
private AuthenticatedUser currentUser;
/**
* The internal model object containing the values which represent the
* connection associated with this configuration.
*/
private ConnectionModel connectionModel;
/**
* Service for managing connection parameters.
*/
@Inject
private ConnectionService connectionService;
/**
* The manually-set parameter map, if any.
*/
private Map<String, String> 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<String, String> parameters) {
this.parameters = parameters;
super.setParameters(parameters);
}
@Override
public Map<String, String> getParameters() {
// Retrieve visible parameters, if not overridden by setParameters()
if (parameters == null) {
// Retrieve all visible parameters
Map<String, String> visibleParameters =
connectionService.retrieveParameters(currentUser, connectionModel.getIdentifier());
// Use retrieved parameters to back future operations
super.setParameters(visibleParameters);
}
return super.getParameters();
}
}

View File

@@ -25,6 +25,8 @@ package net.sourceforge.guacamole.net.auth.mysql.service;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
import net.sourceforge.guacamole.net.auth.mysql.AuthenticatedUser; import net.sourceforge.guacamole.net.auth.mysql.AuthenticatedUser;
import net.sourceforge.guacamole.net.auth.mysql.MySQLConnection; import net.sourceforge.guacamole.net.auth.mysql.MySQLConnection;
@@ -180,6 +182,39 @@ public class ConnectionService extends DirectoryObjectService<MySQLConnection, C
} }
/**
* Retrieves all parameters visible to the given user and associated with
* the connection having the given identifier. If the given user has no
* access to such parameters, or no such connection exists, the returned
* map will be empty.
*
* @param user
* The user retrieving connection parameters.
*
* @param identifier
* The identifier of the connection whose parameters are being
* retrieved.
*
* @return
* A new map of all parameter name/value pairs that the given user has
* access to.
*/
public Map<String, String> retrieveParameters(AuthenticatedUser user,
String identifier) {
// FIXME: Check permissions
Map<String, String> parameterMap = new HashMap<String, String>();
// Convert associated parameters to map
Collection<ParameterModel> 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 * Connects to the given connection as the given user, using the given
* client information. If the user does not have permission to read the * client information. If the user does not have permission to read the