You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sentry.apache.org by vs...@apache.org on 2017/11/17 16:52:27 UTC

sentry git commit: SENTRY-2032: Leading Slashes need to removed when creating HMS path entries (Arjun Mishra, reviewed by Alexander Kolbasov, Vadim Spector)

Repository: sentry
Updated Branches:
  refs/heads/master 5fc1e9779 -> 9c541adf1


SENTRY-2032: Leading Slashes need to removed when creating HMS path entries (Arjun Mishra, reviewed by Alexander Kolbasov, Vadim Spector)


Project: http://git-wip-us.apache.org/repos/asf/sentry/repo
Commit: http://git-wip-us.apache.org/repos/asf/sentry/commit/9c541adf
Tree: http://git-wip-us.apache.org/repos/asf/sentry/tree/9c541adf
Diff: http://git-wip-us.apache.org/repos/asf/sentry/diff/9c541adf

Branch: refs/heads/master
Commit: 9c541adf15194c44800555f0fb161463df68feac
Parents: 5fc1e97
Author: Vadim Spector <vs...@cloudera.com>
Authored: Fri Nov 17 08:51:41 2017 -0800
Committer: Vadim Spector <vs...@cloudera.com>
Committed: Fri Nov 17 08:51:41 2017 -0800

----------------------------------------------------------------------
 .../sentry/core/common/utils/PathUtils.java     |  8 ++-
 .../sentry/core/common/utils/TestPathUtils.java | 27 ++++++++++
 .../db/service/persistent/TestSentryStore.java  | 57 ++++++++++++++++++++
 3 files changed, 90 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sentry/blob/9c541adf/sentry-core/sentry-core-common/src/main/java/org/apache/sentry/core/common/utils/PathUtils.java
----------------------------------------------------------------------
diff --git a/sentry-core/sentry-core-common/src/main/java/org/apache/sentry/core/common/utils/PathUtils.java b/sentry-core/sentry-core-common/src/main/java/org/apache/sentry/core/common/utils/PathUtils.java
index cef8bd7..2d67a5b 100644
--- a/sentry-core/sentry-core-common/src/main/java/org/apache/sentry/core/common/utils/PathUtils.java
+++ b/sentry-core/sentry-core-common/src/main/java/org/apache/sentry/core/common/utils/PathUtils.java
@@ -215,9 +215,13 @@ public class PathUtils {
    * Split path into elements.
    * May evolve to do something smarter, e.g. path canonicalization,
    * but for now simple split on "/" is sufficient.
+   *
+   * Remove leading, following, and consecutive slashes from path so
+   * input like "//a/b//c///" when split gives
+   * {a,b,c} instead of {"","",a,b,"",c,"","",""}
    */
   public static String[] splitPath(String path) {
-    return (path != null) ? path.split("/+") : null;
+    path = path.replaceAll("(^/+)|(/+$)", "");
+    return path.split("/+");
   }
-
 }

http://git-wip-us.apache.org/repos/asf/sentry/blob/9c541adf/sentry-core/sentry-core-common/src/test/java/org/apache/sentry/core/common/utils/TestPathUtils.java
----------------------------------------------------------------------
diff --git a/sentry-core/sentry-core-common/src/test/java/org/apache/sentry/core/common/utils/TestPathUtils.java b/sentry-core/sentry-core-common/src/test/java/org/apache/sentry/core/common/utils/TestPathUtils.java
index 8419b9d..329e668 100644
--- a/sentry-core/sentry-core-common/src/test/java/org/apache/sentry/core/common/utils/TestPathUtils.java
+++ b/sentry-core/sentry-core-common/src/test/java/org/apache/sentry/core/common/utils/TestPathUtils.java
@@ -21,8 +21,11 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.common.collect.Lists;
 import java.net.URI;
 
+import java.util.Arrays;
+import java.util.List;
 import org.junit.Test;
 
 public class TestPathUtils {
@@ -146,4 +149,28 @@ public class TestPathUtils {
     assertEquals("file://localhost:9999/tmp/hive-user",
         PathUtils.parseLocalURI("file://localhost:9999/tmp/hive-user"));
   }
+
+  @Test
+  public void testStripSurplusSlashesAndSplitPath() throws Exception {
+
+    List<String> expected = Arrays.asList("a", "b", "c");
+
+    String path = "a/b/c";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+
+    path = "/a/b/c";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+
+    path = "a/b/c/";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+
+    path = "/a/b/c/";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+
+    path = "/////a/b/c///";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+
+    path = "/////a//b//c///";
+    assertEquals("Invalid split doesn't match expected output", expected, Lists.newArrayList(PathUtils.splitPath(path)));
+  }
 }

http://git-wip-us.apache.org/repos/asf/sentry/blob/9c541adf/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/persistent/TestSentryStore.java
----------------------------------------------------------------------
diff --git a/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/persistent/TestSentryStore.java b/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/persistent/TestSentryStore.java
index cf83e77..90f35f1 100644
--- a/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/persistent/TestSentryStore.java
+++ b/sentry-provider/sentry-provider-db/src/test/java/org/apache/sentry/provider/db/service/persistent/TestSentryStore.java
@@ -3461,4 +3461,61 @@ public class TestSentryStore extends org.junit.Assert {
     }
   }
 
+  /**
+   * Test paths with multiple leading slashes
+   * @throws Exception
+   */
+  @Test
+  public void testRetrievePathImageWithMultipleLeadingSlashes() throws Exception {
+    //Test with no leading slashes
+    String prefix = "user/hive/warehouse";
+    String []prefixes = {"/" + prefix};
+    Map<String, Collection<String>> authzPaths = new HashMap<>();
+    // Makes sure that authorizable object could be associated
+    // with different paths and can be properly persisted into database.
+    String tablePath = prefix + "/loc1/db2.db/table1.1";
+    authzPaths.put("db1.table1", Sets.newHashSet(tablePath));
+    long notificationID = 1;
+    sentryStore.persistFullPathsImage(authzPaths, notificationID);
+    PathsUpdate pathsUpdate = sentryStore.retrieveFullPathsImageUpdate(prefixes);
+    assertEquals(notificationID, pathsUpdate.getImgNum());
+    TPathsUpdate tPathsUpdate = pathsUpdate.toThrift();
+    TPathsDump pathDump = tPathsUpdate.getPathsDump();
+    Map<Integer, TPathEntry> nodeMap = pathDump.getNodeMap();
+    assertEquals(7, nodeMap.size());
+
+    //Test with single leading slashes
+    prefix = "/user/hive/warehouse";
+    prefixes = new String[]{prefix};
+    authzPaths = new HashMap<>();
+    // Makes sure that authorizable object could be associated
+    // with different paths and can be properly persisted into database.
+    tablePath = prefix + "/loc1/db2.db/table1.1";
+    authzPaths.put("db1.table1", Sets.newHashSet(tablePath));
+    notificationID = 2;
+    sentryStore.persistFullPathsImage(authzPaths, notificationID);
+    pathsUpdate = sentryStore.retrieveFullPathsImageUpdate(prefixes);
+    assertEquals(notificationID, pathsUpdate.getImgNum());
+    tPathsUpdate = pathsUpdate.toThrift();
+    pathDump = tPathsUpdate.getPathsDump();
+    nodeMap = pathDump.getNodeMap();
+    assertEquals(7, nodeMap.size());
+
+    //Test with multiple leading slash
+    prefix = "///user/hive/warehouse";
+    prefixes = new String[]{prefix};
+    authzPaths = new HashMap<>();
+    // Makes sure that authorizable object could be associated
+    // with different paths and can be properly persisted into database.
+    tablePath = prefix + "/loc1/db2.db/table1.1";
+    authzPaths.put("db1.table1", Sets.newHashSet(tablePath));
+    notificationID = 3;
+    sentryStore.persistFullPathsImage(authzPaths, notificationID);
+    pathsUpdate = sentryStore.retrieveFullPathsImageUpdate(prefixes);
+    assertEquals(notificationID, pathsUpdate.getImgNum());
+    tPathsUpdate = pathsUpdate.toThrift();
+    pathDump = tPathsUpdate.getPathsDump();
+    nodeMap = pathDump.getNodeMap();
+    assertEquals(7, nodeMap.size());
+  }
 }