diff --git a/CHANGES.txt b/CHANGES.txt index ef6b848ff2..4af9fb7b63 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.0.5 + * Grant permission on keyspaces system_views and system_virtual_schema not possible (CASSANDRA-20171) * Avoid purging deletions in RowFilter when reconciliation is required (CASSANDRA-20541) * Fixed multiple single-node SAI query bugs relating to static columns (CASSANDRA-20338) * Upgrade com.datastax.cassandra:cassandra-driver-core:3.11.5 to org.apache.cassandra:cassandra-driver-core:3.12.1 (CASSANDRA-17231) diff --git a/src/java/org/apache/cassandra/auth/DataResource.java b/src/java/org/apache/cassandra/auth/DataResource.java index 4923a0b2d6..6776fc1449 100644 --- a/src/java/org/apache/cassandra/auth/DataResource.java +++ b/src/java/org/apache/cassandra/auth/DataResource.java @@ -24,6 +24,7 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; import org.apache.cassandra.schema.Schema; +import org.apache.cassandra.schema.SchemaConstants; /** * The primary type of resource in Cassandra. @@ -249,7 +250,8 @@ public class DataResource implements IResource return true; case KEYSPACE: case ALL_TABLES: - return Schema.instance.getKeyspaces().contains(keyspace); + return SchemaConstants.isVirtualSystemKeyspace(keyspace) || + Schema.instance.getKeyspaces().contains(keyspace); case TABLE: return Schema.instance.getTableMetadata(keyspace, table) != null; } diff --git a/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java b/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java index 96a1b4b027..5e2557e3b5 100644 --- a/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java +++ b/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java @@ -36,6 +36,7 @@ import org.apache.cassandra.db.SystemKeyspace; import org.apache.cassandra.schema.Schema; import org.apache.cassandra.schema.SchemaConstants; import org.apache.cassandra.schema.TableMetadata; +import org.apache.cassandra.service.CassandraDaemon; import org.apache.cassandra.transport.ProtocolVersion; import static java.lang.String.format; @@ -60,6 +61,7 @@ public class GrantAndRevokeTest extends CQLTester CQLTester.setUpClass(); requireAuthentication(); requireNetwork(); + CassandraDaemon.getInstanceForTesting().setupVirtualKeyspaces(); } @After @@ -473,6 +475,18 @@ public class GrantAndRevokeTest extends CQLTester executeNet(ProtocolVersion.CURRENT, "INSERT INTO system.peers_v2(peer, peer_port, data_center) VALUES ('127.0.100.100', 7012, 'invalid_dc')"); } + @Test + public void testGrantOnVirtualKeyspaces() throws Throwable + { + useSuperUser(); + executeNet(String.format("CREATE ROLE %s WITH LOGIN = TRUE AND password='%s'", user, pass)); + + executeNet(ProtocolVersion.CURRENT, format("GRANT SELECT PERMISSION ON KEYSPACE system_virtual_schema TO %s", user)); + executeNet(ProtocolVersion.CURRENT, format("GRANT SELECT PERMISSION ON KEYSPACE system_views TO %s", user)); + executeNet(ProtocolVersion.CURRENT, format("REVOKE SELECT PERMISSION ON KEYSPACE system_virtual_schema FROM %s", user)); + executeNet(ProtocolVersion.CURRENT, format("REVOKE SELECT PERMISSION ON KEYSPACE system_views FROM %s", user)); + } + private void maybeReadSystemTables(boolean superuser) throws Throwable { if (superuser)