Commit ad3674ab authored by Benny Prange's avatar Benny Prange
Browse files

Release eumw-1.0.4

parent e0975357
......@@ -3,3 +3,10 @@ packer/
*Jenkinsfile
.hg/
# IntelliJ project files
*.iml
*.iws
*.ipr
.idea/
*/_build
......@@ -9,3 +9,4 @@ e78b3ff8c6e824ac3ab43fcaeb695aaafb3c236c eumw-1.0.2
50562c1c941f357f2418be4e62e13f7e06665a48 eumw-1.0.3-rc.2
f33f98135e4d97738965caf8369910526a4ba5eb eumw-1.0.3
241787841eb0799eca7a5e1fc975de7d34186807 eumw-1.0.4-rc.1
1832cd8ad07210ce87e68e1efe861200ed1974d2 eumw-1.0.4-rc.2
version: '3'
services:
configuration-wizard:
image: "governikus/eidas-configuration-wizard:1.0.4-rc.1"
image: "governikus/eidas-configuration-wizard:1.0.4"
ports:
- "443:8080"
environment:
......
version: '3'
services:
configuration-wizard:
image: "governikus/eidas-configuration-wizard:1.0.4-rc.2"
image: "governikus/eidas-configuration-wizard:1.0.4"
ports:
- "8080:8080"
volumes:
......
FROM governikus/eidas-base-container:1.0.4-rc.2
FROM governikus/eidas-base-container:1.0.4
MAINTAINER Benny Prange <benny.prange@governikus.de>
# NOTE: Some ENV variables are set in the parent "eidas-base-image"
......
......@@ -14,7 +14,7 @@
<parent>
<groupId>de.governikus.eumw</groupId>
<artifactId>eumw</artifactId>
<version>1.0.4-SNAPSHOT</version>
<version>1.0.4</version>
</parent>
<artifactId>configuration-wizard</artifactId>
......
=======================================
Database Migration Application
=======================================
Version eumw-1.0.4
Table of contents:
1. Introduction
2. Usage
=======================================
1. This application migrates a h2 database used by the
Governikus eIDAS Middleware from the schema version
1.0.2 to schema version 1.0.3.
This is necessary if the database was created by the
middleware in version 1.0.1 or 1.0.2 and now the
same database should be used by version 1.0.3 or later.
=======================================
2. This application is a Spring Boot Application.
You can run it by executing
java -jar database-migration-1.0.3.jar.
In the working directory there must be folder named config.
In this folder there must exist a file called
application.properties. This file must contain the
following content:
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
You must change the first three properties according to
your environment.
You can copy and paste these values from your
application.properties file that is used by the eIDAS
middleware.
Please make a backup of the database by copying the
database file, e.g. eidasm.mv.db, to another place.
Then you can execute the migration with the command
mentioned above. If there were any errors in the
output, send an email to eidas-middleware@governikus.de
with the log output attached.
If the migration was successful, you can start the
middleware in version 1.0.3 or later with the migrated database.
......@@ -14,7 +14,7 @@
<parent>
<artifactId>eumw</artifactId>
<groupId>de.governikus.eumw</groupId>
<version>1.0.4-SNAPSHOT</version>
<version>1.0.4</version>
</parent>
<artifactId>database-migration</artifactId>
......
......@@ -15,8 +15,8 @@ import java.util.Base64;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.stereotype.Repository;
import lombok.extern.slf4j.Slf4j;
......@@ -37,10 +37,9 @@ public class DatabaseConnector
/**
* Default constructor with dependency injection
*
*
* @param jdbcTemplate Used to access the database
*/
@Autowired
public DatabaseConnector(JdbcTemplate jdbcTemplate)
{
this.jdbcTemplate = jdbcTemplate;
......@@ -85,14 +84,51 @@ public class DatabaseConnector
}
}
/**
* Check that only SECTORID and SPECIFICID are used for the primary key
*
* @return true if only SECTORID and SPECIFICID are used for the primary key
*/
public boolean checkPrimaryKey()
{
SqlRowSet result = jdbcTemplate.queryForRowSet("SELECT * FROM INFORMATION_SCHEMA.CONSTRAINTS WHERE TABLE_NAME = 'BLACKLISTENTRY'");
if (!result.next())
{
return false;
}
boolean correctPrimaryKey = "SECTORID,SPECIFICID".equals(result.getString("COLUMN_LIST"));
// There must be only one constraint on this table
if (result.next())
{
correctPrimaryKey = false;
}
return correctPrimaryKey;
}
/**
* Truncate BLACKLISTENTRY. Delete the column BLACKLISTVERSION from BLACKLISTENTRY, create the column
* BLACKLISTVERSION in TERMINALPERMISSION. This must only be used if there is only one terminal available.
*/
public boolean performMigrationWithoutData()
{
jdbcTemplate.update("TRUNCATE TABLE BLACKLISTENTRY");
jdbcTemplate.update("ALTER TABLE BLACKLISTENTRY DROP PRIMARY KEY");
jdbcTemplate.update("ALTER TABLE BLACKLISTENTRY ADD PRIMARY KEY (SECTORID,SPECIFICID)");
jdbcTemplate.update("ALTER TABLE BLACKLISTENTRY DROP COLUMN BLACKLISTVERSION");
jdbcTemplate.update("ALTER TABLE TERMINALPERMISSION ADD BLACKLISTVERSION BIGINT;");
int columnCount = getColumnCountForBlacklistentry();
return columnCount == 2;
}
/**
* Delete the column BLACKLISTVERSION from BLACKLISTENTRY, create the column BLACKLISTVERSION in
* TERMINALPERMISSION. Copy if available the newest value of BLACKLISTVERSION from BLACKLISTENTRY to
* TERMINALPERMISSION. This must only be used if there is only one terminal available.
*
* @return
*/
public boolean performMigration()
public boolean performMigrationWithData()
{
jdbcTemplate.update("ALTER TABLE TERMINALPERMISSION ADD BLACKLISTVERSION BIGINT;");
List<Long> blacklistversions = jdbcTemplate.queryForList("SELECT DISTINCT BLACKLISTVERSION FROM BLACKLISTENTRY",
......
......@@ -54,6 +54,7 @@ public class DatabaseMigrationApplication implements CommandLineRunner
{
log.info("Running the database migration for 1.0.1 and 1.0.2 to 1.0.3.");
log.info("Using datasource URL: {}", datasourceURL);
// Check that there is only one terminal in the database
if (connector.getTerminalsFromTerminalpermission().size() != 1)
{
......@@ -62,14 +63,27 @@ public class DatabaseMigrationApplication implements CommandLineRunner
System.exit(1);
}
// remove outdated SectorIDs from Blacklistentry before migrating
connector.removeOutdatedSectorIDsFromBlacklistentry();
boolean migrationSuccessful;
// Check if the blacklist data can be migrated
if (connector.checkPrimaryKey())
{
// remove outdated SectorIDs from Blacklistentry before migrating
connector.removeOutdatedSectorIDsFromBlacklistentry();
// remove outdated BlacklistIDs from Blacklistentry before migrating
connector.removeOutdatedVersionsFromBlacklistentry();
// remove outdated BlacklistIDs from Blacklistentry before migrating
connector.removeOutdatedVersionsFromBlacklistentry();
// perform the migration
migrationSuccessful = connector.performMigrationWithData();
}
else
{
log.info("The blacklist data will be deleted. Update the blacklist using the web administration interface afterwards.");
migrationSuccessful = connector.performMigrationWithoutData();
}
// perform the migration
if (connector.performMigration())
if (migrationSuccessful)
{
log.info("Successfully migrated the database.");
}
......
......@@ -11,6 +11,7 @@
package de.governikus.eumw.databasemigration;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import java.nio.charset.StandardCharsets;
......@@ -63,9 +64,26 @@ public class DatabaseConnectorTest
@Test
public void testMigration()
{
// Check that the primary key is correct
assertThat("Primary key should be correct", connector.checkPrimaryKey(), is(true));
// perform the migration
assertThat("Migration is successful", connector.performMigration(), is(true));
assertThat("Migration is successful", connector.performMigrationWithData(), is(true));
checkSchemaChanges();
// check that the value from the old columns is copied
long blacklistversion = jdbcTemplate.queryForObject("SELECT BLACKLISTVERSION FROM TERMINALPERMISSION WHERE REFID = ?",
Long.TYPE,
"test");
assertThat("The old value must be copied", blacklistversion, is(1337L));
// Check that the primary key is correct
assertThat("Primary key should be correct", connector.checkPrimaryKey(), is(true));
}
private void checkSchemaChanges()
{
// check that the column in BLACKLISTENTRY is deleted
List<String> columnsInBlacklistentry = getColumnsFromTable("SELECT * FROM BLACKLISTENTRY");
assertThat("Only SECTORID and SPECIFICID must be present",
......@@ -77,12 +95,6 @@ public class DatabaseConnectorTest
assertThat("ONLY REFID, SECTORID and BLACKLISTVERSION must be present",
columnsInTerminalpermission,
Matchers.containsInAnyOrder("REFID", "SECTORID", "BLACKLISTVERSION"));
// check that the value from the old columns is copied
long blacklistversion = jdbcTemplate.queryForObject("SELECT BLACKLISTVERSION FROM TERMINALPERMISSION WHERE REFID = ?",
Long.TYPE,
"test");
assertThat("The old value must be copied", blacklistversion, is(1337L));
}
private List<String> getColumnsFromTable(String query)
......@@ -183,4 +195,27 @@ public class DatabaseConnectorTest
return jdbcTemplate.queryForList("SELECT DISTINCT (BLACKLISTVERSION) FROM BLACKLISTENTRY", Long.TYPE);
}
/**
* Check the case that the primary key contains all three columns.
*/
@Test
public void testFalsePrimaryKey()
{
jdbcTemplate.update("ALTER TABLE BLACKLISTENTRY DROP PRIMARY KEY");
jdbcTemplate.update("ALTER TABLE BLACKLISTENTRY ADD PRIMARY KEY (SECTORID,SPECIFICID,BLACKLISTVERSION)");
assertThat("Primary key should be corrupted", connector.checkPrimaryKey(), is(false));
connector.performMigrationWithoutData();
checkSchemaChanges();
// Check that the value for the BLACKLISTVERSION is null
Long blacklistversion = jdbcTemplate.queryForObject("SELECT BLACKLISTVERSION FROM TERMINALPERMISSION WHERE REFID = ?",
Long.TYPE,
"test");
assertThat("The old value must be copied", blacklistversion, nullValue());
// Check that the primary key is correct
assertThat("Primary key must be correct", connector.checkPrimaryKey(), is(true));
}
}
......@@ -4,15 +4,25 @@ Changelog
=========
* 1.0.1
- Initial Release
- Initial Release.
* 1.0.2
- Improvement of the :term:`Black List` handling.
NOTE: When upgrading from 1.0.1 to 1.0.2, you must execute the database migration application.
* 1.0.3
- Introduction of the configuration wizard
- Improvements for Docker integration
- Various bug fixes
- Improvement of the :term:`Black List` handling with database changes.
NOTE: When upgrading from 1.0.1 or 1.0.2 to 1.0.3 or later, you must execute the database migration application (see :ref:`database_migration`).
- Introduction of the configuration wizard.
- Improvements for Docker integration.
- Various bug fixes.
* 1.0.4
- Add the eIDAS SAML Demo.
- Fix ID generation and audience restriction in the eIDAS SAML response.
- Fix for the eIDAS Middleware Docker integration.
- Fix the project setup of the password generator.
- Older databases are now also supported in the database migration tool.
- Other minor fixes and improvements.
......@@ -56,7 +56,7 @@ In case you are using your own environment, copy the JAR file to a folder of you
You can start the application with the following command::
java -jar configuration-wizard-1.0.3.jar
java -jar configuration-wizard-1.0.4.jar
This way the configuration wizard will be available at `http://localhost:8080/config-wizard.`
......@@ -81,7 +81,7 @@ to run the wizard again whenever you need it.
To run the configuration wizard, execute the following command.
It will mount the named volume in the container so that the configuration wizard can store the configuration in the volume. ::
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -p 8080:8080 --name eidas-configuration-wizard eidas-configuration-wizard
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -p 8080:8080 --name eidas-configuration-wizard governikus/eidas-configuration-wizard:1.0.4
Running this command the configuration wizard will be available on http://localhost:8080/config-wizard.
......@@ -95,7 +95,7 @@ with the alias ``localhost`` and the password ``123456`` for the keystore and th
You can also use PKCS12 keystores,
in this case you must change the value of ``SERVER_SSL_KEY_STORE_TYPE`` to ``PKCS12``. ::
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -v /home/user/keystore.jks:/opt/eidas-middleware/keystore.jks -p 443:8080 -e SERVER_SSL_KEY_STORE=file:/opt/eidas-middleware/keystore.jks -e SERVER_SSL_KEY_STORE_TYPE=JKS -e SERVER_SSL_KEY_STORE_PASSWORD=123456 -e SERVER_SSL_KEY_ALIAS=localhost -e SERVER_SSL_KEY_PASSWORD=123456 --name eidas-configuration-wizard eidas-configuration-wizard
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -v /home/user/keystore.jks:/opt/eidas-middleware/keystore.jks -p 443:8080 -e SERVER_SSL_KEY_STORE=file:/opt/eidas-middleware/keystore.jks -e SERVER_SSL_KEY_STORE_TYPE=JKS -e SERVER_SSL_KEY_STORE_PASSWORD=123456 -e SERVER_SSL_KEY_ALIAS=localhost -e SERVER_SSL_KEY_PASSWORD=123456 --name eidas-configuration-wizard governikus/eidas-configuration-wizard:1.0.4
Because the application is now bound to the host in port 443,
the configuration wizard is available at https://localhost/config-wizard.
......
.. _eidasdemoapplication:
eIDAS Demo Application
======================
Starting with version 1.0.4, we provide a simple eIDAS Demo Application to test the eIDAS Middleware.
The eIDAS Demo Application is an eIDAS Connector that sends an eIDAS request to the middleware and
displays the returned eIDAS response.
This way you can verify that the eIDAS Middleware is working correctly.
Configuration of the eIDAS Demo Application
-------------------------------------------
Because the eIDAS Demo Application is a Spring Boot Application, the ``application.properties`` file is used to configure the eIDAS Demo Application.
It must contain the following content. Adapt all the values to match your setup. ::
# The URL to the eIDAS Middleware
middleware.samlreceiverurl=https://your.middleware.host:8443/eidas-middleware/RequestReceiver
# The path to the certificate that can be used to verify the signature of the eIDAS responses from the Middleware
middleware.signature.certificate=/path/to/your/middleware_signature.crt
# The path to the keystore that will be used to sign the eIDAS request, jks or p12
demo.signature.keystore=/path/to/your/demo_signature_keystore.p12
# The alias for the demo_signature_keystore
demo.signature.alias=alias
# The pin of the keystore and key of the demo_signature_keystore
demo.signature.pin=123456
# The path to the keystore that will be used to decrypt the eIDAS responses from the Middleware
demo.decryption.keystore=/path/to/your/demo_decryption_keystore.p12
# The alias for the demo_decryption_keystore
demo.decryption.alias=alias
# The pin of the keystore and key of demo_decryption_keystore
demo.decryption.pin=123456
# Optional: Add a context path to the eIDAS Demo Application
#server.contextPath=/eIDASDemoApplication
# Optional: Change the port of the eIDAS Demo Application
server.port=8080
The ``application.properties`` file must be present in your working directory or in a subdirectory called ``config`` of your working directory.
Using the eIDAS Demo Application
--------------------------------
To use the eIDAS Demo Application, start by running the eIDAS Demo Application.
#. Change to the correct directory where the aforementioned configuration is present.
#. If not present, copy the ``eidas-demo-1.0.4.jar`` file in this directory.
#. Start the application by executing ``java -jar eidas-demo-1.0.4.jar``.
Now you must configure your eIDAS Middleware to communicate with the eIDAS Demo Application.
#. Open the URL ``http://your.demo.host:8080/Metadata``. If you have changed the port or added a context path, adapt the URL to your configuration.
#. Right-click on the page in your browser and select ``Save as`` to save the Connector metadata of the eIDAS Demo Application.
#. Export the certificate from the demo_signature_keystore.
#. Stop the eIDAS Middleware.
#. Configure the eIDAS Middleware with this metadata and certificate:
#) With the configuration wizard: Follow the instructions from :ref:`configuration-mw` but use these files when asked to upload the metadata of the connector and the corresponding signature certificate.
#) Without the configuration wizard: Copy the metadata and the certificate on the machine that runs the eIDAS Middleware. Note that you must place the metadata in an empty directory. In the file ``eidasmiddleware.properties``, change the values of the properties ``SERVICE_PROVIDER_CONFIG_FOLDER`` to the new directory containing the metadata and ``SERVICE_PROVIDER_METADATA_SIGNATURE_CERT`` to the path of the certificate.
#. Start the eIDAS Middleware. Check the log for configuration errors.
Once you have configured the eIDAS Middleware, you are ready to test your system.
#. Open the URL ``http://your.demo.host:8080/NewRequesterServlet``.
#. Click on ``Go to the eIDAS Middleware``.
#. Click on ``Understood, start online identification`` to start the authorisation procedure with your test eID card and the AusweisApp2.
#. Finally, you should be redirected to ``http://your.demo.host:8080/NewReceiverServlet``.
At the top you can see the full eIDAS SAML response with the encrypted SAML assertion.
Below that you can see the data from the test eID card.
If there was an error or the user aborted the authorisation procedure, you would see the eIDAS SAML response with the status and unencrypted assertion containing more information why the error occurred.
Using the eIDAS Demo Application in Docker
------------------------------------------
We provide an Docker image for the eIDAS Demo Application as well.
It can be found at `DockerHub <https://hub.docker.com/r/governikus/eidas-demo-application/>`_ .
Because the ``application.properties`` file and the referenced keystores must be mounted into the container, it is recommended to place the configuration file and the keystores and certificates in a single directory.
Also bear in mind that you must use the path of the container file system in the configuration when setting the keystores and certificates, e.g. ``middleware.signature.certificate=/opt/eidas-middleware/config/middleware_signature.crt``
To run the middleware, execute the following command after you have prepared the configuration, certificate and keystores::
docker run --rm -it -v /path/to/your/config-directory:/opt/eidas-middleware/config -p 8080:8080 governikus/eidas-demo-application:1.0.4
Now you can follow the steps above to configure and test the eIDAS Middleware.
To stop the eIDAS Demo Application, execute ``CTRL+C``.
There is also a docker compose file available at `GitHub <https://github.com/Governikus/eidas-middleware/blob/master/eidas-demo/docker-compose/docker-compose.yaml>`_.
You can copy this file on your local machine and create a directory called configuration in your working directory.
Then copy the configuration file and the certificate and keystores in the configuration directory.
Afterwards you can run the container by executing ``docker-compose up``.
To stop and remove the container, first execute ``CTRL+C`` followed by ``docker-compose down``.
......@@ -82,15 +82,15 @@ This way you can stop and remove the middleware Docker container and create a ne
To run the eIDAS Middleware, execute the following command.
It will mount the named volumes containing the database and configuration in the container
and the application will be available on port 8443 on . ::
and the application will be available on port 8443. ::
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -v eidas-database:/opt/eidas-middleware/database -p 8443:8443 --name eidas-middleware-application eidas-middleware-application
docker run --rm -it -v eidas-configuration:/opt/eidas-middleware/configuration -v eidas-database:/opt/eidas-middleware/database -p 8443:8443 --name eidas-middleware-application governikus/eidas-middleware-application:1.0.4
To stop and remove the container, just hit ``CTRL+C``.
To keep the container running longer without being attached to the STDOUT and STDERR, change the command to the following::
docker run -d -v eidas-configuration:/opt/eidas-middleware/configuration -v eidas-database:/opt/eidas-middleware/database -p 8443:8443 --name eidas-middleware-application eidas-middleware-application
docker run -d -v eidas-configuration:/opt/eidas-middleware/configuration -v eidas-database:/opt/eidas-middleware/database -p 8443:8443 --name eidas-middleware-application governikus/eidas-middleware-application:1.0.4
For more information on starting and stopping containers and viewing the logs,
see the `Docker Docs <https://docs.docker.com/engine/reference/run/>`_.
......@@ -134,7 +134,7 @@ Scalability
^^^^^^^^^^^
The performance of the eIDAS Middleware improves by adding more memory (RAM) and using a faster CPU.
In case the memory configuration has changed, the server needs to be restarted.
To start the JVM with more memory, add ``-Xmx`` with the new maximum memory size to the start command, e.g. ``java -Xmx8g -jar eidas-middleware-1.0.3.jar`` for 8 GB.
To start the JVM with more memory, add ``-Xmx`` with the new maximum memory size to the start command, e.g. ``java -Xmx8g -jar eidas-middleware-1.0.4.jar`` for 8 GB.
Monitoring
......@@ -161,3 +161,32 @@ The following example will show the total RAM usage:
.. hint::
If you want to use Nagios please refer to `Nagios Website <https://www.nagios.com/solutions/snmp-monitoring/>`_
.. _database_migration:
Migration Instructions
----------------------
In version 1.0.3 the database schema was changed to improve the handling of productive blacklists.
This means that you must perform a database migration when you want to upgrade a previous eIDAS Middleware Application to version 1.0.3 and later.
The database migration tool is included in every release and can be found on github.
The database migration tool needs to be configured before performing the migration.
Because this tool uses Spring Boot as well, the configuration is done in the ``application.properties`` file that must be present either in the working directory or in a subdirectory of the working directory called ``config``.
The configuration file must contain the following values. The first three values can be copied from the ``application.properties`` file that is used for the eIDAS Middleware Application. ::
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Before running the migration tool, please create a backup of your database.
Stop the eIDAS Middleware Application and copy the database file to your backup location, e.g. ``cp /opt/eidas-middleware/database/eidasmw.mv.db /path/to/your/backup-location/eidasmw.mv.db``.
To perform the migration, copy the database migration JAR file to the directory where your configuration file is available and execute the command ``java -jar database-migration-1.0.4.jar``.
If there are errors in the log output, please send the complete log output and some information on your environment to eidas-middleware@governikus.com.
......@@ -61,7 +61,7 @@ author = u'Hartje Bruns'
# The short X.Y version.
version = '1.0.4'
# The full version, including alpha/beta/rc tags.
release = '1.0.4-rc.2'
release = '1.0.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
......
......@@ -11,6 +11,7 @@ Contents
chapter/Requirements
chapter/Configuration
chapter/Operating
chapter/DemoApplication
chapter/Changelog
chapter/glossary
......
......@@ -3,7 +3,7 @@ FROM governikus/zulu-openjdk:8u172
MAINTAINER Benny Prange <benny.prange@governikus.de>
# Define the application version for the subsequent application images
ENV VERSION=1.0.4-rc.2
ENV VERSION=1.0.4
# Define the spring boot configuration directory
ENV CONFIG_DIR=/opt/eidas-middleware/configuration
......
......@@ -14,7 +14,7 @@
<parent>
<groupId>de.governikus.eumw</groupId>
<artifactId>eumw</artifactId>
<version>1.0.4-SNAPSHOT</version>
<version>1.0.4</version>
</parent>
<artifactId>eid-service</artifactId>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment