You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2023/01/19 14:08:13 UTC

[jackrabbit-filevault] branch master updated: JCRVLT-677 store attributes within "entries.xml" (#270)

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ab75123 JCRVLT-677 store attributes within "entries.xml" (#270)
4ab75123 is described below

commit 4ab7512355ad97bbbcbc592dc7252f4058ee364d
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Thu Jan 19 15:08:07 2023 +0100

    JCRVLT-677 store attributes within "entries.xml" (#270)
    
    This fixes the NPE being issued when trying to resolve conflicts
    Convert tests to JUnit5
---
 parent/pom.xml                                     |  7 ++
 vault-vlt/pom.xml                                  |  4 +-
 .../vault/vlt/meta/xml/XmlEntryInfo.java           | 15 ++--
 .../vault/vlt/{Test.java => ManualIT.java}         |  4 +-
 .../jackrabbit/vault/vlt/meta/TextXMLEntries.java  | 82 ---------------------
 ...bstractTestEntries.java => XmlEntriesTest.java} | 85 ++++++++++++++++++----
 6 files changed, 89 insertions(+), 108 deletions(-)

diff --git a/parent/pom.xml b/parent/pom.xml
index b2c17e37..60b25c99 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -529,6 +529,13 @@ Bundle-Category: jackrabbit
                 <artifactId>junit</artifactId>
                 <version>4.13.2</version>
             </dependency>
+            <dependency>
+                <groupId>org.junit</groupId>
+                <artifactId>junit-bom</artifactId>
+                <version>5.9.2</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/vault-vlt/pom.xml b/vault-vlt/pom.xml
index 85a12530..50d5eea3 100644
--- a/vault-vlt/pom.xml
+++ b/vault-vlt/pom.xml
@@ -87,8 +87,8 @@
             <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/xml/XmlEntryInfo.java b/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/xml/XmlEntryInfo.java
index b5246314..06942ac8 100644
--- a/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/xml/XmlEntryInfo.java
+++ b/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/xml/XmlEntryInfo.java
@@ -39,7 +39,7 @@ import org.xml.sax.helpers.AttributesImpl;
  */
 public class XmlEntryInfo implements VltEntryInfo {
 
-    private static final String AN_NAME = "name";
+    private static final String AN_NAME = "name"; // file name, mandatory for type "mine" and "theirs"
     private static final String AN_DATE = "date";
     private static final String AN_MD5 = "md5";
     private static final String AN_CONTENT_TYPE = "contentType";
@@ -212,27 +212,28 @@ public class XmlEntryInfo implements VltEntryInfo {
 
     public void write(XMLStreamWriter writer) throws XMLStreamException {
         writer.writeStartElement(type.name().toLowerCase());
+        writeAttributes(writer);
         writer.writeEndElement();
         dirty = false;
     }
 
-    protected void addAttributes(AttributesImpl attrs) {
+    protected void writeAttributes(XMLStreamWriter writer) throws XMLStreamException {
         if (name != null) {
-            attrs.addAttribute("", AN_NAME, "", "CDATA", name);
+            writer.writeAttribute(AN_NAME, name);
         }
         if (date > 0) {
             Calendar c = Calendar.getInstance();
             c.setTimeInMillis(date);
-            attrs.addAttribute("", AN_DATE, "", "CDATA", ISO8601.format(c));
+            writer.writeAttribute(AN_DATE, ISO8601.format(c));
         }
         if (md5 != null) {
-            attrs.addAttribute("", AN_MD5, "", "CDATA", md5.toString());
+            writer.writeAttribute(AN_MD5, md5.toString());
         }
         if (contentType != null) {
-            attrs.addAttribute("", AN_CONTENT_TYPE, "", "CDATA", contentType);
+            writer.writeAttribute(AN_CONTENT_TYPE, contentType);
         }
         if (size > 0) {
-            attrs.addAttribute("", AN_SIZE, "", "CDATA", String.valueOf(size));
+            writer.writeAttribute(AN_SIZE, String.valueOf(size));
         }
     }
 
diff --git a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/Test.java b/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/ManualIT.java
similarity index 98%
rename from vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/Test.java
rename to vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/ManualIT.java
index 17f86209..422980ae 100644
--- a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/Test.java
+++ b/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/ManualIT.java
@@ -31,13 +31,11 @@ import java.util.zip.ZipOutputStream;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.vlt.meta.xml.zip.UpdateableZipFile;
-import org.junit.Ignore;
 
 /**
  * {@code Test}...
  */
-@Ignore
-public class Test {
+public class ManualIT {
 
     public static final String TEXT = "/*\n" +
             " * Licensed to the Apache Software Foundation (ASF) under one or more\n" +
diff --git a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/TextXMLEntries.java b/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/TextXMLEntries.java
deleted file mode 100644
index 6a55c8a2..00000000
--- a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/TextXMLEntries.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.
- * The ASF licenses this file to You 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
- *
- * 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.apache.jackrabbit.vault.vlt.meta;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.jackrabbit.vault.vlt.VltException;
-import org.apache.jackrabbit.vault.vlt.meta.xml.XmlEntries;
-import org.apache.jackrabbit.vault.vlt.meta.xml.zip.ZipMetaDir;
-
-/**
- * {@code TextXMLEntries}...
- */
-public class TextXMLEntries extends AbstractTestEntries {
-
-    private File file = new File("target/vlt-test-entries.zip");
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        if (file.exists()) {
-            file.delete();
-        }
-        dir = new ZipMetaDir(file);
-        dir.create("/a/b/c");
-        dir.close();
-        dir = null;
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    protected void open() throws IOException, VltException {
-        dir = new ZipMetaDir(file);
-        entries = dir.getEntries();
-    }
-
-
-    public void testXSS() throws VltException {
-        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
-                "<!DOCTYPE entries [\n" +
-                "   <!ENTITY % foo \"bar\">\n" +
-                "]>\n" +
-                "<entries path=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3\">\n" +
-                " <entry name=\".content.xml\" rp=\"\" ap=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3\">\n" +
-                "   <base date=\"2018-10-02T11:44:02.000+02:00\" md5=\"268b8e1f6d7b3fc9ec71226ee1a9dc70\" contentType=\"text/xml\" size=\"946\"/>\n" +
-                "   <work date=\"2018-10-02T11:44:02.000+02:00\" md5=\"268b8e1f6d7b3fc9ec71226ee1a9dc70\" contentType=\"text/xml\" size=\"946\"/>\n" +
-                " </entry>\n" +
-                " <entry name=\"_rep_policy.xml\" rp=\"\" ap=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3/rep:policy\">\n" +
-                "   <base date=\"2018-10-02T11:44:02.000+02:00\" md5=\"5a788decc1968551e2838bc46914f75a\" contentType=\"text/xml\" size=\"500\"/>\n" +
-                "   <work date=\"2018-10-02T11:44:02.000+02:00\" md5=\"5a788decc1968551e2838bc46914f75a\" contentType=\"text/xml\" size=\"500\"/>\n" +
-                " </entry>\n" +
-                "</entries>";
-        try {
-            XmlEntries entries = XmlEntries.load(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
-            assertTrue(entries.hasEntry(".content.xml"));
-            fail("XML entries with DTD should fail.");
-        } catch (VltException e) {
-            // ok
-        }
-    }
-}
\ No newline at end of file
diff --git a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/AbstractTestEntries.java b/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/XmlEntriesTest.java
similarity index 51%
rename from vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/AbstractTestEntries.java
rename to vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/XmlEntriesTest.java
index f9214247..648a1ae8 100644
--- a/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/AbstractTestEntries.java
+++ b/vault-vlt/src/test/java/org/apache/jackrabbit/vault/vlt/meta/XmlEntriesTest.java
@@ -14,26 +14,36 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.jackrabbit.vault.vlt.meta;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.jackrabbit.vault.fs.api.DumpContext;
 import org.apache.jackrabbit.vault.fs.api.Dumpable;
 import org.apache.jackrabbit.vault.util.MD5;
 import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.meta.xml.XmlEntries;
+import org.apache.jackrabbit.vault.vlt.meta.xml.XmlEntryInfo;
+import org.apache.jackrabbit.vault.vlt.meta.xml.zip.ZipMetaDir;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 
-import junit.framework.TestCase;
-
-/**
- * {@code TestEntries}...
- */
-public abstract class AbstractTestEntries extends TestCase {
+class XmlEntriesTest {
 
-    protected File file = new File("target/vlt-test-entries.zip");
+    private File file;
 
     private boolean verbose;
 
@@ -41,7 +51,13 @@ public abstract class AbstractTestEntries extends TestCase {
 
     protected VltEntries entries;
 
-    abstract protected void open() throws IOException, VltException;
+    @TempDir
+    File tempDir;
+
+    protected void open() throws IOException, VltException {
+        dir = new ZipMetaDir(file);
+        entries = dir.getEntries();
+    }
 
     protected void close() throws IOException {
         if (entries != null) {
@@ -58,7 +74,8 @@ public abstract class AbstractTestEntries extends TestCase {
         open();
     }
 
-    public void testRepoAddress() throws IOException, VltException {
+    @Test
+    void testRepoAddress() throws IOException, VltException {
         open();
         assertNull(dir.getRepositoryUrl());
         dir.setRepositoryUrl("http://localhost:8080");
@@ -67,15 +84,17 @@ public abstract class AbstractTestEntries extends TestCase {
         assertEquals("http://localhost:8080", dir.getRepositoryUrl());
     }
 
-    public void testAddEntry() throws VltException, IOException {
+    @Test
+    void testAddEntry() throws VltException, IOException {
         open();
         assertFalse(entries.hasEntry("foo.png"));
-        VltEntry e = entries.update("foo.png", "/bla", "foo.png");
+        entries.update("foo.png", "/bla", "foo.png");
         reopen();
         assertTrue(entries.hasEntry("foo.png"));
     }
 
-    public void testAddInfo() throws VltException, IOException {
+    @Test
+    void testAddInfo() throws VltException, IOException {
         testAddEntry();
 
         assertTrue(entries.hasEntry("foo.png"));
@@ -89,7 +108,8 @@ public abstract class AbstractTestEntries extends TestCase {
         assertNotNull(e.base());
     }
 
-    public void testModifyInfo() throws VltException, IOException {
+    @Test
+    void testModifyInfo() throws VltException, IOException {
         testAddInfo();
         reopen();
 
@@ -101,6 +121,7 @@ public abstract class AbstractTestEntries extends TestCase {
         base.setDate(1000);
         base.setMd5(new MD5(2,3));
         base.setSize(4);
+        ((XmlEntryInfo) base).setName("myName");
         reopen();
         e = entries.getEntry("foo.png");
         base = e.base();
@@ -108,8 +129,19 @@ public abstract class AbstractTestEntries extends TestCase {
         assertEquals(1000, base.getDate());
         assertEquals(new MD5(2,3), base.getMd5());
         assertEquals(4, base.getSize());
+        assertEquals("myName", ((XmlEntryInfo) base).getName());
     }
 
+    @BeforeEach
+    protected void setUp() throws Exception {
+        file = new File(tempDir, "vlt-test-entries.zip");
+        dir = new ZipMetaDir(file);
+        dir.create("/a/b/c");
+        dir.close();
+        dir = null;
+    }
+
+    @AfterEach
     protected void tearDown() throws Exception {
         if (entries != null && verbose) {
             PrintWriter out = new PrintWriter(System.out);
@@ -120,4 +152,29 @@ public abstract class AbstractTestEntries extends TestCase {
             out.flush();
         }
     }
+
+    @Test
+    void testXSS() throws VltException {
+        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<!DOCTYPE entries [\n" +
+                "   <!ENTITY % foo \"bar\">\n" +
+                "]>\n" +
+                "<entries path=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3\">\n" +
+                " <entry name=\".content.xml\" rp=\"\" ap=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3\">\n" +
+                "   <base date=\"2018-10-02T11:44:02.000+02:00\" md5=\"268b8e1f6d7b3fc9ec71226ee1a9dc70\" contentType=\"text/xml\" size=\"946\"/>\n" +
+                "   <work date=\"2018-10-02T11:44:02.000+02:00\" md5=\"268b8e1f6d7b3fc9ec71226ee1a9dc70\" contentType=\"text/xml\" size=\"946\"/>\n" +
+                " </entry>\n" +
+                " <entry name=\"_rep_policy.xml\" rp=\"\" ap=\"/home/users/m/mCY2rm1YSMlKFlJ-NEN3/rep:policy\">\n" +
+                "   <base date=\"2018-10-02T11:44:02.000+02:00\" md5=\"5a788decc1968551e2838bc46914f75a\" contentType=\"text/xml\" size=\"500\"/>\n" +
+                "   <work date=\"2018-10-02T11:44:02.000+02:00\" md5=\"5a788decc1968551e2838bc46914f75a\" contentType=\"text/xml\" size=\"500\"/>\n" +
+                " </entry>\n" +
+                "</entries>";
+        try {
+            XmlEntries entries = XmlEntries.load(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
+            assertTrue(entries.hasEntry(".content.xml"));
+            fail("XML entries with DTD should fail.");
+        } catch (VltException e) {
+            // ok
+        }
+    }
 }
\ No newline at end of file