Merge branch 'master' of ssh://guacamole.git.sourceforge.net/gitroot/guacamole/guacamole

This commit is contained in:
Michael Jumper
2011-01-02 23:55:18 -08:00
5 changed files with 176 additions and 217 deletions

36
guacamole/.gitignore vendored
View File

@@ -1,35 +1 @@
# Object code
*.o
*.so
*.lo
*.la
# Backup files
*~
# Release files
*.tar.gz
# Files currently being edited by vim or vi
*.swp
# automake/autoconf
.deps/
.libs/
Makefile
Makefile.in
aclocal.m4
autom4te.cache/
m4/
config.guess
config.log
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
missing
target/

View File

@@ -64,7 +64,7 @@
<distributionManagement>
<repository>
<id>guac-dev</id>
<url>scpexe://guac-dev.org/var/www/repo</url>
<url>${guac-dev.dist.repo}</url>
</repository>
</distributionManagement>

View File

@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.Configuration;
import net.sourceforge.guacamole.net.GuacamoleProperties;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -80,7 +81,7 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
}
@Override
public BasicLogin.AuthorizedConfiguration getAuthorizedConfiguration(String username, String password) throws GuacamoleException {
public Configuration getAuthorizedConfiguration(String username, String password) throws GuacamoleException {
// Check mapping file mod time
File userMappingFile = getUserMappingFile();
@@ -96,12 +97,7 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
AuthInfo info = mapping.get(username);
if (info != null && info.validate(username, password))
return new BasicLogin.AuthorizedConfiguration(
info.getProtocol(),
info.getHostname(),
info.getPort(),
info.getPassword()
);
return info.getConfiguration();
return null;
@@ -118,15 +114,14 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
private String auth_password;
private Encoding auth_encoding;
private String protocol;
private String hostname;
private int port;
private String password;
private Configuration config;
public AuthInfo(String auth_username, String auth_password, Encoding auth_encoding) {
this.auth_username = auth_username;
this.auth_password = auth_password;
this.auth_encoding = auth_encoding;
config = new Configuration();
}
private static final char HEX_CHARS[] = {
@@ -182,20 +177,8 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
}
public String getHostname() {
return hostname;
}
public String getPassword() {
return password;
}
public int getPort() {
return port;
}
public String getProtocol() {
return protocol;
public Configuration getConfiguration() {
return config;
}
}
@@ -209,20 +192,35 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
return Collections.unmodifiableMap(authMapping);
}
private AuthInfo current;
private enum AUTH_INFO_STATE {
private enum State {
ROOT,
USER_MAPPING,
AUTH_INFO,
PROTOCOL,
HOSTNAME,
PORT,
PASSWORD
};
PARAMETER,
END;
}
private AUTH_INFO_STATE infoState;
private State state = State.ROOT;
private AuthInfo current = null;
private String currentParameter = null;
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
switch (state) {
case USER_MAPPING:
if (localName.equals("user-mapping")) {
state = State.END;
return;
}
break;
case AUTH_INFO:
if (localName.equals("authorize")) {
// Finalize mapping for this user
@@ -231,15 +229,54 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
current
);
state = State.USER_MAPPING;
return;
}
infoState = null;
break;
case PROTOCOL:
if (localName.equals("protocol")) {
state = State.AUTH_INFO;
return;
}
break;
case PARAMETER:
if (localName.equals("param")) {
state = State.AUTH_INFO;
return;
}
break;
}
throw new SAXException("Tag not yet complete: " + localName);
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
switch (state) {
// Document must be <user-mapping>
case ROOT:
if (localName.equals("user-mapping")) {
state = State.USER_MAPPING;
return;
}
break;
// Only <authorize> tags allowed in main document
case USER_MAPPING:
if (localName.equals("authorize")) {
AuthInfo.Encoding encoding;
@@ -260,24 +297,37 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
encoding
);
infoState = null;
// Next state
state = State.AUTH_INFO;
return;
}
break;
case AUTH_INFO:
if (localName.equals("protocol")) {
// Next state
state = State.PROTOCOL;
return;
}
if (localName.equals("param")) {
currentParameter = attributes.getValue("name");
if (currentParameter == null)
throw new SAXException("Attribute \"name\" required for param tag.");
// Next state
state = State.PARAMETER;
return;
}
break;
}
else if (localName.equals("protocol"))
infoState = AUTH_INFO_STATE.PROTOCOL;
else if (localName.equals("hostname"))
infoState = AUTH_INFO_STATE.HOSTNAME;
else if (localName.equals("port"))
infoState = AUTH_INFO_STATE.PORT;
else if (localName.equals("password"))
infoState = AUTH_INFO_STATE.PASSWORD;
else
infoState = null;
throw new SAXException("Unexpected tag: " + localName);
}
@@ -285,30 +335,21 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
public void characters(char[] ch, int start, int length) throws SAXException {
String str = new String(ch, start, length);
if (infoState == null)
return;
switch (infoState) {
switch (state) {
case PROTOCOL:
current.protocol = str;
break;
current.getConfiguration().setProtocol(str);
return;
case HOSTNAME:
current.hostname = str;
break;
case PORT:
current.port = Integer.parseInt(str);
break;
case PASSWORD:
current.password = str;
break;
case PARAMETER:
current.getConfiguration().setParameter(currentParameter, str);
return;
}
if (str.trim().length() != 0)
throw new SAXException("Unexpected character data.");
}

View File

@@ -2,9 +2,11 @@
package net.sourceforge.guacamole.net.authentication.basic;
import javax.servlet.http.HttpSession;
import net.sourceforge.guacamole.GuacamoleTCPClient;
import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.GuacamoleSession;
import net.sourceforge.guacamole.net.authentication.GuacamoleSessionProvider;
import net.sourceforge.guacamole.net.Configuration;
import net.sourceforge.guacamole.net.GuacamoleProperties;
import net.sourceforge.guacamole.net.authentication.GuacamoleClientProvider;
/*
* Guacamole - Clientless Remote Desktop
@@ -24,26 +26,25 @@ import net.sourceforge.guacamole.net.authentication.GuacamoleSessionProvider;
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
public class BasicGuacamoleSessionProvider implements GuacamoleSessionProvider {
public class BasicGuacamoleClientProvider implements GuacamoleClientProvider {
public GuacamoleSession createSession(HttpSession session) throws GuacamoleException {
public GuacamoleTCPClient createClient(HttpSession session) throws GuacamoleException {
// Retrieve authorized config data from session
BasicLogin.AuthorizedConfiguration config = (BasicLogin.AuthorizedConfiguration)
session.getAttribute("BASIC-LOGIN-AUTH");
Configuration config = (Configuration) session.getAttribute("BASIC-LOGIN-AUTH");
// If no data, not authorized
if (config == null)
throw new GuacamoleException("Unauthorized");
// Configure session from authorized config info
GuacamoleSession guacSession = new GuacamoleSession(session);
guacSession.setConnection(config.getProtocol(), config.getHostname(), config.getPort());
if (config.getPassword() != null)
guacSession.setPassword(config.getPassword());
String hostname = GuacamoleProperties.getProperty("guacd-hostname");
int port = GuacamoleProperties.getIntProperty("guacd-port", null);
GuacamoleTCPClient client = new GuacamoleTCPClient(hostname, port);
client.connect(config);
// Return authorized session
return guacSession;
return client;
}

View File

@@ -28,99 +28,50 @@ import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sourceforge.guacamole.GuacamoleException;
import net.sourceforge.guacamole.net.Configuration;
import net.sourceforge.guacamole.net.GuacamoleProperties;
public class BasicLogin extends HttpServlet {
private Config config;
private AuthenticationProvider authProvider;
@Override
public void init() throws ServletException {
// Get auth provider instance
try {
config = new Config();
String authProviderClassName = GuacamoleProperties.getProperty("auth-provider");
Object obj = Class.forName(authProviderClassName).getConstructor().newInstance();
if (!(obj instanceof AuthenticationProvider))
throw new ServletException("Specified authentication provider class is not a AuthenticationProvider.");
authProvider = (AuthenticationProvider) obj;
}
catch (GuacamoleException e) {
throw new ServletException(e);
}
}
private class Config extends Configuration {
private AuthenticationProvider authProvider;
public Config() throws GuacamoleException {
// Get auth provider instance
try {
String authProviderClassName = readParameter("auth-provider");
Object obj = Class.forName(authProviderClassName).getConstructor().newInstance();
if (!(obj instanceof AuthenticationProvider))
throw new GuacamoleException("Specified session provider class is not a GuacamoleSessionProvider");
authProvider = (AuthenticationProvider) obj;
}
catch (ClassNotFoundException e) {
throw new GuacamoleException("Session provider class not found", e);
throw new ServletException("Authentication provider class not found", e);
}
catch (NoSuchMethodException e) {
throw new GuacamoleException("Default constructor for session provider not present", e);
throw new ServletException("Default constructor for authentication provider not present", e);
}
catch (SecurityException e) {
throw new GuacamoleException("Creation of session provider disallowed; check your security settings", e);
throw new ServletException("Creation of authentication provider disallowed; check your security settings", e);
}
catch (InstantiationException e) {
throw new GuacamoleException("Unable to instantiate session provider", e);
throw new ServletException("Unable to instantiate authentication provider", e);
}
catch (IllegalAccessException e) {
throw new GuacamoleException("Unable to access default constructor of session provider", e);
throw new ServletException("Unable to access default constructor of authentication provider", e);
}
catch (InvocationTargetException e) {
throw new GuacamoleException("Internal error in constructor of session provider", e.getTargetException());
}
}
public AuthenticationProvider getAuthenticationProvider() {
return authProvider;
throw new ServletException("Internal error in constructor of authentication provider", e.getTargetException());
}
}
public static interface AuthenticationProvider {
public AuthorizedConfiguration getAuthorizedConfiguration(String username, String password) throws GuacamoleException;
}
// Added to session when session validated
public static class AuthorizedConfiguration {
private String protocol;
private String hostname;
private int port;
private String password;
public AuthorizedConfiguration(String protocol, String hostname, int port, String password) {
this.protocol = protocol;
this.hostname = hostname;
this.port = port;
this.password = password;
}
public String getHostname() {
return hostname;
}
public String getPassword() {
return password;
}
public int getPort() {
return port;
}
public String getProtocol() {
return protocol;
}
public Configuration getAuthorizedConfiguration(String username, String password) throws GuacamoleException;
}
@Override
@@ -133,14 +84,14 @@ public class BasicLogin extends HttpServlet {
// Validate username and password
try {
AuthorizedConfiguration info = config.getAuthenticationProvider().getAuthorizedConfiguration(username, password);
if (info != null) {
Configuration config = authProvider.getAuthorizedConfiguration(username, password);
if (config != null) {
// Store authorized configuration
HttpSession session = req.getSession(true);
session.setAttribute(
"BASIC-LOGIN-AUTH",
info
config
);
// Success