package at.gv.egovernment.moa.id.auth.modules.eidas.eid4u.utils; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.StringUtils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import at.gv.egiz.eid4u.api.attributes.Definitions; import at.gv.egovernment.moaspss.logging.Logger; import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress; public class AttributeScopeMapper { private static AttributeScopeMapper instance = null; public static final String Scope_Delimiter = " "; public static final String Citizenship = "ANY@tugraz.idm.attr.Citizenship"; public static final String CityOfBirth = "ANY@tugraz.idm.attr.CityOfBirth"; public static final String CountryOfBirth = "ANY@tugraz.idm.attr.CountryOfBirth"; public static final String CurrentDegreeName = "ANY@tugraz.idm.attr.CurrentDegreeName"; public static final String CurrentFieldOfStudy = "ANY@tugraz.idm.attr.CurrentFieldOfStudy"; public static final String CurrentLevelOfStudy = "ANY@tugraz.idm.attr.CurrentLevelOfStudy"; public static final String EmailStud = "ANY@tugraz.idm.attr.EmailStud"; public static final String Gender = "ANY@tugraz.idm.attr.Gender"; public static final String HomeInstitutionName = "ANY@tugraz.idm.attr.HomeInstitutionName"; public static final String HomeInstitutionCountry = "ANY@tugraz.idm.attr.HomeInstitutionCountry"; public static final String HomeInstitutionAddressCountryCode = "ANY@tugraz.idm.attr.HomeInstitutionAddressCountryCode"; public static final String HomeInstitutionAddressPostalCode = "ANY@tugraz.idm.attr.HomeInstitutionAddressPostalCode"; public static final String HomeInstitutionAddressStreet = "ANY@tugraz.idm.attr.HomeInstitutionAddressStreet"; public static final String HomeInstitutionAddressCity = "ANY@tugraz.idm.attr.HomeInstitutionAddressCity"; public static final String PermanentAddressCity = "ANY@tugraz.idm.attr.PermanentAddressCity"; public static final String PermanentAddressCountryCode = "ANY@tugraz.idm.attr.PermanentAddressCountryCode"; public static final String PermanentAddressPostalCode = "ANY@tugraz.idm.attr.PermanentAddressPostalCode"; public static final String PermanentAddressStreet = "ANY@tugraz.idm.attr.PermanentAddressStreet"; public static final String StudyAddressCity = "ANY@tugraz.idm.attr.StudyAddressCity"; public static final String StudyAddressCountryCode = "ANY@tugraz.idm.attr.StudyAddressCountryCode"; public static final String StudyAddressPostalCode = "ANY@tugraz.idm.attr.StudyAddressPostalCode"; public static final String StudyAddressStreet = "ANY@tugraz.idm.attr.StudyAddressStreet"; private static List complexeScopes = new ArrayList(); private static final Map eIDASToScopes = Collections.unmodifiableMap(new HashMap() { private static final long serialVersionUID = 1L; { put(Definitions.CITIZENSHIP_NAME, Citizenship); put(eu.eidas.auth.engine.core.eidas.spec.NaturalPersonSpec.Definitions.PLACE_OF_BIRTH.getNameUri().toString(), CityOfBirth); put(Definitions.COUNTRYOFBIRTH_NAME, CountryOfBirth); put(Definitions.CURRENTDEGREE_NAME, CurrentDegreeName); put(Definitions.FIELDOFSTUDY_NAME, CurrentFieldOfStudy); put(Definitions.CURRENTLEVELOFSTUDY_NAME, CurrentLevelOfStudy); put(Definitions.EMAIL_NAME, EmailStud); put(eu.eidas.auth.engine.core.eidas.spec.NaturalPersonSpec.Definitions.GENDER.getNameUri().toString(), Gender); put(Definitions.HOMEINSTITUTIONNAME_NAME, HomeInstitutionName); put(Definitions.HOMEINSTITUTIONCOUNTRY_NAME, HomeInstitutionCountry); put(Definitions.HOMEINSTITUTIONADDRESS_NAME, HomeInstitutionAddressCountryCode + Scope_Delimiter + HomeInstitutionAddressPostalCode + Scope_Delimiter + HomeInstitutionAddressStreet + Scope_Delimiter + HomeInstitutionAddressCity); put(eu.eidas.auth.engine.core.eidas.spec.NaturalPersonSpec.Definitions.CURRENT_ADDRESS.getNameUri().toString(), PermanentAddressCity + Scope_Delimiter + PermanentAddressCountryCode + Scope_Delimiter + PermanentAddressPostalCode + Scope_Delimiter + PermanentAddressStreet); put(Definitions.TEMPORARYADDRESS_NAME, StudyAddressCity + Scope_Delimiter + StudyAddressCountryCode + Scope_Delimiter + StudyAddressPostalCode + Scope_Delimiter + StudyAddressStreet); } }); private static Map scopesToeIDAS = Collections.unmodifiableMap(new HashMap() { private static final long serialVersionUID = 1L; { Iterator> it = eIDASToScopes.entrySet().iterator(); while (it.hasNext()) { Entry el = it.next(); String[] value = el.getValue().split(Scope_Delimiter); if (value.length == 1) put(el.getValue(), el.getKey()); else { for (String i : value) { put(i, el.getKey()); complexeScopes.add(i); } } } } }); public static AttributeScopeMapper getInstance() { if (instance == null) { instance = new AttributeScopeMapper(); } return instance; } /** * Map a eID4U attribute-name into a TUG Scope * * @param eID4UAttributeName eID4U attribute-name * @return TUG Scope */ public String getTUGScopesForAttribute(String eID4UAttributeName) { if (eIDASToScopes.containsKey(eID4UAttributeName)) return eIDASToScopes.get(eID4UAttributeName); else { Logger.info("eID4U attribute '" + eID4UAttributeName + "' CAN NOT provides from TUG"); return StringUtils.EMPTY; } } /** * Map a TUG Scope into an eID4u attribute-name * * @param scope TUG scope * @return eID4u attribute name */ public String geteIDASAttrFromScope(String scope) { return scopesToeIDAS.get(scope); } /** * Check if an TUG scope is part of a complex eID4u attribute * * @param scope TUG scope * @return true if scope is part of a complex attribute, otherwise false */ public boolean isComplexeScope(String scope) { return complexeScopes.contains(scope); } /** * Convert the TUG Attribute-provider response into a Map of eID4U attributes * * * @param jsonObject TUG AP response * @return Map of eID4U attributes, but never null */ public Map populateEid4uAttributesFromTugResponse(JsonObject jsonObject) { Map result = new HashMap(); Map complexAttr = new HashMap(); Iterator> it = jsonObject.entrySet().iterator(); while (it.hasNext()) { Entry el = it.next(); String key = el.getKey(); Logger.trace("Starting TUG scrope mapping for: " + key + " ... "); String eIDASAttr = AttributeScopeMapper.getInstance().geteIDASAttrFromScope(key); if (StringUtils.isNotEmpty(eIDASAttr)) { if (!AttributeScopeMapper.getInstance().isComplexeScope(key)) { Logger.debug("Map simple TUG scope: " + key + " to eIDAS attribute: " + eIDASAttr); result.put(eIDASAttr, el.getValue().getAsString()); } else { Logger.trace("Find complex TUG scope: " + key); complexAttr.put(eIDASAttr, null); } } else Logger.info("Can NOT map TUG scope: " + key + " to any eID4U attribute"); } //TODO: can only Map address attributes Iterator complIt = complexAttr.keySet().iterator(); while(complIt.hasNext()) { String attr = complIt.next(); eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress.Builder address = PostalAddress.builder(); if (Definitions.HOMEINSTITUTIONADDRESS_NAME.equals(attr)) { address.postCode(jsonObject.get(AttributeScopeMapper.HomeInstitutionAddressPostalCode).getAsString()); address.postName(jsonObject.get(AttributeScopeMapper.HomeInstitutionAddressCity).getAsString()); address.cvAddressArea(jsonObject.get(AttributeScopeMapper.HomeInstitutionAddressStreet).getAsString()); address.thoroughfare(jsonObject.get(AttributeScopeMapper.HomeInstitutionAddressStreet).getAsString()); result.put(attr, address.build()); } else if (Definitions.TEMPORARYADDRESS_NAME.equals(attr)) { address.postCode(jsonObject.get(AttributeScopeMapper.StudyAddressPostalCode).getAsString()); address.postName(jsonObject.get(AttributeScopeMapper.StudyAddressCity).getAsString()); address.cvAddressArea(jsonObject.get(AttributeScopeMapper.StudyAddressStreet).getAsString()); address.thoroughfare(jsonObject.get(AttributeScopeMapper.StudyAddressStreet).getAsString()); result.put(attr, address.build()); } else if (eu.eidas.auth.engine.core.eidas.spec.NaturalPersonSpec.Definitions.CURRENT_ADDRESS.getNameUri().toString().equals(attr)) { address.postCode(jsonObject.get(AttributeScopeMapper.PermanentAddressPostalCode).getAsString()); address.postName(jsonObject.get(AttributeScopeMapper.PermanentAddressCity).getAsString()); address.cvAddressArea(jsonObject.get(AttributeScopeMapper.PermanentAddressStreet).getAsString()); address.thoroughfare(jsonObject.get(AttributeScopeMapper.PermanentAddressStreet).getAsString()); result.put(attr, address.build()); } else { Logger.warn("Complexe eID4U attribute: " + attr + " is NOT SUPPORTED yet!"); } } return result; } private AttributeScopeMapper() { } }