Skip to content

Commit 167164a

Browse files
committed
Test new filter function in security checks
And add bug-fix after moving filter_with_permissions to hyperdb.
1 parent 5227890 commit 167164a

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

roundup/hyperdb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,10 +1828,10 @@ def filter_with_permissions(self, search_matches, filterspec, sort=[],
18281828
new_ids = set(item_ids)
18291829
confirmed = set()
18301830
for perm in sec.filter_iter(permission, userid, cn):
1831-
fargs = perm.filter(self._client.db, userid, klass)
1831+
fargs = perm.filter(self.db, userid, self)
18321832
for farg in fargs:
18331833
farg.update(sort=[], group=[], retired=None)
1834-
result = klass.filter(list(new_ids), **farg)
1834+
result = self.filter(list(new_ids), **farg)
18351835
new_ids.difference_update(result)
18361836
confirmed.update(result)
18371837
# all allowed?

test/db_test_base.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)