@@ -2959,6 +2959,80 @@ def testFilteringRetiredString(self):
29592959 ae (filt (None , {'title' : ['one' , 'two' ]}, ('+' ,'id' ),
29602960 retired = retire ), r [retire ][4 ])
29612961
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+
29623036# XXX add sorting tests for other types
29633037
29643038 # nuke and re-create db for restore
0 commit comments