/*
* 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.data;
import iaik.x509.X509Certificate;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.id.auth.validator.InfoboxValidator;
import at.gv.egovernment.moa.id.auth.validator.parep.ParepUtils;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.Constants;
/**
* Session data to be stored between AuthenticationServer
API calls.
*
* @author Paul Ivancsics
* @version $Id$
*/
public class AuthenticationSession {
private static String TARGET_PREFIX_ = Constants.URN_PREFIX_CDID + "+";
private static String REGISTERANDORDNR_PREFIX_ = Constants.URN_PREFIX_WBPK + "+";
/**
* session ID
*/
private String sessionID;
/**
* "Geschäftsbereich" the online application belongs to; maybe null
* if the online application is a business application
*/
private String target;
/**
* public online application URL requested
*/
private String oaURLRequested;
/**
* public online application URL prefix
*/
private String oaPublicURLPrefix;
/**
* URL of MOA ID authentication component
*/
private String authURL;
/**
* HTML template URL
*/
private String templateURL;
/**
* URL of the BKU
*/
private String bkuURL;
/**
* Use mandate
*/
private boolean useMandate;
/**
* Selected mandate
*/
private Element mandateElem;
/**
* @return the mandateElem
*/
public Element getMandateElem() {
return mandateElem;
}
/**
* @param mandateElem the mandateElem to set
*/
public void setMandateElem(Element mandateElem) {
this.mandateElem = mandateElem;
}
/**
* SessionID for MIS
*/
private String misSessionID;
/**
* identity link read from smartcard
*/
private IdentityLink identityLink;
/**
* authentication block to be signed by the user
*/
private String authBlock;
/**
* timestamp logging when authentication session has been created
*/
private Date timestampStart;
/**
* timestamp logging when identity link has been received
*/
private Date timestampIdentityLink;
/**
* Indicates whether the corresponding online application is a business
* service or not
*/
private boolean businessService;
/**
* Signer certificate of the foreign citizen
*/
private X509Certificate signerCertificate;
/**
* SAML attributes from an extended infobox validation to be appended
* to the SAML assertion delivered to the final online application.
*/
private List extendedSAMLAttributesOA;
/**
* The boolean value for either a target or a wbPK is provided as
* SAML Attribute in the SAML Assertion or not.
*/
private boolean samlAttributeGebeORwbpk;
/**
* SAML attributes from an extended infobox validation to be appended
* to the SAML assertion of the AUTHBlock.
*/
private List extendedSAMLAttributesAUTH;
/**
* The issuing time of the AUTH-Block SAML assertion.
*/
private String issueInstant;
/**
* If infobox validators are needed after signing, they can be stored in
* this list.
*/
private List infoboxValidators;
/**
* The register and number in the register parameter in case of a business
* service application.
*/
private String domainIdentifier;
/**
* This string contains all identifiers of infoboxes, the online application
* is configured to accept. The infobox identifiers are comma separated.
*/
private String pushInfobox;
/**
* AppSpecificConfiguration entry of then mandates infobox-validator. Tells
* whether person data from the representative have to be exchanged by data
* from the mandate
*/
private boolean mandateCompatibilityMode = false;
/**
* Constructor for AuthenticationSession.
*
* @param id Session ID
*/
public AuthenticationSession(String id) {
sessionID = id;
setTimestampStart();
infoboxValidators = new ArrayList();
}
public X509Certificate getForeignSignerCertificate() {
return signerCertificate;
}
public void setForeignSignerCertificate(X509Certificate signerCertificate) {
this.signerCertificate = signerCertificate;
}
/**
* Returns the identityLink.
* @return IdentityLink
*/
public IdentityLink getIdentityLink() {
return identityLink;
}
/**
* Returns the sessionID.
* @return String
*/
public String getSessionID() {
return sessionID;
}
/**
* Sets the identityLink.
* @param identityLink The identityLink to set
*/
public void setIdentityLink(IdentityLink identityLink) {
this.identityLink = identityLink;
}
/**
* Sets the sessionID.
* @param sessionId The sessionID to set
*/
public void setSessionID(String sessionId) {
this.sessionID = sessionId;
}
/**
* Returns the oaURLRequested.
* @return String
*/
public String getOAURLRequested() {
return oaURLRequested;
}
/**
* Returns the oaURLRequested.
* @return String
*/
public String getPublicOAURLPrefix() {
return oaPublicURLPrefix;
}
/**
* Returns the BKU URL.
* @return String
*/
public String getBkuURL() {
return bkuURL;
}
/**
* Returns the target.
* @return String
*/
public String getTarget() {
return target;
}
/**
* Sets the oaURLRequested.
* @param oaURLRequested The oaURLRequested to set
*/
public void setOAURLRequested(String oaURLRequested) {
this.oaURLRequested = oaURLRequested;
}
/**
* Sets the oaPublicURLPrefix
* @param oaPublicURLPrefix The oaPublicURLPrefix to set
*/
public void setPublicOAURLPrefix(String oaPublicURLPrefix) {
this.oaPublicURLPrefix = oaPublicURLPrefix;
}
/**
* Sets the bkuURL
* @param bkuURL The BKU URL to set
*/
public void setBkuURL(String bkuURL) {
this.bkuURL = bkuURL;
}
/**
* Sets the target. If the target includes the target prefix, the prefix will be stripped off.
* @param target The target to set
*/
public void setTarget(String target) {
if (target != null && target.startsWith(TARGET_PREFIX_))
{
// If target starts with prefix "urn:publicid:gv.at:cdid+"; remove prefix
this.target = target.substring(TARGET_PREFIX_.length());
Logger.debug("Target prefix stripped off; resulting target: " + this.target);
}
else
{
this.target = target;
}
}
/**
* Returns the authURL.
* @return String
*/
public String getAuthURL() {
return authURL;
}
/**
* Sets the authURL.
* @param authURL The authURL to set
*/
public void setAuthURL(String authURL) {
this.authURL = authURL;
}
/**
* Returns the authBlock.
* @return String
*/
public String getAuthBlock() {
return authBlock;
}
/**
* Sets the authBlock.
* @param authBlock The authBlock to set
*/
public void setAuthBlock(String authBlock) {
this.authBlock = authBlock;
}
/**
* Returns the timestampIdentityLink.
* @return Date
*/
public Date getTimestampIdentityLink() {
return timestampIdentityLink;
}
/**
* Returns the businessService.
* @return true
if the corresponding online application is
* a business application, otherwise false
*/
public boolean getBusinessService() {
return businessService;
}
/**
* Sets the businessService variable.
* @param businessService the value for setting the businessService variable.
*/
public void setBusinessService(boolean businessService) {
this.businessService = businessService;
}
/**
* Returns the timestampStart.
* @return Date
*/
public Date getTimestampStart() {
return timestampStart;
}
/**
* Sets the current date as timestampIdentityLink.
*/
public void setTimestampIdentityLink() {
timestampIdentityLink = new Date();
}
/**
* Sets the current date as timestampStart.
*/
public void setTimestampStart() {
timestampStart = new Date();
}
/**
* @return template URL
*/
public String getTemplateURL() {
return templateURL;
}
/**
* @param string the template URL
*/
public void setTemplateURL(String string) {
templateURL = string;
}
/**
* Returns the SAML Attributes to be appended to the AUTHBlock. Maybe null
.
*
* @return The SAML Attributes to be appended to the AUTHBlock. Maybe null
.
*/
public List getExtendedSAMLAttributesAUTH() {
return extendedSAMLAttributesAUTH;
}
/**
* Sets the SAML Attributes to be appended to the AUTHBlock.
*
* @param extendedSAMLAttributesAUTH The SAML Attributes to be appended to the AUTHBlock.
*/
public void setExtendedSAMLAttributesAUTH(
List extendedSAMLAttributesAUTH) {
this.extendedSAMLAttributesAUTH = extendedSAMLAttributesAUTH;
}
/**
* Returns the SAML Attributes to be appended to the SAML assertion
* delivered to the online application. Maybe null
.
*
* @return The SAML Attributes to be appended to the SAML assertion
* delivered to the online application
*/
public List getExtendedSAMLAttributesOA() {
return extendedSAMLAttributesOA;
}
/**
* Sets the SAML Attributes to be appended to the SAML assertion
* delivered to the online application.
*
* @param extendedSAMLAttributesOA The SAML Attributes to be appended to the SAML
* assertion delivered to the online application.
*/
public void setExtendedSAMLAttributesOA(
List extendedSAMLAttributesOA) {
this.extendedSAMLAttributesOA = extendedSAMLAttributesOA;
}
/**
* Returns the boolean value for either a target or a wbPK is
* provided as SAML Attribute in the SAML Assertion or not.
*
* @return true either a target or a wbPK is provided as SAML Attribute
* in the SAML Assertion or false if not.
*/
public boolean getSAMLAttributeGebeORwbpk() {
return this.samlAttributeGebeORwbpk;
}
/**
* Sets the boolean value for either a target or a wbPK is
* provided as SAML Attribute in the SAML Assertion or not.
*
* @param samlAttributeGebeORwbpk The boolean for value either a target or
* wbPK is provided as SAML Attribute in the SAML Assertion or not.
*/
public void setSAMLAttributeGebeORwbpk(boolean samlAttributeGebeORwbpk) {
this.samlAttributeGebeORwbpk = samlAttributeGebeORwbpk;
}
/**
* Returns the issuing time of the AUTH-Block SAML assertion.
*
* @return The issuing time of the AUTH-Block SAML assertion.
*/
public String getIssueInstant() {
return issueInstant;
}
/**
* Sets the issuing time of the AUTH-Block SAML assertion.
*
* @param issueInstant The issueInstant to set.
*/
public void setIssueInstant(String issueInstant) {
this.issueInstant = issueInstant;
}
/**
* Returns the iterator to the stored infobox validators.
* @return Iterator
*/
public Iterator getInfoboxValidatorIterator() {
if (infoboxValidators==null) return null;
return infoboxValidators.iterator();
}
/**
* Adds an infobox validator class to the stored infobox validators.
* @param infoboxIdentifier the identifier of the infobox the validator belongs to
* @param infoboxFriendlyName the friendly name of the infobox
* @param infoboxValidator the infobox validator to add
*/
public Iterator addInfoboxValidator(String infoboxIdentifier, String infoboxFriendlyName, InfoboxValidator infoboxValidator) {
if (infoboxValidators==null) infoboxValidators = new ArrayList();
Vector v = new Vector(3);
v.add(infoboxIdentifier);
v.add(infoboxFriendlyName);
v.add(infoboxValidator);
infoboxValidators.add(v);
return infoboxValidators.iterator();
}
/**
* Tests for pending input events of the infobox validators.
* @return true if a validator has a form to show
*/
public boolean isValidatorInputPending() {
boolean result = false;
Iterator iter = getInfoboxValidatorIterator();
if (iter != null) {
while (!result && iter.hasNext()) {
Vector infoboxValidatorVector = (Vector) iter.next();
InfoboxValidator infoboxvalidator = (InfoboxValidator) infoboxValidatorVector.get(2);
if (!ParepUtils.isEmpty(infoboxvalidator.getForm())) result=true;
}
}
return result;
}
/**
* Returns the first pending infobox validator.
* @return the infobox validator class
*/
public InfoboxValidator getFirstPendingValidator() {
Iterator iter = getInfoboxValidatorIterator();
if (iter != null) {
while (iter.hasNext()) {
Vector infoboxValidatorVector = (Vector) iter.next();
InfoboxValidator infoboxvalidator = (InfoboxValidator) infoboxValidatorVector.get(2);
String form = infoboxvalidator.getForm();
if (!ParepUtils.isEmpty(form)) return infoboxvalidator;
}
}
return null;
}
/**
* Returns the input form of the first pending infobox validator input processor.
* @return the form to show
*/
public String getFirstValidatorInputForm() {
Iterator iter = getInfoboxValidatorIterator();
if (iter != null) {
while (iter.hasNext()) {
Vector infoboxValidatorVector = (Vector) iter.next();
InfoboxValidator infoboxvalidator = (InfoboxValidator) infoboxValidatorVector.get(2);
String form = infoboxvalidator.getForm();
if (!ParepUtils.isEmpty(form)) return form;
}
}
return null;
}
/**
* @return the mandateCompatibilityMode
*/
public boolean isMandateCompatibilityMode() {
return mandateCompatibilityMode;
}
/**
* @param mandateCompatibilityMode the mandateCompatibilityMode to set
*/
public void setMandateCompatibilityMode(boolean mandateCompatibilityMode) {
this.mandateCompatibilityMode = mandateCompatibilityMode;
}
/**
* Returns domain identifier (the register and number in the register parameter).
* null
in the case of not a business service.
*
* @return the domainIdentifier
*/
public String getDomainIdentifier() {
return domainIdentifier;
}
/**
* Sets the register and number in the register parameter if the application
* is a business service.
* If the domain identifier includes the registerAndOrdNr prefix, the prefix
* will be stripped off.
*
* @param domainIdentifier the domain identifier to set
*/
public void setDomainIdentifier(String domainIdentifier) {
if (domainIdentifier != null && domainIdentifier.startsWith(REGISTERANDORDNR_PREFIX_))
{
// If domainIdentifier starts with prefix "urn:publicid:gv.at:wbpk+"; remove this prefix
this.domainIdentifier = domainIdentifier.substring(REGISTERANDORDNR_PREFIX_.length());
Logger.debug("Register and ordernumber prefix stripped off; resulting register string: " + this.domainIdentifier);
}
else
{
this.domainIdentifier = domainIdentifier;
}
}
/**
* Gets all identifiers of infoboxes, the online application
* is configured to accept. The infobox identifiers are comma separated.
*
* @return the string containing infobox identifiers
*/
public String getPushInfobox() {
if (pushInfobox==null) return "";
return pushInfobox;
}
/**
* @param pushInfobox the infobox identifiers to set (comma separated)
*/
public void setPushInfobox(String pushInfobox) {
this.pushInfobox = pushInfobox;
}
/**
*
* @param useMandate indicates if mandate is used or not
*/
public void setUseMandate(String useMandate) {
if (useMandate.compareToIgnoreCase("true") == 0)
this.useMandate = true;
else
this.useMandate = false;
}
/**
* Returns if mandate is used or not
* @return
*/
public boolean getUseMandate() {
return this.useMandate;
}
/**
*
* @param misSessionID indicates the MIS session ID
*/
public void setMISSessionID(String misSessionID) {
this.misSessionID = misSessionID;
}
/**
* Returns the MIS session ID
* @return
*/
public String getMISSessionID() {
return this.misSessionID;
}
}