Repository: hbase
Updated Branches:
  refs/heads/branch-1 f9fce4caf -> 81c4caf1f


HBASE-12142 Truncate command does not preserve ACLs table (Vandana 
Ayyalasomayajula)

Conflicts:
        
hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/81c4caf1
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/81c4caf1
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/81c4caf1

Branch: refs/heads/branch-1
Commit: 81c4caf1f1ded4132339f4c7de17ce48725d81e5
Parents: f9fce4c
Author: Andrew Purtell <[email protected]>
Authored: Tue Oct 28 09:59:45 2014 -0700
Committer: Andrew Purtell <[email protected]>
Committed: Tue Oct 28 09:59:45 2014 -0700

----------------------------------------------------------------------
 .../hbase/security/access/AccessController.java | 23 ++++++++++++++++++-
 .../security/access/TestAccessController.java   | 24 ++++++++++++++++++--
 2 files changed, 44 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/81c4caf1/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
index bd91501..1602f9f 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
@@ -175,6 +175,8 @@ public class AccessController extends 
BaseMasterAndRegionObserver
   private Map<InternalScanner,String> scannerOwners =
       new MapMaker().weakKeys().makeMap();
 
+  private Map<TableName, List<UserPermission>> tableAcls;
+
   // Provider for mapping principal names to Users
   private UserProvider userProvider;
 
@@ -857,6 +859,8 @@ public class AccessController extends 
BaseMasterAndRegionObserver
     } else {
       throw new RuntimeException("Error obtaining TableAuthManager, zk found 
null.");
     }
+
+    tableAcls = new MapMaker().weakValues().makeMap();
   }
 
   public void stop(CoprocessorEnvironment env) {
@@ -934,7 +938,24 @@ public class AccessController extends 
BaseMasterAndRegionObserver
   @Override
   public void preTruncateTable(ObserverContext<MasterCoprocessorEnvironment> 
c, TableName tableName)
       throws IOException {
-    requirePermission("truncateTable", tableName, null, null, Action.ADMIN, 
Action.CREATE);
+    requirePermission("truncateTable", tableName, null, null, Action.ADMIN);
+    List<UserPermission> acls = 
AccessControlLists.getUserTablePermissions(c.getEnvironment()
+        .getConfiguration(), tableName);
+    if (acls != null) {
+      tableAcls.put(tableName, acls);
+    }
+  }
+
+  @Override
+  public void postTruncateTable(ObserverContext<MasterCoprocessorEnvironment> 
ctx,
+      TableName tableName) throws IOException {
+    List<UserPermission> perms = tableAcls.get(tableName);
+    if (perms != null) {
+      for (UserPermission perm : perms) {
+        
AccessControlLists.addUserPermission(ctx.getEnvironment().getConfiguration(), 
perm);
+      }
+    }
+    tableAcls.remove(tableName);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hbase/blob/81c4caf1/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
index f5bb872..9dde626 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
@@ -37,6 +37,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.permission.FsPermission;
 import org.apache.hadoop.hbase.Coprocessor;
 import org.apache.hadoop.hbase.CoprocessorEnvironment;
+import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
@@ -335,8 +336,8 @@ public class TestAccessController extends SecureTestUtil {
       }
     };
 
-    verifyAllowed(truncateTable, SUPERUSER, USER_ADMIN, USER_CREATE, 
USER_OWNER);
-    verifyDenied(truncateTable, USER_RW, USER_RO, USER_NONE);
+    verifyAllowed(truncateTable, SUPERUSER, USER_ADMIN);
+    verifyDenied(truncateTable, USER_RW, USER_RO, USER_NONE,USER_CREATE, 
USER_OWNER);
   }
 
   @Test
@@ -2280,4 +2281,23 @@ public class TestAccessController extends SecureTestUtil 
{
      }
      TEST_UTIL.getMiniHBaseCluster().getMaster().deleteNamespace(namespace);
    }
+
+  @Test
+  public void testTruncatePerms() throws Exception {
+    try {
+      List<UserPermission> existingPerms = 
AccessControlClient.getUserPermissions(conf, TEST_TABLE
+          .getTableName().getNameAsString());
+      assertTrue(existingPerms != null);
+      assertTrue(existingPerms.size() > 1);
+      TEST_UTIL.getHBaseAdmin().disableTable(TEST_TABLE.getTableName());
+      TEST_UTIL.getHBaseAdmin().truncateTable(TEST_TABLE.getTableName(), true);
+      List<UserPermission> perms = 
AccessControlClient.getUserPermissions(conf, TEST_TABLE
+          .getTableName().getNameAsString());
+      assertTrue(perms != null);
+      assertEquals(existingPerms.size(), perms.size());
+    } catch (Throwable e) {
+      throw new HBaseException(e);
+    }
+  }
+
 }

Reply via email to