Author: astaric
Date: Fri Jan 17 11:49:40 2014
New Revision: 1559080
URL: http://svn.apache.org/r1559080
Log:
Refactor SecurityFilter (Whoosh 2.5 compatibility).
SecurityFilter used to keep filters in lists, converting them to queries when
subqueries property was accessed.
This worked with Whoosh 2.4.1, but failed with Whoosh 2.5. (Whoosh 2.5 adds
additional caching, which checks
SecurityFilter.__hash__ before SecurityFilter.subqueries is accessed).
Refs: #741
Modified:
bloodhound/trunk/bloodhound_search/bhsearch/security.py
bloodhound/trunk/bloodhound_search/bhsearch/tests/security.py
Modified: bloodhound/trunk/bloodhound_search/bhsearch/security.py
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_search/bhsearch/security.py?rev=1559080&r1=1559079&r2=1559080&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_search/bhsearch/security.py (original)
+++ bloodhound/trunk/bloodhound_search/bhsearch/security.py Fri Jan 17 11:49:40
2014
@@ -54,8 +54,8 @@ class SecurityPreprocessor(Component):
def update_security_filter(self, query_parameters, allowed=(), denied=()):
security_filter = self.create_security_filter(query_parameters)
- security_filter.allowed.extend(allowed)
- security_filter.denied.extend(denied)
+ security_filter.add_allowed(allowed)
+ security_filter.add_denied(denied)
def create_security_filter(self, query_parameters):
security_filter = self.find_security_filter(query_parameters['filter'])
@@ -214,32 +214,22 @@ class AuthzSecurityPreprocessor(Security
class SecurityFilter(query.AndNot):
- def __init__(self, allowed=(), denied=()):
- self.allowed = list(allowed)
- self.denied = list(denied)
- super(SecurityFilter, self).__init__(self.allowed, self.denied)
-
- _subqueries = ()
- @property
- def subqueries(self):
- self.finalize()
- return self._subqueries
-
- @subqueries.setter
- def subqueries(self, value):
- pass
-
- def finalize(self):
- self._subqueries = []
- if self.allowed:
- self.a = query.Or(self.allowed)
- else:
- self.a = query.NullQuery
- if self.denied:
- self.b = query.Or(self.denied)
- else:
- self.b = query.NullQuery
- self._subqueries = (self.a, self.b)
+ def __init__(self):
+ super(SecurityFilter, self).__init__(query.NullQuery, query.NullQuery)
+
+ def add_allowed(self, allowed):
+ if self.a == query.NullQuery:
+ self.a = query.Or([])
+
+ self.a.subqueries.extend(allowed)
+ self.subqueries = (self.a, self.b)
+
+ def add_denied(self, denied):
+ if self.b == query.NullQuery:
+ self.b = query.Or([])
+
+ self.b.subqueries.extend(denied)
+ self.subqueries = (self.a, self.b)
def __repr__(self):
r = "%s(allow=%r, deny=%r)" % (self.__class__.__name__,
Modified: bloodhound/trunk/bloodhound_search/bhsearch/tests/security.py
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_search/bhsearch/tests/security.py?rev=1559080&r1=1559079&r2=1559080&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_search/bhsearch/tests/security.py (original)
+++ bloodhound/trunk/bloodhound_search/bhsearch/tests/security.py Fri Jan 17
11:49:40 2014
@@ -25,6 +25,7 @@ system backend.
import contextlib
import os
from sqlite3 import OperationalError
+from bhsearch.security import SecurityFilter
try:
import configobj
@@ -385,12 +386,19 @@ class AuthzSecurityTestCase(SecurityTest
self.assertEqual(1, results.hits)
+class SecurityFilterTests(unittest.TestCase):
+ def test_hash(self):
+ sf = SecurityFilter()
+ hash(sf)
+
+
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(MultiProductSecurityTestCase, 'test'))
if configobj:
suite.addTest(unittest.makeSuite(AuthzSecurityTestCase, 'test'))
+ suite.addTest(unittest.makeSuite(SecurityFilterTests, 'test'))
return suite
if __name__ == '__main__':
- unittest.main()
+ unittest.main(defaultTest="suite")