From c978c6dfd0fd0aff53895c08a264904818b14873 Mon Sep 17 00:00:00 2001 From: OZG-Cloud Team <noreply@ozg-sh.de> Date: Wed, 12 Apr 2023 09:19:10 +0200 Subject: [PATCH] OZG-3136 cleanup integration testing --- .gitignore | 2 + xta-adapter/pom.xml | 5 ++ xta-adapter/readme.md | 19 +++++++- .../eingang/xta/XtaRemoteService.java | 4 +- .../xta/XtaRemoteServiceConfiguration.java | 44 +++++++----------- .../src/main/resources/application-local.yml | 5 ++ .../src/main/resources/application.yml | 9 ---- .../eingang/xta/XtaApplicationTest.java | 20 ++++++++ .../eingang/xta/XtaRemoteServiceITCase.java | 23 +++++---- .../src/test/resources/KOP_SH_KIEL_DEV.p12 | Bin 13210 -> 0 bytes .../src/test/resources/KOP_SH_KIEL_DEV.pfx | Bin 7678 -> 0 bytes .../src/test/resources/application-itcase.yml | 5 ++ .../src/test/resources/xtaTestStore.p12 | Bin 0 -> 2768 bytes 13 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 xta-adapter/src/main/resources/application-local.yml create mode 100644 xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java delete mode 100644 xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.p12 delete mode 100644 xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.pfx create mode 100644 xta-adapter/src/test/resources/application-itcase.yml create mode 100644 xta-adapter/src/test/resources/xtaTestStore.p12 diff --git a/.gitignore b/.gitignore index 863349c7..5224ca6b 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ build/ ### VS Code ### .vscode/ + +application-sec.yml diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml index 6b216bd1..4740b9a1 100644 --- a/xta-adapter/pom.xml +++ b/xta-adapter/pom.xml @@ -40,6 +40,11 @@ <groupId>org.springframework.ws</groupId> <artifactId>spring-ws-support</artifactId> </dependency> + <dependency> + <groupId>org.springframework.ws</groupId> + <artifactId>spring-ws-test</artifactId> + <scope>test</scope> + </dependency> <!--own project --> <dependency> <groupId>de.itvsh.kop.eingangsadapter</groupId> diff --git a/xta-adapter/readme.md b/xta-adapter/readme.md index 9381635b..e5541a8c 100644 --- a/xta-adapter/readme.md +++ b/xta-adapter/readme.md @@ -1,5 +1,22 @@ +# Keystore passwort +Das Keystore und Passwort müssen extra hinzugefügt werden. Keystore irgendwo im Dateisystem ablegen. +Dazu eine Datei 'application-sec.yml' anlegen: + +ozgcloud: + xta: + keystore: + store: file:<pfad zum keystore> + password: <geheim> + +Den Dienst dann mit dem Spring-Profile 'sec' starten. + # Ceritifcade chain lokal das Root CA in keystore laden: - sudo keytool -trustcacerts -keystore /lib/jvm/java-1.17.0-openjdk-amd64/lib/security/cacerts -storepass changeit -importcert -alias dataportRoot -file DataportRootCA02.crt \ No newline at end of file + sudo keytool -trustcacerts -keystore /lib/jvm/java-1.17.0-openjdk-amd64/lib/security/cacerts -storepass changeit -importcert -alias dataportRoot -file DataportRootCA02.crt + +# Port forwarding +Um eine Verbindung zum Nachrichtenbroker aufbauen zu können, muss diese über den Hetzner-Server geroutet werden: + +ssh -L 3000:[Hetzner-Server-IP]:443 ozg-sh.de \ No newline at end of file diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java index 40d588c0..931703ba 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java @@ -22,8 +22,6 @@ import eu.osci.ws._2008._05.transport.ObjectFactory; @Service class XtaRemoteService { - private static final String URI_TEMPLATE = "https://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; - @Autowired @Valid private XtaProperties properties; @@ -55,7 +53,7 @@ class XtaRemoteService { private URI getTargetUri() { try { - return new URI(URI_TEMPLATE.formatted(properties.getServer().getName())); + return new URI(XtaRemoteServiceConfiguration.URI_TEMPLATE.formatted(properties.getServer().getName())); } catch (URISyntaxException e) { throw new TechnicalException("Error building target url: " + e); } diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java index d4032da2..f57da92e 100644 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java +++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java @@ -10,9 +10,7 @@ import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @@ -20,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.ws.client.support.destination.DestinationProvider; import org.springframework.ws.client.support.interceptor.ClientInterceptor; @@ -33,7 +32,7 @@ import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException; @Configuration public class XtaRemoteServiceConfiguration { - private static final String KEYSTORE_TYPE = "PKCS12"; + static final String URI_TEMPLATE = "https://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; @Autowired private XtaProperties properties; @@ -47,9 +46,9 @@ public class XtaRemoteServiceConfiguration { } @Bean + @Profile("local") WebServiceTemplateCustomizer webServiceTemplateCustomizer() { - return template -> template - .setMessageSender(messageSender()); + return template -> template.setMessageSender(messageSender()); } @Bean @@ -79,7 +78,7 @@ public class XtaRemoteServiceConfiguration { DestinationProvider destinationProvider() { return () -> { try { - return new URI("https://localhost:3000/MB_XTA-WS/XTA210msgBoxPort.svc"); + return new URI(URI_TEMPLATE.formatted(properties.getServer().getAddress())); } catch (URISyntaxException e) { throw new TechnicalException("Error building URI", e); } @@ -94,26 +93,18 @@ public class XtaRemoteServiceConfiguration { } @Bean + @Profile("local") WebServiceMessageSender messageSender() { - return initMessageSender(); - } - - HttpsUrlConnectionMessageSender initMessageSender() { try { var keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(xtaKeyStore(), properties.getKeyStore().getPassword()); - var messageSender = new HttpsUrlConnectionMessageSender(); - messageSender.setKeyManagers(keyManagerFactory.getKeyManagers()); - messageSender.setTrustManagers(new TrustManager[] { new UnTrustworthyTrustManager() }); - messageSender.setHostnameVerifier(new HostnameVerifier() { - - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } - }); - return messageSender; + var messageSender1 = new HttpsUrlConnectionMessageSender(); + messageSender1.setKeyManagers(keyManagerFactory.getKeyManagers()); + messageSender1.setTrustManagers(new TrustManager[] { new UnTrustworthyTrustManager() }); + messageSender1.setHostnameVerifier((hostname, session) -> true); // NOSONAR only for test/local + + return messageSender1; } catch (Exception e) { throw new TechnicalException("Error initializating message sender.", e); } @@ -122,11 +113,8 @@ public class XtaRemoteServiceConfiguration { @Bean KeyStore xtaKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException { var keyStoreResource = properties.getKeyStore().getFile(); -// var keysres = XtaRemoteServiceConfiguration.class.getResourceAsStream("/KOP_SH_KIEL_DEV.p12"); -// assert (keysres != null); - var keyStore = KeyStore.getInstance(KEYSTORE_TYPE); + var keyStore = KeyStore.getInstance(properties.getKeyStore().getType()); try (InputStream keyStoreStream = keyStoreResource.getInputStream()) { -// try (InputStream keyStoreStream = keysres) { keyStore.load(keyStoreStream, properties.getKeyStore().getPassword()); } @@ -135,16 +123,16 @@ public class XtaRemoteServiceConfiguration { static class UnTrustworthyTrustManager implements X509TrustManager { @Override - public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // NOSONAR only for test/local } @Override - public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // NOSONAR only for test/local } @Override public X509Certificate[] getAcceptedIssuers() { - return null; + return new X509Certificate[0]; } } } diff --git a/xta-adapter/src/main/resources/application-local.yml b/xta-adapter/src/main/resources/application-local.yml new file mode 100644 index 00000000..b6142ac1 --- /dev/null +++ b/xta-adapter/src/main/resources/application-local.yml @@ -0,0 +1,5 @@ +ozgcloud: + xta: + server: + address: localhost:3000 + name: LI33-0005 \ No newline at end of file diff --git a/xta-adapter/src/main/resources/application.yml b/xta-adapter/src/main/resources/application.yml index 980bf841..710c65c6 100644 --- a/xta-adapter/src/main/resources/application.yml +++ b/xta-adapter/src/main/resources/application.yml @@ -1,8 +1,3 @@ -spring: - profiles: - active: - - sec - logging: level: ROOT: WARN @@ -13,11 +8,7 @@ logging: ozgcloud: xta: max-list-elements: 10 - server: - name: LI33-0005 - address: localhost:3000 keystore: - file: classpath:KOP_SH_KIEL_DEV.p12 type: PKCS12 actions: status-list: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest" \ No newline at end of file diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java new file mode 100644 index 00000000..8a57fa74 --- /dev/null +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java @@ -0,0 +1,20 @@ +package de.ozgcloud.eingang.xta; + +import static org.junit.Assert.*; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import de.itvsh.kop.eingangsadapter.Application; + +@ActiveProfiles({ "local", "itcase" }) +@SpringBootTest(classes = Application.class) +class XtaApplicationTest { + + @Test + void startup() { + // should start without exception; + assertTrue(true); + } +} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java index d7a52c3a..ed30f74a 100644 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java +++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceITCase.java @@ -2,10 +2,9 @@ package de.ozgcloud.eingang.xta; import static org.assertj.core.api.Assertions.*; -import java.net.URISyntaxException; - import jakarta.validation.Valid; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -13,14 +12,15 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import de.itvsh.kop.eingangsadapter.Application; -import eu.osci.ws._2008._05.transport.MsgStatusListType; +import lombok.SneakyThrows; -@ActiveProfiles({ "itcase", "local", "sec" }) +@Disabled("real live test - do only activate for manual testing") +@ActiveProfiles({ "itcase", "local" }) @SpringBootTest(classes = Application.class) class XtaRemoteServiceITCase { @Autowired - private XtaRemoteService xtaRemoteService; + private XtaRemoteService remoteService; @Autowired @Valid private XtaProperties xtaProperties; @@ -33,11 +33,16 @@ class XtaRemoteServiceITCase { } } - @Test - void test() throws URISyntaxException { - MsgStatusListType rsp = xtaRemoteService.getStatusList(); + @Nested + class TestGetStatusList { + + @SneakyThrows + @Test + void shouldSendRequestWithIdentifier() { + + remoteService.getStatusList(); - assertThat(rsp.getMessageMetaData()).isNotEmpty(); + } } } diff --git a/xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.p12 b/xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.p12 deleted file mode 100644 index 2fba6f4b2e751d74d1ce155b2f6415d83d256410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13210 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 Q`OUDo@0Tz!Gqx=N0HmM>L;wH) diff --git a/xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.pfx b/xta-adapter/src/test/resources/KOP_SH_KIEL_DEV.pfx deleted file mode 100644 index e3cfb904cfa693ffa5e61e55c6bea59195d4a9c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7678 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 WY5DRfy{-hul?USwJl+JFiv<9j1?fuw diff --git a/xta-adapter/src/test/resources/application-itcase.yml b/xta-adapter/src/test/resources/application-itcase.yml new file mode 100644 index 00000000..3507852f --- /dev/null +++ b/xta-adapter/src/test/resources/application-itcase.yml @@ -0,0 +1,5 @@ +ozgcloud: + xta: + keystore: + file: classpath:xtaTestStore.p12 + password: <geheim> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/xtaTestStore.p12 b/xta-adapter/src/test/resources/xtaTestStore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..a0cc212c49745a428186d0d4f2f73dd6ac7f24ff GIT binary patch literal 2768 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 P6^{eYHd-+;sS5xAda~bQ literal 0 HcmV?d00001 -- GitLab