From a5cd95eb8433791a25c9d4aa63a6fe49f3ffd361 Mon Sep 17 00:00:00 2001 From: Ionuț Arțăriși Date: Mon, 11 Feb 2013 15:19:56 +0100 Subject: 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 --- keystone/common/ldap/core.py | 14 ++++---------- keystone/common/ldap/fakeldap.py | 16 ++++++++-------- 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) -- cgit