@@ -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
@@ -1385,8 +1391,8 @@ def test_creator_of_db_resource_granted_all_permissions(self):
13851391 mike_permissions = [('mike' , '<all roles>' , 'CREATE' ),
13861392 ('mike' , '<all keyspaces>' , 'CREATE' )]
13871393 mike_permissions .extend (self .role_creator_permissions ('mike' , '<role role1>' ))
1388- mike_permissions .extend (data_resource_creator_permissions ('mike' , '<keyspace ks>' ))
1389- mike_permissions .extend (data_resource_creator_permissions ('mike' , '<table ks.cf>' ))
1394+ mike_permissions .extend (self . data_resource_creator_permissions ('mike' , '<keyspace ks>' ))
1395+ mike_permissions .extend (self . data_resource_creator_permissions ('mike' , '<table ks.cf>' ))
13901396 mike_permissions .extend (function_resource_creator_permissions ('mike' , '<function ks.state_function_1(int, int)>' ))
13911397 mike_permissions .extend (function_resource_creator_permissions ('mike' , '<function ks.simple_aggregate_1(int)>' ))
13921398
@@ -1671,23 +1677,29 @@ def test_filter_granted_permissions_by_resource_type(self):
16711677
16721678 # GRANT ALL ON KEYSPACE grants Permission.ALL_DATA
16731679 self .superuser .execute ("GRANT ALL ON KEYSPACE ks TO mike" )
1674- self .assert_permissions_listed ([("mike" , "<keyspace ks>" , "CREATE" ),
1675- ("mike" , "<keyspace ks>" , "ALTER" ),
1676- ("mike" , "<keyspace ks>" , "DROP" ),
1677- ("mike" , "<keyspace ks>" , "SELECT" ),
1678- ("mike" , "<keyspace ks>" , "MODIFY" ),
1679- ("mike" , "<keyspace ks>" , "AUTHORIZE" )],
1680+ permissions = [("mike" , "<keyspace ks>" , "CREATE" ),
1681+ ("mike" , "<keyspace ks>" , "ALTER" ),
1682+ ("mike" , "<keyspace ks>" , "DROP" ),
1683+ ("mike" , "<keyspace ks>" , "SELECT" ),
1684+ ("mike" , "<keyspace ks>" , "MODIFY" ),
1685+ ("mike" , "<keyspace ks>" , "AUTHORIZE" )]
1686+ if self .cluster_version_has_unmask_permission ():
1687+ permissions .append (("mike" , "<keyspace ks>" , "UNMASK" ))
1688+ self .assert_permissions_listed (permissions ,
16801689 self .superuser ,
16811690 "LIST ALL PERMISSIONS OF mike" )
16821691 self .superuser .execute ("REVOKE ALL ON KEYSPACE ks FROM mike" )
16831692
16841693 # GRANT ALL ON TABLE does not include CREATE (because the table must already be created before the GRANT)
16851694 self .superuser .execute ("GRANT ALL ON ks.cf TO MIKE" )
1686- self .assert_permissions_listed ([("mike" , "<table ks.cf>" , "ALTER" ),
1687- ("mike" , "<table ks.cf>" , "DROP" ),
1688- ("mike" , "<table ks.cf>" , "SELECT" ),
1689- ("mike" , "<table ks.cf>" , "MODIFY" ),
1690- ("mike" , "<table ks.cf>" , "AUTHORIZE" )],
1695+ permissions = [("mike" , "<table ks.cf>" , "ALTER" ),
1696+ ("mike" , "<table ks.cf>" , "DROP" ),
1697+ ("mike" , "<table ks.cf>" , "SELECT" ),
1698+ ("mike" , "<table ks.cf>" , "MODIFY" ),
1699+ ("mike" , "<table ks.cf>" , "AUTHORIZE" )]
1700+ if self .cluster_version_has_unmask_permission ():
1701+ permissions .append (("mike" , "<table ks.cf>" , "UNMASK" ))
1702+ self .assert_permissions_listed (permissions ,
16911703 self .superuser ,
16921704 "LIST ALL PERMISSIONS OF mike" )
16931705 self .superuser .execute ("REVOKE ALL ON ks.cf FROM mike" )
@@ -1788,8 +1800,8 @@ def test_list_permissions(self):
17881800 ("role1" , "<table ks.cf>" , "SELECT" ),
17891801 ("role2" , "<table ks.cf>" , "ALTER" ),
17901802 ("role2" , "<role role1>" , "ALTER" )]
1791- expected_permissions .extend (data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
1792- expected_permissions .extend (data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
1803+ expected_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<keyspace ks>' ))
1804+ expected_permissions .extend (self . data_resource_creator_permissions ('cassandra' , '<table ks.cf>' ))
17931805 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role mike>' ))
17941806 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role role1>' ))
17951807 expected_permissions .extend (self .role_creator_permissions ('cassandra' , '<role role2>' ))
0 commit comments