From 57098c2d96a0aa39bb9c919bbb73b6857e74dc7f Mon Sep 17 00:00:00 2001 From: Thomas <> Date: Tue, 22 Aug 2023 12:17:21 +0200 Subject: chore(core): log transformation in case of missing or unknown Algorithm --- .../at/gv/egovernment/moa/util/DomUtilsTest.java | 58 ++++++++++++++++++ .../test/resources/data/SL20_authblock_v1.0.xml | 8 +++ .../data/SL20_authblock_v1.0_invalid_schema.xml | 8 +++ .../SL20_authblock_v1.1_invalid_transformation.xml | 8 +++ .../moa/spss/api/xmlbind/TransformParser.java | 11 ++++ .../server/config/ConfigurationPartsBuilder.java | 24 +++++++- .../moa/spss/server/config/ProfileParseTest.java | 68 ++++++++++++++++++++++ .../test/resources/data/SL20_authblock_v1.0.xml | 8 +++ .../data/SL20_authblock_v1.0_invalid_schema.xml | 8 +++ .../SL20_authblock_v1.1_invalid_transformation.xml | 8 +++ 10 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 moaSig/common/src/test/java/test/at/gv/egovernment/moa/util/DomUtilsTest.java create mode 100644 moaSig/common/src/test/resources/data/SL20_authblock_v1.0.xml create mode 100644 moaSig/common/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml create mode 100644 moaSig/common/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml create mode 100644 moaSig/moa-sig-lib/src/test/java/test/at/gv/egovernment/moa/spss/server/config/ProfileParseTest.java create mode 100644 moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0.xml create mode 100644 moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml create mode 100644 moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml diff --git a/moaSig/common/src/test/java/test/at/gv/egovernment/moa/util/DomUtilsTest.java b/moaSig/common/src/test/java/test/at/gv/egovernment/moa/util/DomUtilsTest.java new file mode 100644 index 0000000..8b745a4 --- /dev/null +++ b/moaSig/common/src/test/java/test/at/gv/egovernment/moa/util/DomUtilsTest.java @@ -0,0 +1,58 @@ +package test.at.gv.egovernment.moa.util; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +import at.gv.egovernment.moaspss.util.Constants; +import at.gv.egovernment.moaspss.util.DOMUtils; + +@RunWith(BlockJUnit4ClassRunner.class) +public class DomUtilsTest { + + @Test + public void xsdTransformationValid() throws SAXException, IOException, ParserConfigurationException { + Element transformation = DOMUtils.parseDocument( + DomUtilsTest.class.getResourceAsStream("/data/SL20_authblock_v1.0.xml"), + true, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull(transformation); + + } + + @Test + public void xsdTransformationInvalidAlgorithm() throws SAXException, IOException, ParserConfigurationException { + Element transformation = DOMUtils.parseDocument( + DomUtilsTest.class.getResourceAsStream("/data/SL20_authblock_v1.1_invalid_transformation.xml"), + true, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull(transformation); + + } + + @Test + public void xsdTransformationIgnoreInvalidSchema() throws SAXException, IOException, ParserConfigurationException { + Element transformation = DOMUtils.parseDocument( + DomUtilsTest.class.getResourceAsStream("/data/SL20_authblock_v1.0_invalid_schema.xml"), + false, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull(transformation); + + } + + @Test + public void xsdTransformationInvalidSchema() throws SAXException, IOException, ParserConfigurationException { + assertThrows(SAXParseException.class, () -> DOMUtils.parseDocument( + DomUtilsTest.class.getResourceAsStream("/data/SL20_authblock_v1.0_invalid_schema.xml"), + true, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement()); + + } +} diff --git a/moaSig/common/src/test/resources/data/SL20_authblock_v1.0.xml b/moaSig/common/src/test/resources/data/SL20_authblock_v1.0.xml new file mode 100644 index 0000000..e67b1f5 --- /dev/null +++ b/moaSig/common/src/test/resources/data/SL20_authblock_v1.0.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
diff --git a/moaSig/common/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml b/moaSig/common/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml new file mode 100644 index 0000000..9ec50e8 --- /dev/null +++ b/moaSig/common/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
diff --git a/moaSig/common/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml b/moaSig/common/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml new file mode 100644 index 0000000..5eb4303 --- /dev/null +++ b/moaSig/common/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
diff --git a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/TransformParser.java b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/TransformParser.java index 7a246d6..beb1c15 100644 --- a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/TransformParser.java +++ b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/api/xmlbind/TransformParser.java @@ -23,11 +23,14 @@ package at.gv.egovernment.moa.spss.api.xmlbind; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; +import javax.xml.transform.TransformerException; + import org.w3c.dom.Element; import org.w3c.dom.traversal.NodeIterator; @@ -42,6 +45,7 @@ import at.gv.egovernment.moa.spss.api.common.XPathFilter; import at.gv.egovernment.moa.spss.api.common.XPathFilter2Transform; import at.gv.egovernment.moa.spss.api.common.XPathTransform; import at.gv.egovernment.moa.spss.api.common.XSLTTransform; +import at.gv.egovernment.moaspss.logging.Logger; import at.gv.egovernment.moaspss.util.Constants; import at.gv.egovernment.moaspss.util.DOMUtils; import at.gv.egovernment.moaspss.util.XPathUtils; @@ -137,6 +141,13 @@ public class TransformParser { } else if (XSLTTransform.XSLT.equals(algorithmUri)) { return parseXSLTTransform(transformElem); } else { + try { + Logger.info("Find suspect XML transformation: " + DOMUtils.serializeNode(transformElem)); + + } catch (TransformerException | IOException e) { + Logger.warn("Can not serialize suspect XML transformation", e); + + } throw new MOAApplicationException("1108", new Object[] { algorithmUri }); } } diff --git a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/server/config/ConfigurationPartsBuilder.java b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/server/config/ConfigurationPartsBuilder.java index 5f8b46d..6a79a87 100644 --- a/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/server/config/ConfigurationPartsBuilder.java +++ b/moaSig/moa-sig-lib/src/main/java/at/gv/egovernment/moa/spss/server/config/ConfigurationPartsBuilder.java @@ -48,8 +48,11 @@ import org.w3c.dom.Element; import org.w3c.dom.traversal.NodeIterator; import org.xml.sax.SAXException; +import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.api.common.TSLConfiguration; import at.gv.egovernment.moa.spss.api.impl.TSLConfigurationImpl; +import at.gv.egovernment.moa.spss.api.xmlbind.ProfileParser; +import at.gv.egovernment.moa.spss.api.xmlbind.TransformParser; import at.gv.egovernment.moa.spss.util.MessageProvider; import at.gv.egovernment.moaspss.logging.LogMsg; import at.gv.egovernment.moaspss.logging.Logger; @@ -66,6 +69,7 @@ import iaik.pki.revocation.RevocationSourceTypes; import iaik.server.modules.xml.BlackListEntry; import iaik.server.modules.xml.ExternalReferenceChecker; import iaik.server.modules.xml.WhiteListEntry; +import iaik.server.modules.xmlverify.TransformationParsingException; import iaik.utils.RFC2253NameParser; import iaik.utils.RFC2253NameParserException; import iaik.xml.crypto.utils.URI; @@ -1095,7 +1099,21 @@ public class ConfigurationPartsBuilder { * @return The mapping from profile ID to profile. */ public Map buildVerifyTransformsInfoProfiles() { - return loadProfiles(VERIFY_TRANSFORMS_INFO_PROFILE_XPATH, "VerifyTransformsInfoProfile"); + Map profiles = loadProfiles(VERIFY_TRANSFORMS_INFO_PROFILE_XPATH, "VerifyTransformsInfoProfile"); + + // validate entries + ProfileParser profileParser = new ProfileParser(); + profiles.entrySet().forEach(el -> { + try { + profileParser.parseVerifyTransformsInfoProfile(el.getValue()); + + } catch (MOAApplicationException e) { + Logger.warn("TransformationProfile with Id:" + el.getKey() + " is invalid: " + e.getMessage()); + } + }); + + return profiles; + } /** @@ -1116,8 +1134,8 @@ public class ConfigurationPartsBuilder { * * @return Map The profile ID to profile mapping. */ - private Map loadProfiles(String xpath, String profileRoot) { - final Map profiles = new HashMap(); + private Map loadProfiles(String xpath, String profileRoot) { + final Map profiles = new HashMap<>(); final NodeIterator profileIter = XPathUtils.selectNodeIterator(getConfigElem(), xpath); Element profileElem; diff --git a/moaSig/moa-sig-lib/src/test/java/test/at/gv/egovernment/moa/spss/server/config/ProfileParseTest.java b/moaSig/moa-sig-lib/src/test/java/test/at/gv/egovernment/moa/spss/server/config/ProfileParseTest.java new file mode 100644 index 0000000..887772d --- /dev/null +++ b/moaSig/moa-sig-lib/src/test/java/test/at/gv/egovernment/moa/spss/server/config/ProfileParseTest.java @@ -0,0 +1,68 @@ +package test.at.gv.egovernment.moa.spss.server.config; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import at.gv.egovernment.moaspss.util.Constants; +import at.gv.egovernment.moaspss.util.DOMUtils; +import at.gv.egovernment.moa.spss.MOAApplicationException; +import at.gv.egovernment.moa.spss.api.xmlbind.ProfileParser; +import at.gv.egovernment.moa.spss.api.xmlverify.VerifyTransformsInfoProfile; + +@RunWith(BlockJUnit4ClassRunner.class) +public class ProfileParseTest { + + @Test + public void xsdTransformationValid() throws SAXException, IOException, ParserConfigurationException, MOAApplicationException { + Element transformation = DOMUtils.parseDocument( + ProfileParseTest.class.getResourceAsStream("/data/SL20_authblock_v1.0.xml"), + true, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull("missing transformation", transformation); + + ProfileParser profileParser = new ProfileParser(); + VerifyTransformsInfoProfile profile = profileParser.parseVerifyTransformsInfoProfile(transformation); + assertNotNull(profile); + + } + + @Test + public void xsdTransformationInvalidAlgorithm() throws SAXException, IOException, ParserConfigurationException { + Element transformation = DOMUtils.parseDocument( + ProfileParseTest.class.getResourceAsStream("/data/SL20_authblock_v1.1_invalid_transformation.xml"), + true, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull("missing transformation", transformation); + + + ProfileParser profileParser = new ProfileParser(); + MOAApplicationException error = assertThrows(MOAApplicationException.class, () -> profileParser.parseVerifyTransformsInfoProfile(transformation)); + assertEquals("1108", error.getMessageId()); + + } + + @Test + public void xsdTransformationInvalidSchema() throws SAXException, IOException, ParserConfigurationException { + Element transformation = DOMUtils.parseDocument( + ProfileParseTest.class.getResourceAsStream("/data/SL20_authblock_v1.0_invalid_schema.xml"), + false, Constants.ALL_SCHEMA_LOCATIONS, null).getDocumentElement(); + assertNotNull("missing transformation", transformation); + + + ProfileParser profileParser = new ProfileParser(); + MOAApplicationException error = assertThrows(MOAApplicationException.class, () -> profileParser.parseVerifyTransformsInfoProfile(transformation)); + assertEquals("1108", error.getMessageId()); + + } + +} diff --git a/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0.xml b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0.xml new file mode 100644 index 0000000..e67b1f5 --- /dev/null +++ b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
diff --git a/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml new file mode 100644 index 0000000..9ec50e8 --- /dev/null +++ b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.0_invalid_schema.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
diff --git a/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml new file mode 100644 index 0000000..5eb4303 --- /dev/null +++ b/moaSig/moa-sig-lib/src/test/resources/data/SL20_authblock_v1.1_invalid_transformation.xml @@ -0,0 +1,8 @@ +Signatur der Anmeldedaten

Anmeldedaten:

Daten zur Person

Vorname:
Nachname:
Geburtsdatum:
Vollmacht: Ich melde mich in Vertretung an. Im nächsten Schritt wird mir eine Liste der für mich verfügbaren Vertretungsverhältnisse angezeigt, aus denen ich eines auswählen werde.

Daten zur Anwendung

Identifikator:
Name:
Staat:

Technische Parameter

Datum:..
Uhrzeit:::
TransaktionsToken:
+ Vollmachten-Referenz:
-- cgit v1.2.3