summaryrefslogtreecommitdiffstats
path: root/keystone/common
diff options
context:
space:
mode:
authorIonuț Arțăriși <iartarisi@suse.cz>2013-02-11 15:19:56 +0100
committerIonuț Arțăriși <iartarisi@suse.cz>2013-02-11 16:25:29 +0100
commita5cd95eb8433791a25c9d4aa63a6fe49f3ffd361 (patch)
tree7d3424177c2716413d68a6d5a5ebf47b3a8b1763 /keystone/common
parentc05041e4f2b1ac89d105b1a35d5f4f9a1f065573 (diff)
downloadkeystone-a5cd95eb8433791a25c9d4aa63a6fe49f3ffd361.tar.gz
keystone-a5cd95eb8433791a25c9d4aa63a6fe49f3ffd361.tar.xz
keystone-a5cd95eb8433791a25c9d4aa63a6fe49f3ffd361.zip
simplify query building logic
as a side-effect we now have fakeldap with support for '&' queries with a single filter(e.g. "(&(myfilter=true))" ) Change-Id: I29564704f58e108cbfb488c18e1dfd4656e1d18c
Diffstat (limited to 'keystone/common')
-rw-r--r--keystone/common/ldap/core.py14
-rw-r--r--keystone/common/ldap/fakeldap.py16
2 files changed, 12 insertions, 18 deletions
diff --git a/keystone/common/ldap/core.py b/keystone/common/ldap/core.py
index e767e93e..aab42a20 100644
--- a/keystone/common/ldap/core.py
+++ b/keystone/common/ldap/core.py
@@ -204,11 +204,8 @@ class BaseLdap(object):
def _ldap_get(self, id, filter=None):
conn = self.get_connection()
- query = '(objectClass=%s)' % self.object_class
- if (filter is not None or self.filter is not None):
- localfilter = self.filter if self.filter is not None else ''
- paramfilter = filter if filter is not None else ''
- query = '(&%s%s%s)' % (localfilter, paramfilter, query)
+ query = '(&%s(objectClass=%s))' % (filter or self.filter or '',
+ self.object_class)
try:
res = conn.search_s(self._id_to_dn(id), ldap.SCOPE_BASE, query)
except ldap.NO_SUCH_OBJECT:
@@ -221,11 +218,8 @@ class BaseLdap(object):
def _ldap_get_all(self, filter=None):
conn = self.get_connection()
- query = '(objectClass=%s)' % (self.object_class,)
- if (filter is not None or self.filter is not None):
- localfilter = self.filter if self.filter is not None else ''
- paramfilter = filter if filter is not None else ''
- query = '(&%s%s%s)' % (localfilter, paramfilter, query)
+ query = '(&%s(objectClass=%s))' % (filter or self.filter or '',
+ self.object_class)
try:
return conn.search_s(self.tree_dn, ldap.SCOPE_ONELEVEL, query)
except ldap.NO_SUCH_OBJECT:
diff --git a/keystone/common/ldap/fakeldap.py b/keystone/common/ldap/fakeldap.py
index b41f20d5..43490bef 100644
--- a/keystone/common/ldap/fakeldap.py
+++ b/keystone/common/ldap/fakeldap.py
@@ -51,14 +51,14 @@ def _match_query(query, attrs):
"""
# cut off the parentheses
inner = query[1:-1]
- if inner.startswith('&'):
- # cut off the &
- l, r = _paren_groups(inner[1:])
- return _match_query(l, attrs) and _match_query(r, attrs)
- if inner.startswith('|'):
- # cut off the |
- l, r = _paren_groups(inner[1:])
- return _match_query(l, attrs) or _match_query(r, attrs)
+ if inner.startswith(('&', '|')):
+ # cut off the & or |
+ groups = _paren_groups(inner[1:])
+ try:
+ l, r = groups
+ return _match_query(l, attrs) and _match_query(r, attrs)
+ except ValueError: # just one group
+ return _match_query(groups[0], attrs)
if inner.startswith('!'):
# cut off the ! and the nested parentheses
return not _match_query(query[2:-1], attrs)