@@ -2959,6 +2959,80 @@ def testFilteringRetiredString(self):
2959
2959
ae (filt (None , {'title' : ['one' , 'two' ]}, ('+' ,'id' ),
2960
2960
retired = retire ), r [retire ][4 ])
2961
2961
2962
+ def setupQuery (self ):
2963
+ self .filteringSetup ()
2964
+ self .db .user .set ('3' , roles = 'User' )
2965
+ self .db .user .set ('4' , roles = 'User' )
2966
+ self .db .user .set ('5' , roles = 'User' )
2967
+ self .db .commit ()
2968
+ self .db .close ()
2969
+ self .open_database ('bleep' )
2970
+ setupSchema (self .db , 0 , self .module )
2971
+ cls = self .module .Class
2972
+ query = cls (self .db , "query" , klass = String (), name = String (),
2973
+ private_for = Link ("user" ))
2974
+ self .db .post_init ()
2975
+ # Allow searching query
2976
+ sec = self .db .security
2977
+ p = sec .addPermission (name = 'Search' , klass = 'query' )
2978
+ sec .addPermissionToRole ('User' , p )
2979
+ # Queries user3
2980
+ default = dict (klass = 'issue' , private_for = '3' )
2981
+ self .db .query .create (name = 'c5' , ** default )
2982
+ self .db .query .create (name = 'c4' , ** default )
2983
+ self .db .query .create (name = 'b4' , ** default )
2984
+ self .db .query .create (name = 'b3' , ** default )
2985
+ # public queries
2986
+ d = dict (default ,private_for = None )
2987
+ self .db .query .create (name = 'a1' , ** d )
2988
+ self .db .query .create (name = 'a2' , ** d )
2989
+ # Queries user5
2990
+ d = dict (default ,private_for = '5' )
2991
+ self .db .query .create (name = 'other_user1' , ** d )
2992
+ self .db .query .create (name = 'other_user2' , ** d )
2993
+
2994
+ def view_query (db , userid , itemid ):
2995
+ q = db .query .getnode (itemid )
2996
+ if q .private_for is None :
2997
+ return True
2998
+ if q .private_for == userid :
2999
+ return True
3000
+ return False
3001
+
3002
+ return view_query
3003
+
3004
+ def testFilteringWithoutPermissionCheck (self ):
3005
+ view_query = self .setupQuery ()
3006
+ filt = self .db .query .filter
3007
+ r = filt (None , {}, sort = [('+' , 'name' )])
3008
+ # Gets all queries
3009
+ self .assertEqual (r , ['5' , '6' , '4' , '3' , '2' , '1' , '7' , '8' ])
3010
+
3011
+ def testFilteringWithPermissionNoFilterFunction (self ):
3012
+ view_query = self .setupQuery ()
3013
+ perm = self .db .security .addPermission
3014
+ p = perm (name = 'View' , klass = 'query' , check = view_query )
3015
+ self .db .security .addPermissionToRole ("User" , p )
3016
+ filt = self .db .query .filter_with_permissions
3017
+
3018
+ r = filt (None , {}, sort = [('+' , 'name' )])
3019
+ # User may see own and public queries
3020
+ self .assertEqual (r , ['5' , '6' , '4' , '3' , '2' , '1' ])
3021
+
3022
+ def testFilteringWithPermissionFilterFunction (self ):
3023
+ view_query = self .setupQuery ()
3024
+
3025
+ def filter (db , userid , klass ):
3026
+ return [dict (filterspec = dict (private_for = ['-1' , userid ]))]
3027
+ perm = self .db .security .addPermission
3028
+ p = perm (name = 'View' , klass = 'query' , check = view_query , filter = filter )
3029
+ self .db .security .addPermissionToRole ("User" , p )
3030
+ filt = self .db .query .filter_with_permissions
3031
+
3032
+ r = filt (None , {}, sort = [('+' , 'name' )])
3033
+ # User may see own and public queries
3034
+ self .assertEqual (r , ['5' , '6' , '4' , '3' , '2' , '1' ])
3035
+
2962
3036
# XXX add sorting tests for other types
2963
3037
2964
3038
# nuke and re-create db for restore
0 commit comments