Added UserConfiguration, refactored auth into own package.

This commit is contained in:
Michael Jumper
2011-08-14 19:38:05 -07:00
parent e2e110b12f
commit c559f4ae33
9 changed files with 93 additions and 50 deletions

View File

@@ -0,0 +1,10 @@
package net.sourceforge.guacamole.net.auth;
import net.sourceforge.guacamole.GuacamoleException;
public interface AuthenticationProvider {
public UserConfiguration getUserConfiguration(String username, String password) throws GuacamoleException;
}

View File

@@ -0,0 +1,13 @@
package net.sourceforge.guacamole.net.auth;
import java.util.Collection;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
public interface UserConfiguration {
public GuacamoleConfiguration getConfiguration(String id);
public Collection<String> listConfigurations();
}

View File

@@ -1,11 +0,0 @@
package net.sourceforge.guacamole.net.basic;
import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
public interface AuthenticationProvider {
public GuacamoleConfiguration getAuthorizedConfiguration(String username, String password) throws GuacamoleException;
}

View File

@@ -19,6 +19,7 @@ package net.sourceforge.guacamole.net.basic;
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import net.sourceforge.guacamole.net.auth.AuthenticationProvider;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.MessageDigest; import java.security.MessageDigest;
@@ -27,9 +28,10 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.auth.UserConfiguration;
import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties; import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
import net.sourceforge.guacamole.properties.GuacamoleProperties; import net.sourceforge.guacamole.properties.GuacamoleProperties;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
@@ -84,7 +86,7 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
} }
@Override @Override
public GuacamoleConfiguration getAuthorizedConfiguration(String username, String password) throws GuacamoleException { public UserConfiguration getUserConfiguration(String username, String password) throws GuacamoleException {
// Check mapping file mod time // Check mapping file mod time
File userMappingFile = getUserMappingFile(); File userMappingFile = getUserMappingFile();
@@ -107,7 +109,7 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
// Validate and return info for given user and pass // Validate and return info for given user and pass
AuthInfo info = mapping.get(username); AuthInfo info = mapping.get(username);
if (info != null && info.validate(username, password)) if (info != null && info.validate(username, password))
return info.getConfiguration(); return info.getUserConfiguration();
return null; return null;
@@ -115,6 +117,8 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
public static class AuthInfo { public static class AuthInfo {
protected static final String CONFIG_ID = "DEFAULT";
public static enum Encoding { public static enum Encoding {
PLAIN_TEXT, PLAIN_TEXT,
MD5 MD5
@@ -124,14 +128,16 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
private String auth_password; private String auth_password;
private Encoding auth_encoding; private Encoding auth_encoding;
private GuacamoleConfiguration config; private BasicUserConfiguration userConfig;
public AuthInfo(String auth_username, String auth_password, Encoding auth_encoding) { public AuthInfo(String auth_username, String auth_password, Encoding auth_encoding) {
this.auth_username = auth_username; this.auth_username = auth_username;
this.auth_password = auth_password; this.auth_password = auth_password;
this.auth_encoding = auth_encoding; this.auth_encoding = auth_encoding;
config = new GuacamoleConfiguration(); userConfig = new BasicUserConfiguration();
userConfig.setConfiguration(CONFIG_ID, new GuacamoleConfiguration());
} }
private static final char HEX_CHARS[] = { private static final char HEX_CHARS[] = {
@@ -187,8 +193,8 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
} }
public GuacamoleConfiguration getConfiguration() { public BasicUserConfiguration getUserConfiguration() {
return config; return userConfig;
} }
} }
@@ -348,11 +354,13 @@ public class BasicFileAuthenticationProvider implements AuthenticationProvider {
switch (state) { switch (state) {
case PROTOCOL: case PROTOCOL:
current.getConfiguration().setProtocol(str); current.getUserConfiguration().getConfiguration(AuthInfo.CONFIG_ID)
.setProtocol(str);
return; return;
case PARAMETER: case PARAMETER:
current.getConfiguration().setParameter(currentParameter, str); current.getUserConfiguration().getConfiguration(AuthInfo.CONFIG_ID)
.setParameter(currentParameter, str);
return; return;
} }

View File

@@ -18,10 +18,9 @@ package net.sourceforge.guacamole.net.basic;
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import java.util.Map; import net.sourceforge.guacamole.net.auth.AuthenticationProvider;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.InetGuacamoleSocket; import net.sourceforge.guacamole.net.InetGuacamoleSocket;
@@ -30,6 +29,7 @@ import net.sourceforge.guacamole.properties.GuacamoleProperties;
import net.sourceforge.guacamole.net.GuacamoleSocket; import net.sourceforge.guacamole.net.GuacamoleSocket;
import net.sourceforge.guacamole.servlet.GuacamoleSession; import net.sourceforge.guacamole.servlet.GuacamoleSession;
import net.sourceforge.guacamole.net.GuacamoleTunnel; import net.sourceforge.guacamole.net.GuacamoleTunnel;
import net.sourceforge.guacamole.net.auth.UserConfiguration;
import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties; import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties;
import net.sourceforge.guacamole.protocol.ConfiguredGuacamoleSocket; import net.sourceforge.guacamole.protocol.ConfiguredGuacamoleSocket;
import net.sourceforge.guacamole.servlet.GuacamoleTunnelServlet; import net.sourceforge.guacamole.servlet.GuacamoleTunnelServlet;
@@ -65,16 +65,15 @@ public class BasicGuacamoleTunnelServlet extends GuacamoleTunnelServlet {
String id = request.getParameter("id"); String id = request.getParameter("id");
// Get authorized configs // Get authorized configs
Map<String, GuacamoleConfiguration> configs = UserConfiguration userConfig = (UserConfiguration)
(Map<String, GuacamoleConfiguration>) httpSession.getAttribute("GUAC_USER_CONFIG");
httpSession.getAttribute("GUAC_AUTH_CONFIGS");
// If no configs in session, not authorized // If no configs in session, not authorized
if (configs == null) if (userConfig == null)
throw new GuacamoleException("No authorized configurations."); throw new GuacamoleException("No authorized configurations.");
// Get authorized config // Get authorized config
GuacamoleConfiguration config = configs.get(id); GuacamoleConfiguration config = userConfig.getConfiguration(id);
if (config == null) { if (config == null) {
logger.error("Error retrieving authorized configuration id={}.", id); logger.error("Error retrieving authorized configuration id={}.", id);
throw new GuacamoleException("Unknown configuration ID."); throw new GuacamoleException("Unknown configuration ID.");

View File

@@ -18,16 +18,15 @@ package net.sourceforge.guacamole.net.basic;
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import net.sourceforge.guacamole.net.auth.UserConfiguration;
import net.sourceforge.guacamole.net.auth.AuthenticationProvider;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
import net.sourceforge.guacamole.properties.GuacamoleProperties; import net.sourceforge.guacamole.properties.GuacamoleProperties;
import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties; import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -63,13 +62,13 @@ public class BasicLogin extends HttpServlet {
String username = request.getParameter("username"); String username = request.getParameter("username");
String password = request.getParameter("password"); String password = request.getParameter("password");
// Get authorized config // Get authorized configs
GuacamoleConfiguration config; UserConfiguration config;
try { try {
config = authProvider.getAuthorizedConfiguration(username, password); config = authProvider.getUserConfiguration(username, password);
} }
catch (GuacamoleException e) { catch (GuacamoleException e) {
logger.error("Error retrieving authorized configuration for user {}.", username); logger.error("Error retrieving configuration for user {}.", username);
response.sendError(HttpServletResponse.SC_FORBIDDEN); response.sendError(HttpServletResponse.SC_FORBIDDEN);
return; return;
} }
@@ -82,11 +81,8 @@ public class BasicLogin extends HttpServlet {
logger.info("Successful login from {} for user \"{}\".", request.getRemoteAddr(), username); logger.info("Successful login from {} for user \"{}\".", request.getRemoteAddr(), username);
// Build map of authorized configs // Associate configs with session
Map<String, GuacamoleConfiguration> configs = new HashMap<String, GuacamoleConfiguration>(); httpSession.setAttribute("GUAC_USER_CONFIG", config);
configs.put("TEST-UID", config);
httpSession.setAttribute("GUAC_AUTH_CONFIGS", configs);
} }

View File

@@ -0,0 +1,29 @@
package net.sourceforge.guacamole.net.basic;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import net.sourceforge.guacamole.net.auth.UserConfiguration;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
public class BasicUserConfiguration implements UserConfiguration {
private Map<String, GuacamoleConfiguration> configs =
new HashMap<String, GuacamoleConfiguration>();
@Override
public GuacamoleConfiguration getConfiguration(String id) {
return configs.get(id);
}
@Override
public Collection<String> listConfigurations() {
return configs.keySet();
}
protected void setConfiguration(String id, GuacamoleConfiguration config) {
configs.put(id, config);
}
}

View File

@@ -20,12 +20,12 @@ package net.sourceforge.guacamole.net.basic;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import net.sourceforge.guacamole.net.auth.UserConfiguration;
import net.sourceforge.guacamole.protocol.GuacamoleConfiguration; import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -40,13 +40,12 @@ public class ConfigurationList extends HttpServlet {
HttpSession httpSession = request.getSession(true); HttpSession httpSession = request.getSession(true);
// Get authorized configs // Get user configuration
Map<String, GuacamoleConfiguration> configs = UserConfiguration userConfig = (UserConfiguration)
(Map<String, GuacamoleConfiguration>) httpSession.getAttribute("GUAC_USER_CONFIG");
httpSession.getAttribute("GUAC_AUTH_CONFIGS");
// If no configs in session, not authorized // If no userConfig in session, not authorized
if (configs == null) { if (userConfig == null) {
response.sendError(HttpServletResponse.SC_FORBIDDEN); response.sendError(HttpServletResponse.SC_FORBIDDEN);
return; return;
} }
@@ -56,13 +55,13 @@ public class ConfigurationList extends HttpServlet {
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
out.println("<configs>"); out.println("<configs>");
for (Entry<String, GuacamoleConfiguration> entry : configs.entrySet()) { for (String id : userConfig.listConfigurations()) {
GuacamoleConfiguration config = entry.getValue(); GuacamoleConfiguration config = userConfig.getConfiguration(id);
// Write config // Write config
out.print("<config id=\""); out.print("<config id=\"");
out.print(entry.getKey()); out.print(id);
out.print("\" protocol=\""); out.print("\" protocol=\"");
out.print(config.getProtocol()); out.print(config.getProtocol());
out.println("\"/>"); out.println("\"/>");

View File

@@ -20,7 +20,7 @@ package net.sourceforge.guacamole.net.basic.properties;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.basic.AuthenticationProvider; import net.sourceforge.guacamole.net.auth.AuthenticationProvider;
import net.sourceforge.guacamole.properties.GuacamoleProperty; import net.sourceforge.guacamole.properties.GuacamoleProperty;
public abstract class AuthenticationProviderProperty implements GuacamoleProperty<AuthenticationProvider> { public abstract class AuthenticationProviderProperty implements GuacamoleProperty<AuthenticationProvider> {