diff --git a/library/src/main/resources/stylesheets/xrechnung-html.de.ids.xsl b/library/src/main/resources/stylesheets/xrechnung-html.de.ids.xsl
index ab453b51..1c02ca63 100644
--- a/library/src/main/resources/stylesheets/xrechnung-html.de.ids.xsl
+++ b/library/src/main/resources/stylesheets/xrechnung-html.de.ids.xsl
@@ -1193,7 +1193,7 @@ function downloadData (element_id) {
-
Postfach (BT-51):
+
Adresszusatz (BT-51):
@@ -1258,7 +1258,7 @@ function downloadData (element_id) {
-
Postfach (BT-36):
+
Adresszusatz (BT-36):
@@ -1998,7 +1998,7 @@ function downloadData (element_id) {
-
Postfach (BT-65):
+
Adresszusatz (BT-65):
@@ -2111,7 +2111,7 @@ function downloadData (element_id) {
-
Postfach (BT-76):
+
Adresszusatz (BT-76):
diff --git a/library/src/main/resources/stylesheets/xrechnung-html.de.xsl b/library/src/main/resources/stylesheets/xrechnung-html.de.xsl
index e2a2e930..052cb544 100644
--- a/library/src/main/resources/stylesheets/xrechnung-html.de.xsl
+++ b/library/src/main/resources/stylesheets/xrechnung-html.de.xsl
@@ -13,7 +13,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
@@ -166,7 +166,7 @@
-
+
@@ -189,7 +189,7 @@
-
+
diff --git a/library/src/main/resources/stylesheets/xrechnung-html.xsl b/library/src/main/resources/stylesheets/xrechnung-html.xsl
index 54a0de84..6309f380 100644
--- a/library/src/main/resources/stylesheets/xrechnung-html.xsl
+++ b/library/src/main/resources/stylesheets/xrechnung-html.xsl
@@ -122,7 +122,7 @@
-
Postfach:
+
Adresszusatz:
-
Postfach:
+
Adresszusatz:
-
Postfach:
+
Adresszusatz:
-
Postfach:
+
Adresszusatz:
diff --git a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java
index f819db12..9902a05c 100644
--- a/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java
+++ b/library/src/test/java/org/mustangproject/ZUGFeRD/XRTest.java
@@ -180,6 +180,36 @@ public class XRTest extends TestCase {
}
}
+
+ public void testTaxExemptionReasonIssue() {
+ String orgname = "Test company";
+ String number = "123";
+ String amountStr = "1.00";
+ BigDecimal amount = new BigDecimal(amountStr);
+ byte[] b = {12, 13};
+
+ Invoice i = new Invoice().setDueDate(new Date()).setIssueDate(new Date()).setDeliveryDate(new Date())
+ .setSender(new TradeParty(orgname, "teststr", "55232", "teststadt", "DE").setEmail("sender@example.com").addTaxID("DE4711").addVATID("DE0815").setContact(new Contact("Hans Test", "+49123456789", "test@example.org")).addBankDetails(new BankDetails("DE12500105170648489890", "COBADEFXXX").setAccountName("kontoInhaber")))
+ .setRecipient(new TradeParty("Franz Müller", "teststr.12", "55232", "Entenhausen", "DE").setEmail("recipient@sample.org"))
+ .setReferenceNumber("991-01484-64")//leitweg-id
+ // not using any VAT, this is also a test of zero-rated goods:
+ .setNumber(number)
+ .addItem(new Item(new Product("Testprodukt", "", "C62", BigDecimal.ZERO).setTaxCategoryCode("E").setTaxExemptionReason("Kleinunternehmer"), amount, new BigDecimal(1.0)))
+ .addItem(new Item(new Product("Testprodukt2", "", "C62", BigDecimal.ZERO).setTaxCategoryCode("S"), amount, new BigDecimal(1.0)))
+ .setPayee( new TradeParty().setName("VR Factoring GmbH").setID("DE813838785").setLegalOrganisation(new LegalOrganisation("391200LDDFJDMIPPMZ54", "0199")));
+
+
+
+ ZUGFeRD2PullProvider zf2p = new ZUGFeRD2PullProvider();
+
+ zf2p.setProfile(Profiles.getByName("XRechnung"));
+ zf2p.generateXML(i);
+ String theXML = new String(zf2p.getXML(), StandardCharsets.UTF_8);
+ assertThat(theXML).valueByXPath("count(//*[local-name()='ExemptionReason'])")
+ .asInt()
+ .isEqualTo(2);
+ }
+
public void testApplicablePercentInUntaxedService() {
diff --git a/library/src/test/resources/factur-x-vis-extended.de.html b/library/src/test/resources/factur-x-vis-extended.de.html
index ed5a147d..4ef990b5 100644
--- a/library/src/test/resources/factur-x-vis-extended.de.html
+++ b/library/src/test/resources/factur-x-vis-extended.de.html
@@ -762,7 +762,7 @@
KUNDENWEG 88
-
Postfach:
+
Adresszusatz:
@@ -826,7 +826,7 @@
BAHNHOFSTRASSE 99
-
Postfach:
+
Adresszusatz:
@@ -2203,7 +2203,7 @@
HAUPTSTRASSE 44
-
Postfach:
+
Adresszusatz:
diff --git a/validator/src/main/java/org/mustangproject/validator/Validator.java b/validator/src/main/java/org/mustangproject/validator/Validator.java
index 545ee574..92e38228 100644
--- a/validator/src/main/java/org/mustangproject/validator/Validator.java
+++ b/validator/src/main/java/org/mustangproject/validator/Validator.java
@@ -61,6 +61,10 @@ public abstract class Validator {
Source xmlData = new StreamSource(new ByteArrayInputStream(xmlRawData));
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
+ schemaFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ schemaFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+ schemaFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+ schemaFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Schema schema = schemaFactory.newSchema(schemaFile);
javax.xml.validation.Validator validator = schema.newValidator();
validator.validate(xmlData);
diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java
index 58dba911..cf911dc6 100644
--- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java
+++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java
@@ -150,13 +150,23 @@ public class XMLValidator extends Validator {
*/
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true); // otherwise we can not act namespace independently, i.e. use
- // document.getElementsByTagNameNS("*",...
- dbf.setExpandEntityReferences(false);
- dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ //REDHAT
+ //https://www.blackhat.com/docs/us-15/materials/us-15-Wang-FileCry-The-New-Age-Of-XXE-java-wp.pdf
+ dbf.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+ dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
+
+ //OWASP
+ //https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+ // Disable external DTDs as well
+ dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+ // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
+ dbf.setXIncludeAware(false);
+ dbf.setExpandEntityReferences(false);
+ dbf.setNamespaceAware(true);
final DocumentBuilder db = dbf.newDocumentBuilder();
final InputSource is = new InputSource(new StringReader(zfXML));
diff --git a/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java b/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java
index cdab1874..1b328cd0 100644
--- a/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java
+++ b/validator/src/main/java/org/mustangproject/validator/ZUGFeRDValidator.java
@@ -143,12 +143,23 @@ public class ZUGFeRDValidator {
String xmlAsString = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setExpandEntityReferences(false);
- dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ //REDHAT
+ //https://www.blackhat.com/docs/us-15/materials/us-15-Wang-FileCry-The-New-Age-Of-XXE-java-wp.pdf
+ dbf.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+ dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
+
+ //OWASP
+ //https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+ // Disable external DTDs as well
+ dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+ // and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
+ dbf.setXIncludeAware(false);
+ dbf.setExpandEntityReferences(false);
+ dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
content = XMLTools.removeBOM(content);
@@ -301,6 +312,7 @@ public class ZUGFeRDValidator {
XMLWriter writer = new XMLWriter(sw, format);
try {
writer.write(document);
+ writer.close();
} catch (Exception e) {
LOGGER.error(e.getMessage());
}