diff options
Diffstat (limited to 'connector_lib')
9 files changed, 356 insertions, 14 deletions
| diff --git a/connector_lib/pom.xml b/connector_lib/pom.xml index b6a2e060..f24a2801 100644 --- a/connector_lib/pom.xml +++ b/connector_lib/pom.xml @@ -27,6 +27,10 @@        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>      </dependency> +    <dependency> +      <groupId>javax.validation</groupId> +      <artifactId>validation-api</artifactId> +    </dependency>      <dependency>        <groupId>javax.servlet</groupId> @@ -44,20 +48,20 @@        <groupId>org.springframework</groupId>        <artifactId>spring-test</artifactId>        <scope>test</scope> -    </dependency>     +    </dependency>      <dependency>        <groupId>at.gv.egiz.eaaf</groupId>        <artifactId>eaaf_core_utils</artifactId>        <scope>test</scope>        <type>test-jar</type> -    </dependency>     +    </dependency>      <dependency> -        <groupId>at.gv.egiz.eaaf</groupId> -        <artifactId>eaaf-core</artifactId> -        <scope>test</scope> -        <type>test-jar</type> -    </dependency>  -     +      <groupId>at.gv.egiz.eaaf</groupId> +      <artifactId>eaaf-core</artifactId> +      <scope>test</scope> +      <type>test-jar</type> +    </dependency> +    </dependencies>    <build> @@ -87,7 +91,7 @@            </dependency>          </dependencies>        </plugin> -       +        <plugin>          <groupId>com.github.spotbugs</groupId>          <artifactId>spotbugs-maven-plugin</artifactId> diff --git a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/MsEidasNodeConstants.java b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/MsEidasNodeConstants.java index 8d1dcc0b..133f104d 100644 --- a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/MsEidasNodeConstants.java +++ b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/MsEidasNodeConstants.java @@ -103,7 +103,7 @@ public class MsEidasNodeConstants { -  public static final String PROP_CONFIG_SP_LIST_PREFIX = "sp."; +  public static final String PROP_CONFIG_SP_LIST_PREFIX = "sp";    public static final String PROP_CONFIG_SP_UNIQUEIDENTIFIER = EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER;    public static final String PROP_CONFIG_SP_FRIENDLYNAME = "friendlyName";    public static final String PROP_CONFIG_SP_PVP2_METADATA_URL = "pvp2.metadata.url"; diff --git a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/BasicConfigurationProvider.java b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/BasicConfigurationProvider.java index 355c63f2..8f15a12d 100644 --- a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/BasicConfigurationProvider.java +++ b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/BasicConfigurationProvider.java @@ -31,6 +31,7 @@ import java.util.Map.Entry;  import org.apache.commons.lang3.StringUtils;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile;  import org.springframework.stereotype.Service;  import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; @@ -41,6 +42,7 @@ import at.gv.egiz.eaaf.core.impl.idp.conf.AbstractConfigurationImpl;  import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils;  @Service("BasicMSSpecificNodeConfig") +@Profile("!springBoot")  public class BasicConfigurationProvider extends AbstractConfigurationImpl {    private static final Logger log = LoggerFactory.getLogger(BasicConfigurationProvider.class); @@ -56,7 +58,7 @@ public class BasicConfigurationProvider extends AbstractConfigurationImpl {      if (!spConfigCache.containsKey(entityId)) {        log.debug("SP: " + entityId + " is NOT cached. Starting load operation ...  ");        final Map<String, String> allSPs = getBasicConfigurationWithPrefix( -          MsEidasNodeConstants.PROP_CONFIG_SP_LIST_PREFIX); +          MsEidasNodeConstants.PROP_CONFIG_SP_LIST_PREFIX + KeyValueUtils.KEY_DELIMITER);        for (Entry<String, String> entry : allSPs.entrySet()) {          if (entry.getKey().endsWith(MsEidasNodeConstants.PROP_CONFIG_SP_UNIQUEIDENTIFIER)               && entry.getValue().equals(entityId)) { diff --git a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/SpringBootBasicConfigurationProvider.java b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/SpringBootBasicConfigurationProvider.java new file mode 100644 index 00000000..76e2c01f --- /dev/null +++ b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/config/SpringBootBasicConfigurationProvider.java @@ -0,0 +1,122 @@ +package at.asitplus.eidas.specific.connector.config; + +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.lang3.StringUtils; + +import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration; +import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException; +import at.gv.egiz.eaaf.core.exceptions.EaafException; +import at.gv.egiz.eaaf.core.impl.idp.conf.AbstractSpringBootConfigurationImpl; +import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class SpringBootBasicConfigurationProvider extends AbstractSpringBootConfigurationImpl { + +  private final Map<String, ISpConfiguration> spConfigCache = new HashMap<>(); +   +  @Override +  public ISpConfiguration getServiceProviderConfiguration(String entityId) throws EaafConfigurationException { +    if (!spConfigCache.containsKey(entityId)) { +      log.debug("SP: " + entityId + " is NOT cached. Starting load operation ...  "); +      final Map<String, String> allSPs = getBasicConfigurationWithPrefix( +          MsEidasNodeConstants.PROP_CONFIG_SP_LIST_PREFIX); +      for (Entry<String, String> entry : allSPs.entrySet()) { +        if (entry.getKey().endsWith(MsEidasNodeConstants.PROP_CONFIG_SP_UNIQUEIDENTIFIER)  +            && entry.getValue().equals(entityId)) { +          final String listId = KeyValueUtils.getParentKey(entry.getKey()); +          log.trace("Find SP configuration with list-Id: " + listId +              + ". Extracting configuration elements ... "); +          final Map<String, String> spConfig = KeyValueUtils.getSubSetWithPrefix(allSPs, listId +              + KeyValueUtils.KEY_DELIMITER); +          spConfigCache.put(entityId, +              new ServiceProviderConfiguration(spConfig, this)); +          break; +        } +      } + +      if (spConfigCache.containsKey(entityId)) { +        log.info("SP: " + entityId + " is loaded. Continuing auth. process ... "); +      } else { +        log.warn("SP: " + entityId + " is NOT found in configuration. Stopping auth. process ... "); +        return null; + +      } + +    } else { +      log.trace("SP: " + entityId + " is already cached. Use configuration from there ... "); +    } + +    return spConfigCache.get(entityId); +  } + +  @Override +  public <T> T getServiceProviderConfiguration(String entityId, Class<T> decorator) +      throws EaafConfigurationException { +    final ISpConfiguration spConfig = getServiceProviderConfiguration(entityId); +    if (spConfig != null && decorator != null) { +      if (decorator.isInstance(spConfig)) { +        return (T) spConfig; +      } else { +        log.error("SPConfig: " + spConfig.getClass().getName() + " is NOT instance of: " + decorator +            .getName()); +      } + +    } + +    return null; + +  } + +  @Override +  public String validateIdpUrl(URL url) throws EaafException { +    log.trace("Validate requested URL: " + url); +    String urlPrefixFromConfig = getBasicConfiguration( +        MsEidasNodeConstants.PROP_CONFIG_APPLICATION_PUBLIC_URL_PREFIX); +    if (StringUtils.isEmpty(urlPrefixFromConfig)) { +      log.warn("Application config containts NO URL prefix"); +      throw new EaafConfigurationException("config.27", +          new Object[] { "Application config containts NO " +              + getApplicationSpecificKeyPrefix() +              + MsEidasNodeConstants.PROP_CONFIG_APPLICATION_PUBLIC_URL_PREFIX }); + +    } + +    // remove last slash +    if (urlPrefixFromConfig.endsWith("/")) { +      urlPrefixFromConfig = urlPrefixFromConfig.substring(0, urlPrefixFromConfig.length() - 1); +    } + +    if (getBasicConfigurationBoolean( +        MsEidasNodeConstants.PROP_CONFIG_APPLICATION_PUBLIC_URL_REQUEST_VALIDATION, false)) { +      if (url != null && url.toExternalForm().startsWith(urlPrefixFromConfig)) { +        return urlPrefixFromConfig; +      } + +      log.info("URL: " + url + " does NOT match to allowed application prefix: " + urlPrefixFromConfig); +      return null; + +    } else { +      return urlPrefixFromConfig; + +    } +  } + +  @Override +  public String getApplicationSpecificKeyPrefix() { +    return MsEidasNodeConstants.PROP_CONFIG_APPLICATION_PREFIX; + +  } + +  @Override +  protected String getBackupConfigPath() { +    return null; + +  } + +} diff --git a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/gui/DefaultVelocityGuiBuilderImpl.java b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/gui/DefaultVelocityGuiBuilderImpl.java index 7abc6fcb..e7ebc92f 100644 --- a/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/gui/DefaultVelocityGuiBuilderImpl.java +++ b/connector_lib/src/main/java/at/asitplus/eidas/specific/connector/gui/DefaultVelocityGuiBuilderImpl.java @@ -33,7 +33,7 @@ import at.gv.egiz.eaaf.core.api.gui.IVelocityGuiBuilderConfiguration;  import at.gv.egiz.eaaf.core.exceptions.GuiBuildException;  import at.gv.egiz.eaaf.core.impl.gui.AbstractVelocityGuiFormBuilderImpl; -@Service("DefaultVelocityGUIBuilderImpl") +@Service("velocityGUIBuilderImpl")  public class DefaultVelocityGuiBuilderImpl extends AbstractVelocityGuiFormBuilderImpl {    private static final Logger log = LoggerFactory.getLogger(DefaultVelocityGuiBuilderImpl.class); diff --git a/connector_lib/src/main/resources/common_gui.beans.xml b/connector_lib/src/main/resources/common_gui.beans.xml new file mode 100644 index 00000000..969a40f7 --- /dev/null +++ b/connector_lib/src/main/resources/common_gui.beans.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" +  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +  xmlns:context="http://www.springframework.org/schema/context" +  xmlns:tx="http://www.springframework.org/schema/tx" +  xmlns:aop="http://www.springframework.org/schema/aop" +  xmlns:task="http://www.springframework.org/schema/task" +  xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd +    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd +    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd +    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  +    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> + +  <bean id="contentNegotiationManager" +    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean" +    primary="true"> +    <property name="parameterName" value="mediaType" /> +    <property name="defaultContentType" value="application/json" /> +    <property name="useRegisteredExtensionsOnly" value="false" /> +    <property name="mediaTypes"> +      <map> +        <entry key="json" value="application/json" /> +        <entry key="html" value="text/html" /> +      </map> +    </property> +  </bean> + +  <bean +    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> +    <property name="order" value="1" /> +    <property name="defaultViews"> +      <list> +        <!-- JSON View --> +        <bean +          class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> +          <property name="contentType" value="application/json" /> +        </bean> +      </list> +    </property> +  </bean> + + +  <bean id="templateEngine" +    class="org.thymeleaf.spring5.SpringTemplateEngine"> +    <property name="templateResolver" ref="templateResolver" /> +  </bean> + +  <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> +    <property name="order" value="2" /> +    <property name="templateEngine" ref="templateEngine" /> +    <property name="characterEncoding" value="UTF-8" /> +  </bean> + +  <bean id="valitatorWithI18nSupport" +    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> +    <property name="validationMessageSource" +      ref="messageSource" /> +  </bean> + +</beans>
\ No newline at end of file diff --git a/connector_lib/src/test/java/at/asitplus/eidas/specific/connector/test/config/SpringBootBasicConfigurationProviderTest.java b/connector_lib/src/test/java/at/asitplus/eidas/specific/connector/test/config/SpringBootBasicConfigurationProviderTest.java new file mode 100644 index 00000000..4e7e7dd2 --- /dev/null +++ b/connector_lib/src/test/java/at/asitplus/eidas/specific/connector/test/config/SpringBootBasicConfigurationProviderTest.java @@ -0,0 +1,148 @@ +package at.asitplus.eidas.specific.connector.test.config; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Map; + +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; +import at.asitplus.eidas.specific.connector.config.ServiceProviderConfiguration; +import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP; +import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration; +import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException; +import at.gv.egiz.eaaf.core.exceptions.EaafException; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { +    "/SpringTest-context_basic_realConfig.xml"}) +@TestPropertySource(locations = { "/config/junit_config_1.properties" }) +@ActiveProfiles("springBoot") +@DirtiesContext(classMode = ClassMode.BEFORE_CLASS) +public class SpringBootBasicConfigurationProviderTest { + + @Autowired private IConfigurationWithSP basicConfig; +  +  @Test +  public void configPropInfos() { +    Assert.assertEquals("size", 2, MsEidasNodeConstants.COUNTRY_SELECTION_PARAM_WHITELIST.size()); +     +  } +   +  @Test +  public void loadSpNoExist() throws EaafConfigurationException { +    ISpConfiguration spConfig = basicConfig.getServiceProviderConfiguration( +        RandomStringUtils.randomAlphabetic(5)); +    Assert.assertNull("spConfig", spConfig); +     +  } +   +  @Test +  public void loadSpConfigBasicMode() throws EaafConfigurationException { +    ISpConfiguration spConfig = basicConfig.getServiceProviderConfiguration("jUnitTest1"); +     +    Assert.assertNotNull("spConfig", spConfig); +    Assert.assertEquals("uniqueId", "jUnitTest1", spConfig.getUniqueIdentifier()); +    Assert.assertEquals("friendlyName", "NO FRIENDLYNAME SET", spConfig.getFriendlyName()); +    Assert.assertEquals("pvp2.truststore", "", spConfig.getConfigurationValue("pvp2.metadata.truststore")); +    String test = RandomStringUtils.randomAlphabetic(5); +    Assert.assertEquals("pvp2.password", "1234pass",  +        spConfig.getConfigurationValue("pvp2.metadata.truststore.password", test)); +    Assert.assertEquals("eidMode", true, spConfig.isConfigurationValue("newEidMode")); +    Assert.assertEquals("notexistflag", false, spConfig.isConfigurationValue("notexist", false)); +    Assert.assertNotNull("fullConfig", spConfig.getFullConfiguration()); +    Assert.assertEquals("fullConfig", 4, spConfig.getFullConfiguration().size()); +     +  } +   +  @Test +  public void loadSpConfigAdvancedMode() throws EaafConfigurationException { +    ISpConfiguration spConfig = basicConfig.getServiceProviderConfiguration( +        "jUnitTest2", ServiceProviderConfiguration.class); +     +    Assert.assertNotNull("spConfig", spConfig); +    Assert.assertEquals("uniqueId", "jUnitTest2", spConfig.getUniqueIdentifier()); +    Assert.assertEquals("friendlyName", "jUnit tester 2", spConfig.getFriendlyName()); +    Assert.assertEquals("pvp2.truststore", "", spConfig.getConfigurationValue("pvp2.metadata.truststore")); +    String test = RandomStringUtils.randomAlphabetic(5); +    Assert.assertEquals("pvp2.password", test,  +        spConfig.getConfigurationValue("pvp2.metadata.truststore.notexist", test)); +    Assert.assertEquals("eidMode", false, spConfig.isConfigurationValue("newEidMode")); +    Assert.assertEquals("notexistflag", false, spConfig.isConfigurationValue("notexist", false)); +    Assert.assertNotNull("fullConfig", spConfig.getFullConfiguration()); +    Assert.assertEquals("fullConfig", 5, spConfig.getFullConfiguration().size()); +    Assert.assertFalse("baseIdInternal", spConfig.hasBaseIdInternalProcessingRestriction()); +    Assert.assertTrue("baseIdTransfer", spConfig.hasBaseIdTransferRestriction()); +     +  } +   +  @Test +  public void loadSpConfigAdvancedModeWrongDecorator() throws EaafConfigurationException { +    ISpConfiguration spConfig1 = basicConfig.getServiceProviderConfiguration( +        "jUnitTest2", null);     +    Assert.assertNull("spConfig", spConfig1); + +    String spConfig2 = basicConfig.getServiceProviderConfiguration( +        "jUnitTest2", String.class);     +    Assert.assertNull("spConfig", spConfig2); +     +  } +   +  @Test +  public void loadConfigValuesString() { +    Assert.assertEquals("without default", "ownSpecificConnector",  +        basicConfig.getBasicConfiguration("auth.eIDAS.node_v2.entityId")); +     +    Assert.assertEquals("with default", "",  +        basicConfig.getBasicConfiguration("auth.eIDAS.szrclient.endpoint.prod",  +            RandomStringUtils.randomAlphabetic(5))); +     +    String rand1 = RandomStringUtils.randomAlphanumeric(5); +    Assert.assertEquals("unknown with default", rand1,  +        basicConfig.getBasicConfiguration("notexist", rand1)); +     +  } +   +  @Test +  public void loadConfigValuesBoolean() { +    Assert.assertEquals("without default", true,  +        basicConfig.getBasicConfigurationBoolean("auth.eIDAS.szrclient.useTestService")); +     +    Assert.assertEquals("not exist with default", false,  +        basicConfig.getBasicConfigurationBoolean("auth.notexist",  +            false)); +     +    Assert.assertEquals("exist but empty with default", true,  +        basicConfig.getBasicConfigurationBoolean("auth.eIDAS.szrclient.params.vkz", true)); +     +  } +   +  @Test +  public void loadConfigMap() { +    Map<String, String> entries = basicConfig.getBasicConfigurationWithPrefix("auth.eIDAS.szrclient"); +    Assert.assertEquals("wrong size", 16, entries.size()); +    Assert.assertTrue("missing element", entries.containsKey("endpoint.test")); +    Assert.assertEquals("wrong entry", "http://localhost:1234/demoszr", entries.get("endpoint.test")); +     +  } +   +  @Test +  public void validateUrl() throws MalformedURLException, EaafException { +    Assert.assertEquals("wrong URL", "http://localhost/test",  +        basicConfig.validateIdpUrl(new URL("http://localhost/test/" + RandomStringUtils.randomAlphabetic(5)))); +    +    Assert.assertNull("wrong URL", +        basicConfig.validateIdpUrl(new URL("http://localhost/wrong/" + RandomStringUtils.randomAlphabetic(5)))); +     +  } +} diff --git a/connector_lib/src/test/resources/SpringTest-context_basic_realConfig.xml b/connector_lib/src/test/resources/SpringTest-context_basic_realConfig.xml index bcca90b5..fbc4640a 100644 --- a/connector_lib/src/test/resources/SpringTest-context_basic_realConfig.xml +++ b/connector_lib/src/test/resources/SpringTest-context_basic_realConfig.xml @@ -11,10 +11,15 @@    <context:annotation-config /> +  <beans profile="!springBoot">    <bean id="BasicMSSpecificNodeConfig"      class="at.asitplus.eidas.specific.connector.config.BasicConfigurationProvider"> -    <constructor-arg -      value="#{systemProperties['eidas.ms.configuration']}" /> +    <constructor-arg value="#{systemProperties['eidas.ms.configuration']}" />    </bean> +  </beans> +  <beans profile="springBoot"> +    <bean id="springBootMsSpecificNodeConfig" +          class="at.asitplus.eidas.specific.connector.config.SpringBootBasicConfigurationProvider" /> +  </beans>  </beans>
\ No newline at end of file diff --git a/connector_lib/src/test/resources/config/junit_config_1.properties b/connector_lib/src/test/resources/config/junit_config_1.properties index 01dcf842..160725d4 100644 --- a/connector_lib/src/test/resources/config/junit_config_1.properties +++ b/connector_lib/src/test/resources/config/junit_config_1.properties @@ -1,6 +1,7 @@  ## Basic service configuration  eidas.ms.context.url.prefix=http://localhost/test/  eidas.ms.context.url.request.validation=true +eidas.ms.core.configRootDir=file:./src/test/resources/config/  eidas.ms.context.use.clustermode=true | 
