1414import javax .ejb .LocalBean ;
1515import javax .ejb .Stateless ;
1616
17+ import org .docx4j .openpackaging .exceptions .Docx4JException ;
18+ import org .docx4j .openpackaging .packages .WordprocessingMLPackage ;
1719import org .slf4j .Logger ;
1820import org .slf4j .LoggerFactory ;
1921
@@ -37,7 +39,7 @@ public class TemplateEngineService {
3739 private ConfigFacadeEjb .ConfigFacadeEjbLocal configFacade ;
3840
3941 public Set <String > extractTemplateVariables (InputStream templateFile ) throws IOException , XDocReportException {
40- IXDocReport report = XDocReportRegistry . getRegistry (). loadReport ( templateFile , TemplateEngineKind . Velocity );
42+ IXDocReport report = readXDocReport ( templateFile );
4143
4244 FieldsExtractor <FieldExtractor > extractor = FieldsExtractor .create ();
4345 report .extractFields (extractor );
@@ -60,7 +62,7 @@ public Set<String> extractTemplateVariables(InputStream templateFile) throws IOE
6062 }
6163
6264 public InputStream generateDocument (Properties properties , InputStream templateFile ) throws IOException , XDocReportException {
63- IXDocReport report = XDocReportRegistry . getRegistry (). loadReport ( templateFile , TemplateEngineKind . Velocity );
65+ IXDocReport report = readXDocReport ( templateFile );
6466
6567 IContext context = report .createContext ();
6668 for (Object key : properties .keySet ()) {
@@ -78,8 +80,9 @@ public InputStream generateDocument(Properties properties, InputStream templateF
7880 }
7981
8082 public void validateTemplate (InputStream templateFile ) {
83+
8184 try {
82- IXDocReport report = XDocReportRegistry . getRegistry (). loadReport ( templateFile , TemplateEngineKind . Velocity );
85+ IXDocReport report = readXDocReport ( templateFile );
8386 FieldsExtractor <FieldExtractor > extractor = FieldsExtractor .create ();
8487 report .extractFields (extractor );
8588 } catch (Exception e ) {
@@ -90,4 +93,20 @@ public void validateTemplate(InputStream templateFile) {
9093 public String getTempDir () {
9194 return configFacade .getCustomFilesPath ();
9295 }
96+
97+ private IXDocReport readXDocReport (InputStream templateFile ) throws IOException , XDocReportException {
98+
99+ try {
100+ // Sanitize docx template for XXEs
101+ WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load (templateFile );
102+ wordMLPackage .getDocumentModel ();
103+
104+ ByteArrayOutputStream outStream = new ByteArrayOutputStream ();
105+ wordMLPackage .save (outStream );
106+ ByteArrayInputStream inStream1 = new ByteArrayInputStream (outStream .toByteArray ());
107+ return XDocReportRegistry .getRegistry ().loadReport (inStream1 , TemplateEngineKind .Velocity );
108+ } catch (Docx4JException e ) {
109+ throw new IllegalArgumentException (e .getMessage (), e );
110+ }
111+ }
93112}
0 commit comments