/*
* Copyright 2003 Federal Chancellery Austria
* MOA-ID has been developed in a cooperation between BRZ, the Federal
* Chancellery Austria - ICT staff unit, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package at.gv.egovernment.moa.id.auth.builder;
import java.text.MessageFormat;
import java.util.List;
import at.gv.egovernment.moa.id.BuildException;
import at.gv.egovernment.moa.id.ParseException;
import at.gv.egovernment.moa.id.data.AuthenticationData;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.Constants;
import at.gv.egovernment.moa.util.StringUtils;
/**
* Builder for the authentication data <saml:Assertion>
* to be provided by the MOA ID Auth component.
*
* @author Paul Ivancsics
* @version $Id$
*/
public class AuthenticationDataAssertionBuilder extends AuthenticationAssertionBuilder implements Constants {
/** private static String NL contains the NewLine representation in Java*/
private static final String NL = "\n";
/**
* XML template for the <saml:Assertion>
to be built
*/
private static final String AUTH_DATA =
"" + NL +
"" + NL +
" " + NL +
" " + NL +
" {4}" + NL +
" " + NL +
" " + MOA_NS_URI + "cm" + NL +
" {5}{6}" + NL +
" " + NL +
" " + NL +
" " + NL +
" {7}" + NL +
" " + NL +
" " + NL +
" {8}" + NL +
" " + NL +
" " + NL +
" {9}" + NL +
" " + NL +
"{10}" +
"{11}" +
"{12}" +
"{13}" +
" " + NL +
"";
/**
* XML template for the <saml:Assertion>
to be built
*/
private static final String AUTH_DATA_MANDATE =
"" + NL +
"" + NL +
" " + NL +
" " + NL +
" {4}" + NL +
" " + NL +
" " + MOA_NS_URI + "cm" + NL +
" {5}{6}" + NL +
" " + NL +
" " + NL +
" " + NL +
" {7}" + NL +
" " + NL +
" " + NL +
" {8}" + NL +
" " + NL +
" " + NL +
" {9}" + NL +
" " + NL +
" " + NL +
" {10}" + NL +
" " + NL +
"{11}" +
"{12}" +
"{13}" +
"{14}" +
" " + NL +
"";
/**
* XML template for the <saml:Attribute>
named "isPublicAuthority"
,
* to be inserted into the <saml:Assertion>
*/
private static final String PUBLIC_AUTHORITY_ATT =
" " + NL +
" {0}" + NL +
" " + NL;
private static final String SIGNER_CERTIFICATE_ATT =
" " + NL +
" {0}" + NL +
" " + NL;
/**
* Constructor for AuthenticationDataAssertionBuilder.
*/
public AuthenticationDataAssertionBuilder() {
super();
}
/**
* Builds the authentication data <saml:Assertion>
.
*
* @param authData the AuthenticationData
to build the
* <saml:Assertion>
from
* @param xmlPersonData lt;pr:Person>
element as a String
* @param xmlAuthBlock authentication block to be included in a
* lt;saml:SubjectConfirmationData>
element; may include
* the "Stammzahl"
or not; may be empty
* @param xmlIdentityLink the IdentityLink
* @param signerCertificateBase64 Base64 encoded certificate of the signer. Maybe
* an empty string if the signer certificate should not be provided.
* Will be ignored if the businessService
parameter is
* set to false
.
* @param businessService true
if the online application is a
* business service, otherwise false
* @return the <saml:Assertion>
* @throws BuildException if an error occurs during the build process
*/
public String build(
AuthenticationData authData,
String xmlPersonData,
String xmlAuthBlock,
String xmlIdentityLink,
String bkuURL,
String signerCertificateBase64,
boolean businessService,
String sourceID,
List extendedSAMLAttributes)
throws BuildException
{
String isQualifiedCertificate = authData.isQualifiedCertificate() ? "true" : "false";
String publicAuthorityAttribute = "";
if (authData.isPublicAuthority()) {
String publicAuthorityIdentification = authData.getPublicAuthorityCode();
if (publicAuthorityIdentification == null)
publicAuthorityIdentification = "True";
publicAuthorityAttribute = MessageFormat.format(
PUBLIC_AUTHORITY_ATT, new Object[] { publicAuthorityIdentification });
}
String signerCertificateAttribute = "";
if (signerCertificateBase64 != "") {
signerCertificateAttribute = MessageFormat.format(
SIGNER_CERTIFICATE_ATT, new Object[] { signerCertificateBase64 });
}
String pkType;
String pkValue;
if (businessService) {
pkType = authData.getIdentificationType();
pkValue = authData.getWBPK();
} else {
// always has the bPK as type/value
pkType = URN_PREFIX_BPK;
pkValue = authData.getBPK();
}
// System.out.println("pkType; " + pkType);
// System.out.println("pkValue; " + pkValue);
String assertion;
try {
assertion = MessageFormat.format(AUTH_DATA, new Object[] {
authData.getAssertionID(),
authData.getIssuer(),
authData.getIssueInstant(),
pkType,
pkValue,
StringUtils.removeXMLDeclaration(xmlAuthBlock),
StringUtils.removeXMLDeclaration(xmlIdentityLink),
StringUtils.removeXMLDeclaration(xmlPersonData),
isQualifiedCertificate,
bkuURL,
buildSourceIDSAMLAttributes(sourceID),
publicAuthorityAttribute,
signerCertificateAttribute,
buildExtendedSAMLAttributes(extendedSAMLAttributes)});
} catch (ParseException e) {
Logger.error("Error on building Authentication Data Assertion: " + e.getMessage());
throw new BuildException("builder.00", new Object[] { "Authentication Data Assertion", e.toString()});
}
return assertion;
}
/**
* Builds the authentication data <saml:Assertion>
.
*
* @param authData the AuthenticationData
to build the
* <saml:Assertion>
from
* @param xmlPersonData lt;pr:Person>
element as a String
* @param xmlAuthBlock authentication block to be included in a
* lt;saml:SubjectConfirmationData>
element; may include
* the "Stammzahl"
or not; may be empty
* @param xmlIdentityLink the IdentityLink
* @param signerCertificateBase64 Base64 encoded certificate of the signer. Maybe
* an empty string if the signer certificate should not be provided.
* Will be ignored if the businessService
parameter is
* set to false
.
* @param businessService true
if the online application is a
* business service, otherwise false
* @return the <saml:Assertion>
* @throws BuildException if an error occurs during the build process
*/
public String buildMandate(
AuthenticationData authData,
String xmlPersonData,
String xmlMandateData,
String xmlAuthBlock,
String xmlIdentityLink,
String bkuURL,
String signerCertificateBase64,
boolean businessService,
String sourceID,
List extendedSAMLAttributes)
throws BuildException
{
String isQualifiedCertificate = authData.isQualifiedCertificate() ? "true" : "false";
String publicAuthorityAttribute = "";
if (authData.isPublicAuthority()) {
String publicAuthorityIdentification = authData.getPublicAuthorityCode();
if (publicAuthorityIdentification == null)
publicAuthorityIdentification = "True";
publicAuthorityAttribute = MessageFormat.format(
PUBLIC_AUTHORITY_ATT, new Object[] { publicAuthorityIdentification });
}
String signerCertificateAttribute = "";
if (signerCertificateBase64 != "") {
signerCertificateAttribute = MessageFormat.format(
SIGNER_CERTIFICATE_ATT, new Object[] { signerCertificateBase64 });
}
String pkType;
String pkValue;
if (businessService) {
pkType = authData.getIdentificationType();
pkValue = authData.getWBPK();
} else {
// always has the bPK as type/value
pkType = URN_PREFIX_BPK;
pkValue = authData.getBPK();
}
// System.out.println("pkType; " + pkType);
// System.out.println("pkValue; " + pkValue);
String assertion;
try {
assertion = MessageFormat.format(AUTH_DATA_MANDATE, new Object[] {
authData.getAssertionID(),
authData.getIssuer(),
authData.getIssueInstant(),
pkType,
pkValue,
StringUtils.removeXMLDeclaration(xmlAuthBlock),
StringUtils.removeXMLDeclaration(xmlIdentityLink),
StringUtils.removeXMLDeclaration(xmlPersonData),
StringUtils.removeXMLDeclaration(xmlMandateData),
isQualifiedCertificate,
bkuURL,
buildSourceIDSAMLAttributes(sourceID),
publicAuthorityAttribute,
signerCertificateAttribute,
buildExtendedSAMLAttributes(extendedSAMLAttributes)});
} catch (ParseException e) {
Logger.error("Error on building Authentication Data Assertion: " + e.getMessage());
throw new BuildException("builder.00", new Object[] { "Authentication Data Assertion", e.toString()});
}
return assertion;
}
}