package at.gv.egovernment.moa.id.proxy;
import java.io.File;
import at.gv.egovernment.moa.id.config.proxy.OAConfiguration;
import at.gv.egovernment.moa.id.data.AuthenticationData;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.Base64Utils;
import java.io.IOException;
import java.util.*;
//import org.apache.xerces.parsers.AbstractDOMParser;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.*;
/**
* XMLLoginParameterResolver an implementation of implementation of interface
* LoginParameterResolver
* This implementation used to map identities stored in an XML file to parameters
* which are given to OAs.
*
* @author Rudolf Schamberger
* @version $Id$
*/
public class XMLLoginParameterResolver implements LoginParameterResolver {
//file which is parsed and interpreted for paremeter resolving.
private String identityFile;
/**
* inner class used to store mapped parameters
*/
class LPRParams {
/**
* getter method for parameter Enabled.
* Parameter Enabled decides if mapped parameters should be used by XMLLoginParameterResolver
*/
public boolean getEnabled() {
return enabled.booleanValue();
}
/**
* getter method for parameter UN (username)
* @return Parameter UN or null
not set.
*/
public String getUN() {
return UN;
}
/**
* getter method for parameter PW (password)
* @return Parameter PW or null
not set.
*/
public String getPW() {
return PW;
}
/**
* getter method for parameter Param1
* @return Parameter Param1 or null
not set.
*/
public String getParam1() {
return Param1;
}
/**
* getter method for parameter Param2
* @return Parameter Param2 or null
not set.
*/
public String getParam2() {
return Param2;
}
/**
* getter method for parameter Param3
* @return Parameter Param3 or null
not set.
*/
public String getParam3() {
return Param3;
}
/**
* Returns a string representation of LPRParams
*
* @return a String
representation of this object.
* @see XMLLoginParameterResolver.LPRParams
*/
public String toString() {
return "Enabled: "
+ enabled.toString()
+ "UN: '"
+ UN
+ "' PW: '"
+ PW
+ "' Param1: '"
+ Param1
+ "' Param2: '"
+ Param2
+ "' Param3: '"
+ Param3
+ "'\n";
}
//private member variables used
private Boolean enabled = null;
private String UN = null;
private String PW = null;
private String Param1 = null;
private String Param2 = null;
private String Param3 = null;
/**
* Constructs a newly allocated XMLLoginParameterResolver.LPRParams
object.
*
* @param enabled enable user mapping to parameter set for the parameter set.
* @param UN username used in HTTP 401 - BasicAuthentication
* @param PW password used in HTTP 401 - BasicAuthentication
* @param Param1 parameter1 used in HeaderAuthentication and ParameterAuthentication
* @param Param2 parameter2 used in HeaderAuthentication and ParameterAuthentication
* @param Param3 parameter3 used in HeaderAuthentication and ParameterAuthentication
**/
LPRParams(boolean enabled, String UN, String PW, String Param1, String Param2, String Param3) {
this.enabled = new Boolean(enabled);
this.UN = UN;
this.PW = PW;
this.Param1 = Param1;
this.Param1 = Param2;
this.Param1 = Param3;
}
/**
* Constructs a newly allocated XMLLoginParameterResolver.LPRParams
object.
*
* @param enabled enable user mapping to parameter set for the parameter set.
* @param UN username used in HTTP 401 - BasicAuthentication
* @param PW password used in HTTP 401 - BasicAuthentication
**/
LPRParams(boolean enabled, String UN, String PW) {
this(enabled, UN, PW, null, null, null);
}
}
/**
* Constructs a newly allocated XMLLoginParameterResolver
object.
**/
public XMLLoginParameterResolver() {
bPKMap = new HashMap();
namedMap = new HashMap();
}
/**
* configuration method
* @param configuration enabled enable user mapping to parameter set for the parameter set.
*/
public void configure(String configuration) throws LoginParameterResolverException {
File idFile;
this.identityFile = configuration;
try {
if (null == identityFile || false == (idFile = new File(identityFile)).canRead()) {
Logger.error("XMLLoginParameterResolver could not read '"
+ identityFile
+ "' " );
return;
}
Document doc = readXMLFile(identityFile);
buildInfo(doc);
} catch (Throwable ex) {
throw new LoginParameterResolverException("config.11", new Object[] {identityFile}, ex);
}
isConfigured = true;
}
public Map getAuthenticationHeaders(
OAConfiguration oaConf,
AuthenticationData authData,
String clientIPAddress) throws LoginParameterResolverException {
Map result = new HashMap();
if (!isConfigured) {
throw new LoginParameterResolverException("XMLLoginParameterResolver with configuration '" +
identityFile + "' is not configured!", null);
}
String famName = resolveValue("MOAFamilyName", authData, clientIPAddress);
String givenName = resolveValue("MOAGivenName", authData, clientIPAddress);
String dateOfBirth = resolveValue("MOADateOfBirth", authData, clientIPAddress);
String bPK = resolveValue("MOABPK", authData, clientIPAddress);
String userid = "";
String password = "";
LPRParams params = null;
boolean userFound = false;
//try bPK and named search
userFound = bPKIdentitySearch(bPK, params);
if(false == userFound)
namedIdentitySearch(famName, givenName, dateOfBirth, params);
if(false == userFound)
return result;
//HTTP 401 - Basic Authentication
if (oaConf.getAuthType().equals("basic")) {
userid = params.getUN();
password = params.getPW();
try {
String userIDPassword = userid + ":" + password;
String credentials = Base64Utils.encode(userIDPassword.getBytes());
Logger.debug("XMLLoginParameterResolver: calculated credentials: " + credentials);
result.put("Authorization", "Basic " + credentials);
} catch (IOException ignore) {
}
return result;
}
if (oaConf.getAuthType().equals("header")) {
String key;
String resolvedValue;
result.put("Param1", params.getParam1());
result.put("Param2", params.getParam2());
result.put("Param3", params.getParam3());
return result;
/* for (Iterator iter = oaConf.getHeaderAuthMapping().keySet().iterator();
iter.hasNext();
result.put(key, resolvedValue)) {
key = (String) iter.next();
String predicate = (String) oaConf.getHeaderAuthMapping().get(key);
resolvedValue = resolveValue(predicate, authData, clientIPAddress);
}
*/
}
return result;
}
public Map getAuthenticationParameters(
OAConfiguration oaConf,
AuthenticationData authData,
String clientIPAddress) {
Map result = new HashMap();
if (!isConfigured) {
Logger.warn("XMLLoginParameterResolver with configuration '" + identityFile + " is not configured");
return result;
}
String famName = resolveValue("MOAFamilyName", authData, clientIPAddress);
String givenName = resolveValue("MOAGivenName", authData, clientIPAddress);
String dateOfBirth = resolveValue("MOADateOfBirth", authData, clientIPAddress);
String bPK = resolveValue("MOABPK", authData, clientIPAddress);
String userid = "";
String password = "";
LPRParams params = null;
boolean userFound = false;
//try bPK and named search
userFound = bPKIdentitySearch(bPK, params);
if (false == userFound)
namedIdentitySearch(famName, givenName, dateOfBirth, params);
if (false == userFound)
return result;
if (oaConf.getAuthType().equals("param")) {
result.put("Param1", params.getParam1());
result.put("Param2", params.getParam2());
result.put("Param3", params.getParam3());
return result;
/*
String key;
String resolvedValue;
for (Iterator iter = oaConf.getParamAuthMapping().keySet().iterator();
iter.hasNext();
result.put(key, resolvedValue)) {
key = (String) iter.next();
String predicate = (String) oaConf.getParamAuthMapping().get(key);
resolvedValue = resolveValue(predicate, authData, clientIPAddress);
}
*/
}
return result;
}
private static String resolveValue(
String predicate,
AuthenticationData authData,
String clientIPAddress) {
if (predicate.equals("MOAGivenName"))
return authData.getGivenName();
if (predicate.equals("MOAFamilyName"))
return authData.getFamilyName();
if (predicate.equals("MOADateOfBirth"))
return authData.getDateOfBirth();
if (predicate.equals("MOABPK"))
return authData.getPBK();
if (predicate.equals("MOAPublicAuthority"))
if (authData.isPublicAuthority())
return "true";
else
return "false";
if (predicate.equals("MOABKZ"))
return authData.getPublicAuthorityCode();
if (predicate.equals("MOAQualifiedCertificate"))
if (authData.isQualifiedCertificate())
return "true";
else
return "false";
if (predicate.equals("MOAStammzahl"))
return authData.getIdentificationValue();
if (predicate.equals(MOAIdentificationValueType))
return authData.getIdentificationType();
if (predicate.equals("MOAIPAddress"))
return clientIPAddress;
else
return null;
}
private Document readXMLFile(String fileName) {
Logger.info("XMLLoginParameterResolver: Loading MOA-OA configuration " + fileName);
DOMParser parser = new DOMParser();
try {
parser.setFeature("http://xml.org/sax/features/validation", true);
parser.setFeature("http://apache.org/xml/features/validation/schema", true);
parser.parse(fileName);
return parser.getDocument();
} catch (Exception e) {
String msg = e.toString();
Logger.error("XMLLoginParameterResolver: Error parsing file" + fileName + "\n" + msg);
return null;
}
}
private void buildInfo(Document doc) {
Element root = doc.getDocumentElement();
NodeList idList = root.getElementsByTagName(XSD_IDELEM);
NodeList paramList = root.getElementsByTagName("Parameters");
for (int i = 0; i < idList.getLength(); i++)
Logger.debug("XMLLoginParameterResolver: LocalName idList: " + idList.item(i).getLocalName());
for (int i = 0; i < paramList.getLength(); i++)
Logger.debug(
"XMLLoginParameterResolver: LocalName paramList: " + paramList.item(i).getLocalName());
for (int i = 0; i < idList.getLength(); i++) {
Element tmpElem = (Element) idList.item(i);
NodeList tmpList = tmpElem.getElementsByTagName("NamedIdentity");
for (int j = 0; j < tmpList.getLength(); j++)
Logger.debug("XMLLoginParameterResolver: LocalName tmp: " + tmpList.item(j).getLocalName());
if (1 == tmpList.getLength()) {
tmpElem = (Element) tmpList.item(0);
String tmpStr = tmpElem.getAttribute("SurName") + "," + tmpElem.getAttribute("GivenName");
boolean tmpBool = false;
if (tmpElem.getFirstChild() != null
&& "1".compareTo(tmpElem.getFirstChild().getNodeValue()) == 0)
tmpBool = true;
Logger.debug(
"XMLLoginParameterResolver: tmpStr: "
+ tmpStr
+ " value: "
+ (new Boolean(tmpBool)).toString());
tmpElem = (Element) paramList.item(i);
Logger.debug(
"XMLLoginParameterResolver: attribute UN: "
+ tmpElem.getAttribute("UN")
+ " attribute PW: "
+ tmpElem.getAttribute("PW"));
namedMap.put(
tmpStr,
new LPRParams(tmpBool, tmpElem.getAttribute("UN"), tmpElem.getAttribute("PW")));
} else {
tmpList = tmpElem.getElementsByTagName("bPKIdentity");
if (1 == tmpList.getLength()) {
tmpElem = (Element) tmpList.item(0);
String tmpStr = tmpElem.getAttribute("bPK");
boolean tmpBool = false;
if (tmpElem.getFirstChild() != null
&& "1".compareTo(tmpElem.getFirstChild().getNodeValue()) == 0)
tmpBool = true;
Logger.debug(
"XMLLoginParameterResolver: tmpStr: "
+ tmpStr
+ " value: "
+ (new Boolean(tmpBool)).toString());
tmpElem = (Element) paramList.item(i);
Logger.debug(
"XMLLoginParameterResolver: attribute UN: "
+ tmpElem.getAttribute("UN")
+ " attribute PW: "
+ tmpElem.getAttribute("PW")
+ " attribute Param1: "
+ tmpElem.getAttribute("Param1"));
bPKMap.put(
tmpStr,
new LPRParams(tmpBool, tmpElem.getAttribute("UN"), tmpElem.getAttribute("PW")));
} else {
Logger.warn(
"XMLLoginParameterResolver: wrong format no NamedIdentity or bPKIdentity found");
}
}
}
Logger.debug("namedMap:" + namedMap.toString());
Logger.debug("bPKMap:" + bPKMap.toString());
}
private void buildIdentityInfo(Document doc) {
}
boolean bPKIdentitySearch(String bPK, LPRParams params) {
//search for mapping with bPK of the user
Logger.info("XMLLoginParameterResolver: search for login data mapped to bPK:" + bPK);
params = (LPRParams) bPKMap.get(bPK);
if (null == params) {
Logger.info("XMLLoginParameterResolver: params for bPK: " + bPK + " not found!");
return false;
} else if (params.getEnabled()) {
Logger.info("XMLLoginParameterResolver: bPK: " + bPK + "found in list; user is enabled");
Logger.debug("XMLLoginParameterResolver: using: " + params.toString());
return true;
}
Logger.info("XMLLoginParameterResolver: bPK: " + bPK + "found in list but user is NOT enabled");
return false;
}
boolean namedIdentitySearch(
String famName,
String givenName,
String dateOfBirth,
LPRParams params) {
Logger.info(
"XMLLoginParameterResolver: search for login data for SurName:"
+ famName
+ " GivenName: "
+ givenName);
params = (LPRParams) namedMap.get(famName + "," + givenName);
if (null == params) {
Logger.info(
"XMLLoginParameterResolver: params for Surname: "
+ famName
+ " GivenName: "
+ givenName
+ " not found!");
return false;
}
if (params.getEnabled()) {
Logger.info(
"XMLLoginParameterResolver: SurName:"
+ famName
+ " GivenName: "
+ givenName
+ "found in list; user is enabled");
Logger.debug("XMLLoginParameterResolver: using: " + params.toString());
return true;
}
Logger.info(
"XMLLoginParameterResolver: SurName:"
+ famName
+ " GivenName: "
+ givenName
+ "found in list; user is NOT enabled");
return false;
}
public static final String XSD_MAPPING = "Mapping";
public static final String XSD_DOCELEM = "MOAIdentities";
public static final String XSD_IDELEM = "Identity";
public static final String XSD_NAMEDIDELEM = "NamedIdentity";
public static final String XSD_BPKIDELEM = "bPKIdentity";
public static final String XSD_PARAMELEM = "Parameters";
public static final String XML_LPR_CONFIG_PROPERTY_NAME = "moa.id.xmllpr.configuration";
private Map bPKMap;
private Map namedMap;
private boolean isConfigured = false;
}