Migrated to new format and new (more strict) parser.

This commit is contained in:
Michael Jumper
2011-01-02 22:35:17 -08:00
parent ac96427c08
commit d536196e62

View File

@@ -96,19 +96,8 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
} }
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();
Configuration config = new Configuration();
// TODO: Migrate user-mapping to general form
config.setProtocol(info.getProtocol());
config.setParameter("hostname", info.getHostname());
config.setParameter("port", Integer.toString(info.getPort()));
config.setParameter("password", info.getPassword());
return config;
}
return null; return null;
@@ -125,15 +114,14 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
private String auth_password; private String auth_password;
private Encoding auth_encoding; private Encoding auth_encoding;
private String protocol; private Configuration config;
private String hostname;
private int port;
private String password;
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 Configuration();
} }
private static final char HEX_CHARS[] = { private static final char HEX_CHARS[] = {
@@ -189,20 +177,8 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
} }
public String getHostname() { public Configuration getConfiguration() {
return hostname; return config;
}
public String getPassword() {
return password;
}
public int getPort() {
return port;
}
public String getProtocol() {
return protocol;
} }
} }
@@ -216,75 +192,142 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
return Collections.unmodifiableMap(authMapping); return Collections.unmodifiableMap(authMapping);
} }
private AuthInfo current; private enum State {
ROOT,
private enum AUTH_INFO_STATE { USER_MAPPING,
AUTH_INFO,
PROTOCOL, PROTOCOL,
HOSTNAME, PARAMETER,
PORT, END;
PASSWORD }
};
private AUTH_INFO_STATE infoState; private State state = State.ROOT;
private AuthInfo current = null;
private String currentParameter = null;
@Override @Override
public void endElement(String uri, String localName, String qName) throws SAXException { public void endElement(String uri, String localName, String qName) throws SAXException {
if (localName.equals("authorize")) { switch (state) {
// Finalize mapping for this user case USER_MAPPING:
authMapping.put(
current.auth_username, if (localName.equals("user-mapping")) {
current state = State.END;
); return;
}
break;
case AUTH_INFO:
if (localName.equals("authorize")) {
// Finalize mapping for this user
authMapping.put(
current.auth_username,
current
);
state = State.USER_MAPPING;
return;
}
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;
} }
infoState = null; throw new SAXException("Tag not yet complete: " + localName);
} }
@Override @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (localName.equals("authorize")) { switch (state) {
AuthInfo.Encoding encoding; // Document must be <user-mapping>
String encodingString = attributes.getValue("encoding"); case ROOT:
if (encodingString == null)
encoding = AuthInfo.Encoding.PLAIN_TEXT; if (localName.equals("user-mapping")) {
else if (encodingString.equals("plain")) state = State.USER_MAPPING;
encoding = AuthInfo.Encoding.PLAIN_TEXT; return;
else if (encodingString.equals("md5")) }
encoding = AuthInfo.Encoding.MD5;
else break;
throw new SAXException("Invalid encoding type");
// Only <authorize> tags allowed in main document
case USER_MAPPING:
if (localName.equals("authorize")) {
AuthInfo.Encoding encoding;
String encodingString = attributes.getValue("encoding");
if (encodingString == null)
encoding = AuthInfo.Encoding.PLAIN_TEXT;
else if (encodingString.equals("plain"))
encoding = AuthInfo.Encoding.PLAIN_TEXT;
else if (encodingString.equals("md5"))
encoding = AuthInfo.Encoding.MD5;
else
throw new SAXException("Invalid encoding type");
current = new AuthInfo( current = new AuthInfo(
attributes.getValue("username"), attributes.getValue("username"),
attributes.getValue("password"), attributes.getValue("password"),
encoding 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")) throw new SAXException("Unexpected tag: " + localName);
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;
} }
@@ -292,30 +335,21 @@ public class BasicFileAuthenticationProvider implements BasicLogin.Authenticatio
public void characters(char[] ch, int start, int length) throws SAXException { public void characters(char[] ch, int start, int length) throws SAXException {
String str = new String(ch, start, length); String str = new String(ch, start, length);
switch (state) {
if (infoState == null)
return;
switch (infoState) {
case PROTOCOL: case PROTOCOL:
current.protocol = str; current.getConfiguration().setProtocol(str);
break; 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.");
} }