/*
* 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;
import iaik.pki.PKIException;
import iaik.x509.CertificateFactory;
import iaik.x509.X509Certificate;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.security.Principal;
import java.security.cert.CertificateException;
//import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.apache.xpath.XPathAPI;
import org.opensaml.saml2.metadata.RequestedAttribute;
import org.opensaml.xml.util.Base64;
import org.opensaml.xml.util.XMLHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import at.gv.egovernment.moa.id.AuthenticationException;
import at.gv.egovernment.moa.id.BuildException;
import at.gv.egovernment.moa.id.MOAIDException;
import at.gv.egovernment.moa.id.ParseException;
import at.gv.egovernment.moa.id.ServiceException;
import at.gv.egovernment.moa.id.auth.builder.AuthenticationBlockAssertionBuilder;
import at.gv.egovernment.moa.id.auth.builder.BPKBuilder;
import at.gv.egovernment.moa.id.auth.builder.CertInfoVerifyXMLSignatureRequestBuilder;
import at.gv.egovernment.moa.id.auth.builder.CreateXMLSignatureRequestBuilder;
import at.gv.egovernment.moa.id.auth.builder.DataURLBuilder;
import at.gv.egovernment.moa.id.auth.builder.GetIdentityLinkFormBuilder;
import at.gv.egovernment.moa.id.auth.builder.InfoboxReadRequestBuilder;
import at.gv.egovernment.moa.id.auth.builder.InfoboxValidatorParamsBuilder;
import at.gv.egovernment.moa.id.auth.builder.PersonDataBuilder;
import at.gv.egovernment.moa.id.auth.builder.SelectBKUFormBuilder;
import at.gv.egovernment.moa.id.auth.builder.VerifyXMLSignatureRequestBuilder;
import at.gv.egovernment.moa.id.auth.data.AuthenticationSession;
import at.gv.egovernment.moa.id.auth.data.CreateXMLSignatureResponse;
import at.gv.egovernment.moa.id.auth.data.ExtendedSAMLAttribute;
import at.gv.egovernment.moa.id.auth.data.ExtendedSAMLAttributeImpl;
import at.gv.egovernment.moa.id.auth.data.IdentityLink;
import at.gv.egovernment.moa.id.auth.data.InfoboxValidationResult;
import at.gv.egovernment.moa.id.auth.data.InfoboxValidatorParams;
import at.gv.egovernment.moa.id.auth.data.VerifyXMLSignatureResponse;
import at.gv.egovernment.moa.id.auth.invoke.SignatureVerificationInvoker;
import at.gv.egovernment.moa.id.auth.parser.CreateXMLSignatureResponseParser;
import at.gv.egovernment.moa.id.auth.parser.ExtendedInfoboxReadResponseParser;
import at.gv.egovernment.moa.id.auth.parser.InfoboxReadResponseParser;
import at.gv.egovernment.moa.id.auth.parser.SAMLArtifactParser;
import at.gv.egovernment.moa.id.auth.parser.VerifyXMLSignatureResponseParser;
import at.gv.egovernment.moa.id.auth.servlet.AuthServlet;
import at.gv.egovernment.moa.id.auth.servlet.PEPSConnectorServlet;
import at.gv.egovernment.moa.id.auth.stork.STORKAuthnRequestProcessor;
import at.gv.egovernment.moa.id.auth.validator.CreateXMLSignatureResponseValidator;
import at.gv.egovernment.moa.id.auth.validator.IdentityLinkValidator;
import at.gv.egovernment.moa.id.auth.validator.InfoboxValidator;
import at.gv.egovernment.moa.id.auth.validator.ValidateException;
import at.gv.egovernment.moa.id.auth.validator.VerifyXMLSignatureResponseValidator;
import at.gv.egovernment.moa.id.auth.validator.parep.ParepUtils;
import at.gv.egovernment.moa.id.auth.validator.parep.ParepValidator;
import at.gv.egovernment.moa.id.auth.validator.parep.client.szrgw.CreateIdentityLinkResponse;
import at.gv.egovernment.moa.id.auth.validator.parep.client.szrgw.SZRGWClient;
import at.gv.egovernment.moa.id.auth.validator.parep.client.szrgw.SZRGWClientException;
import at.gv.egovernment.moa.id.auth.validator.parep.client.szrgw.SZRGWConstants;
import at.gv.egovernment.moa.id.commons.db.ex.MOADatabaseException;
import at.gv.egovernment.moa.id.config.ConfigurationException;
import at.gv.egovernment.moa.id.config.ConfigurationProvider;
import at.gv.egovernment.moa.id.config.ConnectionParameter;
import at.gv.egovernment.moa.id.config.auth.AuthConfigurationProvider;
import at.gv.egovernment.moa.id.config.auth.OAAuthParameter;
import at.gv.egovernment.moa.id.config.auth.VerifyInfoboxParameter;
import at.gv.egovernment.moa.id.config.auth.VerifyInfoboxParameters;
import at.gv.egovernment.moa.id.config.stork.CPEPS;
import at.gv.egovernment.moa.id.config.stork.STORKConfig;
import at.gv.egovernment.moa.id.data.AuthenticationData;
import at.gv.egovernment.moa.id.moduls.IRequest;
import at.gv.egovernment.moa.id.storage.AssertionStorage;
import at.gv.egovernment.moa.id.storage.AuthenticationSessionStoreage;
import at.gv.egovernment.moa.id.util.HTTPUtils;
import at.gv.egovernment.moa.id.util.MOAIDMessageProvider;
import at.gv.egovernment.moa.id.util.Random;
import at.gv.egovernment.moa.id.util.SSLUtils;
import at.gv.egovernment.moa.id.util.client.mis.simple.MISMandate;
import at.gv.egovernment.moa.logging.LogMsg;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.Base64Utils;
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.DateTimeUtils;
import at.gv.egovernment.moa.util.FileUtils;
import at.gv.egovernment.moa.util.StringUtils;
import eu.stork.mw.messages.saml.STORKAuthnRequest;
import eu.stork.vidp.messages.builder.STORKMessagesBuilder;
import eu.stork.vidp.messages.common.STORKConstants;
import eu.stork.vidp.messages.exception.SAMLException;
import eu.stork.vidp.messages.exception.SAMLValidationException;
import eu.stork.vidp.messages.stork.QualityAuthenticationAssuranceLevel;
import eu.stork.vidp.messages.stork.RequestedAttributes;
import eu.stork.vidp.messages.util.SAMLUtil;
import eu.stork.vidp.messages.util.XMLUtil;
/**
* API for MOA ID Authentication Service.
{@link AuthenticationSession} is
* stored in a session store and retrieved by giving the session ID.
*
* @author Paul Ivancsics
* @version $Id: AuthenticationServer.java 1273 2012-02-27 14:50:18Z kstranacher
* $
*/
public class AuthenticationServer implements MOAIDAuthConstants {
/** single instance */
private static AuthenticationServer instance;
/** session data store (session ID -> AuthenticationSession) */
//private static Map sessionStore = new HashMap();
/**
* time out in milliseconds used by {@link cleanup} for session store
*/
private long sessionTimeOut = 10 * 60 * 1000; // default 10 minutes
/**
* time out in milliseconds used by {@link cleanup} for authentication data
* store
*/
private long authDataTimeOut = 2 * 60 * 1000; // default 2 minutes
/**
* Returns the single instance of AuthenticationServer
.
*
* @return the single instance of AuthenticationServer
*/
public static AuthenticationServer getInstance() {
if (instance == null)
instance = new AuthenticationServer();
return instance;
}
/**
* Constructor for AuthenticationServer.
*/
public AuthenticationServer() {
super();
}
/**
* Processes request to select a BKU.
* Processing depends on value of
* {@link AuthConfigurationProvider#getBKUSelectionType}.
* For bkuSelectionType==HTMLComplete
, a returnURI
* for the "BKU Auswahl" service is returned.
* For bkuSelectionType==HTMLSelect
, an HTML form for BKU
* selection is returned.
*
* @param authURL
* base URL of MOA-ID Auth component
* @param target
* "Geschäftsbereich"
* @param oaURL
* online application URL requested
* @param bkuSelectionTemplateURL
* template for BKU selection form to be used in case of
* HTMLSelect
; may be null
* @param templateURL
* URL providing an HTML template for the HTML form to be used
* for call startAuthentication
* @return for bkuSelectionType==HTMLComplete
, the
* returnURI
for the "BKU Auswahl" service; for
* bkuSelectionType==HTMLSelect
, an HTML form for BKU
* selection
* @throws WrongParametersException
* upon missing parameters
* @throws AuthenticationException
* when the configured BKU selection service cannot be reached,
* and when the given bkuSelectionTemplateURL cannot be reached
* @throws ConfigurationException
* on missing configuration data
* @throws BuildException
* while building the HTML form
*/
public String selectBKU(String authURL, String target, String oaURL,
String bkuSelectionTemplateURL, String templateURL)
throws WrongParametersException, AuthenticationException,
ConfigurationException, BuildException {
// check if HTTP Connection may be allowed (through
// FRONTEND_SERVLETS_ENABLE_HTTP_CONNECTION_PROPERTY)
String boolStr = AuthConfigurationProvider
.getInstance()
.getGenericConfigurationParameter(
AuthConfigurationProvider.FRONTEND_SERVLETS_ENABLE_HTTP_CONNECTION_PROPERTY);
if ((!authURL.startsWith("https:"))
&& (false == BoolUtils.valueOf(boolStr)))
throw new AuthenticationException("auth.07", new Object[] { authURL
+ "*" });
if (isEmpty(authURL))
throw new WrongParametersException("StartAuthentication",
"AuthURL", "auth.05");
if (isEmpty(oaURL))
throw new WrongParametersException("StartAuthentication", PARAM_OA,
"auth.05");
ConnectionParameter bkuConnParam = AuthConfigurationProvider
.getInstance().getBKUConnectionParameter();
if (bkuConnParam == null)
throw new ConfigurationException("config.08",
new Object[] { "BKUSelection/ConnectionParameter" });
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(oaURL);
if (oaParam == null)
throw new AuthenticationException("auth.00", new Object[] { oaURL });
if (!oaParam.getBusinessService()) {
if (isEmpty(target))
throw new WrongParametersException("StartAuthentication",
PARAM_TARGET, "auth.05");
} else {
if (!isEmpty(target)) {
Logger
.info("Ignoring target parameter thus application type is \"businessService\"");
}
target = null;
}
AuthenticationSession session = newSession();
Logger.info("MOASession " + session.getSessionID() + " angelegt");
session.setTarget(target);
session.setOAURLRequested(oaURL);
session.setPublicOAURLPrefix(oaParam.getPublicURLPrefix());
session.setAuthURL(authURL);
session.setTemplateURL(templateURL);
session.setBusinessService(oaParam.getBusinessService());
try {
AuthenticationSessionStoreage.storeSession(session);
} catch (MOADatabaseException e) {
throw new AuthenticationException("", null);
}
String returnURL = new DataURLBuilder().buildDataURL(authURL,
REQ_START_AUTHENTICATION, session.getSessionID());
String bkuSelectionType = AuthConfigurationProvider.getInstance()
.getBKUSelectionType();
if (bkuSelectionType
.equals(AuthConfigurationProvider.BKU_SELECTION_TYPE_HTMLCOMPLETE)) {
// bkuSelectionType==HTMLComplete
String redirectURL = bkuConnParam.getUrl() + "?"
+ AuthServlet.PARAM_RETURN + "=" + returnURL;
return redirectURL;
} else {
// bkuSelectionType==HTMLSelect
String bkuSelectTag;
try {
bkuSelectTag = readBKUSelectTag(AuthConfigurationProvider
.getInstance(), bkuConnParam);
} catch (Throwable ex) {
throw new AuthenticationException("auth.11", new Object[] {
bkuConnParam.getUrl(), ex.toString() }, ex);
}
String bkuSelectionTemplate = null;
// override template url by url from configuration file
if (oaParam.getBkuSelectionTemplateURL() != null) {
bkuSelectionTemplateURL = oaParam.getBkuSelectionTemplateURL();
}
if (bkuSelectionTemplateURL != null) {
try {
bkuSelectionTemplate = new String(FileUtils
.readURL(bkuSelectionTemplateURL));
} catch (IOException ex) {
throw new AuthenticationException("auth.03", new Object[] {
bkuSelectionTemplateURL, ex.toString() }, ex);
}
}
String htmlForm = new SelectBKUFormBuilder().build(
bkuSelectionTemplate, returnURL, bkuSelectTag);
return htmlForm;
}
}
/**
* Method readBKUSelectTag.
*
* @param conf
* the ConfigurationProvider
* @param connParam
* the ConnectionParameter for that connection
* @return String
* @throws ConfigurationException
* on config-errors
* @throws PKIException
* on PKI errors
* @throws IOException
* on any data error
* @throws GeneralSecurityException
* on security errors
*/
private String readBKUSelectTag(ConfigurationProvider conf,
ConnectionParameter connParam) throws ConfigurationException,
PKIException, IOException, GeneralSecurityException {
if (connParam.isHTTPSURL())
return SSLUtils.readHttpsURL(conf, connParam);
else
return HTTPUtils.readHttpURL(connParam.getUrl());
}
/**
* Processes the beginning of an authentication session.
*
<InfoboxReadRequest>
<InfoboxReadRequest>
null
; in this case, the default location will be
* used
* @param useMandate
* Indicates if mandate is used or not
* @param templateURL
* URL providing an HTML template for the HTML form generated
* @param templateMandteURL
* URL providing an HTML template for the HTML form generated
* (for signing in mandates mode)
* @param scheme
* determines the protocol used
* @param sourceID
* @return HTML form
* @throws AuthenticationException
* @see GetIdentityLinkFormBuilder
* @see InfoboxReadRequestBuilder
*/
public String startAuthentication(AuthenticationSession session, String scheme) throws WrongParametersException,
AuthenticationException, ConfigurationException, BuildException {
if (session == null) {
throw new AuthenticationException("auth.18", new Object[] { });
}
//load OnlineApplication configuration
OAAuthParameter oaParam =
AuthConfigurationProvider.getInstance().getOnlineApplicationParameter(session.getPublicOAURLPrefix());
if (oaParam == null)
throw new AuthenticationException("auth.00", new Object[] { session.getPublicOAURLPrefix() });
//load Template
String template = null;
if (session.getTemplateURL() != null) {
try {
template = new String(FileUtils.readURL(session.getTemplateURL()));
} catch (IOException ex) {
throw new AuthenticationException("auth.03", new Object[] {
session.getTemplateURL(), ex.toString() }, ex);
}
}
//build ReadInfobox request
String infoboxReadRequest = new InfoboxReadRequestBuilder().build(
oaParam.getSlVersion12(), oaParam.getBusinessService(), oaParam
.getIdentityLinkDomainIdentifier());
String dataURL = new DataURLBuilder().buildDataURL(
session.getAuthURL(), REQ_VERIFY_IDENTITY_LINK, session
.getSessionID());
String pushInfobox = "";
VerifyInfoboxParameters verifyInfoboxParameters = oaParam
.getVerifyInfoboxParameters();
if (verifyInfoboxParameters != null) {
pushInfobox = verifyInfoboxParameters.getPushInfobox();
session.setPushInfobox(pushInfobox);
}
//build CertInfo request
String certInfoRequest = new CertInfoVerifyXMLSignatureRequestBuilder()
.build(oaParam.getSlVersion12());
String certInfoDataURL = new DataURLBuilder()
.buildDataURL(session.getAuthURL(), REQ_START_AUTHENTICATION,
session.getSessionID());
String htmlForm = new GetIdentityLinkFormBuilder().build(template,
session.getBkuURL(), infoboxReadRequest, dataURL, certInfoRequest,
certInfoDataURL, pushInfobox);
return htmlForm;
}
/**
* Processes an <InfoboxReadResponse>
sent by the
* security layer implementation.<InfoboxReadResponse>
<InfoboxReadResponse>
<CreateXMLSignatureRequest>
* containg the authentication block, meant to be returned to the security
* layer implementation<InfoboxReadResponse>
* @return String representation of the
* <CreateXMLSignatureRequest>
*/
public String verifyIdentityLink(AuthenticationSession session,
Map infoboxReadResponseParameters) throws AuthenticationException,
BuildException, ParseException, ConfigurationException,
ValidateException, ServiceException {
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_IDENTITY_LINK, PARAM_SESSIONID });
String xmlInfoboxReadResponse = (String) infoboxReadResponseParameters
.get(PARAM_XMLRESPONSE);
// System.out.println("PB: " + xmlInfoboxReadResponse);
if (isEmpty(xmlInfoboxReadResponse))
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_IDENTITY_LINK, PARAM_XMLRESPONSE });
// AuthenticationSession session = getSession(sessionID);
// if (session.getTimestampIdentityLink() != null)
// throw new AuthenticationException("auth.01",
// new Object[] { sessionID });
session.setTimestampIdentityLink();
AuthConfigurationProvider authConf = AuthConfigurationProvider
.getInstance();
// check if an identity link was found
// Errorcode 2911 von Trustdesk BKU (nicht spezifikationskonform
// (SL1.2))
// CharSequence se = "ErrorCode>2911".substring(0);
// boolean b = xmlInfoboxReadResponse.contains(se);
String se = "ErrorCode>2911";
int b = xmlInfoboxReadResponse.indexOf(se);
if (b != -1) { // no identity link found
Logger
.info("Es konnte keine Personenbindung auf der Karte gefunden werden. Versuche Anmeldung als auslaendische eID.");
return null;
}
// spezifikationsgemaess (SL1.2) Errorcode
se = "ErrorCode>4002";
// b = xmlInfoboxReadResponse.contains(se);
b = xmlInfoboxReadResponse.indexOf(se);
if (b != -1) { // Unbekannter Infoboxbezeichner
Logger
.info("Unbekannter Infoboxbezeichner. Versuche Anmeldung als auslaendische eID.");
return null;
}
// for testing new identity link certificate
// xmlInfoboxReadResponse = null;
// try {
// File file = new File("c:/temp/XXXMuster.xml");
// FileInputStream fis;
//
// fis = new FileInputStream(file);
// byte[] array = Utils.readFromInputStream(fis);
//
// xmlInfoboxReadResponse = new String(array);
// System.out.println(xmlInfoboxReadResponse);
//
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (UtilsException e) {
// e.printStackTrace();
// }
// parses the <InfoboxReadResponse>
sent by the
* security layer implementation.<InfoboxReadResponse>
<InfoboxReadResponse>
<CreateXMLSignatureRequest>
* containg the authentication block, meant to be returned to the security
* layer implementation<InfoboxReadResponse>
* @return String representation of the
* <CreateXMLSignatureRequest>
*/
public String verifyCertificate(AuthenticationSession session,
X509Certificate certificate) throws AuthenticationException,
BuildException, ParseException, ConfigurationException,
ValidateException, ServiceException, MOAIDException{
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_CERTIFICATE, PARAM_SESSIONID });
// check if person is a Organwalter
// if true - don't show bPK in AUTH Block
boolean isOW = false;
// String oid = null;
// if (oid.equalsIgnoreCase(MISMandate.OID_ORGANWALTER))
// isOW = true;
//
// AuthenticationSession session = getSession(sessionID);
AuthConfigurationProvider authConf = AuthConfigurationProvider
.getInstance();
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(session.getPublicOAURLPrefix());
String returnvalue = getCreateXMLSignatureRequestAuthBlockOrRedirectForOW(session,
authConf, oaParam, isOW);
return returnvalue;
}
/**
* Processes an Mandate
sent by the MIS.Mandate
<CreateXMLSignatureRequest>
* containg the authentication block, meant to be returned to the security
* layer implementation<InfoboxReadResponse>
* @return String representation of the
* <CreateXMLSignatureRequest>
*/
public void verifyMandate(AuthenticationSession session, MISMandate mandate)
throws AuthenticationException, BuildException, ParseException,
ConfigurationException, ValidateException, ServiceException {
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
GET_MIS_SESSIONID, PARAM_SESSIONID });
String sMandate = new String(mandate.getMandate());
if (sMandate == null | sMandate.compareToIgnoreCase("") == 0) {
Logger.error("Mandate is empty.");
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID });
}
//AuthenticationSession session = getSession(sessionID);
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(session.getPublicOAURLPrefix());
try {
// sets the extended SAML attributes for OID (Organwalter)
setExtendedSAMLAttributeForMandatesOID(session, mandate, oaParam
.getBusinessService());
} catch (SAXException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (IOException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (ParserConfigurationException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (TransformerException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
}
if (oaParam.getProvideFullMandatorData()) {
try {
// set extended SAML attributes if provideMandatorData is true
setExtendedSAMLAttributeForMandates(session, mandate, oaParam
.getBusinessService(), oaParam.getProvideStammzahl());
//AuthenticationSessionStoreage.storeSession(session);
} catch (SAXException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (IOException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (ParserConfigurationException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
} catch (TransformerException e) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID }, e);
}
}
}
/**
*
* @param session
* @param authConf
* @param oaParam
* @return
* @throws ConfigurationException
* @throws BuildException
* @throws ValidateException
*/
public String getCreateXMLSignatureRequestAuthBlockOrRedirect(
AuthenticationSession session, AuthConfigurationProvider authConf,
OAAuthParameter oaParam) throws ConfigurationException,
BuildException, ValidateException {
// check for intermediate processing of the infoboxes
if (session.isValidatorInputPending())
return "Redirect to Input Processor";
if (authConf == null)
authConf = AuthConfigurationProvider.getInstance();
if (oaParam == null)
oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(
session.getPublicOAURLPrefix());
//TODO: CHECK!! is moved to buildAuthenticationBlock to hold the baseID in identitylink
// if (!fromMandate) {
// BZ.., calculate bPK for signing to be already present in AuthBlock
// IdentityLink identityLink = session.getIdentityLink();
// if (identityLink.getIdentificationType().equals(
// Constants.URN_PREFIX_BASEID)) {
// // only compute bPK if online application is a public service and we
// // have the Stammzahl
// String bpkBase64 = new BPKBuilder().buildBPK(identityLink
// .getIdentificationValue(), session.getTarget());
// identityLink.setIdentificationValue(bpkBase64);
// identityLink.setIdentificationType(Constants.URN_PREFIX_CDID + "+" + session.getTarget());
// }
// ..BZ
// }
// builds the AUTH-block
String authBlock = buildAuthenticationBlock(session, oaParam);
// session.setAuthBlock(authBlock);
// builds the <CreateXMLSignatureRequest>
*/
public String createXMLSignatureRequestForeignID(AuthenticationSession session,
X509Certificate cert) throws AuthenticationException,
BuildException, ParseException, ConfigurationException,
ValidateException, ServiceException {
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_CERTIFICATE, PARAM_SESSIONID });
// AuthenticationSession session = getSession(sessionID);
AuthConfigurationProvider authConf = AuthConfigurationProvider
.getInstance();
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(session.getPublicOAURLPrefix());
//session.setSignerCertificate(cert);
return getCreateXMLSignatureRequestForeigID(session, authConf, oaParam,
cert);
}
public String getCreateXMLSignatureRequestForeigID(
AuthenticationSession session, AuthConfigurationProvider authConf,
OAAuthParameter oaParam, X509Certificate cert)
throws ConfigurationException {
// check for intermediate processing of the infoboxes
if (session.isValidatorInputPending())
return "Redirect to Input Processor";
if (authConf == null)
authConf = AuthConfigurationProvider.getInstance();
if (oaParam == null)
oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(
session.getPublicOAURLPrefix());
Principal subject = cert.getSubjectDN();
String createXMLSignatureRequest = new CreateXMLSignatureRequestBuilder()
.buildForeignID(subject.toString(), oaParam, session);
return createXMLSignatureRequest;
}
/**
* Processes an <CreateXMLSignatureResponse>
sent by the
* security layer implementation.<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
*/
public X509Certificate verifyXMLSignature(String sessionID,
Map createXMLSignatureResponseParameters)
throws AuthenticationException, BuildException, ParseException,
ConfigurationException, ValidateException, ServiceException {
if (isEmpty(sessionID))
throw new AuthenticationException("auth.10", new Object[] {
REQ_GET_FOREIGN_ID, PARAM_SESSIONID });
String xmlCreateXMLSignatureResponse = (String) createXMLSignatureResponseParameters
.get(PARAM_XMLRESPONSE);
if (isEmpty(xmlCreateXMLSignatureResponse))
throw new AuthenticationException("auth.10", new Object[] {
REQ_GET_FOREIGN_ID, PARAM_XMLRESPONSE });
//AuthenticationSession session = getSession(sessionID);
/*
* if (session.getTimestampIdentityLink() != null) throw new
* AuthenticationException("auth.01", new Object[] { sessionID });
*/
// session.setTimestampIdentityLink();
AuthConfigurationProvider authConf = AuthConfigurationProvider
.getInstance();
// parses the <CreateXMLSignatureResponse>
sent by the
* security layer implementation.<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
<ReadInfoboxResponse>
*/
public X509Certificate getCertificate(String sessionID,
Map readInfoboxResponseParameters) throws AuthenticationException,
BuildException, ParseException, ConfigurationException,
ValidateException, ServiceException {
if (isEmpty(sessionID))
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_CERTIFICATE, PARAM_SESSIONID });
String xmlReadInfoboxResponse = (String) readInfoboxResponseParameters
.get(PARAM_XMLRESPONSE);
if (isEmpty(xmlReadInfoboxResponse))
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_CERTIFICATE, PARAM_XMLRESPONSE });
// parses the <saml:Assertion>
from
* given session data.
*
* @param session
* authentication session
*
* @return <saml:Assertion>
as a String
*
* @throws BuildException
* If an error occurs on serializing an extended SAML attribute
* to be appended to the AUTH-Block.
*/
private String buildAuthenticationBlock(AuthenticationSession session,
OAAuthParameter oaParam) throws BuildException {
IdentityLink identityLink = session.getIdentityLink();
String issuer = identityLink.getName();
String gebDat = identityLink.getDateOfBirth();
String identificationValue = null;
String identificationType = null;
if (identityLink.getIdentificationType().equals(
Constants.URN_PREFIX_BASEID)) {
// only compute bPK if online application is a public service and we
// have the Stammzahl
String bpkBase64 = new BPKBuilder().buildBPK(identityLink
.getIdentificationValue(), session.getTarget());
identificationValue = bpkBase64;
identificationType = Constants.URN_PREFIX_CDID + "+" + session.getTarget();
// identityLink.setIdentificationValue(bpkBase64);
// identityLink.setIdentificationType(Constants.URN_PREFIX_CDID + "+" + session.getTarget());
} else {
identificationValue = identityLink.getIdentificationValue();
identificationType = identityLink.getIdentificationType();
}
String issueInstant = DateTimeUtils.buildDateTime(Calendar
.getInstance(), oaParam.getUseUTC());
session.setIssueInstant(issueInstant);
String authURL = session.getAuthURL();
String target = session.getTarget();
String targetFriendlyName = session.getTargetFriendlyName();
// Bug #485
// (https://egovlabs.gv.at/tracker/index.php?func=detail&aid=485&group_id=6&atid=105)
// String oaURL = session.getPublicOAURLPrefix();
String oaURL = session.getPublicOAURLPrefix().replaceAll("&", "&");
List extendedSAMLAttributes = session.getExtendedSAMLAttributesAUTH();
String authBlock = new AuthenticationBlockAssertionBuilder()
.buildAuthBlock(issuer, issueInstant, authURL, target,
targetFriendlyName, identificationValue,
identificationType, oaURL, gebDat,
extendedSAMLAttributes, session);
return authBlock;
}
/**
* Builds an authentication block <saml:Assertion>
from
* given session data.
*
* @param session
* authentication session
*
* @return <saml:Assertion>
as a String
*
* @throws BuildException
* If an error occurs on serializing an extended SAML attribute
* to be appended to the AUTH-Block.
*/
private String buildAuthenticationBlockForOW(AuthenticationSession session,
OAAuthParameter oaParam, boolean isOW) throws BuildException {
IdentityLink identityLink = session.getIdentityLink();
String issuer = identityLink.getName();
String gebDat = identityLink.getDateOfBirth();
String identificationValue = identityLink.getIdentificationValue();
String identificationType = identityLink.getIdentificationType();
String issueInstant = DateTimeUtils.buildDateTime(Calendar
.getInstance(), oaParam.getUseUTC());
session.setIssueInstant(issueInstant);
String authURL = session.getAuthURL();
String target = session.getTarget();
String targetFriendlyName = session.getTargetFriendlyName();
// Bug #485
// (https://egovlabs.gv.at/tracker/index.php?func=detail&aid=485&group_id=6&atid=105)
// String oaURL = session.getPublicOAURLPrefix();
String oaURL = session.getPublicOAURLPrefix().replaceAll("&", "&");
List extendedSAMLAttributes = session.getExtendedSAMLAttributesAUTH();
Iterator it = extendedSAMLAttributes.iterator();
// delete bPK attribute from extended SAML attributes
if (isOW) {
ExtendedSAMLAttribute toDelete = null;
while (it.hasNext()) {
ExtendedSAMLAttribute attr = (ExtendedSAMLAttribute)it.next();
if (attr.getName().equalsIgnoreCase("bPK"))
toDelete = attr;
}
if (toDelete != null)
extendedSAMLAttributes.remove(toDelete);
}
String authBlock = new AuthenticationBlockAssertionBuilder()
.buildAuthBlock(issuer, issueInstant, authURL, target,
targetFriendlyName, identificationValue,
identificationType, oaURL, gebDat,
extendedSAMLAttributes, session);
return authBlock;
}
/**
* Verifies the infoboxes (except of the identity link infobox) returned by
* the BKU by calling appropriate validator classes.
*
* @param session
* The actual authentication session.
* @param infoboxReadResponseParams
* The parameters returned from the BKU as response to an infobox
* read request (including the infobox tokens to be verified).
* @param hideStammzahl
* Indicates whether source pins (Stammzahl
en)
* should be hidden in any SAML attribute that may be returned by
* a validator.
*
* @throws AuthenticationException
* If the verification of at least one infobox fails.
* @throws ConfigurationException
* If the OAuthParameter cannot be extracted.
*/
private void verifyInfoboxes(AuthenticationSession session,
Map infoboxReadResponseParams, boolean hideStammzahl)
throws ValidateException, ConfigurationException {
AuthConfigurationProvider authConfigurationProvider = AuthConfigurationProvider
.getInstance();
// get the default VerifyInfobox parameters
Map defaultInfoboxParameters = null;
VerifyInfoboxParameters defaultVerifyInfoboxParameters = authConfigurationProvider
.getDefaultVerifyInfoboxParameters();
if (defaultVerifyInfoboxParameters != null) {
defaultInfoboxParameters = defaultVerifyInfoboxParameters
.getInfoboxParameters();
}
// get the OA specific VerifyInfobox parameters
Map infoboxParameters = null;
OAAuthParameter oaParam = authConfigurationProvider
.getOnlineApplicationParameter(session.getPublicOAURLPrefix());
VerifyInfoboxParameters verifyInfoboxParameters = oaParam
.getVerifyInfoboxParameters();
session.setExtendedSAMLAttributesAUTH(new Vector()); // Initialize SAML
// Attributes
session.setExtendedSAMLAttributesOA(new Vector());
// System.out.println("SAML set: " +
// session.getExtendedSAMLAttributesAUTH().size());
if (verifyInfoboxParameters != null) {
infoboxParameters = verifyInfoboxParameters.getInfoboxParameters();
// get the list of infobox identifiers
List identifiers = verifyInfoboxParameters.getIdentifiers();
if (identifiers != null) {
// step through the identifiers and verify the infoboxes
Iterator it = identifiers.iterator();
while (it.hasNext()) {
String identifier = (String) it.next();
// get the infobox read response from the map of parameters
String infoboxReadResponse = (String) infoboxReadResponseParams
.get(identifier);
// get the configuration parameters
VerifyInfoboxParameter verifyInfoboxParameter = null;
Object object = infoboxParameters.get(identifier);
// if not present, use default
if ((object == null) && (defaultInfoboxParameters != null)) {
object = defaultInfoboxParameters.get(identifier);
}
if (object != null) {
verifyInfoboxParameter = (VerifyInfoboxParameter) object;
}
if (infoboxReadResponse != null) {
if (verifyInfoboxParameter == null) {
// should not happen because of the pushinfobox
// mechanism; check it anyway
Logger.error("No validator for verifying \""
+ identifier + "\"-infobox configured.");
throw new ValidateException("validator.41",
new Object[] { identifier });
} else {
String friendlyName = verifyInfoboxParameter
.getFriendlyName();
boolean isParepRequest = false;
// parse the infobox read reponse
List infoboxTokenList = null;
try {
infoboxTokenList = ExtendedInfoboxReadResponseParser
.parseInfoboxReadResponse(
infoboxReadResponse,
friendlyName);
} catch (ParseException e) {
Logger
.error("InfoboxReadResponse for \""
+ identifier
+ "\"-infobox could not be parsed successfully: "
+ e.getMessage());
throw new ValidateException("validator.43",
new Object[] { friendlyName });
}
// set compatibility mode for mandates infobox and
// all infoboxes (it is possible to be a parep
// infobox)
// session.setMandateCompatibilityMode(ParepConfiguration.isMandateCompatibilityMode(verifyInfoboxParameter.getApplicationSpecificParams()));
// check for party representation in mandates
// infobox
if (Constants.INFOBOXIDENTIFIER_MANDATES
.equalsIgnoreCase(identifier)
&& !((infoboxTokenList == null || infoboxTokenList
.size() == 0))) {
// We need app specific parameters
if (null == verifyInfoboxParameter
.getApplicationSpecificParams()) {
throw new ValidateException("validator.66",
new Object[] { friendlyName });
}
Element mandate = ParepValidator
.extractPrimaryToken(infoboxTokenList);
// ParepUtils.serializeElement(mandate,
// System.out);
String mandateID = ParepUtils
.extractRepresentativeID(mandate);
if (!isEmpty(mandateID)
&& ("*".equals(mandateID) || mandateID
.startsWith(MOAIDAuthConstants.PARTY_REPRESENTATION_OID_NUMBER))) {
isParepRequest = true;
}
if (!isParepRequest) {
// if mandates validator is disabled we must
// throw an error in this case
if (!ParepUtils
.isValidatorEnabled(verifyInfoboxParameter
.getApplicationSpecificParams())) {
throw new ValidateException(
"validator.60",
new Object[] { friendlyName });
}
}
}
// get the class for validating the infobox
InfoboxValidator infoboxValidator = null;
try {
Class validatorClass = null;
if (isParepRequest) {
// Mandates infobox in party representation
// mode
validatorClass = Class
.forName("at.gv.egovernment.moa.id.auth.validator.parep.ParepValidator");
} else {
validatorClass = Class
.forName(verifyInfoboxParameter
.getValidatorClassName());
}
infoboxValidator = (InfoboxValidator) validatorClass
.newInstance();
} catch (Exception e) {
Logger
.error("Could not load validator class \""
+ verifyInfoboxParameter
.getValidatorClassName()
+ "\" for \""
+ identifier
+ "\"-infobox: "
+ e.getMessage());
throw new ValidateException("validator.42",
new Object[] { friendlyName });
}
Logger
.debug("Successfully loaded validator class \""
+ verifyInfoboxParameter
.getValidatorClassName()
+ "\" for \""
+ identifier
+ "\"-infobox.");
// build the parameters for validating the infobox
InfoboxValidatorParams infoboxValidatorParams = InfoboxValidatorParamsBuilder
.buildInfoboxValidatorParams(session,
verifyInfoboxParameter,
infoboxTokenList, oaParam);
// now validate the infobox
InfoboxValidationResult infoboxValidationResult = null;
try {
infoboxValidationResult = infoboxValidator
.validate(infoboxValidatorParams);
} catch (ValidateException e) {
Logger.error("Error validating " + identifier
+ " infobox:" + e.getMessage());
throw new ValidateException("validator.44",
new Object[] { friendlyName });
}
if (!infoboxValidationResult.isValid()) {
Logger.info("Validation of " + identifier
+ " infobox failed.");
throw new ValidateException("validator.40",
new Object[] {
friendlyName,
infoboxValidationResult
.getErrorMessage() });
}
Logger.info(identifier
+ " infobox successfully validated.");
// store the validator for post processing
session.addInfoboxValidator(identifier,
friendlyName, infoboxValidator);
// get the SAML attributes to be appended to the
// AUTHBlock or to the final
// SAML Assertion
AddAdditionalSAMLAttributes(session,
infoboxValidationResult
.getExtendedSamlAttributes(),
identifier, friendlyName);
}
} else {
if ((verifyInfoboxParameter != null)
&& (verifyInfoboxParameter.isRequired())) {
Logger
.info("Infobox \""
+ identifier
+ "\" is required, but not returned from the BKU");
throw new ValidateException("validator.48",
new Object[] { verifyInfoboxParameter
.getFriendlyName() });
}
Logger.debug("Infobox \"" + identifier
+ "\" not returned from BKU.");
}
}
}
}
}
/**
* Verifies the infoboxes (except of the identity link infobox) returned by
* the BKU by calling appropriate validator classes.
*
* @param session
* The actual authentication session.
* @param mandate
* The Mandate from the MIS
*
* @throws AuthenticationException
* @throws ConfigurationException
* @throws TransformerException
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
private void setExtendedSAMLAttributeForMandates(
AuthenticationSession session, MISMandate mandate,
boolean business, boolean provideStammzahl)
throws ValidateException, ConfigurationException, SAXException,
IOException, ParserConfigurationException, TransformerException {
ExtendedSAMLAttribute[] extendedSamlAttributes = addExtendedSamlAttributes(
mandate, business, provideStammzahl);
AddAdditionalSAMLAttributes(session, extendedSamlAttributes,
"MISService", "MISService");
}
/**
* Verifies the infoboxes (except of the identity link infobox) returned by
* the BKU by calling appropriate validator classes.
*
* @param session
* The actual authentication session.
* @param mandate
* The Mandate from the MIS
*
* @throws AuthenticationException
* @throws ConfigurationException
* @throws TransformerException
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
private void setExtendedSAMLAttributeForMandatesOID(
AuthenticationSession session, MISMandate mandate, boolean business)
throws ValidateException, ConfigurationException, SAXException,
IOException, ParserConfigurationException, TransformerException {
ExtendedSAMLAttribute[] extendedSamlAttributes = addExtendedSamlAttributesOID(
mandate, business);
AddAdditionalSAMLAttributes(session, extendedSamlAttributes,
"MISService", "MISService");
}
/**
* Intermediate processing of the infoboxes. The first pending infobox
* validator may validate the provided input
*
* @param session
* The current authentication session
* @param parameters
* The parameters got returned by the user input fields
*/
public static void processInput(AuthenticationSession session,
Map parameters) throws ValidateException {
// post processing of the infoboxes
Iterator iter = session.getInfoboxValidatorIterator();
if (iter != null) {
while (iter.hasNext()) {
Vector infoboxValidatorVector = (Vector) iter.next();
InfoboxValidator infoboxvalidator = (InfoboxValidator) infoboxValidatorVector
.get(2);
if (!ParepUtils.isEmpty(infoboxvalidator.getForm())) {
String identifier = (String) infoboxValidatorVector.get(0);
String friendlyName = (String) infoboxValidatorVector
.get(1);
InfoboxValidationResult infoboxValidationResult = null;
try {
infoboxValidationResult = infoboxvalidator
.validate(parameters);
} catch (ValidateException e) {
Logger.error("Error validating " + identifier
+ " infobox:" + e.getMessage());
throw new ValidateException("validator.44",
new Object[] { friendlyName });
}
if (!infoboxValidationResult.isValid()) {
Logger.info("Validation of " + identifier
+ " infobox failed.");
throw new ValidateException("validator.40",
new Object[] {
friendlyName,
infoboxValidationResult
.getErrorMessage() });
}
AddAdditionalSAMLAttributes(
session,
infoboxValidationResult.getExtendedSamlAttributes(),
identifier, friendlyName);
}
}
}
}
/**
* Adds given SAML Attributes to the current session. They will be appended
* to the final SAML Assertion or the AUTH block. If the attributes are
* already in the list, they will be replaced.
*
* @param session
* The current session
* @param extendedSAMLAttributes
* The SAML attributes to add
* @param identifier
* The infobox identifier for debug purposes
* @param friendlyNam
* The friendly name of the infobox for debug purposes
*/
private static void AddAdditionalSAMLAttributes(
AuthenticationSession session,
ExtendedSAMLAttribute[] extendedSAMLAttributes, String identifier,
String friendlyName) throws ValidateException {
if (extendedSAMLAttributes == null)
return;
List oaAttributes = session.getExtendedSAMLAttributesOA();
if (oaAttributes == null)
oaAttributes = new Vector();
List authAttributes = session.getExtendedSAMLAttributesAUTH();
if (authAttributes == null)
authAttributes = new Vector();
int length = extendedSAMLAttributes.length;
for (int i = 0; i < length; i++) {
ExtendedSAMLAttribute samlAttribute = extendedSAMLAttributes[i];
Object value = verifySAMLAttribute(samlAttribute, i, identifier,
friendlyName);
if ((value instanceof String) || (value instanceof Element)) {
switch (samlAttribute.getAddToAUTHBlock()) {
case ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY:
replaceExtendedSAMLAttribute(authAttributes, samlAttribute);
break;
case ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK:
replaceExtendedSAMLAttribute(authAttributes, samlAttribute);
replaceExtendedSAMLAttribute(oaAttributes, samlAttribute);
break;
case ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK:
replaceExtendedSAMLAttribute(oaAttributes, samlAttribute);
break;
default:
Logger
.info("Invalid return value from method \"getAddToAUTHBlock()\" ("
+ samlAttribute.getAddToAUTHBlock()
+ ") in SAML attribute number "
+ (i + 1)
+ " for infobox " + identifier);
throw new ValidateException("validator.47", new Object[] {
friendlyName, String.valueOf((i + 1)) });
}
} else {
Logger
.info("The type of SAML-Attribute number "
+ (i + 1)
+ " returned from "
+ identifier
+ "-infobox validator is not valid. Must be either \"java.Lang.String\""
+ " or \"org.w3c.dom.Element\"");
throw new ValidateException("validator.46", new Object[] {
identifier, String.valueOf((i + 1)) });
}
}
session.setExtendedSAMLAttributesAUTH(authAttributes);
session.setExtendedSAMLAttributesOA(oaAttributes);
}
// /**
// * Adds given SAML Attributes to the current session. They will be
// appended
// * to the final SAML Assertion or the AUTH block. If the attributes are
// * already in the list, they will be replaced.
// *
// * @param session The current session
// * @param extendedSAMLAttributes The SAML attributes to add
// * @param identifier The infobox identifier for debug purposes
// * @param friendlyNam The friendly name of the infobox for debug purposes
// */
// private static void AddAdditionalSAMLAttributes(AuthenticationSession
// session, MISMandate mandate) throws ValidateException
// {
//
// List oaAttributes = session.getExtendedSAMLAttributesOA();
// if (oaAttributes==null) oaAttributes = new Vector();
// List authAttributes = session.getExtendedSAMLAttributesAUTH();
// if (authAttributes==null) authAttributes = new Vector();
//
//
// addExtendedSamlAttributes(authAttributes, mandate);
//
// session.setExtendedSAMLAttributesAUTH(authAttributes);
// session.setExtendedSAMLAttributesOA(oaAttributes);
// }
/**
* Adds the AUTH block related SAML attributes to the validation result.
* This is needed always before the AUTH block is to be signed, because the
* name of the mandator has to be set
*
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
* @throws TransformerException
*/
private static ExtendedSAMLAttribute[] addExtendedSamlAttributes(
MISMandate mandate, boolean business, boolean provideStammzahl)
throws SAXException, IOException, ParserConfigurationException,
TransformerException {
Vector extendedSamlAttributes = new Vector();
extendedSamlAttributes.clear();
// extendedSamlAttributes.add(new
// ExtendedSAMLAttributeImpl(ParepValidator.EXT_SAML_MANDATE_RAW,
// mandate, SZRGWConstants.MANDATE_NS,
// ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK));
// Name
Element domMandate = mandateToElement(mandate);
Element nameSpaceNode = domMandate.getOwnerDocument().createElement(
"NameSpaceNode");
nameSpaceNode.setAttribute("xmlns" + SZRGWConstants.PD_POSTFIX,
Constants.PD_NS_URI);
nameSpaceNode.setAttribute("xmlns" + SZRGWConstants.MANDATE_POSTFIX,
SZRGWConstants.MANDATE_NS);
Element mandator = (Element) XPathAPI.selectSingleNode(domMandate,
"//md:Mandate/md:Mandator", nameSpaceNode);
// first check if physical person
// Element name = (Element) XPathAPI.selectSingleNode(mandator,
// "descendant-or-self::pr:Name/pr:GivenName", nameSpaceNode);
// String mandatorname = ParepUtils.extractMandatorName(mandator);
// extendedSamlAttributes.add(new
// ExtendedSAMLAttributeImpl(ParepValidator.EXT_SAML_MANDATE_NAME,
// mandatorname, SZRGWConstants.MANDATE_NS,
// ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY));
// Geburtsdatum
// String dob = ParepUtils.extractMandatorDateOfBirth(mandator);
// if (dob != null && !"".equals(dob)) {
// extendedSamlAttributes.add(new
// ExtendedSAMLAttributeImpl(ParepValidator.EXT_SAML_MANDATE_DOB, dob,
// SZRGWConstants.MANDATE_NS,
// ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY));
// }
// Mandate
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_RAW, domMandate,
SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK));
// (w)bpk
String wbpk = ParepUtils.extractMandatorWbpk(mandator);
if (!ParepUtils.isEmpty(wbpk)) {
if (!ParepUtils.isPhysicalPerson(mandator)) {
String idType = ParepUtils
.extractMandatorIdentificationType(mandator);
if (!ParepUtils.isEmpty(idType)
&& idType.startsWith(Constants.URN_PREFIX_BASEID)) {
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_CB_BASE_ID,
ParepUtils.getRegisterString(idType) + ": " + wbpk,
SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY));
}
} else if (business) {
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_WBPK, wbpk,
SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY));
}
}
// String oid = mandate.getProfRep();
// if (oid != null) {
// String oidDescription = mandate.getTextualDescriptionOfOID();
// extendedSamlAttributes.add(new
// ExtendedSAMLAttributeImpl(ParepValidator.EXT_SAML_MANDATE_OIDTEXTUALDESCRIPTION,
// oidDescription, SZRGWConstants.MANDATE_NS,
// ExtendedSAMLAttribute.ADD_TO_AUTHBLOCK_ONLY));
// }
ExtendedSAMLAttribute[] ret = new ExtendedSAMLAttribute[extendedSamlAttributes
.size()];
extendedSamlAttributes.copyInto(ret);
Logger.debug("ExtendedSAML Attributes: " + ret.length);
return ret;
}
/**
* Adds the AUTH block related SAML attributes to the validation result.
* This is needed always before the AUTH block is to be signed, because the
* name of the mandator has to be set
*
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
* @throws TransformerException
*/
private static ExtendedSAMLAttribute[] addExtendedSamlAttributesOID(
MISMandate mandate, boolean business) throws SAXException,
IOException, ParserConfigurationException, TransformerException {
Vector extendedSamlAttributes = new Vector();
extendedSamlAttributes.clear();
// RepresentationType
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_REPRESENTATIONTYPE,
ParepValidator.EXT_SAML_MANDATE_REPRESENTATIONTEXT,
SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK));
String oid = mandate.getProfRep();
if (oid != null) {
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_OID, oid,
SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK));
String oidDescription = mandate.getTextualDescriptionOfOID();
extendedSamlAttributes.add(new ExtendedSAMLAttributeImpl(
ParepValidator.EXT_SAML_MANDATE_OIDTEXTUALDESCRIPTION,
oidDescription, SZRGWConstants.MANDATE_NS,
ExtendedSAMLAttribute.NOT_ADD_TO_AUTHBLOCK));
}
ExtendedSAMLAttribute[] ret = new ExtendedSAMLAttribute[extendedSamlAttributes
.size()];
extendedSamlAttributes.copyInto(ret);
Logger.debug("ExtendedSAML Attributes: " + ret.length);
return ret;
}
/**
*
* @param mandate
* @return
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
private static Element mandateToElement(MISMandate mandate)
throws SAXException, IOException, ParserConfigurationException {
ByteArrayInputStream bais = new ByteArrayInputStream(mandate
.getMandate());
Document doc = DOMUtils.parseDocumentSimple(bais);
return doc.getDocumentElement();
}
private static void replaceExtendedSAMLAttribute(List attributes,
ExtendedSAMLAttribute samlAttribute) {
if (null == attributes) {
attributes = new Vector();
} else {
String id = samlAttribute.getName();
int length = attributes.size();
for (int i = 0; i < length; i++) {
ExtendedSAMLAttribute att = (ExtendedSAMLAttribute) attributes
.get(i);
if (id.equals(att.getName())) {
// replace attribute
attributes.set(i, samlAttribute);
return;
}
}
attributes.add(samlAttribute);
}
}
/**
* Processes a <CreateXMLSignatureResponse>
sent by the
* security layer implementation.<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
for error
* codes<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
* @return SAML artifact needed for retrieving authentication data, encoded
* BASE64
*/
public String verifyAuthenticationBlock(AuthenticationSession session,
String xmlCreateXMLSignatureReadResponse)
throws AuthenticationException, BuildException, ParseException,
ConfigurationException, ServiceException, ValidateException {
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_AUTH_BLOCK, PARAM_SESSIONID });
if (isEmpty(xmlCreateXMLSignatureReadResponse))
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_AUTH_BLOCK, PARAM_XMLRESPONSE });
//AuthenticationSession session = getSession(sessionID);
AuthConfigurationProvider authConf = AuthConfigurationProvider
.getInstance();
// parses <CreateXMLSignatureResponse>
sent by the
* security layer implementation.<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
for error
* codes<CreateXMLSignatureResponse>
<CreateXMLSignatureResponse>
* @return SAML artifact needed for retrieving authentication data, encoded
* BASE64
*/
public String verifyAuthenticationBlockMandate(AuthenticationSession session,
Element mandate) throws AuthenticationException, BuildException,
ParseException, ConfigurationException, ServiceException,
ValidateException {
if (session == null)
throw new AuthenticationException("auth.10", new Object[] {
REQ_VERIFY_AUTH_BLOCK, PARAM_SESSIONID });
//AuthenticationSession session = getSession(sessionID);
// AuthConfigurationProvider authConf =
// AuthConfigurationProvider.getInstance();
IdentityLink tempIdentityLink = null;
if (session.getUseMandate()) {
tempIdentityLink = new IdentityLink();
Element mandator = ParepUtils.extractMandator(mandate);
String dateOfBirth = "";
Element prPerson = null;
String familyName = "";
String givenName = "";
String identificationType = "";
String identificationValue = "";
if (mandator != null) {
boolean physical = ParepUtils.isPhysicalPerson(mandator);
if (physical) {
familyName = ParepUtils.extractText(mandator,
"descendant-or-self::pr:Name/pr:FamilyName/text()");
givenName = ParepUtils.extractText(mandator,
"descendant-or-self::pr:Name/pr:GivenName/text()");
dateOfBirth = ParepUtils
.extractMandatorDateOfBirth(mandator);
} else {
familyName = ParepUtils.extractMandatorFullName(mandator);
}
identificationType = ParepUtils.getIdentification(mandator,
"Type");
identificationValue = ParepUtils.extractMandatorWbpk(mandator);
prPerson = ParepUtils.extractPrPersonOfMandate(mandate);
if (physical
&& session.getBusinessService()
&& identificationType != null
&& Constants.URN_PREFIX_BASEID
.equals(identificationType)) {
// now we calculate the wbPK and do so if we got it from the
// BKU
identificationType = Constants.URN_PREFIX_WBPK + "+"
+ session.getDomainIdentifier();
identificationValue = new BPKBuilder().buildWBPK(
identificationValue, session.getDomainIdentifier());
ParepUtils
.HideStammZahlen(prPerson, true, null, null, true);
}
tempIdentityLink.setDateOfBirth(dateOfBirth);
tempIdentityLink.setFamilyName(familyName);
tempIdentityLink.setGivenName(givenName);
tempIdentityLink.setIdentificationType(identificationType);
tempIdentityLink.setIdentificationValue(identificationValue);
tempIdentityLink.setPrPerson(prPerson);
try {
tempIdentityLink.setSamlAssertion(session.getIdentityLink()
.getSamlAssertion());
} catch (Exception e) {
throw new ValidateException("validator.64", null);
}
}
}
// builds authentication data and stores it together with a SAML
// artifact
// TODO: Check, if this element is in use!!!!
//AuthenticationData authData = session.getAssertionAuthData(); // buildAuthenticationData(session,
// vsresp,
// replacementIdentityLink);
Element mandatePerson = tempIdentityLink.getPrPerson();
// try {
// System.out.println("MANDATE: " +
// DOMUtils.serializeNode(mandatePerson));
// }
// catch(Exception e) {
// e.printStackTrace();
// }
String mandateData = null;
boolean useCondition = false;
int conditionLength = -1;
try {
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
.getOnlineApplicationParameter(
session.getPublicOAURLPrefix());
boolean provideStammzahl = oaParam.getProvideStammzahl();
useCondition = oaParam.getUseCondition();
conditionLength = oaParam.getConditionLength();
String oatargetType;
if(session.getBusinessService()) {
oatargetType = AuthenticationSession.REGISTERANDORDNR_PREFIX_+session.getDomainIdentifier();
} else {
oatargetType = AuthenticationSession.TARGET_PREFIX_ + session.getTarget();
}
Element prIdentification = (Element) mandatePerson
.getElementsByTagNameNS(Constants.PD_NS_URI,
"Identification").item(0);
if (!oatargetType.equals(tempIdentityLink.getIdentificationType())) {
String isPrPerson = mandatePerson.getAttribute("xsi:type");
if (!StringUtils.isEmpty(isPrPerson)) {
if (isPrPerson.equalsIgnoreCase("pr:PhysicalPerson")) {
String baseid = getBaseId(mandatePerson);
Element identificationBpK = createIdentificationBPK(mandatePerson,
baseid, session.getTarget());
if (!provideStammzahl) {
prIdentification.getFirstChild().setTextContent("");
}
mandatePerson.insertBefore(identificationBpK,
prIdentification);
}
}
} else {
// Element identificationBpK = mandatePerson.getOwnerDocument()
// .createElementNS(Constants.PD_NS_URI, "Identification");
// Element valueBpK = mandatePerson.getOwnerDocument().createElementNS(
// Constants.PD_NS_URI, "Value");
//
// valueBpK.appendChild(mandatePerson.getOwnerDocument().createTextNode(
// tempIdentityLink.getIdentificationValue()));
// Element typeBpK = mandatePerson.getOwnerDocument().createElementNS(
// Constants.PD_NS_URI, "Type");
// typeBpK.appendChild(mandatePerson.getOwnerDocument().createTextNode(
// "urn:publicid:gv.at:cdid+bpk"));
// identificationBpK.appendChild(valueBpK);
// identificationBpK.appendChild(typeBpK);
//
// mandatePerson.insertBefore(identificationBpK, prIdentification);
}
mandateData = DOMUtils.serializeNode(mandatePerson);
} catch (TransformerException e1) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID });
} catch (IOException e1) {
throw new AuthenticationException("auth.16",
new Object[] { GET_MIS_SESSIONID });
}
//TODO: Check, if this element is in use!!!
//session.setAuthData(authData);
session.setMandateData(mandateData);
session.setAuthenticatedUsed(false);
session.setAuthenticated(true);
String oldsessionID = session.getSessionID();
//Session is implicite stored in changeSessionID!!!
String newMOASessionID = AuthenticationSessionStoreage.changeSessionID(session);
Logger.info("Changed MOASession " + oldsessionID + " to Session " + newMOASessionID);
Logger.info("Daten angelegt zu MOASession " + newMOASessionID);
return newMOASessionID;
/*
String samlAssertion = new AuthenticationDataAssertionBuilder()
.buildMandate(authData, session.getAssertionPrPerson(),
mandateData, session.getAssertionAuthBlock(), session
.getAssertionIlAssertion(),
session.getBkuURL(), session
.getAssertionSignerCertificateBase64(), session
.getAssertionBusinessService(), session
.getSourceID(), session
.getExtendedSAMLAttributesOA(), useCondition,
conditionLength);
authData.setSamlAssertion(samlAssertion);
String assertionFile = AuthConfigurationProvider.getInstance()
.getGenericConfigurationParameter(
"AuthenticationServer.WriteAssertionToFile");
if (!ParepUtils.isEmpty(assertionFile))
try {
ParepUtils.saveStringToFile(samlAssertion, new File(
assertionFile));
} catch (IOException e) {
throw new BuildException("builder.00", new Object[] {
"AuthenticationData", e.toString() }, e);
}
String samlArtifact = new SAMLArtifactBuilder().build(session
.getAuthURL(), session.getSessionID(), session.getSourceID());
storeAuthenticationData(samlArtifact, authData);
// invalidates the authentication session
sessionStore.remove(sessionID);
Logger.info("Anmeldedaten zu MOASession " + sessionID
+ " angelegt, SAML Artifakt " + samlArtifact);
return samlArtifact;*/
}
private Element createIdentificationBPK(Element mandatePerson,
String baseid, String target) throws BuildException {
Element identificationBpK = mandatePerson.getOwnerDocument()
.createElementNS(Constants.PD_NS_URI, "Identification");
Element valueBpK = mandatePerson.getOwnerDocument().createElementNS(
Constants.PD_NS_URI, "Value");
String bpkBase64 = new BPKBuilder().buildBPK(baseid, target);
valueBpK.appendChild(mandatePerson.getOwnerDocument().createTextNode(
bpkBase64));
Element typeBpK = mandatePerson.getOwnerDocument().createElementNS(
Constants.PD_NS_URI, "Type");
typeBpK.appendChild(mandatePerson.getOwnerDocument().createTextNode(
"urn:publicid:gv.at:cdid+bpk"));
identificationBpK.appendChild(valueBpK);
identificationBpK.appendChild(typeBpK);
return identificationBpK;
}
private String getBaseId(Element mandatePerson)
throws TransformerException, IOException {
NodeList list = mandatePerson.getElementsByTagNameNS(
Constants.PD_NS_URI, "Identification");
for (int i = 0; i < list.getLength(); i++) {
Element identification = (Element) list.item(i);
Element type = (Element) identification.getElementsByTagNameNS(
Constants.PD_NS_URI, "Type").item(0);
if (type.getTextContent().compareToIgnoreCase(
"urn:publicid:gv.at:baseid") == 0) {
Element value = (Element) identification
.getElementsByTagNameNS(Constants.PD_NS_URI, "Value")
.item(0);
return value.getTextContent();
}
}
return null;
}
/**
* Gets the foreign authentication data.<saml:Assertion>
*
* @param session
* authentication session
* @param verifyXMLSigResp
* VerifyXMLSignatureResponse from MOA-SP
* @param useUTC uses correct UTC time format
* @param useUTC indicates that authenticated citizen is a foreigner
* @param isForeigner indicates whether Austrian (false) or foreigner (true) authenticates
* @return AuthenticationData object
* @throws ConfigurationException
* while accessing configuration data
* @throws BuildException
* while building the <saml:Assertion>
*/
public static AuthenticationData buildAuthenticationData(
AuthenticationSession session, OAAuthParameter oaParam, String target)
throws ConfigurationException, BuildException {
IdentityLink identityLink = session.getIdentityLink();
AuthenticationData authData = new AuthenticationData();
// OAAuthParameter oaParam = AuthConfigurationProvider.getInstance()
// .getOnlineApplicationParameter(session.getPublicOAURLPrefix());
VerifyXMLSignatureResponse verifyXMLSigResp = session.getXMLVerifySignatureResponse();
boolean useUTC = oaParam.getUseUTC();
boolean isForeigner = session.isForeigner();
boolean businessService = oaParam.getBusinessService();
authData.setMajorVersion(1);
authData.setMinorVersion(0);
authData.setAssertionID(Random.nextRandom());
authData.setIssuer(session.getAuthURL());
authData.setIssueInstant(DateTimeUtils.buildDateTime(Calendar
.getInstance(), useUTC));
authData.setIdentificationType(identityLink.getIdentificationType());
authData.setGivenName(identityLink.getGivenName());
authData.setFamilyName(identityLink.getFamilyName());
authData.setDateOfBirth(identityLink.getDateOfBirth());
authData.setQualifiedCertificate(verifyXMLSigResp
.isQualifiedCertificate());
authData.setPublicAuthority(verifyXMLSigResp.isPublicAuthority());
authData.setPublicAuthorityCode(verifyXMLSigResp
.getPublicAuthorityCode());
authData.setBkuURL(session.getBkuURL());
authData.setUseUTC(oaParam.getUseUTC());
boolean provideStammzahl = oaParam.getProvideStammzahl();
if (provideStammzahl) {
authData.setIdentificationValue(identityLink
.getIdentificationValue());
}
// String prPerson = new PersonDataBuilder().build(identityLink,
// provideStammzahl);
try {
// String signerCertificateBase64 = "";
// if (oaParam.getProvideCertifcate()) {
// X509Certificate signerCertificate = verifyXMLSigResp
// .getX509certificate();
// if (signerCertificate != null) {
// signerCertificateBase64 = Base64Utils
// .encode(signerCertificate.getEncoded());
// } else {
// Logger
// .info("\"provideCertificate\" is \"true\", but no signer certificate available");
// }
// }
// authData.setSignerCertificate(signerCertificateBase64);
if(!isForeigner) {
//we have Austrian citizen
if (businessService) {
authData.setBPK(identityLink.getIdentificationValue());
authData.setBPKType(identityLink.getIdentificationType());
} else {
// OLD! BZ.., calculation of bPK already before sending AUTHBlock
//TL: identitylLink holds the BASEID, bPK is only calculated for AUTHBlock
//authData.setBPK(identityLink.getIdentificationValue());
// only compute bPK if online application is a public service and we have the Stammzahl
if(identityLink.getIdentificationType().equals(Constants.URN_PREFIX_BASEID)) {
String bpkBase64 = new BPKBuilder().buildBPK(
identityLink.getIdentificationValue(), target);
authData.setBPK(bpkBase64);
authData.setBPKType(Constants.URN_PREFIX_CDID + "+" + oaParam.getTarget());
}
}
} else {
//we have foreigner, thus we have to calculate bPK and wbPK now (after receiving identity link from SZR-GW
if (businessService) {
//since we have foreigner, wbPK is not calculated in BKU
if(identityLink.getIdentificationType().equals(Constants.URN_PREFIX_BASEID)) {
String registerAndOrdNr = oaParam.getIdentityLinkDomainIdentifier();
if (registerAndOrdNr.startsWith(AuthenticationSession.REGISTERANDORDNR_PREFIX_)) {
// If domainIdentifier starts with prefix
// "urn:publicid:gv.at:wbpk+"; remove this prefix
registerAndOrdNr = registerAndOrdNr
.substring(AuthenticationSession.REGISTERANDORDNR_PREFIX_.length());
Logger.debug("Register and ordernumber prefix stripped off; resulting register string: "
+ registerAndOrdNr);
}
String wbpkBase64 = new BPKBuilder().buildWBPK(identityLink.getIdentificationValue(), registerAndOrdNr);
authData.setBPK(wbpkBase64);
authData.setBPKType( Constants.URN_PREFIX_WBPK + "+" + registerAndOrdNr);
}
} else {
if(identityLink.getIdentificationType().equals(Constants.URN_PREFIX_BASEID)) {
// only compute bPK if online application is a public service and we have the Stammzahl
String bpkBase64 = new BPKBuilder().buildBPK(identityLink.getIdentificationValue(), target);
authData.setBPK(bpkBase64);
authData.setBPKType(Constants.URN_PREFIX_CDID + "+" + oaParam.getTarget());
}
}
}
// String ilAssertion = oaParam.getProvideIdentityLink() ? identityLink
// .getSerializedSamlAssertion()
// : "";
// if (!oaParam.getProvideStammzahl()) {
// ilAssertion = StringUtils.replaceAll(ilAssertion, identityLink
// .getIdentificationValue(), "");
// }
// String authBlock = oaParam.getProvideAuthBlock() ? session
// .getAuthBlock() : "";
//TODO: check, if this elements are in use!!!!
// session.setAssertionAuthBlock(authBlock);
// session.setAssertionAuthData(authData);
// session.setAssertionBusinessService(businessService);
// session.setAssertionIlAssertion(ilAssertion);
// session.setAssertionPrPerson(prPerson);
// session.setAssertionSignerCertificateBase64(signerCertificateBase64);
return authData;
} catch (Throwable ex) {
throw new BuildException("builder.00", new Object[] {
"AuthenticationData", ex.toString() }, ex);
}
}
/**
* Creates a new session and puts it into the session store.
*
* @param id
* Session ID
* @return AuthenticationSession created
* @exception AuthenticationException
* thrown when an AuthenticationSession
is
* running already for the given session ID
*/
private static AuthenticationSession newSession()
throws AuthenticationException {
try {
return AuthenticationSessionStoreage.createSession();
} catch (MOADatabaseException e) {
throw new AuthenticationException("", null);
}
}
/**
* Retrieves a session from the session store.
*
* @param id
* session ID
* @return AuthenticationSession
stored with given session ID,
* null
if session ID unknown
*/
public static AuthenticationSession getSession(String id)
throws AuthenticationException {
AuthenticationSession session;
try {
session = AuthenticationSessionStoreage.getSession(id);
/*(AuthenticationSession) sessionStore
.get(id);*/
if (session == null)
throw new AuthenticationException("auth.02", new Object[] { id });
return session;
} catch (MOADatabaseException e) {
throw new AuthenticationException("parser.04", new Object[] { id });
}
}
/**
* Cleans up expired session and authentication data stores.
*/
public void cleanup() {
long now = new Date().getTime();
//clean AuthenticationSessionStore
//TODO: acutally the StartAuthentificaten timestamp is used!!!!!
//TODO: maybe change this to lastupdate timestamp.
AuthenticationSessionStoreage.clean(now, sessionTimeOut);
//clean AssertionStore
AssertionStorage assertionstore = AssertionStorage.getInstance();
assertionstore.clean(now, authDataTimeOut);
}
/**
* Sets the sessionTimeOut.
*
* @param seconds
* Time out of the session in seconds
*/
public void setSecondsSessionTimeOut(long seconds) {
sessionTimeOut = 1000 * seconds;
}
/**
* Sets the authDataTimeOut.
*
* @param seconds
* Time out for signing AuthData in seconds
*/
public void setSecondsAuthDataTimeOut(long seconds) {
authDataTimeOut = 1000 * seconds;
}
/**
* Checks a parameter.
*
* @param param
* parameter
* @return true if the parameter is null or empty
*/
private boolean isEmpty(String param) {
return param == null || param.length() == 0;
}
/**
* Checks the correctness of SAML attributes and returns its value.
*
* @param param
* samlAttribute
* @param i
* the number of the verified attribute for messages
* @param identifier
* the infobox identifier for messages
* @param friendlyname
* the friendly name of the infobox for messages
* @return the SAML attribute value (Element or String)
*/
private static Object verifySAMLAttribute(
ExtendedSAMLAttribute samlAttribute, int i, String identifier,
String friendlyName) throws ValidateException {
String name = samlAttribute.getName();
if (name == null) {
Logger.info("The name of SAML-Attribute number " + (i + 1)
+ " returned from " + identifier
+ "-infobox validator is null.");
throw new ValidateException("validator.45", new Object[] {
friendlyName, "Name", String.valueOf((i + 1)), "null" });
}
if (name == "") {
Logger.info("The name of SAML-Attribute number " + (i + 1)
+ " returned from " + identifier
+ "-infobox validator is empty.");
throw new ValidateException("validator.45", new Object[] {
friendlyName, "Name", String.valueOf((i + 1)), "leer" });
}
if (samlAttribute.getNameSpace() == null) {
Logger.info("The namespace of SAML-Attribute number " + (i + 1)
+ " returned from " + identifier
+ "-infobox validator is null.");
throw new ValidateException("validator.45",
new Object[] { friendlyName, "Namespace",
String.valueOf((i + 1)), "null" });
}
Object value = samlAttribute.getValue();
if (value == null) {
Logger.info("The value of SAML-Attribute number " + (i + 1)
+ " returned from " + identifier
+ "-infobox validator is null.");
throw new ValidateException("validator.45", new Object[] {
friendlyName, "Wert", String.valueOf((i + 1)), "null" });
}
return value;
}
/**
* Does the request to the SZR-GW
* @param signature XMLDSIG signature
* @return Identity link assertion
* @throws SZRGWClientException
*/
public CreateIdentityLinkResponse getIdentityLink(String PEPSIdentifier, String PEPSFirstname, String PEPSFamilyname, String PEPSDateOfBirth, Element signature) throws SZRGWClientException {
SZRGWClient client = new SZRGWClient();
try {
AuthConfigurationProvider authConf = AuthConfigurationProvider.getInstance();
ConnectionParameter connectionParameters = authConf.getForeignIDConnectionParameter();
client.setAddress(connectionParameters.getUrl());
if (connectionParameters.getUrl().toLowerCase().startsWith("https:")) {
Logger.debug("Initialisiere SSL Verbindung");
try {
client.setSSLSocketFactory(SSLUtils.getSSLSocketFactory(AuthConfigurationProvider.getInstance(), connectionParameters));
} catch (IOException e) {
Logger.error("Could not initialize SSL Factory", e);
throw new SZRGWClientException("Could not initialize SSL Factory");
} catch (GeneralSecurityException e) {
Logger.error("Could not initialize SSL Factory", e);
throw new SZRGWClientException("Could not initialize SSL Factory");
} catch (PKIException e) {
Logger.error("Could not initialize SSL Factory", e);
throw new SZRGWClientException("Could not initialize SSL Factory");
}
}
Logger.info("Starte Kommunikation mit dem Stammzahlenregister Gateway(" + connectionParameters.getUrl() + ")...");
}
catch (ConfigurationException e) {
Logger.warn(e);
Logger.warn(MOAIDMessageProvider.getInstance().getMessage("config.12", null ));
}
// create request
CreateIdentityLinkResponse response = null;
Element request = null;
try {
Document doc = client.buildGetIdentityLinkRequest(PEPSIdentifier, PEPSFirstname, PEPSFamilyname, PEPSDateOfBirth, signature);
request = doc.getDocumentElement();
// send request
response = client.createIdentityLinkResponse(request);
} catch (SZRGWClientException e) {
// give him a second try - Nach dem Starten des Tomcat wird beim ersten Mal das Client-Zertifikat offenbar vom HTTPClient nicht mitgeschickt.
try {
response = client.createIdentityLinkResponse(request);
}
catch (SZRGWClientException e1) {
throw new SZRGWClientException(e1);
}
}
return response;
}
/**
* Starts a MOA-ID authentication process using STORK
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @param ccc Citizen country code
* @param oaURL URL of the online application
* @param target Target parameter
* @param targetFriendlyName Friendly Name of Target
* @param authURL Authentication URL
* @param sourceID SourceID parameter
* @throws MOAIDException
* @throws AuthenticationException
* @throws WrongParametersException
* @throws ConfigurationException
*/
public static void startSTORKAuthentication(
HttpServletRequest req,
HttpServletResponse resp,
AuthenticationSession moasession) throws MOAIDException, AuthenticationException, WrongParametersException, ConfigurationException {
if (moasession == null) {
throw new AuthenticationException("auth.18", new Object[] { });
}
//read configuration paramters of OA
OAAuthParameter oaParam = AuthConfigurationProvider.getInstance().getOnlineApplicationParameter(moasession.getPublicOAURLPrefix());
if (oaParam == null)
throw new AuthenticationException("auth.00", new Object[] { moasession.getPublicOAURLPrefix() });
//Start of STORK Processing
STORKConfig storkConfig = AuthConfigurationProvider.getInstance().getStorkConfig();
CPEPS cpeps = storkConfig.getCPEPS(moasession.getCcc());
Logger.debug("Preparing to assemble STORK AuthnRequest witht the following values:");
String destination = cpeps.getPepsURL().toExternalForm();
Logger.debug("C-PEPS URL: " + destination);
String acsURL = HTTPUtils.getBaseURL(req) + PEPSConnectorServlet.PEPSCONNECTOR_SERVLET_URL_PATTERN;
Logger.debug("MOA Assertion Consumer URL (PEPSConnctor): " + acsURL);
String providerName= oaParam.getFriendlyName();
String issuerValue = HTTPUtils.getBaseURL(req);
Logger.debug("Issuer value: " + issuerValue);
QualityAuthenticationAssuranceLevel qaaLevel = null;//TODO UNCOMMENT AGAIN !! = STORKMessagesBuilder.buildQualityAuthenticationAssuranceLevel(oaParam.getQaaLevel().getValue());
//Logger.debug("QAALevel: " + qaaLevel.getValue());
RequestedAttributes requestedAttributes = null;
//TODO UNCOMMENT AGAIN !! requestedAttributes = oaParam.getRequestedAttributes();
requestedAttributes.detach();
List