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")


Reply via email to