3f51ca
From 6d4676c4e3403df547ef03a2e716d6254c3c512e Mon Sep 17 00:00:00 2001
3f51ca
From: Florence Blanc-Renaud <flo@redhat.com>
3f51ca
Date: Fri, 5 Jan 2018 09:50:26 +0100
3f51ca
Subject: [PATCH] Idviews: fix objectclass violation on idview-add
3f51ca
3f51ca
When the option --domain-resolution-order is used with the command
3f51ca
ipa idview-add, the resulting LDAP object stores the value in
3f51ca
ipadomainresolutionorder attribute.
3f51ca
The issue is that the add command does not add the needed object
3f51ca
class (ipaNameResolutionData) because it is part of
3f51ca
possible_objectclasses but not of object_class.
3f51ca
3f51ca
The fix makes sure to add the objectclass when the option
3f51ca
--domain-resolution-order is used, and adds a non-regression test.
3f51ca
3f51ca
Note that idview-mod does not have any issue as it correctly handles
3f51ca
the addition of missing possible objectclasses.
3f51ca
3f51ca
Fixes:
3f51ca
https://pagure.io/freeipa/issue/7350
3f51ca
3f51ca
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
3f51ca
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
3f51ca
---
3f51ca
 ipaserver/plugins/idviews.py                | 15 +++++++++----
3f51ca
 ipatests/test_xmlrpc/test_idviews_plugin.py | 35 +++++++++++++++++++++++++++++
3f51ca
 2 files changed, 46 insertions(+), 4 deletions(-)
3f51ca
3f51ca
diff --git a/ipaserver/plugins/idviews.py b/ipaserver/plugins/idviews.py
3f51ca
index a55c20bbf2466d9cb3a317d49a8bba3c9379f572..2b06cc54e4b04aac004efbf02a446464b8c89777 100644
3f51ca
--- a/ipaserver/plugins/idviews.py
3f51ca
+++ b/ipaserver/plugins/idviews.py
3f51ca
@@ -22,10 +22,11 @@ import re
3f51ca
 import six
3f51ca
 
3f51ca
 from .baseldap import (LDAPQuery, LDAPObject, LDAPCreate,
3f51ca
-                                     LDAPDelete, LDAPUpdate, LDAPSearch,
3f51ca
-                                     LDAPAddAttributeViaOption,
3f51ca
-                                     LDAPRemoveAttributeViaOption,
3f51ca
-                                     LDAPRetrieve, global_output_params)
3f51ca
+                       LDAPDelete, LDAPUpdate, LDAPSearch,
3f51ca
+                       LDAPAddAttributeViaOption,
3f51ca
+                       LDAPRemoveAttributeViaOption,
3f51ca
+                       LDAPRetrieve, global_output_params,
3f51ca
+                       add_missing_object_class)
3f51ca
 from .hostgroup import get_complete_hostgroup_member_list
3f51ca
 from .service import validate_certificate
3f51ca
 from ipalib import api, Str, Int, Bytes, Flag, _, ngettext, errors, output
3f51ca
@@ -169,6 +170,12 @@ class idview_add(LDAPCreate):
3f51ca
     def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
3f51ca
         self.api.Object.config.validate_domain_resolution_order(entry_attrs)
3f51ca
 
3f51ca
+        # The objectclass ipaNameResolutionData may not be present on
3f51ca
+        # the id view. We need to add it if we define a new
3f51ca
+        # value for ipaDomainResolutionOrder
3f51ca
+        if 'ipadomainresolutionorder' in entry_attrs:
3f51ca
+            add_missing_object_class(ldap, u'ipanameresolutiondata', dn,
3f51ca
+                                     entry_attrs, update=False)
3f51ca
         return dn
3f51ca
 
3f51ca
 
3f51ca
diff --git a/ipatests/test_xmlrpc/test_idviews_plugin.py b/ipatests/test_xmlrpc/test_idviews_plugin.py
3f51ca
index 35d31b37d8fb87384d9ae550182e353c1d6383cc..3d4cce5ea0505ef8b0cd8253fd74b037890ce18b 100644
3f51ca
--- a/ipatests/test_xmlrpc/test_idviews_plugin.py
3f51ca
+++ b/ipatests/test_xmlrpc/test_idviews_plugin.py
3f51ca
@@ -1704,4 +1704,39 @@ class test_idviews(Declarative):
3f51ca
             ),
3f51ca
         ),
3f51ca
 
3f51ca
+        # Delete the ID View
3f51ca
+
3f51ca
+        dict(
3f51ca
+            desc='Delete ID View "%s"' % idview1,
3f51ca
+            command=('idview_del', [idview1], {}),
3f51ca
+            expected=dict(
3f51ca
+                result=dict(failed=[]),
3f51ca
+                summary=u'Deleted ID View "%s"' % idview1,
3f51ca
+                value=[idview1],
3f51ca
+            ),
3f51ca
+        ),
3f51ca
+
3f51ca
+        # Test the creation of ID view with domain resolution order
3f51ca
+        # Non-regression test for issue 7350
3f51ca
+
3f51ca
+        dict(
3f51ca
+            desc='Create ID View "%s"' % idview1,
3f51ca
+            command=(
3f51ca
+                'idview_add',
3f51ca
+                [idview1],
3f51ca
+                dict(ipadomainresolutionorder=u'%s' % api.env.domain)
3f51ca
+            ),
3f51ca
+            expected=dict(
3f51ca
+                value=idview1,
3f51ca
+                summary=u'Added ID View "%s"' % idview1,
3f51ca
+                result=dict(
3f51ca
+                    dn=get_idview_dn(idview1),
3f51ca
+                    objectclass=objectclasses.idview +
3f51ca
+                    [u'ipanameresolutiondata'],
3f51ca
+                    cn=[idview1],
3f51ca
+                    ipadomainresolutionorder=[api.env.domain]
3f51ca
+                )
3f51ca
+            ),
3f51ca
+        ),
3f51ca
+
3f51ca
     ]
3f51ca
-- 
3f51ca
2.13.6
3f51ca