ODFTOOLKIT-447 Encrypted documents invalid due to misordered manifest XML elements
git-svn-id: https://svn.apache.org/repos/asf/incubator/odf/trunk@1786676 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
new file mode 100644
index 0000000..461d955
--- /dev/null
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
@@ -0,0 +1,53 @@
+/************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
+ *
+ * Use is subject to license terms.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
+ * obtain a copy of the License at http://odftoolkit.org/docs/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ************************************************************************/
+
+package org.odftoolkit.odfdom.pkg;
+
+/**
+ * Namespaces of OpenDocument 1.2 XML Package Schema
+ */
+public enum OdfPackageNamespace implements NamespaceName {
+
+
+ MANIFEST("chart", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"),
+ XML("xml", "http://www.w3.org/XML/1998/namespace" );
+
+ private String mPrefix;
+ private String mUri;
+
+ OdfPackageNamespace(String prefix, String uri) {
+ mPrefix = prefix;
+ mUri = uri;
+ }
+
+ /**
+ * @return the prefix currently related to ODF Namespace.
+ */
+ public String getPrefix() {
+ return mPrefix;
+ }
+
+ /**
+ * @return the URI identifying the ODF Namespace.
+ */
+ public String getUri() {
+ return mUri;
+ }
+}
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
index 977bf9e..8e3aa02 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
@@ -1,9 +1,9 @@
/************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
- *
+ *
* Use is subject to license terms.
- *
+ *
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
@@ -31,6 +31,8 @@
import org.odftoolkit.odfdom.pkg.OdfElement;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+import org.w3c.dom.NodeList;
/**
* Manifest implementation of OpenDocument element {@odf.element manifest:encryption-data}.
*
@@ -124,7 +126,21 @@
AlgorithmElement algorithm = ((OdfFileDom) this.ownerDocument).newOdfElement(AlgorithmElement.class);
algorithm.setAlgorithmNameAttribute(algorithmNameValue);
algorithm.setInitialisationVectorAttribute(initialisationVectorValue);
- this.appendChild(algorithm);
+ if(this.hasChildNodes()){
+ OdfElement precedingSibling = null;
+ NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "start-key-generation");
+ if(nl.getLength() == 0){
+ nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");
+ }
+ if(nl.getLength() != 0){
+ precedingSibling = (OdfElement) nl.item(0);
+ this.insertBefore(algorithm, precedingSibling);
+ }else{
+ this.appendChild(algorithm);
+ }
+ }else{
+ this.appendChild(algorithm);
+ }
return algorithm;
}
@@ -160,8 +176,20 @@
public StartKeyGenerationElement newStartKeyGenerationElement(String startKeyGenerationNameValue) {
StartKeyGenerationElement startKeyGeneration = ((OdfFileDom) this.ownerDocument).newOdfElement(StartKeyGenerationElement.class);
startKeyGeneration.setStartKeyGenerationNameAttribute(startKeyGenerationNameValue);
- this.appendChild(startKeyGeneration);
- return startKeyGeneration;
+
+ if(this.hasChildNodes()){
+ OdfElement precedingSibling = null;
+ NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");
+ if(nl.getLength() != 0){
+ precedingSibling = (OdfElement) nl.item(0);
+ this.insertBefore(startKeyGeneration, precedingSibling);
+ }else{
+ this.appendChild(startKeyGeneration);
+ }
+ }else{
+ this.appendChild(startKeyGeneration);
+ }
+ return startKeyGeneration;
}
}