From 5262f50bc913045feb4c229f8f17d14a05e52022 Mon Sep 17 00:00:00 2001 From: Anuj Borah Date: Feb 25 2019 03:55:02 +0000 Subject: Issue: 50219 - Add generic filter to DSLdapObjects Add generic filter to DSLdapObjects https://pagure.io/389-ds-base/issue/50219 Reviewed by: William Brown --- diff --git a/dirsrvtests/tests/suites/filter/basic_filter_test.py b/dirsrvtests/tests/suites/filter/basic_filter_test.py new file mode 100644 index 0000000..5c5a3aa --- /dev/null +++ b/dirsrvtests/tests/suites/filter/basic_filter_test.py @@ -0,0 +1,48 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2019 RED Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK ---- + +import pytest, os + +from lib389._constants import DEFAULT_SUFFIX, PW_DM +from lib389.topologies import topology_st as topo + +from lib389.idm.user import UserAccount, UserAccounts +from lib389.idm.account import Accounts + + +def test_search_attr(topo): + """ + Test filter can search attributes + :id:9d27f048-7db8-11e8-a71c-8c16451d917b + :setup: server + :steps: + 1. Add test entry + 2. make search + :expectedresults: + 1. Entry should be added + 2. Operation should succeed + """ + user = UserAccounts(topo.standalone, DEFAULT_SUFFIX) + for i in range(1, 5): + user1 = user.create_test_user(uid=i) + user1.set("mail", "AnujBorah{}@ok.com".format(i)) + + # Testing filter is working for any king of attr + + user = Accounts(topo.standalone, DEFAULT_SUFFIX) + + assert len(user.filter('(mail=*)')) == 4 + assert len(user.filter('(uid=*)')) == 4 + + # Testing filter is working for other filters + assert len(user.filter("(objectclass=inetOrgPerson)")) == 4 + + +if __name__ == "__main__": + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s -v %s" % CURRENT_FILE) diff --git a/src/lib389/lib389/_mapped_object.py b/src/lib389/lib389/_mapped_object.py index 9c5e0bd..a035f65 100644 --- a/src/lib389/lib389/_mapped_object.py +++ b/src/lib389/lib389/_mapped_object.py @@ -1039,4 +1039,23 @@ class DSLdapObjects(DSLogging): # Now actually commit the creation req return co.ensure_state(rdn, properties, self._basedn) + def filter(self, search): + # This will yield and & filter for objectClass with as many terms as needed. + search_filter = _gen_and([self._get_objectclass_filter(),search]) + self._log.debug('list filter = %s' % search_filter) + try: + results = self._instance.search_ext_s( + base=self._basedn, + scope=self._scope, + filterstr=search_filter, + attrlist=self._list_attrlist, + serverctrls=self._server_controls, clientctrls=self._client_controls + ) + # def __init__(self, instance, dn=None): + insts = [self._entry_to_instance(dn=r.dn, entry=r) for r in results] + except ldap.NO_SUCH_OBJECT: + # There are no objects to select from, se we return an empty array + insts = [] + return insts +