From 369f5e1eae4da0545145c1b17d6850647287f367 Mon Sep 17 00:00:00 2001 From: Thomas <> Date: Thu, 23 Mar 2023 17:25:56 +0100 Subject: feat(matching): log BM.I specific response headers 'txId' and 'pvp-txId' --- .../auth/eidas/v2/clients/AbstractSoapClient.java | 2 +- .../BmiSoapTransactionHeaderInterceptor.java | 42 ++++++++++++++++++-- .../auth/eidas/v2/clients/ernp/ErnpRestClient.java | 46 +++++++++++++++------- 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java index 20f6d2b1..593a7631 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java @@ -188,7 +188,7 @@ public class AbstractSoapClient { } // add unique TransactionId into SOAP header - handlerList.add(new BmiSoapTransactionHeaderInterceptor()); + handlerList.add(new BmiSoapTransactionHeaderInterceptor(clientType)); // add logging handler to trace messages if required if (enableTraceLogging) { diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/BmiSoapTransactionHeaderInterceptor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/BmiSoapTransactionHeaderInterceptor.java index d1de827b..de18aff5 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/BmiSoapTransactionHeaderInterceptor.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/BmiSoapTransactionHeaderInterceptor.java @@ -1,5 +1,7 @@ package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients; +import java.util.List; +import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; @@ -13,6 +15,9 @@ import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.apache.commons.lang3.StringUtils; +import org.apache.cxf.message.Message; + +import com.google.common.collect.Lists; import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils; import lombok.extern.slf4j.Slf4j; @@ -25,15 +30,31 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class BmiSoapTransactionHeaderInterceptor implements SOAPHandler { + private static final String AUTH_NS = "http://schemas.xmlsoap.org/ws/2002/04/secext"; private static final String AUTH_PREFIX = "wss"; private static final String AUTH_ELEMENT = "Security"; - - + private static final String TRANS_ID_NS = "http://egov.gv.at/pvp1.xsd"; private static final String TRANS_IDPREFIX = "pvp"; private static final String TRANS_ID_ELEMENT = "Client-Request-Id"; + private static final String HEADER_TXID = "txid"; + private static final String HEADER_PVP_TXID = "pvp-txid"; + private static final String HEADER_MSG_NOT_SET = "NOT-set"; + + private String clientName; + + /** + * BM.I specific header interceptor. + * + * @param clientType Name of the SOAP client + */ + public BmiSoapTransactionHeaderInterceptor(String clientType) { + this.clientName = clientType; + + } + @Override public boolean handleMessage(SOAPMessageContext context) { if (((Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue()) { @@ -43,8 +64,15 @@ public class BmiSoapTransactionHeaderInterceptor implements SOAPHandler> headers = (Map>) context.get(Message.PROTOCOL_HEADERS); + log.info("response for SOAP client: {} with {}:{} and {}:{}", clientName, + HEADER_TXID, extractHeaderValue(headers, HEADER_TXID), + HEADER_PVP_TXID, extractHeaderValue(headers, HEADER_PVP_TXID)); + + } return true; @@ -95,4 +123,10 @@ public class BmiSoapTransactionHeaderInterceptor implements SOAPHandler> headers, String headerName) { + List value = headers.getOrDefault(headerName, Lists.newArrayList(HEADER_MSG_NOT_SET)); + return value.isEmpty() ? HEADER_MSG_NOT_SET : value.get(0).toString(); + + } + } \ No newline at end of file diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java index 10aa020d..bbb245f1 100644 --- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java +++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java @@ -24,8 +24,12 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.http.client.HttpClient; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; @@ -126,6 +130,10 @@ public class ErnpRestClient implements IErnpClient { // ERnP person type that indicates mark a person as ZMR entry private static final String ERNP_RESPONSE_OPERATION_ZMR_FORWARD = "PersonUebernehmen"; + private static final String HEADER_TXID = "txid"; + private static final String HEADER_PVP_TXID = "pvp-txid"; + private static final String HEADER_MSG_NOT_SET = "NOT-set"; + @Autowired IConfiguration basicConfig; @Autowired @@ -886,25 +894,33 @@ public class ErnpRestClient implements IErnpClient { final RestTemplate springClient = new RestTemplate(requestFactory); springClient.setErrorHandler(buildErrorHandler()); springClient.getMessageConverters().add(0, buildCustomJacksonObjectMapper()); - // springClient.getInterceptors().add(buildTransactionIdInterceptor()); + springClient.setInterceptors(Collections.singletonList(buildTransactionIdInterceptor())); return springClient; } - // private ClientHttpRequestInterceptor buildTransactionIdInterceptor() { - // return new ClientHttpRequestInterceptor() { - // - // @Override - // public ClientHttpResponse intercept(HttpRequest request, byte[] body, - // ClientHttpRequestExecution execution) - // throws IOException { - // request.getHeaders().add("dfafsafafsaf", - // TransactionIdUtils.getTransactionId()); - // return execution.execute(request, body); - // - // } - // }; - // } + private ClientHttpRequestInterceptor buildTransactionIdInterceptor() { + return new ClientHttpRequestInterceptor() { + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { + ClientHttpResponse response = execution.execute(request, body); + + log.info("response for SOAP client: {} with {}:{} and {}:{}", FRIENDLYNAME_HTTP_CLIENT, + HEADER_TXID, extractHeaderValue(response.getHeaders(), HEADER_TXID), + HEADER_PVP_TXID, extractHeaderValue(response.getHeaders(), HEADER_PVP_TXID)); + return response; + + } + + private String extractHeaderValue(HttpHeaders headers, String headerName) { + List value = headers.get(headerName); + return value == null || value.isEmpty() ? HEADER_MSG_NOT_SET : value.get(0); + + } + }; + } private HttpMessageConverter buildCustomJacksonObjectMapper() { final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); -- cgit v1.2.3