From edfef8e7e8bd4eb72c077136470d275ee07625b2 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Wed, 11 Dec 2024 10:37:41 +0100 Subject: [PATCH] OZG-4094 Replace old osi-postfach with osvi2-postfach --- nachrichten-manager-server/pom.xml | 6 + .../nachrichten/postfach/osi/Message.java | 85 ---------- .../postfach/osi/MessageAttachment.java | 41 ----- .../osi/MessageAttachmentService.java | 88 ----------- .../osi/MockOsiPostfachConfiguration.java | 39 ----- .../osi/MockOsiPostfachRestTemplate.java | 39 ----- .../osi/OsiPostfachMessageMapper.java | 83 ---------- .../postfach/osi/OsiPostfachProperties.java | 63 -------- .../osi/OsiPostfachRemoteService.java | 148 ------------------ .../OsiPostfachServerProcessException.java | 36 ----- .../postfach/osi/PostfachConfiguration.java | 99 ------------ .../nachrichten/postfach/osi/ReplyOption.java | 17 -- 12 files changed, 6 insertions(+), 738 deletions(-) delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/Message.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachment.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachmentService.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachConfiguration.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachRestTemplate.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapper.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachProperties.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteService.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachServerProcessException.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/PostfachConfiguration.java delete mode 100644 nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/ReplyOption.java diff --git a/nachrichten-manager-server/pom.xml b/nachrichten-manager-server/pom.xml index 2983ff7..91b6a83 100644 --- a/nachrichten-manager-server/pom.xml +++ b/nachrichten-manager-server/pom.xml @@ -48,6 +48,7 @@ <bayernid-proxy-interface.version>0.7.0</bayernid-proxy-interface.version> <vorgang-manager.version>2.17.0</vorgang-manager.version> <muk-postfach.version>0.1.0</muk-postfach.version> + <osiv2-postfach.version>0.1.1-SNAPSHOT</osiv2-postfach.version> <api-lib.version>0.13.0</api-lib.version> <ozgcloud-common.version>4.5.0</ozgcloud-common.version> </properties> @@ -88,6 +89,11 @@ <artifactId>muk-postfach</artifactId> <version>${muk-postfach.version}</version> </dependency> + <dependency> + <groupId>de.ozgcloud.osiv2</groupId> + <artifactId>osiv2-postfach</artifactId> + <version>${osiv2-postfach.version}</version> + </dependency> <dependency> <groupId>de.ozgcloud.info</groupId> diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/Message.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/Message.java deleted file mode 100644 index 0af5a29..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/Message.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonValue; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.Singular; -import lombok.ToString; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -@ToString -@Builder -public class Message { - - @RequiredArgsConstructor - public enum EidasLevel { - LOW(0), MEDIUM(1), HIGH(2); - - private final int numValue; - - @JsonValue - public int toValue() { - return numValue; - } - } - - private String messageId; - - @JsonProperty("sequenceNumber") - private String vorgangId; - - @JsonProperty("nameIdentifier") - private String postfachId; - - private String subject; - @JsonProperty("body") - private String mailBody; - - @JsonProperty("isHtml") - private boolean isHtml; - - @JsonProperty("replyAction") - @Builder.Default - private ReplyOption replyOption = ReplyOption.FORBIDDEN; - @Builder.Default - private EidasLevel eidasLevel = EidasLevel.MEDIUM; - - @JsonProperty("isObligatory") - private boolean rechtsverbindlich; - - @Singular - private List<MessageAttachment> attachments; -} diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachment.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachment.java deleted file mode 100644 index 58bfba6..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachment.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@ToString -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Getter -public class MessageAttachment { - - private String fileName; - private String content; -} diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachmentService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachmentService.java deleted file mode 100644 index c6c2170..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MessageAttachmentService.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.Base64; - -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.nachrichten.postfach.AttachmentFile; -import de.ozgcloud.nachrichten.postfach.BinaryFileService; -import de.ozgcloud.nachrichten.postfach.FileId; -import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService; -import lombok.val; - -@Service -public class MessageAttachmentService { - - @Autowired - private PersistPostfachNachrichtService persistPostfachNachrichtService; - - @Autowired - private BinaryFileService binaryFileService; - - public MessageAttachment getMessageAttachment(FileId fileId) { - try { - val metadata = binaryFileService.getFile(fileId).getMetadata(); - return MessageAttachment.builder() - .fileName(metadata.getString("name")) - .content(getAttachmentContent(fileId)) - .build(); - } catch (IOException e) { - throw new TechnicalException(e.getMessage(), e); - } - } - - String getAttachmentContent(FileId fileId) throws IOException { - ByteArrayOutputStream contentStream = new ByteArrayOutputStream(); - IOUtils.copy(getAttachmentContentStream(fileId), contentStream); - return encodeAttachmentContent(contentStream.toByteArray()); - } - - private String encodeAttachmentContent(byte[] content) { - return new String(Base64.getEncoder().encode(content)); - } - - public String persistAttachment(String vorgangId, MessageAttachment attachment) { - return persistPostfachNachrichtService.persistAttachment(vorgangId, mapAttachmentFile(attachment)); - } - - AttachmentFile mapAttachmentFile(MessageAttachment attachment) { - return AttachmentFile.builder() - .name(attachment.getFileName()) - .content(() -> IOUtils.toInputStream(attachment.getContent(), Charset.defaultCharset())).build(); - } - - InputStream getAttachmentContentStream(FileId fileId) { - return binaryFileService.getUploadedFileStream(fileId); - } - -} diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachConfiguration.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachConfiguration.java deleted file mode 100644 index 0664694..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.web.client.RestTemplate; - -@Profile("e2e") -@Configuration -public class MockOsiPostfachConfiguration { - - @Bean - public RestTemplate restTemplate() { - return new MockOsiPostfachRestTemplate(); - } -} \ No newline at end of file diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachRestTemplate.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachRestTemplate.java deleted file mode 100644 index 364d8be..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/MockOsiPostfachRestTemplate.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; - -class MockOsiPostfachRestTemplate extends RestTemplate { - - @Override - public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) - throws RestClientException { - return ResponseEntity.ok().build(); - } -} \ No newline at end of file diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapper.java deleted file mode 100644 index 38c7c4a..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapper.java +++ /dev/null @@ -1,83 +0,0 @@ -package de.ozgcloud.nachrichten.postfach.osi; - -import java.util.List; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.ReportingPolicy; -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.nachrichten.postfach.FileId; -import de.ozgcloud.nachrichten.postfach.PostfachAddress; -import de.ozgcloud.nachrichten.postfach.PostfachNachricht; -import de.ozgcloud.nachrichten.postfach.StringBasedIdentifier; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN) -public abstract class OsiPostfachMessageMapper { - - private static final String POSTFACH_ADDRESS_VERSION = "1.0"; - private static final int POSTFACH_ADDRESS_TYPE = 1; - - @Autowired - private MessageAttachmentService messageAttachmentService; - - @Mapping(target = "attachment", ignore = true) - @Mapping(target = "isHtml", constant = "true") - @Mapping(target = "rechtsverbindlich", constant = "false") - @Mapping(target = "eidasLevel", constant = "MEDIUM") - @Mapping(target = "postfachId", expression = "java(toPostfachId(nachricht))") - @Mapping(target = "mailBody", qualifiedByName = "replaceNewLine") - public abstract Message toOsiMessage(PostfachNachricht nachricht); - - @Mapping(target = "createdBy", ignore = true) - @Mapping(target = "id", ignore = true) - @Mapping(target = "messageCode", ignore = true) - @Mapping(target = "sentAt", ignore = true) - @Mapping(target = "sentSuccessful", ignore = true) - @Mapping(target = "createdAt", expression = "java(java.time.ZonedDateTime.now())") - @Mapping(target = "direction", constant = "IN") - @Mapping(target = "attachments", expression = "java(persistAttachements(message.getVorgangId() ,message.getAttachments()))") - @Mapping(target = "postfachAddress", expression = "java(buildPostfachAddressByPostfachId(message.getPostfachId()))") - @Mapping(target = "mailBody", qualifiedByName = "clearReceivedMessage") - public abstract PostfachNachricht toPostfachNachricht(Message message); - - List<MessageAttachment> map(List<String> attachedFileIds) { - return attachedFileIds.stream().map(FileId::from).map(fileId -> messageAttachmentService.getMessageAttachment(fileId)).toList(); - } - - List<String> persistAttachements(String vorgangId, List<MessageAttachment> attachments) { - return attachments.stream().map(attachment -> messageAttachmentService.persistAttachment(vorgangId, attachment)).toList(); - } - - String toPostfachId(PostfachNachricht nachricht) { - return Optional.ofNullable(nachricht.getPostfachAddress()) - .map(PostfachAddress::getIdentifier) - .filter(StringBasedIdentifier.class::isInstance) - .map(StringBasedIdentifier.class::cast) - .map(StringBasedIdentifier::getPostfachId) - .orElse(StringUtils.EMPTY); - } - - PostfachAddress buildPostfachAddressByPostfachId(String postfachId) { - return PostfachAddress.builder() - .type(POSTFACH_ADDRESS_TYPE) - .version(POSTFACH_ADDRESS_VERSION) - .identifier(StringBasedIdentifier.builder().postfachId(postfachId).build()) - .serviceKontoType(OsiPostfachRemoteService.POSTFACH_TYPE) - .build(); - - } - - @Named("replaceNewLine") - String replaceNewlines(String nachricht) { - return Optional.ofNullable(nachricht).map(str -> str.replaceAll("(\r\n|\n)", "<br>")).orElse(null); - } - - @Named("clearReceivedMessage") - String clearReceivedMessage(String nachricht) { - return Optional.ofNullable(nachricht).map(str -> str.replace("&", "&")).orElse(null); - } -} \ No newline at end of file diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachProperties.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachProperties.java deleted file mode 100644 index 5b3b306..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachProperties.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Configuration -@ConfigurationProperties(prefix = OsiPostfachProperties.PROXY_API_PREFIX) -public class OsiPostfachProperties { - - static final String PREFIX = "ozgcloud.osi.postfach"; - static final String PROXY_API_PREFIX = PREFIX + ".proxyapi"; - - private String url; - private String key; - private String realm; - - @Autowired - private ProxyConfiguration proxyConfiguration; - - @Getter - @Setter - @Configuration - @ConfigurationProperties(prefix = ProxyConfiguration.PREFIX) - static class ProxyConfiguration { - static final String PREFIX = OsiPostfachProperties.PREFIX + ".http-proxy"; - - private String host; - private Integer port; - - private boolean authenticationRequired; - private String username; - private String password; - } -} diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteService.java deleted file mode 100644 index bde0737..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteService.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import java.util.Arrays; -import java.util.Objects; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import jakarta.annotation.PostConstruct; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -import de.ozgcloud.nachrichten.postfach.NotConfiguredException; -import de.ozgcloud.nachrichten.postfach.PostfachBadRequestException; -import de.ozgcloud.nachrichten.postfach.PostfachNachricht; -import de.ozgcloud.nachrichten.postfach.PostfachRemoteService; -import de.ozgcloud.nachrichten.postfach.PostfachRuntimeException; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -@ConditionalOnProperty(prefix = OsiPostfachProperties.PROXY_API_PREFIX, name = { "url", "key", "realm" }) -class OsiPostfachRemoteService implements PostfachRemoteService { - - static final String POSTFACH_TYPE = "OSI"; - - @Autowired - private OsiPostfachMessageMapper mapper; - @Autowired - private OsiPostfachProperties properties; - @Autowired(required = false) - private RestTemplate restTemplate; - - @PostConstruct - public void init() { - LOG.info("OSI Postfach remote service initialized."); - if (isNotConfigured()) { - LOG.warn("OSI Postfach Api not configured. Failed to read config " + OsiPostfachProperties.PROXY_API_PREFIX); - } - } - - @Override - public void sendMessage(PostfachNachricht nachricht) { - checkWhetherIsConfigured(); - - HttpEntity<Message> request = new HttpEntity<>(mapper.toOsiMessage(nachricht)); - - var response = executeHandlingException( - () -> restTemplate.exchange(properties.getUrl(), HttpMethod.POST, request, String.class)); - - sentFailed(response); - } - - @Override - public Stream<PostfachNachricht> getAllMessages() { - checkWhetherIsConfigured(); - - ResponseEntity<Message[]> response = executeHandlingException( - () -> restTemplate.exchange(properties.getUrl(), HttpMethod.GET, null, Message[].class)); - - if (Objects.isNull(response.getBody())) { - LOG.warn("OSI Postfach response with an empty body"); - return Stream.empty(); - } - return Arrays.stream(response.getBody()).map(mapper::toPostfachNachricht); - } - - private void sentFailed(ResponseEntity<String> response) { - if (isSentFailed(response)) { - throw new OsiPostfachServerProcessException(); - } - } - - private boolean isSentFailed(ResponseEntity<String> response) { - return StringUtils.equals(response.getBody(), String.valueOf(false)); - } - - @Override - public void deleteMessage(String messageId) { - checkWhetherIsConfigured(); - - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(properties.getUrl()).queryParam("messageGuid", messageId); - executeHandlingException(() -> restTemplate.exchange(builder.toUriString(), HttpMethod.DELETE, null, String.class)); - } - - private void checkWhetherIsConfigured() { - if (isNotConfigured()) { - throw new NotConfiguredException( - "Postfach %s is not completely configured. Sending and receiving of postfach mails is not possible.".formatted(POSTFACH_TYPE)); - } - } - - private boolean isNotConfigured() { - return Objects.isNull(restTemplate) || Objects.isNull(properties.getUrl()) || Objects.isNull(properties.getKey()); - } - - private <T> T executeHandlingException(Supplier<T> runnable) { - try { - return runnable.get(); - } catch (HttpClientErrorException e) { - throw new PostfachBadRequestException(e); - } catch (RuntimeException e) { - throw new PostfachRuntimeException(e); - } - } - - @Override - public String getPostfachType() { - return POSTFACH_TYPE; - } - - @Override - public boolean isReplyAllowed() { - return true; - } - -} \ No newline at end of file diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachServerProcessException.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachServerProcessException.java deleted file mode 100644 index 4d2bcf4..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachServerProcessException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import de.ozgcloud.nachrichten.postfach.PostfachException; -import de.ozgcloud.nachrichten.postfach.PostfachMessageCode; - -public class OsiPostfachServerProcessException extends PostfachException {// NOSONAR - - private static final long serialVersionUID = 1L; - - OsiPostfachServerProcessException() { - super("Postfach server returned false", PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE); - } -} \ No newline at end of file diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/PostfachConfiguration.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/PostfachConfiguration.java deleted file mode 100644 index 669c30c..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/PostfachConfiguration.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.nachrichten.postfach.osi; - -import java.util.Objects; - -import org.apache.commons.lang3.StringUtils; -import org.apache.hc.client5.http.auth.AuthScope; -import org.apache.hc.client5.http.auth.CredentialsProvider; -import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; -import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; -import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; -import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.core5.http.HttpHost; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.boot.web.client.RestTemplateCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.web.client.RestTemplate; - -@Profile("!e2e") -@Configuration -public class PostfachConfiguration implements RestTemplateCustomizer { - - static final String HEADER_API_KEY = "apiKey"; - static final String HEADER_API_REALM = "realm"; - - @Autowired - private OsiPostfachProperties properties; - - @Bean - @ConditionalOnProperty(prefix = OsiPostfachProperties.PROXY_API_PREFIX, name = { "url", "key", "realm" }) - public RestTemplate restTemplate(RestTemplateBuilder builder, OsiPostfachProperties properties) { - return builder - .defaultHeader(HEADER_API_KEY, properties.getKey()) - .defaultHeader(HEADER_API_REALM, properties.getRealm()) - .build(); - } - - @Override - public void customize(RestTemplate restTemplate) { - if (StringUtils.isNotBlank(properties.getProxyConfiguration().getHost())) { - setProxy(restTemplate); - } - } - - private void setProxy(RestTemplate restTemplate) { - var proxyConfig = properties.getProxyConfiguration(); - var port = Objects.isNull(proxyConfig.getPort()) ? -1 : proxyConfig.getPort(); - var proxy = new HttpHost(proxyConfig.getHost(), port); - - var httpClient = HttpClientBuilder.create() - .setProxy(proxy).setDefaultCredentialsProvider(buildCredentialsProvider(proxy)) - .build(); - - HttpClients.custom().build(); - restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)); - } - - private CredentialsProvider buildCredentialsProvider(HttpHost proxyHost) { - var proxyConfig = properties.getProxyConfiguration(); - - if (!proxyConfig.isAuthenticationRequired()) { - return null; - } - - var credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials( - new AuthScope(proxyHost), - new UsernamePasswordCredentials(proxyConfig.getUsername(), proxyConfig.getPassword().toCharArray())); - return credsProvider; - } - -} diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/ReplyOption.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/ReplyOption.java deleted file mode 100644 index 92fb168..0000000 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/osi/ReplyOption.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.nachrichten.postfach.osi; - -import com.fasterxml.jackson.annotation.JsonValue; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public enum ReplyOption { - POSSIBLE(0), MANDATORY(1), FORBIDDEN(2); - - private final int numValue; - - @JsonValue - public int toValue() { - return numValue; - } -} \ No newline at end of file -- GitLab