diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index 1712e7fc5a4824b0dc03ed97b66f74cd987c2aca..fcc430525e0f29a84d26e9e25072f47e8051acd5 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -28,10 +28,11 @@ <spring-admin.version>2.3.1</spring-admin.version> <commons-io.version>2.8.0</commons-io.version> - + <spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName> <zip.version>2.7.0</zip.version> + <jsoup.version>1.13.1</jsoup.version> </properties> <dependencies> @@ -119,6 +120,11 @@ <artifactId>zip4j</artifactId> <version>${zip.version}</version> </dependency> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + <version>${jsoup.version}</version> + </dependency> <!-- Dev --> <dependency> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoService.java new file mode 100644 index 0000000000000000000000000000000000000000..7e1ffbdc83596eff2597eb1e50cb24be320913d1 --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoService.java @@ -0,0 +1,73 @@ +package de.itvsh.ozg.pluto.common.util; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +import javax.annotation.PostConstruct; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Service; +import org.springframework.util.StreamUtils; + +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Service +public class ForwardingLandesnetzInfoService { + + private static final String LANDESNETZ_TABLE_IDENTIFIER = "tbl_domains"; + + @Autowired + private ResourceLoader resourceLoader; + + @Value("${pluto.forwarding.lninfo.url}") + private String lnInfoUrl; + + List<String> landesnetzInfo = new LinkedList<>(); + + @PostConstruct + private void initLandesnetzList() { + var html = getResourceAsString(); + + if (html.isPresent()) { + landesnetzInfo = JSoupUtil.parseFromHtml(html.get(), LANDESNETZ_TABLE_IDENTIFIER); + LOG.info("Die Landesnetzinfo wurde ohne Fehler eingelesen"); + } else { + LOG.info("Die Landesnetzinfo konnte nicht gefunden werden."); + } + } + + private Optional<String> getResourceAsString() { + try { + return Optional.ofNullable(StreamUtils.copyToString(resourceLoader.getResource(lnInfoUrl).getInputStream(), Charset.defaultCharset())); + } catch (IOException e) { + LOG.info("Fehler beim Einlesen der Landesnetzinfo", e); + } + return Optional.empty(); + } + + public boolean isInLandesnetz(String email) { + return includesDomain(getDomainPart(email)); + } + + private String getDomainPart(String email) { + return email.substring(email.lastIndexOf('@') + 1, email.length()); + } + + private boolean includesDomain(String domainPart) { + for (String netz : landesnetzInfo) { + if (netz.startsWith(".") && domainPart.contains(netz)) { + return true; + } else if (StringUtils.equals(netz, domainPart)) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/JSoupUtil.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/JSoupUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..017497c55f70ee26a46beb7fc177560ce9ceb45f --- /dev/null +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/util/JSoupUtil.java @@ -0,0 +1,71 @@ +package de.itvsh.ozg.pluto.common.util; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PACKAGE) +public class JSoupUtil { + + public static List<String> parseFromHtml(String html, String tableIdentifier) { + return JSoupUtil.parseFromDoc(Jsoup.parse(html), tableIdentifier); + } + + private static List<String> parseFromDoc(Document doc, String tableIdentifier) { + List<String> list = new LinkedList<>(); + + getTableColumnList(doc, tableIdentifier).forEach(tableElement -> verifyEntry(list, tableElement)); + + return list; + } + + private static List<Element> getTableColumnList(Document doc, String tableIdentifier) { + return doc.select("#" + tableIdentifier + " tr"); + } + + private static void verifyEntry(List<String> list, Element element) { + if (isTableEntry(element)) { + addEntry(list, element); + } + } + + private static boolean isTableEntry(Element element) { + return !isHeaderEntry(element) && !element.childNodes().isEmpty(); + } + + private static boolean isHeaderEntry(Node element) { + return StringUtils.equals(element.attr("class"), "header"); + } + + private static void addEntry(List<String> list, Element element) { + var netzName = getNetzName(element); + + if (isLandesnetz(netzName)) { + list.add(getDomainName(element)); + } + } + + private static String getNetzName(Element element) { + return selectTextFromTdElement(element, 1); + } + + private static boolean isLandesnetz(String netzName) { + return StringUtils.equals(netzName, "LNSH"); + } + + private static String getDomainName(Element element) { + return selectTextFromTdElement(element, 0); + } + + private static String selectTextFromTdElement(Element element, int index) { + return element.select("td").get(index).text(); + } +} \ No newline at end of file diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/files/FileService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/files/FileService.java index 4351c6375c0f5aa658eaa6e730fca59edf5ffe09..ed53a36cc3276a9da8fdb7f584dad8c32be0af3d 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/files/FileService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/files/FileService.java @@ -48,7 +48,10 @@ class FileService { } public Stream<BinaryFilePersistanceWrapper> findFiles(Collection<FileId> ids) { - return StreamSupport.stream(binaryFileRepository.findAllById(mapFileIdToString(ids)).spliterator(), false); + Stream<BinaryFilePersistanceWrapper> stream = StreamSupport.stream(binaryFileRepository.findAllById(mapFileIdToString(ids)).spliterator(), + false); + var list = stream.collect(Collectors.toList()); + return list.stream(); } private Iterable<String> mapFileIdToString(Collection<FileId> ids) { diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingService.java index 89511aec4f0fccbcaf152b30028f01f24426f9a0..6d70e3bd69e6828f1076565fce44778e82cc3331 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingService.java @@ -20,10 +20,11 @@ import org.springframework.stereotype.Service; import org.springframework.util.MimeTypeUtils; import de.itvsh.ozg.mail.email.MailSendRequest; -import de.itvsh.ozg.mail.email.MailService; import de.itvsh.ozg.mail.email.MailSendRequest.MailAttachment; +import de.itvsh.ozg.mail.email.MailService; import de.itvsh.ozg.pluto.command.Command; import de.itvsh.ozg.pluto.common.errorhandling.TechnicalException; +import de.itvsh.ozg.pluto.common.util.ForwardingLandesnetzInfoService; import de.itvsh.ozg.pluto.vorgang.Vorgang; import de.itvsh.ozg.pluto.vorgang.VorgangService; import freemarker.template.Configuration; @@ -71,6 +72,8 @@ public class ForwardingService { private VorgangService vorgangService; @Autowired private ApplicationEventPublisher publisher; + @Autowired + private ForwardingLandesnetzInfoService forwardingLandesnetzService; @Value("${pluto.redirect.mail-from}") private String mailFrom; @@ -102,12 +105,16 @@ public class ForwardingService { .body(fillMailTemplate(vorgang)) .receiptRequired(true) .requestReference(forwarding) - .attachment(buildZipAttachment(vorgang, password)) + .attachment(buildZipAttachment(vorgang, password, !isInLandesnetz(forwarding.getZustaendigeStelle()))) .build(); } - MailSendRequest.MailAttachment buildZipAttachment(Vorgang vorgang, char[] password) { - var ds = new ByteArrayDataSource(zipService.buildVorgangZip(vorgang, password).toByteArray(), "application/zip"); + private boolean isInLandesnetz(String zustaendigeStelle) { + return forwardingLandesnetzService.isInLandesnetz(zustaendigeStelle); + } + + MailSendRequest.MailAttachment buildZipAttachment(Vorgang vorgang, char[] password, boolean entcrypted) { + var ds = new ByteArrayDataSource(zipService.buildVorgangZip(vorgang, password, entcrypted).toByteArray(), "application/zip"); ds.setName(buildZipFileName(vorgang)); return MailAttachment.builder() .dataSource(ds) diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderService.java index 3e63a5cdbd41e4297df3a276e536c3e5cdc74e35..7db55903ea2e8a2bddeb03202974447ab7ac3b26 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderService.java @@ -21,8 +21,8 @@ import net.lingala.zip4j.model.enums.EncryptionMethod; @Service class ZipBuilderService { - public ByteArrayOutputStream buildVorgangZip(Vorgang vorgang, char[] password) { - return new ZipBuilder(vorgang).buildZip(password); + public ByteArrayOutputStream buildVorgangZip(Vorgang vorgang, char[] password, boolean encrypted) { + return new ZipBuilder(vorgang, encrypted).buildZip(password); } class ZipBuilder { @@ -31,17 +31,19 @@ class ZipBuilderService { private static final String FILE_NAME_TEMPLATE = "%s/%s"; private final Eingang eingang; + private final boolean entcrypted; private ZipOutputStream zipOut; - ZipBuilder(Vorgang vorgang) { + ZipBuilder(Vorgang vorgang, boolean entcrypted) { this.eingang = vorgang.getEingangs().get(0); + this.entcrypted = entcrypted; } ByteArrayOutputStream buildZip(char[] password) { ByteArrayOutputStream out = new ByteArrayOutputStream(256); - try (ZipOutputStream zOut = new ZipOutputStream(out, password)) { + try (ZipOutputStream zOut = initZipOutputStream(out, password)) { this.zipOut = zOut; fillZip(); @@ -53,6 +55,14 @@ class ZipBuilderService { return out; } + private ZipOutputStream initZipOutputStream(ByteArrayOutputStream out, char[] password) { + try { + return entcrypted ? new ZipOutputStream(out, password) : new ZipOutputStream(out); + } catch (IOException e) { + throw new TechnicalException("Error writing Vorgang-ZIP", e); + } + } + private void fillZip() { addRepresentation(); addAttachments(); @@ -92,8 +102,11 @@ class ZipBuilderService { private ZipParameters buildZipParameter(String fileName) { var zipParameters = new ZipParameters(); - zipParameters.setEncryptFiles(true); - zipParameters.setEncryptionMethod(EncryptionMethod.AES); + if (entcrypted) { + zipParameters.setEncryptFiles(true); + zipParameters.setEncryptionMethod(EncryptionMethod.AES); + } + zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256); zipParameters.setFileNameInZip(fileName); diff --git a/pluto-server/src/main/resources/application.yml b/pluto-server/src/main/resources/application.yml index 8f51cae4e6ee81a1465a757e59fa6253c90b1d09..a12177d14c11502e8e1029ad43df7849579f53c5 100644 --- a/pluto-server/src/main/resources/application.yml +++ b/pluto-server/src/main/resources/application.yml @@ -22,7 +22,10 @@ pluto: redirect: mail-from: EA-Poststelle@itvsh.de production: false - + forwarding: + lninfo: + url: classpath:files/LandesnetzInfo.html + management: server: port: 8081 diff --git a/pluto-server/src/main/resources/files/LandesnetzInfo.html b/pluto-server/src/main/resources/files/LandesnetzInfo.html new file mode 100644 index 0000000000000000000000000000000000000000..00e78db377215dc1860f6831aebeb5188f34e2e1 --- /dev/null +++ b/pluto-server/src/main/resources/files/LandesnetzInfo.html @@ -0,0 +1,174 @@ +<!DOCTYPE html> +<!-- saved from url=(0054)https://lninfo.landsh.de/emaildomain/LNmailkunden.html --> +<html lang="de"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Mailrouting-Tabelle für E-Mail in SH</title> + <style> + * { + box-sizing: border-box; + font-family: Arial, Verdana, sans-serif; + } + + .clearfix::before, + .clearfix::after { + content: " "; + display: table; + } + + .clearfix::after { + clear:both; + } + + #outer_wrapper { + width:85%; + max-width: 1200px; + margin: 0 auto; + + } + + #einleitung { + font-size: 14px; + margin-bottom: 30px; + } + + #header_logo {float:left;} + #header_logo img { + width:200px; padding:10px; + } + #header h1 { + font-size: 24px; + } + #header #ueberschrift { + padding:15px 0 0 220px; + } + + #einleitung table { + margin: -15px 0 20px 15px; + } + + #einleitung td.kuerzel { + font-weight: bold; + padding-right: 10px; + + } + + + #InputSuche { + background-repeat: no-repeat; + width: 100%; + font-size: 16px; + padding: 12px 20px 12px 12px; + border: 1px solid #ddd; + margin-bottom: 12px; + } + + #tbl_domains { + border-collapse: collapse; + width: 100%; + border: 1px solid #ddd; + font-size: 16px; + } + + #tbl_domains th, + #tbl_domains td { + text-align: left; + padding: 6px; + } + + #tbl_domains tr { + border-bottom: 1px solid #ddd; + } + + #tbl_domains tr.header, + #tbl_domains tr:hover { + background-color: #f1f1f1; + } + + #letzte_aktualisierung { + margin:25px 0; + font-size:14px; + } + + </style> +<script src="chrome-extension://mooikfkahbdckldjjndioackbalphokd/assets/prompt.js"></script></head> + +<body> + + <div id="outer_wrapper"> + <div id="header"> + <div id="header_logo"><img src="./Mailrouting-Tabelle für E-Mail in SH_files/dataport_logo.png" alt="Dataport Logo"></div> + <div id="ueberschrift"><h1>Mailroutingtabelle für E-Mail SH Kunden (Fullmail)</h1></div> + <div class="clearfix"></div> + </div> + <div id="einleitung"> + <p> + In der nachfolgenden Tabelle sind Domänen gelistet, welche bei Verwendung des Dataport Mailrelays für + das LNSH (E-Mail SH) über interne Wege geroutet werden.<br> + Zu jeder Zieldomain ist ersichtlich, über welche Infrastruktur die E-Mail geroutet wird. Bei Mehrfachnennung gilt die nachfolgende Reihenfolge:<br><br> + </p> + <table> + <tbody><tr> + <td class="kuerzel">LNSH</td> + <td>Die E-Mail wird über das Landesnetz Schleswig-Holstein zum Empfänger geroutet.</td> + </tr> + <tr> + <td class="kuerzel">NdB</td> + <td>Die E-Mail wird über die Netze des Bundes zum Empfänger geroutet.</td> + </tr> + </tbody></table> + + <p> + E-Mails an Ziele, welche nicht in dieser Übersicht vorhanden sind, werden über das Internet + geroutet.</p> + <p> + <i><strong>Hinweis: </strong>Durch die Nennung einer Domäne in dieser Liste wird keine Aussage oder + Empfehlung darüber + gegeben, + welche Art von E-Mail Inhalten übertragen werden dürfen<br> + und ob diese vor dem Versand verschlüsselt werden sollten. + Bitte beachten Sie die für Ihre Organisation gültigen Regelungen. + </i> + </p> + </div> + + <input type="text" id="InputSuche" onkeyup="myFunction()" placeholder="Suche nach Domainnamen.." title="Geben Sie einen Domainnamen ein"> + + <table id="tbl_domains"> + <tbody><tr class="header"> + <th style="width:60%;">Domainame</th> + <th style="width:40%;">wird geroutet via</th> + </tr> + <tr> <td>.ltsh.de</td> <td>LNSH Altumgebung</td></tr> + <tr> <td>ltsh.de</td> <td>LNSH Altumgebung</td></tr> + <tr> <td>.itvsh.de</td> <td>LNSH</td></tr> + <tr> <td>itvsh.de</td> <td>LNSH</td></tr> + </tbody></table> + <div id="letzte_aktualisierung">Letzte Aktualisierung: 01.06.2021 14:42 Uhr - Alle Angaben ohne Gewähr.</div> + + <script> + function myFunction() { + var input, filter, table, tr, td, i, txtValue; + input = document.getElementById("InputSuche"); + filter = input.value.toUpperCase(); + table = document.getElementById("tbl_domains"); + tr = table.getElementsByTagName("tr"); + for (i = 0; i < tr.length; i++) { + td = tr[i].getElementsByTagName("td")[0]; + if (td) { + txtValue = td.textContent || td.innerText; + if (txtValue.toUpperCase().indexOf(filter) > -1) { + tr[i].style.display = ""; + } else { + tr[i].style.display = "none"; + } + } + } + } + </script> + + </div> + + + +</body></html> diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8d7c33a4899d01a415e65b16b392901fb6f86e53 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/ForwardingLandesnetzInfoServiceTest.java @@ -0,0 +1,56 @@ +package de.itvsh.ozg.pluto.common.util; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Arrays; +import java.util.LinkedList; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.core.io.ResourceLoader; + +class ForwardingLandesnetzInfoServiceTest { + + @Spy // NOSONAR + @InjectMocks // NOSONAR + private ForwardingLandesnetzInfoService service; + @Mock + private ResourceLoader resourceLoader; + + @Nested + class TestIstImLandesnetz { + + private final String IN_LANDESNETZ = "itvsh.de"; + private final String IN_LANDESNETZ_MIT_PUNKT = ".me.itvsh.de"; + + @BeforeEach + void initMap() throws Exception { + service.landesnetzInfo = new LinkedList<>(Arrays.asList(IN_LANDESNETZ, IN_LANDESNETZ_MIT_PUNKT)); + } + + @Test + void shouldReturnTrueIfIsInLandesnetzlist() { + var result = service.isInLandesnetz("email-ohne-domain@" + IN_LANDESNETZ); + + assertThat(result).isTrue(); + } + + @Test + void shouldReturnFalseIfIsNotInLandesnetzlist() { + var result = service.isInLandesnetz("email-ohne-domain@me.ltsh.de"); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnFalseIfIsNotInLandesnetzIfDomainIsNotDomain() { + var result = service.isInLandesnetz(IN_LANDESNETZ + ".email-ohne-domain@me.ltsh.de"); + + assertThat(result).isFalse(); + } + } +} \ No newline at end of file diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/JSoupUtilTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/JSoupUtilTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9786b8ef77865a2cd9a09a97ab5ddc83f4d56294 --- /dev/null +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/common/util/JSoupUtilTest.java @@ -0,0 +1,46 @@ +package de.itvsh.ozg.pluto.common.util; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import io.micrometer.core.instrument.util.IOUtils; + +class JSoupUtilTest { + + @Nested + class TestParseTableWithFile { + + private static final String TABLE_IDENTIFIER = "tbl_domains"; + + private String HTML_VALUE; + + @BeforeEach + void initResource() { + HTML_VALUE = IOUtils.toString(JSoupUtilTest.class.getClassLoader().getResourceAsStream("files/LandesnetzInfo.html")); + } + + @Test + void shouldReadFileIfExist() { + var parsedDomainList = JSoupUtil.parseFromHtml(HTML_VALUE, TABLE_IDENTIFIER); + + assertThat(parsedDomainList).isNotNull().containsExactly(".itvsh.de", "itvsh.de"); + } + + @Test + void shouldReturnEmptyMapIfFileNotExist() { + var parsedDomainList = JSoupUtil.parseFromHtml("NOT_EXIST.html", TABLE_IDENTIFIER); + + assertThat(parsedDomainList).isEmpty(); + } + + @Test + void shouldReturnEmptyMapIfIdentifierNotExist() { + var parsedDomainList = JSoupUtil.parseFromHtml(HTML_VALUE, "NOT_EXIST"); + + assertThat(parsedDomainList).isEmpty(); + } + } +} \ No newline at end of file diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingServiceTest.java index bdf1a0c7c1033ce1c01896822624fb08735eac02..9e8e577bb0eab37466c73274107e131007cd9899 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingServiceTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingServiceTest.java @@ -18,10 +18,11 @@ import org.mockito.Spy; import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.util.ReflectionTestUtils; -import de.itvsh.ozg.mail.email.MailService; import de.itvsh.ozg.mail.email.MailSendRequest.MailAttachment; +import de.itvsh.ozg.mail.email.MailService; import de.itvsh.ozg.pluto.command.Command; import de.itvsh.ozg.pluto.command.CommandTestFactory; +import de.itvsh.ozg.pluto.common.util.ForwardingLandesnetzInfoService; import de.itvsh.ozg.pluto.vorgang.AntragstellerTestFactory; import de.itvsh.ozg.pluto.vorgang.EingangHeaderTestFactory; import de.itvsh.ozg.pluto.vorgang.EingangTestFactory; @@ -43,7 +44,8 @@ class ForwardingServiceTest { private VorgangService vorgangService; @Mock private MailService mailService; - + @Mock + private ForwardingLandesnetzInfoService forwardingLandesnetzService; @Mock private ApplicationEventPublisher publisher; @@ -92,7 +94,8 @@ class ForwardingServiceTest { ReflectionTestUtils.setField(service, "mailFrom", MAIL_FROM); doReturn(BODY).when(service).fillMailTemplate(any()); - doReturn(mock(MailAttachment.class)).when(service).buildZipAttachment(any(), any()); + doReturn(mock(MailAttachment.class)).when(service).buildZipAttachment(any(Vorgang.class), + any(), anyBoolean()); } @Test diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderServiceTest.java index b4071cce708b966a828aa87f4a8450e8a48ad78f..71a852af7097981a6f3548b801a781ab83ccacf3 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderServiceTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ZipBuilderServiceTest.java @@ -41,7 +41,7 @@ class ZipBuilderServiceTest { @BeforeEach void init() { - builder = spy(service.new ZipBuilder(VorgangTestFactory.create())); + builder = spy(service.new ZipBuilder(VorgangTestFactory.create(), true)); ReflectionTestUtils.setField(builder, "zipOut", zipOut); } @@ -99,18 +99,52 @@ class ZipBuilderServiceTest { @Nested class TestBuildZip { - @Test - void shouldValidZipFile() throws IOException { - var zipFile = new ZipFile(buildZippedFile()); - assertThat(zipFile.isValidZipFile()).isTrue(); + @Nested + class TestWithEntcryption { + + @BeforeEach + void init() { + builder = spy(service.new ZipBuilder(VorgangTestFactory.create(), true)); + } + + @Test + void shouldValidZipFile() throws IOException { + var zipFile = new ZipFile(buildZippedFile()); + + assertThat(zipFile.isValidZipFile()).isTrue(); + } + + @Test + void shouldBeEncrypted() throws IOException { + var zipFile = new ZipFile(buildZippedFile()); + + assertThat(zipFile.isEncrypted()).isTrue(); + } } - @Test - void shouldBeEncrypted() throws IOException { - var zipFile = new ZipFile(buildZippedFile()); + @Nested + class TestWithNoEntcryption { + + @BeforeEach + void init() { + builder = spy(service.new ZipBuilder(VorgangTestFactory.create(), false)); + } + + @Test + void shouldValidZipFile() throws IOException { + var zipFile = new ZipFile(buildZippedFile()); + + assertThat(zipFile.isValidZipFile()).isTrue(); + } + + @Test + void shouldBeEncrypted() throws IOException { + var zipFile = new ZipFile(buildZippedFile()); + + assertThat(zipFile.isEncrypted()).isFalse(); + } - assertThat(zipFile.isEncrypted()).isTrue(); } private File buildZippedFile() throws FileNotFoundException, IOException { diff --git a/pluto-server/src/test/resources/files/LandesnetzInfo.html b/pluto-server/src/test/resources/files/LandesnetzInfo.html new file mode 100644 index 0000000000000000000000000000000000000000..00e78db377215dc1860f6831aebeb5188f34e2e1 --- /dev/null +++ b/pluto-server/src/test/resources/files/LandesnetzInfo.html @@ -0,0 +1,174 @@ +<!DOCTYPE html> +<!-- saved from url=(0054)https://lninfo.landsh.de/emaildomain/LNmailkunden.html --> +<html lang="de"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Mailrouting-Tabelle für E-Mail in SH</title> + <style> + * { + box-sizing: border-box; + font-family: Arial, Verdana, sans-serif; + } + + .clearfix::before, + .clearfix::after { + content: " "; + display: table; + } + + .clearfix::after { + clear:both; + } + + #outer_wrapper { + width:85%; + max-width: 1200px; + margin: 0 auto; + + } + + #einleitung { + font-size: 14px; + margin-bottom: 30px; + } + + #header_logo {float:left;} + #header_logo img { + width:200px; padding:10px; + } + #header h1 { + font-size: 24px; + } + #header #ueberschrift { + padding:15px 0 0 220px; + } + + #einleitung table { + margin: -15px 0 20px 15px; + } + + #einleitung td.kuerzel { + font-weight: bold; + padding-right: 10px; + + } + + + #InputSuche { + background-repeat: no-repeat; + width: 100%; + font-size: 16px; + padding: 12px 20px 12px 12px; + border: 1px solid #ddd; + margin-bottom: 12px; + } + + #tbl_domains { + border-collapse: collapse; + width: 100%; + border: 1px solid #ddd; + font-size: 16px; + } + + #tbl_domains th, + #tbl_domains td { + text-align: left; + padding: 6px; + } + + #tbl_domains tr { + border-bottom: 1px solid #ddd; + } + + #tbl_domains tr.header, + #tbl_domains tr:hover { + background-color: #f1f1f1; + } + + #letzte_aktualisierung { + margin:25px 0; + font-size:14px; + } + + </style> +<script src="chrome-extension://mooikfkahbdckldjjndioackbalphokd/assets/prompt.js"></script></head> + +<body> + + <div id="outer_wrapper"> + <div id="header"> + <div id="header_logo"><img src="./Mailrouting-Tabelle für E-Mail in SH_files/dataport_logo.png" alt="Dataport Logo"></div> + <div id="ueberschrift"><h1>Mailroutingtabelle für E-Mail SH Kunden (Fullmail)</h1></div> + <div class="clearfix"></div> + </div> + <div id="einleitung"> + <p> + In der nachfolgenden Tabelle sind Domänen gelistet, welche bei Verwendung des Dataport Mailrelays für + das LNSH (E-Mail SH) über interne Wege geroutet werden.<br> + Zu jeder Zieldomain ist ersichtlich, über welche Infrastruktur die E-Mail geroutet wird. Bei Mehrfachnennung gilt die nachfolgende Reihenfolge:<br><br> + </p> + <table> + <tbody><tr> + <td class="kuerzel">LNSH</td> + <td>Die E-Mail wird über das Landesnetz Schleswig-Holstein zum Empfänger geroutet.</td> + </tr> + <tr> + <td class="kuerzel">NdB</td> + <td>Die E-Mail wird über die Netze des Bundes zum Empfänger geroutet.</td> + </tr> + </tbody></table> + + <p> + E-Mails an Ziele, welche nicht in dieser Übersicht vorhanden sind, werden über das Internet + geroutet.</p> + <p> + <i><strong>Hinweis: </strong>Durch die Nennung einer Domäne in dieser Liste wird keine Aussage oder + Empfehlung darüber + gegeben, + welche Art von E-Mail Inhalten übertragen werden dürfen<br> + und ob diese vor dem Versand verschlüsselt werden sollten. + Bitte beachten Sie die für Ihre Organisation gültigen Regelungen. + </i> + </p> + </div> + + <input type="text" id="InputSuche" onkeyup="myFunction()" placeholder="Suche nach Domainnamen.." title="Geben Sie einen Domainnamen ein"> + + <table id="tbl_domains"> + <tbody><tr class="header"> + <th style="width:60%;">Domainame</th> + <th style="width:40%;">wird geroutet via</th> + </tr> + <tr> <td>.ltsh.de</td> <td>LNSH Altumgebung</td></tr> + <tr> <td>ltsh.de</td> <td>LNSH Altumgebung</td></tr> + <tr> <td>.itvsh.de</td> <td>LNSH</td></tr> + <tr> <td>itvsh.de</td> <td>LNSH</td></tr> + </tbody></table> + <div id="letzte_aktualisierung">Letzte Aktualisierung: 01.06.2021 14:42 Uhr - Alle Angaben ohne Gewähr.</div> + + <script> + function myFunction() { + var input, filter, table, tr, td, i, txtValue; + input = document.getElementById("InputSuche"); + filter = input.value.toUpperCase(); + table = document.getElementById("tbl_domains"); + tr = table.getElementsByTagName("tr"); + for (i = 0; i < tr.length; i++) { + td = tr[i].getElementsByTagName("td")[0]; + if (td) { + txtValue = td.textContent || td.innerText; + if (txtValue.toUpperCase().indexOf(filter) > -1) { + tr[i].style.display = ""; + } else { + tr[i].style.display = "none"; + } + } + } + } + </script> + + </div> + + + +</body></html>