summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Zuna <pzuna@redhat.com>2010-09-21 13:03:40 -0400
committerRob Crittenden <rcritten@redhat.com>2010-10-20 17:38:03 -0400
commit42c78a383d156e2ad7e6ae7832ccb1adc14d23c0 (patch)
tree9b7433f2bdbbe299244ae0cdd221f026ed1da684
parent4f7f40004361d9a63f625e5e70d0969c41d43958 (diff)
downloadfreeipa.git-42c78a383d156e2ad7e6ae7832ccb1adc14d23c0.tar.gz
freeipa.git-42c78a383d156e2ad7e6ae7832ccb1adc14d23c0.tar.xz
freeipa.git-42c78a383d156e2ad7e6ae7832ccb1adc14d23c0.zip
Add flag to group-find to only search on private groups.
ticket #251
-rw-r--r--ipalib/plugins/group.py31
-rw-r--r--tests/test_xmlrpc/test_group_plugin.py21
-rw-r--r--tests/test_xmlrpc/test_user_plugin.py65
3 files changed, 111 insertions, 6 deletions
diff --git a/ipalib/plugins/group.py b/ipalib/plugins/group.py
index 55d8dfd3..2b8dc1af 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 92792cbf..55bb9cde 100644
--- a/tests/test_xmlrpc/test_group_plugin.py
+++ b/tests/test_xmlrpc/test_group_plugin.py
@@ -571,13 +571,32 @@ 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], {}),
expected=errors.ManagedGroupError(),
diff --git a/tests/test_xmlrpc/test_user_plugin.py b/tests/test_xmlrpc/test_user_plugin.py
index c6770b70..ee02a0f8 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(),
),
@@ -318,6 +319,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], {}),
expected=errors.NotFound(reason='no such entry'),