You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2020/03/13 15:06:38 UTC

svn commit: r1875158 - in /jackrabbit/oak/trunk/oak-jcr/src: main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Author: mreutegg
Date: Fri Mar 13 15:06:37 2020
New Revision: 1875158

URL: http://svn.apache.org/viewvc?rev=1875158&view=rev
Log:
OAK-8948: ObservationManager.addEventListener() throws NPE with invalid paths in filter

Apply patch with fix and tests
Issue reported and test contributed by Rafiya Sirin

Modified:
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1875158&r1=1875157&r2=1875158&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java Fri Mar 13 15:06:37 2020
@@ -234,12 +234,12 @@ public class ObservationManagerImpl impl
         boolean noLocal = filter.getNoLocal();
         boolean noExternal = filter.getNoExternal() || listener instanceof ExcludeExternal;
         boolean noInternal = filter.getNoInternal();
-        Set<String> includePaths = getOakPaths(namePathMapper, filter.getAdditionalPaths());
+        Set<String> includePaths = getOakPaths(namePathMapper, filter.getAdditionalPaths(), "include");
         String absPath = filter.getAbsPath();
         if (absPath != null) {
             includePaths.add(namePathMapper.getOakPath(absPath));
         }
-        Set<String> excludedPaths = getOakPaths(namePathMapper, filter.getExcludedPaths());
+        Set<String> excludedPaths = getOakPaths(namePathMapper, filter.getExcludedPaths(), "exclude");
         PathUtils.unifyInExcludes(includePaths, excludedPaths);
         if (oakEventFilter != null) {
             String[] includeGlobPaths = oakEventFilter.getIncludeGlobPaths();
@@ -388,10 +388,16 @@ public class ObservationManagerImpl impl
         return conditions;
     }
 
-    private static Set<String> getOakPaths(NamePathMapper mapper, String[] paths) {
+    private static Set<String> getOakPaths(NamePathMapper mapper, String[] paths, String type)
+            throws RepositoryException {
         Set<String> oakPaths = newHashSet();
         for (String path : paths) {
-            oakPaths.add(mapper.getOakPath(path));
+            String oakPath = mapper.getOakPath(path);
+            if (oakPath != null) {
+                oakPaths.add(oakPath);
+            } else {
+                throw new RepositoryException("Invalid " + type + " path: " + path);
+            }
         }
         return oakPaths;
     }

Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java?rev=1875158&r1=1875157&r2=1875158&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java Fri Mar 13 15:06:37 2020
@@ -34,11 +34,14 @@ import static org.apache.jackrabbit.JcrC
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
 import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
 
 import java.util.Arrays;
@@ -870,6 +873,52 @@ public class ObservationTest extends Abs
     }
 
     @Test
+    public void excludePathInvalid() {
+        assumeTrue(observationManager instanceof JackrabbitObservationManager);
+        ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+        ExpectationListener listener = new ExpectationListener();
+        String invalidPath = TEST_PATH + "/[n]";
+        JackrabbitEventFilter filter = new JackrabbitEventFilter()
+                .setAbsPath(TEST_PATH)
+                .setIsDeep(true)
+                .setExcludedPaths(TEST_PATH + "/c", invalidPath)
+                .setEventTypes(ALL_EVENTS);
+        try {
+            oManager.addEventListener(listener, filter);
+            fail("addEventListener() must fail with RepositoryException");
+        } catch (RepositoryException e) {
+            // expected
+            assertThat(e.getMessage(), containsString("exclude"));
+            assertThat(e.getMessage(), containsString(invalidPath));
+        } catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+    }
+
+    @Test
+    public void includePathInvalid() {
+        assumeTrue(observationManager instanceof JackrabbitObservationManager);
+        ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+        ExpectationListener listener = new ExpectationListener();
+        String invalidPath = TEST_PATH + "/[n]";
+        JackrabbitEventFilter filter = new JackrabbitEventFilter()
+                .setAbsPath(TEST_PATH)
+                .setAdditionalPaths(invalidPath)
+                .setIsDeep(true)
+                .setEventTypes(ALL_EVENTS);
+        try {
+            oManager.addEventListener(listener, filter);
+            fail("addEventListener() must fail with RepositoryException");
+        } catch (RepositoryException e) {
+            // expected
+            assertThat(e.getMessage(), containsString("include"));
+            assertThat(e.getMessage(), containsString(invalidPath));
+        } catch (Exception e) {
+            fail("Unexpected exception: " + e);
+        }
+    }
+
+    @Test
     public void parentPathExclude() throws ExecutionException, InterruptedException, RepositoryException {
         assumeTrue(observationManager instanceof JackrabbitObservationManager);