You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by as...@apache.org on 2014/01/17 12:49:41 UTC

svn commit: r1559080 - in /bloodhound/trunk/bloodhound_search/bhsearch: security.py tests/security.py

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