package at.asitplus.eidas.specific.modules.authmodule_eIDASv2.utils; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; import at.asitplus.eidas.specific.modules.authmodule_eIDASv2.Constants; import at.gv.egiz.eaaf.core.impl.data.Trible; import eu.eidas.auth.commons.attribute.AttributeDefinition; import eu.eidas.auth.commons.attribute.AttributeValue; import eu.eidas.auth.commons.attribute.AttributeValueMarshaller; import eu.eidas.auth.commons.attribute.AttributeValueMarshallingException; import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress; public class eIDASResponseUtils { private static final Logger log = LoggerFactory.getLogger(eIDASResponseUtils.class); public static final String PERSONALIDENIFIER_VALIDATION_PATTERN = "^[A-Z,a-z]{2}/[A-Z,a-z]{2}/.*"; /** * Validate a eIDAS PersonalIdentifier attribute value * This validation is done according to eIDAS SAML Attribute Profile - Section 2.2.3 Unique Identifier * * @param uniqueID eIDAS attribute value of a unique identifier * @return true if the uniqueID matches to eIDAS to Unique Identifier specification, otherwise false */ public static boolean validateEidasPersonalIdentifier(String uniqueID) { Pattern pattern = Pattern.compile(PERSONALIDENIFIER_VALIDATION_PATTERN ); Matcher matcher = pattern.matcher(uniqueID); return matcher.matches(); } /** * Parse an eIDAS PersonalIdentifier attribute value into it components. * This processing is done according to eIDAS SAML Attribute Profile - Section 2.2.3 Unique Identifier * * @param uniqueID eIDAS attribute value of a unique identifier * @return {@link Trible} that contains: *
First : citizen country *
Second: destination country *
Third : unique identifier *
or null if the attribute value has a wrong format */ public static Trible parseEidasPersonalIdentifier(String uniqueID) { if (!validateEidasPersonalIdentifier(uniqueID)) { log.error("eIDAS attribute value for " + Constants.eIDAS_ATTR_PERSONALIDENTIFIER + " looks wrong formated. Value:" + ((String)uniqueID)); return null; } return Trible.newInstance(uniqueID.substring(0, 2), uniqueID.substring(3, 5), uniqueID.substring(6)); } public static List translateStringListAttribute(AttributeDefinition attributeDefinition, ImmutableList> attributeValues) { final List stringListAttribute = new ArrayList(); AttributeValueMarshaller attributeValueMarshaller = attributeDefinition.getAttributeValueMarshaller(); for (AttributeValue attributeValue : attributeValues) { String valueString = null; try { valueString = attributeValueMarshaller.marshal((AttributeValue) attributeValue); stringListAttribute.add(valueString); } catch (AttributeValueMarshallingException e) { throw new IllegalStateException(e); } } return stringListAttribute; } public static DateTime translateDateAttribute(AttributeDefinition attributeDefinition, ImmutableList> attributeValues) { if (attributeValues.size() != 0) { final AttributeValue firstAttributeValue = attributeValues.get(0); return (DateTime) firstAttributeValue.getValue(); } return null; } public static PostalAddress translateAddressAttribute(AttributeDefinition attributeDefinition, ImmutableList> attributeValues) { final AttributeValue firstAttributeValue = attributeValues.get(0); return (PostalAddress) firstAttributeValue.getValue(); } }