Skip to content
Snippets Groups Projects
Commit a32ffe20 authored by OZG-Cloud Team's avatar OZG-Cloud Team
Browse files

Merge pull request 'OZG-7077 Alfa: Sonderzeichen "&" im Anschreiben wird den...

Merge pull request 'OZG-7077 Alfa: Sonderzeichen "&" im Anschreiben wird den Antragsdetails als html-Code angezeigt' (#188) from OZG-7077-Sonderzeichen-im-Anschreiben into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/eingang-manager/pulls/188


Reviewed-by: default avatarOZG-Cloud Team <noreply@ozg-sh.de>
parents 480e0059 e598f4ca
No related branches found
No related tags found
No related merge requests found
......@@ -31,6 +31,7 @@ import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Safelist;
import org.springframework.stereotype.Component;
import org.springframework.web.util.HtmlUtils;
import de.ozgcloud.eingang.common.formdata.FormData;
......@@ -57,13 +58,14 @@ public class FormDataHtmlCleaner {
return value;
}
Object parseHtml(String html) {
var jsoupDocument = Jsoup.parse(html);
String parseHtml(String html) {
var outputSettings = new Document.OutputSettings(); // keep new lines
outputSettings.prettyPrint(false);
jsoupDocument.outputSettings(outputSettings);
var innerHtml = jsoupDocument.html().replace("\\\\n", "\n");
return Jsoup.clean(innerHtml, "", Safelist.none(), outputSettings);
var htmlText = Jsoup.clean(replaceNewLines(html), "", Safelist.none(), outputSettings);
return HtmlUtils.htmlUnescape(htmlText);
}
private String replaceNewLines(String html) {
return html.replace("\\\\n", "\n");
}
}
/*
* Copyright (C) 2023 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.eingang.formcycle;
import static org.assertj.core.api.Assertions.*;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
class FormDataHtmlCleanerITCase {
@Spy
@InjectMocks
private FormDataHtmlCleaner cleaner;
static final String KEY_LABEL = "label";
static final String KEY_VALUE = "value";
static final Map<String, Object> FORM_DATA_MAP = Map.of("tf1", Map.of(
KEY_LABEL, "<p><em>Label</em></p>",
KEY_VALUE, "<i>Value</i>"),
"fs1", Map.of(
KEY_LABEL, "Key",
KEY_VALUE, Map.of(
"tf3", Map.of(
KEY_LABEL, "<p><s>Label</s></p>",
KEY_VALUE, "ein Text mit <html><body><h1>Hello</h1><body><html>")),
"tf4", Map.of(
KEY_LABEL, "<p><span style=\"background-color:#1abc9c;\">Wichtig</span></p>",
KEY_VALUE, "Text"),
"ed1", Map.of(
KEY_LABEL,
"<ol>\n\t<li><em><strong><u>ganz</u></strong></em></li>\n\t<li><span style=\"color:#e74c3c;"
+ "\">bunt</span></li>\n</ol>",
KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen"
)));
static final Map<String, Object> EXPECTED_MAP = Map.of("tf1", Map.of(
KEY_LABEL, "Label",
KEY_VALUE, "Value"),
"fs1", Map.of(
KEY_LABEL, "Key",
KEY_VALUE, Map.of(
"tf3", Map.of(
KEY_LABEL, "Label",
KEY_VALUE, "ein Text mit Hello")),
"tf4", Map.of(
KEY_LABEL, "Wichtig",
KEY_VALUE, "Text"),
"ed1", Map.of(
KEY_LABEL,
"\n\tganz\n\tbunt\n",
KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen"
)));
@Test
void shouldCleanHtml() {
var result = cleaner.clean(FormDataTestFactory.createBuilder().formData(FORM_DATA_MAP).build());
assertThat(result.getFormData()).usingRecursiveComparison().isEqualTo(EXPECTED_MAP);
}
}
\ No newline at end of file
......@@ -30,8 +30,11 @@ import java.util.List;
import java.util.Map;
import org.assertj.core.data.MapEntry;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.InjectMocks;
import org.mockito.Spy;
......@@ -172,58 +175,31 @@ class FormDataHtmlCleanerTest {
}
@Nested
class TestHtmlCleaner {
static final String KEY_LABEL = "label";
static final String KEY_VALUE = "value";
static final Map<String, Object> FORM_DATA_MAP = Map.of("tf1", Map.of(
KEY_LABEL, "<p><em>&Auml;</em></p>",
KEY_VALUE, "Ä - Wert"),
"tf2", Map.of(
KEY_LABEL, "<p><strong>&Ouml;</strong></p>",
KEY_VALUE, "Ö - Wert"),
"fs1", Map.of(
KEY_LABEL, "Ü",
KEY_VALUE, Map.of(
"tf3", Map.of(
KEY_LABEL, " <p><s>Label mit</s> &szlig;</p>",
KEY_VALUE, "ein Text mit ß und <html><body><h1>Hello</h1><body><html>")),
"tf4", Map.of(
KEY_LABEL, "<p><span style=\"background-color:#1abc9c;\">&auml;</span></p>",
KEY_VALUE, "Text"),
"ed1", Map.of(
KEY_LABEL,
"<ol>\n\t<li><em><strong><u>&ouml;</u></strong></em></li>\n\t<li><span style=\"color:#e74c3c;\">&uuml;</span></li>\n</ol>",
KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen"
)));
static final Map<String, Object> EXPECTED_MAP = Map.of("tf1", Map.of(
KEY_LABEL, "Ä",
KEY_VALUE, "Ä - Wert"),
"tf2", Map.of(
KEY_LABEL, "Ö",
KEY_VALUE, "Ö - Wert"),
"fs1", Map.of(
KEY_LABEL, "Ü",
KEY_VALUE, Map.of(
"tf3", Map.of(
KEY_LABEL, "Label mit ß",
KEY_VALUE, "ein Text mit ß und Hello")),
"tf4", Map.of(
KEY_LABEL, "ä",
KEY_VALUE, "Text"),
"ed1", Map.of(
KEY_LABEL,
"\n\tö\n\tü\n",
KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen"
)));
class TestParseHtml {
@Test
void shouldCleanHtml() {
var result = cleaner.clean(FormData.builder().formData(FORM_DATA_MAP).build());
void shouldParseHtml() {
var result = cleaner.parseHtml("<html><body><h1>Hello</h1><body><html>");
assertThat(result.getFormData()).isEqualTo(EXPECTED_MAP);
assertThat(result).isEqualTo("Hello");
}
@DisplayName("should decode german characters")
@ParameterizedTest(name = "{0} => {2}")
@CsvSource({ "&Auml;, Ä", "&Ouml;, Ö", "&Uuml;, Ü", "&szlig;, ß" })
void shouldDecodeUmlaut(String srcValue, String expectedValue) {
var result = cleaner.parseHtml(srcValue);
assertThat(result).isEqualTo(expectedValue);
}
@DisplayName("should decode special characters")
@ParameterizedTest(name = "{0} => {1}")
@CsvSource(value = { "&amp;, &", "&lt;, <,", "&gt;, >", "&quot;, \"", "&#39;, '" }, quoteCharacter = '`')
void shouldDecodeAmpersand(String src, String expected) {
var result = cleaner.parseHtml(src);
assertThat(result).isEqualTo(expected);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment