package at.gv.egovernment.moa.id.proxy.parser;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.id.ParseException;
import at.gv.egovernment.moa.id.auth.builder.BPKBuilder;
import at.gv.egovernment.moa.id.data.AuthenticationData;
import at.gv.egovernment.moa.util.BoolUtils;
import at.gv.egovernment.moa.util.Constants;
import at.gv.egovernment.moa.util.DOMUtils;
import at.gv.egovernment.moa.util.XPathUtils;
/**
* Parser for the <saml:Assertion>
returned by the
* GetAuthenticationData
web service.
* @author Paul Ivancsics
* @version $Id$
*/
public class AuthenticationDataAssertionParser implements Constants {
/** Prefix for SAML-Xpath-expressions */
private static String SAML = SAML_PREFIX + ":";
/** Prefix for PersonData-Xpath-expressions */
private static String PR = PD_PREFIX + ":";
/** Prefix for Attribute MajorVersion in an Xpath-expression */
private static String MAJOR_VERSION_XPATH =
"@MajorVersion";
/** Prefix for Attribute MinorVersion in an Xpath-expression */
private static String MINOR_VERSION_XPATH =
"@MinorVersion";
/** Prefix for Attribute AssertionID in an Xpath-expression */
private static String ASSERTION_ID_XPATH =
"@AssertionID";
/** Prefix for Attribute Issuer in an Xpath-expression */
private static String ISSUER_XPATH =
"@Issuer";
/** Prefix for Attribute IssueInstant in an Xpath-expression */
private static String ISSUE_INSTANT_XPATH =
"@IssueInstant";
/** Prefix for Element AttributeStatement in an Xpath-expression */
private static String ATTRIBUTESTATEMENT_XPATH =
SAML + "AttributeStatement/";
/** Prefix for Element NameIdentifier in an Xpath-expression */
private static String PK_XPATH =
ATTRIBUTESTATEMENT_XPATH +
SAML + "Subject/" +
SAML + "NameIdentifier";
private static String NAME_QUALIFIER_XPATH =
PK_XPATH + "/@NameQualifier";
/** Prefix for Element Person in an Xpath-expression */
private static String PERSONDATA_XPATH =
ATTRIBUTESTATEMENT_XPATH +
SAML + "Attribute[@AttributeName=\"PersonData\"]/" +
SAML + "AttributeValue/" +
PR + "Person/";
/** Prefix for Element Value in an Xpath-expression */
private static String IDENTIFICATION_VALUE_XPATH =
PERSONDATA_XPATH +
PR + "Identification/" +
PR + "Value";
private static String IDENTIFICATION_TYPE_XPATH =
PERSONDATA_XPATH +
PR + "Identification/" +
PR + "Type";
/** Prefix for Element GivenName in an Xpath-expression */
private static String GIVEN_NAME_XPATH =
PERSONDATA_XPATH +
PR + "Name/" +
PR + "GivenName";
/** Prefix for Element FamilyName in an Xpath-expression */
private static String FAMILY_NAME_XPATH =
PERSONDATA_XPATH +
PR + "Name/" +
PR + "FamilyName";
/** Prefix for Element DateOfBirth in an Xpath-expression */
private static String DATE_OF_BIRTH_XPATH =
PERSONDATA_XPATH +
PR + "DateOfBirth";
/** Prefix for Element AttributeValue in an Xpath-expression */
private static String IS_QUALIFIED_CERT_XPATH =
ATTRIBUTESTATEMENT_XPATH +
SAML + "Attribute[@AttributeName=\"isQualifiedCertificate\"]/" +
SAML + "AttributeValue";
/** Prefix for Element AttributeValue in an Xpath-expression */
private static String PUBLIC_AUTHORITY_XPATH =
ATTRIBUTESTATEMENT_XPATH +
SAML + "Attribute[@AttributeName=\"isPublicAuthority\"]/" +
SAML + "AttributeValue";
/** Element samlAssertion represents the SAML:Assertion */
private Element samlAssertion;
/**
* Constructor
* @param samlAssertion samlpResponse the <samlp:Response>
as a DOM element
*/
public AuthenticationDataAssertionParser(Element samlAssertion) {
this.samlAssertion = samlAssertion;
}
/**
* Parses the <saml:Assertion>
.
* @return AuthenticationData
object
* @throws ParseException on any error
*/
public AuthenticationData parseAuthenticationData()
throws ParseException {
try {
AuthenticationData authData = new AuthenticationData();
//ÄNDERN: NUR der Identification-Teil
authData.setSamlAssertion(DOMUtils.serializeNode(samlAssertion));
authData.setMajorVersion(new Integer(
XPathUtils.getAttributeValue(samlAssertion, MAJOR_VERSION_XPATH, "-1")).intValue());
authData.setMinorVersion(new Integer(
XPathUtils.getAttributeValue(samlAssertion, MINOR_VERSION_XPATH, "-1")).intValue());
authData.setAssertionID(
XPathUtils.getAttributeValue(samlAssertion, ASSERTION_ID_XPATH, ""));
authData.setIssuer(
XPathUtils.getAttributeValue(samlAssertion, ISSUER_XPATH, ""));
authData.setIssueInstant(
XPathUtils.getAttributeValue(samlAssertion, ISSUE_INSTANT_XPATH, ""));
String pkValue = XPathUtils.getElementValue(samlAssertion, PK_XPATH, "");
if (XPathUtils.getAttributeValue(samlAssertion, NAME_QUALIFIER_XPATH, "").equalsIgnoreCase(URN_PREFIX_BPK)) {
authData.setBPK(pkValue);
} else {
authData.setWBPK(pkValue);
}
authData.setIdentificationValue(
XPathUtils.getElementValue(samlAssertion, IDENTIFICATION_VALUE_XPATH, ""));
authData.setIdentificationType(
XPathUtils.getElementValue(samlAssertion, IDENTIFICATION_TYPE_XPATH, ""));
authData.setGivenName(
XPathUtils.getElementValue(samlAssertion, GIVEN_NAME_XPATH, ""));
authData.setFamilyName(
XPathUtils.getElementValue(samlAssertion, FAMILY_NAME_XPATH, ""));
authData.setDateOfBirth(
XPathUtils.getElementValue(samlAssertion, DATE_OF_BIRTH_XPATH, ""));
authData.setQualifiedCertificate(BoolUtils.valueOf(
XPathUtils.getElementValue(samlAssertion, IS_QUALIFIED_CERT_XPATH, "")));
String publicAuthority =
XPathUtils.getElementValue(samlAssertion, PUBLIC_AUTHORITY_XPATH, null);
if (publicAuthority == null) {
authData.setPublicAuthority(false);
authData.setPublicAuthorityCode("");
}
else {
authData.setPublicAuthority(true);
if (! publicAuthority.equalsIgnoreCase("true"))
authData.setPublicAuthorityCode(publicAuthority);
}
return authData;
}
catch (Throwable t) {
throw new ParseException("parser.01", new Object[] { t.toString() }, t);
}
}
}