summaryrefslogtreecommitdiffstats
path: root/ipa_server/plugins
diff options
context:
space:
mode:
authorRob Crittenden <rcritten@redhat.com>2008-10-15 16:11:34 -0400
committerRob Crittenden <rcritten@redhat.com>2008-10-15 16:12:27 -0400
commit3268b65ae0dfc7ffdeba685e8e2515a437bf092e (patch)
treea791d5d9f6daeb11e3d8644c0ba8b95d46889011 /ipa_server/plugins
parentaf7c0ee595bf522a7f52e5e1b6515a3a27292846 (diff)
downloadfreeipa-3268b65ae0dfc7ffdeba685e8e2515a437bf092e.tar.gz
freeipa-3268b65ae0dfc7ffdeba685e8e2515a437bf092e.tar.xz
freeipa-3268b65ae0dfc7ffdeba685e8e2515a437bf092e.zip
Initial implementation of a generic search routine.
Diffstat (limited to 'ipa_server/plugins')
-rw-r--r--ipa_server/plugins/b_ldap.py74
1 files changed, 71 insertions, 3 deletions
diff --git a/ipa_server/plugins/b_ldap.py b/ipa_server/plugins/b_ldap.py
index c48230382..42fa65a58 100644
--- a/ipa_server/plugins/b_ldap.py
+++ b/ipa_server/plugins/b_ldap.py
@@ -60,9 +60,8 @@ class ldap(CrudBackend):
object_type = "posixGroup"
elif key_attribute == "krbprincipal": # Service
object_type = "krbPrincipal"
-
- if not object_type:
- return None
+ else:
+ return None
filter = "(&(%s=%s)(objectclass=%s))" % (
key_attribute,
@@ -76,6 +75,31 @@ class ldap(CrudBackend):
return entry['dn']
+ def generate_search_filters(self, **kw):
+ """Generates a search filter based on a list of words and a list
+ of fields to search against.
+
+ Returns a tuple of two filters: (exact_match, partial_match)
+ """
+
+ # construct search pattern for a single word
+ # (|(f1=word)(f2=word)...)
+ exact_pattern = "(|"
+ for field in kw.keys():
+ exact_pattern += "(%s=%s)" % (field, kw[field])
+ exact_pattern += ")"
+
+ sub_pattern = "(|"
+ for field in kw.keys():
+ sub_pattern += "(%s=*%s*)" % (field, kw[field])
+ sub_pattern += ")"
+
+ # construct the giant match for all words
+ exact_match_filter = "(&" + exact_pattern + ")"
+ partial_match_filter = "(|" + sub_pattern + ")"
+
+ return (exact_match_filter, partial_match_filter)
+
def create(self, **kw):
if servercore.entry_exists(kw['dn']):
raise errors.DuplicateEntry("entry already exists")
@@ -107,6 +131,50 @@ class ldap(CrudBackend):
def delete(self, dn):
return servercore.delete_entry(dn)
+ def search(self, **kw):
+ objectclass = kw.get('objectclass')
+ if objectclass:
+ del kw['objectclass']
+ (exact_match_filter, partial_match_filter) = self.generate_search_filters(**kw)
+ if objectclass:
+ exact_match_filter = "(&(objectClass=%s)%s)" % (objectclass, exact_match_filter)
+ partial_match_filter = "(&(objectClass=%s)%s)" % (objectclass, partial_match_filter)
+
+ search_base = "%s, %s" % (self.api.env.container_accounts, self.api.env.basedn)
+ try:
+ exact_results = servercore.search(search_base,
+ exact_match_filter, ["*"])
+ except errors.NotFound:
+ exact_results = [0]
+
+ try:
+ partial_results = servercore.search(search_base,
+ partial_match_filter, ["*"])
+ except errors.NotFound:
+ partial_results = [0]
+
+ exact_counter = exact_results[0]
+ partial_counter = partial_results[0]
+
+ exact_results = exact_results[1:]
+ partial_results = partial_results[1:]
+
+ # Remove exact matches from the partial_match list
+ exact_dns = set(map(lambda e: e.get('dn'), exact_results))
+ partial_results = filter(lambda e: e.get('dn') not in exact_dns,
+ partial_results)
+
+ if (exact_counter == -1) or (partial_counter == -1):
+ counter = -1
+ else:
+ counter = len(exact_results) + len(partial_results)
+
+ results = [counter]
+ for r in exact_results + partial_results:
+ results.append(r)
+
+ return results
+
api.register(ldap)
def delete(self, dn):