diff options
author | Ionuț Arțăriși <iartarisi@suse.cz> | 2013-02-11 15:19:56 +0100 |
---|---|---|
committer | Ionuț Arțăriși <iartarisi@suse.cz> | 2013-02-11 16:25:29 +0100 |
commit | a5cd95eb8433791a25c9d4aa63a6fe49f3ffd361 (patch) | |
tree | 7d3424177c2716413d68a6d5a5ebf47b3a8b1763 /keystone/common | |
parent | c05041e4f2b1ac89d105b1a35d5f4f9a1f065573 (diff) | |
download | keystone-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.py | 14 | ||||
-rw-r--r-- | 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) |