@@ -34,6 +34,31 @@ def role_creator_permissions(self, creator, role):
3434 permissions = ('ALTER' , 'DROP' , 'DESCRIBE' )
3535 return [(creator , role , perm ) for perm in permissions ]
3636
37+ def cluster_version_has_unmask_permission (self ):
38+ return self .cluster .version () >= LooseVersion ('4.2' )
39+
40+ def data_resource_creator_permissions (self , creator , resource ):
41+ """
42+ Assemble a list of all permissions needed to create data on a given resource
43+ @param creator User who needs permissions
44+ @param resource The resource to grant permissions on
45+ @return A list of permissions for creator on resource
46+ """
47+ permissions = []
48+ for perm in 'SELECT' , 'MODIFY' , 'ALTER' , 'DROP' , 'AUTHORIZE' :
49+ permissions .append ((creator , resource , perm ))
50+
51+ if self .cluster_version_has_unmask_permission ():
52+ permissions .append ((creator , resource , 'UNMASK' ))
53+
54+ if resource .startswith ("<keyspace " ):
55+ permissions .append ((creator , resource , 'CREATE' ))
56+ keyspace = resource [10 :- 1 ]
57+ # also grant the creator of a ks perms on functions in that ks
58+ for perm in 'CREATE' , 'ALTER' , 'DROP' , 'AUTHORIZE' , 'EXECUTE' :
59+ permissions .append ((creator , '<all functions in %s>' % keyspace , perm ))
60+ return permissions
61+
3762
3863class TestAuth (AbstractTestAuth ):
3964
@@ -947,9 +972,9 @@ def test_list_permissions(self):
947972
948973 # CASSANDRA-7216 automatically grants permissions on a role to its creator
949974 if self .cluster .cassandra_version () >= '2.2.0' :
950- all_permissions .extend (data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
951- all_permissions .extend (data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
952- all_permissions .extend (data_resource_creator_permissions ('cassandra' , '<table ks.cf2>' ))
975+ all_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
976+ all_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
977+ all_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<table ks.cf2>' ))
953978 all_permissions .extend (self .role_creator_permissions ('cassandra' , '<role bob>' ))
954979 all_permissions .extend (self .role_creator_permissions ('cassandra' , '<role cathy>' ))
955980
@@ -962,7 +987,7 @@ def test_list_permissions(self):
962987
963988 expected_permissions = [('cathy' , '<table ks.cf>' , 'MODIFY' ), ('bob' , '<table ks.cf>' , 'DROP' )]
964989 if self .cluster .cassandra_version () >= '2.2.0' :
965- expected_permissions .extend (data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
990+ expected_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
966991 self .assertPermissionsListed (expected_permissions , cassandra , "LIST ALL PERMISSIONS ON ks.cf NORECURSIVE" )
967992
968993 expected_permissions = [('cathy' , '<table ks.cf2>' , 'SELECT' )]
@@ -1136,25 +1161,6 @@ def assertPermissionsListed(self, expected, session, query):
11361161 assert sorted (expected ) == sorted (perms )
11371162
11381163
1139- def data_resource_creator_permissions (creator , resource ):
1140- """
1141- Assemble a list of all permissions needed to create data on a given resource
1142- @param creator User who needs permissions
1143- @param resource The resource to grant permissions on
1144- @return A list of permissions for creator on resource
1145- """
1146- permissions = []
1147- for perm in 'SELECT' , 'MODIFY' , 'ALTER' , 'DROP' , 'AUTHORIZE' :
1148- permissions .append ((creator , resource , perm ))
1149- if resource .startswith ("<keyspace " ):
1150- permissions .append ((creator , resource , 'CREATE' ))
1151- keyspace = resource [10 :- 1 ]
1152- # also grant the creator of a ks perms on functions in that ks
1153- for perm in 'CREATE' , 'ALTER' , 'DROP' , 'AUTHORIZE' , 'EXECUTE' :
1154- permissions .append ((creator , '<all functions in %s>' % keyspace , perm ))
1155- return permissions
1156-
1157-
11581164@since ('2.2' )
11591165class TestAuthRoles (AbstractTestAuth ):
11601166
@@ -1378,8 +1384,8 @@ def test_creator_of_db_resource_granted_all_permissions(self):
13781384 mike_permissions = [('mike' , '<all roles>' , 'CREATE' ),
13791385 ('mike' , '<all keyspaces>' , 'CREATE' )]
13801386 mike_permissions .extend (self .role_creator_permissions ('mike' , '<role role1>' ))
1381- mike_permissions .extend (data_resource_creator_permissions ('mike' , '<keyspace ks>' ))
1382- mike_permissions .extend (data_resource_creator_permissions ('mike' , '<table ks.cf>' ))
1387+ mike_permissions .extend (self . data_resource_creator_permissions ('mike' , '<keyspace ks>' ))
1388+ mike_permissions .extend (self . data_resource_creator_permissions ('mike' , '<table ks.cf>' ))
13831389 mike_permissions .extend (function_resource_creator_permissions ('mike' , '<function ks.state_function_1(int, int)>' ))
13841390 mike_permissions .extend (function_resource_creator_permissions ('mike' , '<function ks.simple_aggregate_1(int)>' ))
13851391
@@ -1661,23 +1667,29 @@ def test_filter_granted_permissions_by_resource_type(self):
16611667
16621668 # GRANT ALL ON KEYSPACE grants Permission.ALL_DATA
16631669 self .superuser .execute ("GRANT ALL ON KEYSPACE ks TO mike" )
1664- self .assert_permissions_listed ([("mike" , "<keyspace ks>" , "CREATE" ),
1665- ("mike" , "<keyspace ks>" , "ALTER" ),
1666- ("mike" , "<keyspace ks>" , "DROP" ),
1667- ("mike" , "<keyspace ks>" , "SELECT" ),
1668- ("mike" , "<keyspace ks>" , "MODIFY" ),
1669- ("mike" , "<keyspace ks>" , "AUTHORIZE" )],
1670+ permissions = [("mike" , "<keyspace ks>" , "CREATE" ),
1671+ ("mike" , "<keyspace ks>" , "ALTER" ),
1672+ ("mike" , "<keyspace ks>" , "DROP" ),
1673+ ("mike" , "<keyspace ks>" , "SELECT" ),
1674+ ("mike" , "<keyspace ks>" , "MODIFY" ),
1675+ ("mike" , "<keyspace ks>" , "AUTHORIZE" )]
1676+ if self .cluster_version_has_unmask_permission ():
1677+ permissions .append (("mike" , "<keyspace ks>" , "UNMASK" ))
1678+ self .assert_permissions_listed (permissions ,
16701679 self .superuser ,
16711680 "LIST ALL PERMISSIONS OF mike" )
16721681 self .superuser .execute ("REVOKE ALL ON KEYSPACE ks FROM mike" )
16731682
16741683 # GRANT ALL ON TABLE does not include CREATE (because the table must already be created before the GRANT)
16751684 self .superuser .execute ("GRANT ALL ON ks.cf TO MIKE" )
1676- self .assert_permissions_listed ([("mike" , "<table ks.cf>" , "ALTER" ),
1677- ("mike" , "<table ks.cf>" , "DROP" ),
1678- ("mike" , "<table ks.cf>" , "SELECT" ),
1679- ("mike" , "<table ks.cf>" , "MODIFY" ),
1680- ("mike" , "<table ks.cf>" , "AUTHORIZE" )],
1685+ permissions = [("mike" , "<table ks.cf>" , "ALTER" ),
1686+ ("mike" , "<table ks.cf>" , "DROP" ),
1687+ ("mike" , "<table ks.cf>" , "SELECT" ),
1688+ ("mike" , "<table ks.cf>" , "MODIFY" ),
1689+ ("mike" , "<table ks.cf>" , "AUTHORIZE" )]
1690+ if self .cluster_version_has_unmask_permission ():
1691+ permissions .append (("mike" , "<table ks.cf>" , "UNMASK" ))
1692+ self .assert_permissions_listed (permissions ,
16811693 self .superuser ,
16821694 "LIST ALL PERMISSIONS OF mike" )
16831695 self .superuser .execute ("REVOKE ALL ON ks.cf FROM mike" )
@@ -1778,8 +1790,8 @@ def test_list_permissions(self):
17781790 ("role1" , "<table ks.cf>" , "SELECT" ),
17791791 ("role2" , "<table ks.cf>" , "ALTER" ),
17801792 ("role2" , "<role role1>" , "ALTER" )]
1781- expected_permissions .extend (data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
1782- expected_permissions .extend (data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
1793+ expected_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
1794+ expected_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
17831795 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role mike>' ))
17841796 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role role1>' ))
17851797 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role role2>' ))
0 commit comments