diff options
Diffstat (limited to 'connector/src')
3 files changed, 77 insertions, 45 deletions
| diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java index a9eb06be..881eeb8a 100644 --- a/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java +++ b/connector/src/main/java/at/asitplus/eidas/specific/connector/verification/AuthnRequestValidator.java @@ -75,7 +75,7 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {        if (nameIdPolicy != null) {          final String nameIdFormat = nameIdPolicy.getFormat();          if (nameIdFormat != null) { -          if (!(NameIDType.TRANSIENT.equals(nameIdFormat)  +          if (!(NameIDType.TRANSIENT.equals(nameIdFormat)                || NameIDType.PERSISTENT.equals(nameIdFormat))) {              throw new NameIdFormatNotSupportedException(nameIdFormat); @@ -114,10 +114,10 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {        // post-process requested LoA comparison-level        pendingReq.getServiceProviderConfiguration(ServiceProviderConfiguration.class).setLoAMachtingMode(            extractComparisonLevel(authnReq)); -       -      //extract information from requested attributes + +      // extract information from requested attributes        extractFromRequestedAttriutes(pendingReq, authnReq); -       +      } catch (final EaafStorageException e) {        log.info("Can NOT store Authn. Req. data into pendingRequest.", e);        throw new AuthnRequestValidatorException("internal.02", null, e); @@ -126,14 +126,14 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {    } -  private void extractFromRequestedAttriutes(IRequest pendingReq, AuthnRequest authnReq)  -      throws AuthnRequestValidatorException { +  private void extractFromRequestedAttriutes(IRequest pendingReq, AuthnRequest authnReq) +      throws AuthnRequestValidatorException, EaafStorageException {      // validate and process requested attributes      boolean sectorDetected = false; -     +      final ServiceProviderConfiguration spConfig = pendingReq.getServiceProviderConfiguration(          ServiceProviderConfiguration.class); -     +      if (authnReq.getExtensions() != null) {        final List<XMLObject> requestedAttributes = authnReq.getExtensions().getUnknownXMLObjects();        for (final XMLObject reqAttrObj : requestedAttributes) { @@ -143,77 +143,101 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {              for (final EaafRequestedAttribute el : reqAttr.getAttributes()) {                log.trace("Processing req. attribute '" + el.getName() + "' ... ");                if (el.getName().equals(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME)) { -                sectorDetected = extractBpkTargetIdentifier(el, spConfig);  -                +                sectorDetected = extractBpkTargetIdentifier(el, spConfig); +                } else if (el.getName().equals(ExtendedPvpAttributeDefinitions.EID_TRANSACTION_ID_NAME)) {                  extractUniqueTransactionId(el, pendingReq); -                 + +              } else if (el.getName().equals(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME)) { +                extractBindingPublicKey(el, pendingReq); +                } else {                  log.debug("Ignore req. attribute: " + el.getName()); -                 +                }              }            } else {              log.debug("No requested Attributes in Authn. Request"); -             +            }          } else {            log.info("Ignore unknown requested attribute: " + reqAttrObj.getElementQName().toString()); -           +          }        }      } -     +      if (!sectorDetected) {        log.warn("Authn.Req validation FAILED. Reason: Contains NO or NO VALID target-sector information.");        throw new AuthnRequestValidatorException("pvp2.22", new Object[] {            "NO or NO VALID target-sector information" });      } -     + +  } + +  private void extractBindingPublicKey(EaafRequestedAttribute el, IRequest pendingReq) +      throws EaafStorageException { +    if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) { +      final String bindingPubKey = el.getAttributeValues().get(0).getDOM().getTextContent(); +      pendingReq.setRawDataToTransaction(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, bindingPubKey); +      log.info("Find Binding Public-Key. eIDAS authentication will be used to create an ID Austria Binding"); + +    } else { +      log.warn( +          "Req. attribute '{}' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute", +          el.getName()); + +    }    }    /**     * Extract unique transactionId from AuthnRequest. -   *  -   * @param el Requested attribute from AuthnRequest -   * @param pendingReq Current pendingRequest object (has to be of type {@link RequestImpl}) -   * @return <code>true</code> if transactionId extraction was successful, otherwise <code>false</code> +   * +   * @param el         Requested attribute from AuthnRequest +   * @param pendingReq Current pendingRequest object (has to be of type +   *                   {@link RequestImpl}) +   * @return <code>true</code> if transactionId extraction was successful, +   *         otherwise <code>false</code>     */    private boolean extractUniqueTransactionId(EaafRequestedAttribute el, IRequest pendingReq) {      if (!(pendingReq instanceof RequestImpl)) { -      log.warn("Can NOT set unique transactionId from AuthnRequest,because 'PendingRequest' is NOT from Type: {}", +      log.warn( +          "Can NOT set unique transactionId from AuthnRequest,because 'PendingRequest' is NOT from Type: {}",            RequestImpl.class.getName()); -       -    } else {         + +    } else {        if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) { -        final String transactionId = el.getAttributeValues().get(0).getDOM().getTextContent();       -        ((RequestImpl)pendingReq).setUniqueTransactionIdentifier(transactionId);       +        final String transactionId = el.getAttributeValues().get(0).getDOM().getTextContent(); +        ((RequestImpl) pendingReq).setUniqueTransactionIdentifier(transactionId);          return true;        } else { -        log.warn("Req. attribute '{}' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute",  +        log.warn( +            "Req. attribute '{}' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute",              el.getName()); -         +        } -       +      } -     +      return false;    }    /**     * Extract the bPK target from requested attribute. -   *  -   * @param el Requested attribute from AuthnRequest +   * +   * @param el       Requested attribute from AuthnRequest     * @param spConfig Service-Provider configuration for current process -   * @return <code>true</code> if bPK target extraction was successful, otherwise <code>false</code> +   * @return <code>true</code> if bPK target extraction was successful, otherwise +   *         <code>false</code>     */ -  private boolean extractBpkTargetIdentifier(EaafRequestedAttribute el, ServiceProviderConfiguration spConfig) {         +  private boolean extractBpkTargetIdentifier(EaafRequestedAttribute el, +      ServiceProviderConfiguration spConfig) {      if (el.getAttributeValues() != null && el.getAttributeValues().size() == 1) { -      final String sectorId = el.getAttributeValues().get(0).getDOM().getTextContent();       +      final String sectorId = el.getAttributeValues().get(0).getDOM().getTextContent();        try {          spConfig.setBpkTargetIdentifier(sectorId);          return true; @@ -227,16 +251,16 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {        log.warn("Req. attribute '" + el.getName()            + "' contains NO or MORE THEN ONE attribute-values. Ignore full req. attribute");      } -     +      return false; -     +    } -   -  private void postprocessLoaLevel(IRequest pendingReq, AuthnRequest authnReq)  + +  private void postprocessLoaLevel(IRequest pendingReq, AuthnRequest authnReq)        throws AuthnRequestValidatorException {      final List<String> reqLoA = extractLoA(authnReq); -    log.trace("SP requests LoA with: {}", String.join(", ",reqLoA)); -     +    log.trace("SP requests LoA with: {}", String.join(", ", reqLoA)); +      LevelOfAssurance minimumLoAFromConfig = LevelOfAssurance.fromString(basicConfig.getBasicConfiguration(          MsEidasNodeConstants.PROP_EIDAS_REQUEST_LOA_MINIMUM_LEVEL,          EaafConstants.EIDAS_LOA_HIGH)); @@ -246,15 +270,15 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {        minimumLoAFromConfig = LevelOfAssurance.HIGH;      } -           +      log.trace("Validate requested LoA to connector configuration minimum LoA: {} ...", -        minimumLoAFromConfig);       +        minimumLoAFromConfig);      final List<String> allowedLoA = new ArrayList<>();      for (final String loa : reqLoA) {        try {          final LevelOfAssurance intLoa = LevelOfAssurance.fromString(loa);          String selectedLoA = EaafConstants.EIDAS_LOA_HIGH; -        if (intLoa != null  +        if (intLoa != null              && intLoa.numericValue() <= minimumLoAFromConfig.numericValue()) {            log.info("Client: {} requested LoA: {} will be upgraded to: {}",                pendingReq.getServiceProviderConfiguration().getUniqueIdentifier(), @@ -281,7 +305,7 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {      pendingReq.getServiceProviderConfiguration(ServiceProviderConfiguration.class).setRequiredLoA(          allowedLoA); -     +    }    private String extractComparisonLevel(AuthnRequest authnReq) { @@ -335,7 +359,7 @@ public class AuthnRequestValidator implements IAuthnRequestPostProcessor {    private String extractScopeRequsterId(AuthnRequest authnReq) {      if (authnReq.getScoping() != null) {        final Scoping scoping = authnReq.getScoping(); -      if (scoping.getRequesterIDs() != null  +      if (scoping.getRequesterIDs() != null            && scoping.getRequesterIDs().size() > 0) {          if (scoping.getRequesterIDs().size() == 1) {            return scoping.getRequesterIDs().get(0).getRequesterID(); diff --git a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java index 9aafb4b6..c57515a0 100644 --- a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java +++ b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/utils/AuthnRequestValidatorTest.java @@ -214,6 +214,11 @@ public class AuthnRequestValidatorTest {      Assert.assertEquals("wrong transactionId", "transId_11223344556677aabbcc",           pendingReq.getUniqueTransactionIdentifier()); +    +    Assert.assertEquals("wrong binding pubkey", "binding_pubKey_1144225247125dsfasfasdf",  +        pendingReq.getRawData(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, String.class)); +     +        } diff --git a/connector/src/test/resources/data/pvp2_authn_3.xml b/connector/src/test/resources/data/pvp2_authn_3.xml index 35e49b0f..5352c441 100644 --- a/connector/src/test/resources/data/pvp2_authn_3.xml +++ b/connector/src/test/resources/data/pvp2_authn_3.xml @@ -31,6 +31,9 @@        <eid:RequestedAttribute FriendlyName="transactionId" Name="urn:eidgvat:attributes.transactionId" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true">          <eid:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">transId_11223344556677aabbcc</eid:AttributeValue>        </eid:RequestedAttribute> +      <eid:RequestedAttribute FriendlyName="Binding-PublicKey" Name="urn:eidgvat:attributes.binding.pubkey" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"> +        <eid:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">binding_pubKey_1144225247125dsfasfasdf</eid:AttributeValue> +      </eid:RequestedAttribute>      </eid:RequestedAttributes>    </saml2p:Extensions>    <saml2p:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/> | 
