Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -319,16 +319,31 @@ public void postStartMaster(ObserverContext<MasterCoprocessorEnvironment> ctx) t

@Override
public void preSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, SnapshotDescription snapshot, TableDescriptor hTableDescriptor) throws IOException {
if (hTableDescriptor == null) {
// HBase can call this hook with a null table descriptor when the table does not exist (HBASE-29361); the operation fails in HBase anyway
return;
}

requirePermission(ctx, "snapshot", hTableDescriptor.getTableName().getName(), Permission.Action.ADMIN);
}

@Override
public void preCloneSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, SnapshotDescription snapshot, TableDescriptor hTableDescriptor) throws IOException {
if (hTableDescriptor == null) {
// HBase can call this hook with a null table descriptor when the table does not exist (HBASE-29361); the operation fails in HBase anyway
return;
}

requirePermission(ctx, "cloneSnapshot", hTableDescriptor.getTableName().getName(), Permission.Action.ADMIN);
}

@Override
public void preRestoreSnapshot(ObserverContext<MasterCoprocessorEnvironment> ctx, SnapshotDescription snapshot, TableDescriptor hTableDescriptor) throws IOException {
if (hTableDescriptor == null) {
// HBase can call this hook with a null table descriptor when the table does not exist (HBASE-29361); the operation fails in HBase anyway
return;
}

requirePermission(ctx, "restoreSnapshot", hTableDescriptor.getTableName().getName(), Permission.Action.ADMIN);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.SnapshotDescription;
import org.apache.hadoop.hbase.client.SnapshotType;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
Expand Down Expand Up @@ -127,6 +129,7 @@
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
Expand Down Expand Up @@ -2878,4 +2881,30 @@ public void test115_requirePermission_collection_accessDenied() throws Exception
// cleanup
pf.set(null, null);
}

@Test
public void test116_preSnapshotHooks_skipPermissionCheckWhenTableDescriptorNull() throws Exception {
RangerAuthorizationCoprocessor cp = spy(new RangerAuthorizationCoprocessor());
ObserverContext<MasterCoprocessorEnvironment> ctx = mock(ObserverContext.class);
SnapshotDescription snapshot = new SnapshotDescription("snap", TableName.valueOf("nonexistent"), SnapshotType.FLUSH);

cp.preSnapshot(ctx, snapshot, null);
cp.preCloneSnapshot(ctx, snapshot, null);
cp.preRestoreSnapshot(ctx, snapshot, null);

verify(cp, never()).requirePermission(any(ObserverContext.class), anyString(), any(byte[].class), any(Permission.Action.class));
}

@Test
public void test117_preSnapshotHooks_checkPermissionWhenTableDescriptorPresent() throws Exception {
RangerAuthorizationCoprocessor cp = spy(new RangerAuthorizationCoprocessor());
doNothing().when(cp).requirePermission(any(ObserverContext.class), anyString(), any(byte[].class), any(Permission.Action.class));
ObserverContext<MasterCoprocessorEnvironment> ctx = mock(ObserverContext.class);
SnapshotDescription snapshot = new SnapshotDescription("snap", TableName.valueOf("t"), SnapshotType.FLUSH);
TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf("t")).build();

cp.preSnapshot(ctx, snapshot, tableDescriptor);

verify(cp).requirePermission(any(ObserverContext.class), eq("snapshot"), any(byte[].class), any(Permission.Action.class));
}
}