From 42c78a383d156e2ad7e6ae7832ccb1adc14d23c0 Mon Sep 17 00:00:00 2001 From: Pavel Zuna Date: Tue, 21 Sep 2010 13:03:40 -0400 Subject: [PATCH] Add flag to group-find to only search on private groups. ticket #251 --- ipalib/plugins/group.py | 31 +++++++++++- tests/test_xmlrpc/test_group_plugin.py | 21 ++++++++- tests/test_xmlrpc/test_user_plugin.py | 65 ++++++++++++++++++++++++-- 3 files changed, 111 insertions(+), 6 deletions(-) diff --git a/ipalib/plugins/group.py b/ipalib/plugins/group.py index 55d8dfd3e..2b8dc1af1 100644 --- a/ipalib/plugins/group.py +++ b/ipalib/plugins/group.py @@ -188,7 +188,6 @@ class group_mod(LDAPUpdate): """ Modify a group. """ - msg_summary = _('Modified group "%(value)s"') takes_options = LDAPUpdate.takes_options + ( @@ -218,11 +217,39 @@ class group_find(LDAPSearch): """ Search for groups. """ - msg_summary = ngettext( '%(count)d group matched', '%(count)d groups matched', 0 ) + takes_options = LDAPSearch.takes_options + ( + Flag('private', + cli_name='private', + doc=_('search for private groups'), + ), + ) + + def pre_callback(self, ldap, filter, attrs_list, base_dn, *args, **options): + # if looking for private groups, we need to create a new search filter, + # because private groups have different object classes + if options['private']: + # filter based on options, oflt + search_kw = self.args_options_2_entry(**options) + search_kw['objectclass'] = ['posixGroup', 'mepManagedEntry'] + oflt = ldap.make_filter(search_kw, rules=ldap.MATCH_ALL) + + # filter based on 'criteria' argument + search_kw = {} + config = ldap.get_ipa_config()[1] + attrs = config.get(self.obj.search_attributes_config, []) + if len(attrs) == 1 and isinstance(attrs[0], basestring): + search_attrs = attrs[0].split(',') + for a in search_attrs: + search_kw[a] = args[-1] + cflt = ldap.make_filter(search_kw, exact=False) + + filter = ldap.combine_filters((oflt, cflt), rules=ldap.MATCH_ALL) + return filter + api.register(group_find) diff --git a/tests/test_xmlrpc/test_group_plugin.py b/tests/test_xmlrpc/test_group_plugin.py index 92792cbfd..55bb9cde1 100644 --- a/tests/test_xmlrpc/test_group_plugin.py +++ b/tests/test_xmlrpc/test_group_plugin.py @@ -571,12 +571,31 @@ class test_group(Declarative): cn=[user1], description=[u'User private group for %s' % user1], gidnumber=[fuzzy_digits], - dn=u'cn=%s,cn=groups,cn=accounts,%s' % (user1, api.env.basedn), + dn=u'cn=%s,cn=groups,cn=accounts,%s' % (user1, api.env.basedn), ), ), ), + dict( + desc='Verify that managed group %r can be found' % user1, + command=('group_find', [], {'cn': user1, 'private': True}), + expected=dict( + count=1, + truncated=False, + result=[ + dict( + dn=u'cn=%s,cn=groups,cn=accounts,%s' % (user1, api.env.basedn), + cn=[user1], + description=[u'User private group for %s' % user1], + gidnumber=[fuzzy_digits], + ), + ], + summary=u'1 group matched', + ), + ), + + dict( desc='Try to delete a managed group %r' % user1, command=('group_del', [user1], {}), diff --git a/tests/test_xmlrpc/test_user_plugin.py b/tests/test_xmlrpc/test_user_plugin.py index c6770b700..ee02a0f81 100644 --- a/tests/test_xmlrpc/test_user_plugin.py +++ b/tests/test_xmlrpc/test_user_plugin.py @@ -30,6 +30,7 @@ from xmlrpc_test import Declarative, fuzzy_digits, fuzzy_uuid user_memberof = (u'cn=ipausers,cn=groups,cn=accounts,%s' % api.env.basedn,) user1=u'tuser1' +user2=u'tuser2' invaliduser1=u'+tuser1' invaliduser2=u'tuser1234567890123456789012345678901234567890' @@ -38,7 +39,7 @@ invaliduser2=u'tuser1234567890123456789012345678901234567890' class test_user(Declarative): cleanup_commands = [ - ('user_del', [user1], {}), + ('user_del', [user1, user2], {}), ] tests = [ @@ -67,7 +68,7 @@ class test_user(Declarative): dict( desc='Create %r' % user1, command=( - 'user_add', [], dict(givenname=u'Test', sn=u'User1') + 'user_add', [user1], dict(givenname=u'Test', sn=u'User1') ), expected=dict( value=user1, @@ -92,7 +93,7 @@ class test_user(Declarative): dict( desc='Try to create duplicate %r' % user1, command=( - 'user_add', [], dict(givenname=u'Test', sn=u'User1') + 'user_add', [user1], dict(givenname=u'Test', sn=u'User1') ), expected=errors.DuplicateEntry(), ), @@ -317,6 +318,64 @@ class test_user(Declarative): ), + dict( + desc='Create %r' % user1, + command=( + 'user_add', [user1], dict(givenname=u'Test', sn=u'User1') + ), + expected=dict( + value=user1, + summary=u'Added user "tuser1"', + result=dict( + gecos=[user1], + givenname=[u'Test'], + homedirectory=[u'/home/tuser1'], + krbprincipalname=[u'tuser1@' + api.env.realm], + loginshell=[u'/bin/sh'], + objectclass=objectclasses.user, + sn=[u'User1'], + uid=[user1], + uidnumber=[fuzzy_digits], + ipauniqueid=[fuzzy_uuid], + dn=u'uid=tuser1,cn=users,cn=accounts,' + api.env.basedn, + ), + ), + ), + + dict( + desc='Create %r' % user2, + command=( + 'user_add', [user2], dict(givenname=u'Test', sn=u'User2') + ), + expected=dict( + value=user2, + summary=u'Added user "tuser2"', + result=dict( + gecos=[user2], + givenname=[u'Test'], + homedirectory=[u'/home/tuser2'], + krbprincipalname=[u'tuser2@' + api.env.realm], + loginshell=[u'/bin/sh'], + objectclass=objectclasses.user, + sn=[u'User2'], + uid=[user2], + uidnumber=[fuzzy_digits], + ipauniqueid=[fuzzy_uuid], + dn=u'uid=tuser2,cn=users,cn=accounts,' + api.env.basedn, + ), + ), + ), + + dict( + desc='Delete %r and %r at the same time' % (user1, user2), + command=('user_del', [user1, user2], {}), + expected=dict( + result=True, + summary=u'Deleted user "tuser1,tuser2"', + value=u','.join((user1, user2)), + ), + ), + dict( desc='Try to retrieve non-existent %r' % user1, command=('user_show', [user1], {}),