Hi, this couple of patches fixes and improves the coverage for referential integrity of ID overrides.
Note: Last test in the patch 374 is supposed to be failing (for now). https://fedorahosted.org/freeipa/ticket/5322
From 17fab1cf2ff1966b97507477455ecda6bc91bdbd Mon Sep 17 00:00:00 2001 From: Tomas Babej <tba...@redhat.com> Date: Mon, 12 Oct 2015 13:15:20 +0200 Subject: [PATCH] idoverride: Ignore ValidationErrors when converting the anchor When converting the anchor to a human readable form, SID validation may fail, i.e. if the domain is no longer trusted. Ignore such cases and pass along the anchor in the raw format. https://fedorahosted.org/freeipa/ticket/5322 --- ipalib/plugins/idviews.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/ipalib/plugins/idviews.py b/ipalib/plugins/idviews.py index a910486cd0160571311924ce799800aa54868dcc..cd65b92c63d8272522f7381dd2bc175ea51394b8 100644 --- a/ipalib/plugins/idviews.py +++ b/ipalib/plugins/idviews.py @@ -689,6 +689,11 @@ class baseidoverride(LDAPObject): # If we were unable to resolve the anchor, # keep it in the raw form pass + except errors.ValidationError: + # Same as above, ValidationError may be raised when SIDs + # are attempted to be converted, but the domain is no + # longer trusted + pass def prohibit_ipa_users_in_default_view(self, dn, entry_attrs): # Check if parent object is Default Trust View, if so, prohibit @@ -773,12 +778,7 @@ class baseidoverride_find(LDAPSearch): def post_callback(self, ldap, entries, truncated, *args, **options): for entry in entries: - try: - self.obj.convert_anchor_to_human_readable_form(entry, **options) - except errors.NotFound: - # If the conversion to readle form went wrong, do not - # abort the whole find command. Use non-converted entry. - pass + self.obj.convert_anchor_to_human_readable_form(entry, **options) return truncated @@ -788,12 +788,7 @@ class baseidoverride_show(LDAPRetrieve): takes_options = LDAPRetrieve.takes_options + (fallback_to_ldap_option,) def post_callback(self, ldap, dn, entry_attrs, *keys, **options): - try: - self.obj.convert_anchor_to_human_readable_form(entry_attrs, **options) - except errors.NotFound: - # If the conversion to readle form went wrong, do not - # abort the whole show command. Use non-converted entry. - pass + self.obj.convert_anchor_to_human_readable_form(entry_attrs, **options) return dn -- 2.1.0
From a7de153a4de5a5cc9a46842210a748d5a66f756e Mon Sep 17 00:00:00 2001 From: Tomas Babej <tba...@redhat.com> Date: Mon, 12 Oct 2015 18:32:24 +0200 Subject: [PATCH] tests: Add tests for idoverride object integrity As far as IPA objects are concerned, ID overrides are supposed to be removed when the respective user/group is removed. Adds a couple of tests to ensure this behaviour is covered. https://fedorahosted.org/freeipa/ticket/5322 --- ipatests/test_xmlrpc/test_idviews_plugin.py | 175 +++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 2 deletions(-) diff --git a/ipatests/test_xmlrpc/test_idviews_plugin.py b/ipatests/test_xmlrpc/test_idviews_plugin.py index f1a46978b7324e83b0506084ff7a45e488005052..2875558810cfbea814632c9d28472f54b2466af8 100644 --- a/ipatests/test_xmlrpc/test_idviews_plugin.py +++ b/ipatests/test_xmlrpc/test_idviews_plugin.py @@ -52,6 +52,9 @@ hostgroup2 = u'hostgroup2' idoverrideuser1 = u'testuser' idoverridegroup1 = u'testgroup' +idoverrideuser_removed = u'testuser-removed' +idoverridegroup_removed = u'testgroup-removed' + nonexistentuser = u'nonexistentuser' nonexistentgroup = u'nonexistentgroup' @@ -126,8 +129,8 @@ class test_idviews(Declarative): ('host_del', [host1, host2, host3, host4], {'continue': True}), ('hostgroup_del', [hostgroup1, hostgroup2], {'continue': True}), ('idview_del', [idview1], {'continue': True}), - ('user_del', [idoverrideuser1], {'continue': True}), - ('group_del', [idoverridegroup1], {'continue': True}), + ('user_del', [idoverrideuser1, idoverrideuser_removed], {'continue': True}), + ('group_del', [idoverridegroup1, idoverridegroup_removed], {'continue': True}), ] tests = [ @@ -777,6 +780,7 @@ class test_idviews(Declarative): ), ), + # Test ID View applying dict( @@ -1479,4 +1483,171 @@ class test_idviews(Declarative): ), ), ), + + # Test integrity of idoverride objects agains their references + + dict( + desc='Create ID View "%s"' % idview1, + command=( + 'idview_add', + [idview1], + {} + ), + expected=dict( + value=idview1, + summary=u'Added ID View "%s"' % idview1, + result=dict( + dn=get_idview_dn(idview1), + objectclass=objectclasses.idview, + cn=[idview1] + ) + ), + ), + + dict( + desc='Create "%s"' % idoverrideuser_removed, + command=( + 'user_add', + [idoverrideuser_removed], + dict( + givenname=u'Removed', + sn=u'User', + ) + ), + expected=dict( + value=idoverrideuser_removed, + summary=u'Added user "%s"' % idoverrideuser_removed, + result=get_user_result( + idoverrideuser_removed, + u'Removed', + u'User', + 'add', + objectclass=add_oc( + objectclasses.user, + u'ipantuserattrs' + ) + ), + ), + ), + + dict( + desc='Create group %r' % idoverridegroup_removed, + command=( + 'group_add', + [idoverridegroup_removed], + dict(description=u'Removed group') + ), + expected=dict( + value=idoverridegroup_removed, + summary=u'Added group "%s"' % idoverridegroup_removed, + result=dict( + cn=[idoverridegroup_removed], + description=[u'Removed group'], + objectclass=objectclasses.posixgroup, + ipauniqueid=[fuzzy_uuid], + gidnumber=[fuzzy_digits], + dn=get_group_dn(idoverridegroup_removed), + ), + ), + ), + + dict( + desc='Create User ID override "%s"' % idoverrideuser_removed, + command=( + 'idoverrideuser_add', + [idview1, idoverrideuser_removed], + dict(description=u'description', + homedirectory=u'/home/newhome', + uid=u'newlogin', + uidnumber=12345, + ipasshpubkey=sshpubkey, + ) + ), + expected=dict( + value=idoverrideuser_removed, + summary=u'Added User ID override "%s"' % idoverrideuser_removed, + result=dict( + dn=get_override_dn(idview1, idoverrideuser_removed), + objectclass=objectclasses.idoverrideuser, + ipaanchoruuid=[idoverrideuser_removed], + ipaoriginaluid=[idoverrideuser_removed], + description=[u'description'], + homedirectory=[u'/home/newhome'], + uidnumber=[u'12345'], + uid=[u'newlogin'], + ipasshpubkey=[sshpubkey], + sshpubkeyfp=[sshpubkeyfp], + ) + ), + ), + + dict( + desc='Create Group ID override "%s"' % idoverridegroup_removed, + command=( + 'idoverridegroup_add', + [idview1, idoverridegroup_removed], + dict(description=u'description') + ), + expected=dict( + value=idoverridegroup_removed, + summary=u'Added Group ID override "%s"' % idoverridegroup_removed, + result=dict( + dn=get_override_dn(idview1, idoverridegroup_removed), + objectclass=objectclasses.idoverridegroup, + ipaanchoruuid=[idoverridegroup_removed], + description=[u'description'], + ) + ), + ), + + dict( + desc='Delete "%s"' % idoverrideuser_removed, + command=('user_del', [idoverrideuser_removed], {}), + expected=dict( + result=dict(failed=[]), + summary=u'Deleted user "%s"' % idoverrideuser_removed, + value=[idoverrideuser_removed], + ), + ), + + dict( + desc='Delete "%s"' % idoverridegroup_removed, + command=('group_del', [idoverridegroup_removed], {}), + expected=dict( + result=dict(failed=[]), + summary=u'Deleted group "%s"' % idoverridegroup_removed, + value=[idoverridegroup_removed], + ), + ), + + dict( + desc='Make sure idoverrideuser objects have been cleaned', + command=( + 'idoverrideuser_find', + [idview1], + dict(), + ), + expected=dict( + result=[], + summary=u'0 User ID overrides matched', + count=0, + truncated=False, + ), + ), + + dict( + desc='Make sure idoverridegroup objects have been cleaned', + command=( + 'idoverridegroup_find', + [idview1], + dict(), + ), + expected=dict( + result=[], + summary=u'0 Group ID overrides matched', + count=0, + truncated=False, + ), + ), + ] -- 2.1.0
-- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code