The branch, master has been updated via 79dd22a objectclass_attrs: Only abort on a missing attribute when an attribute is both MUST and replicated via e0aa056 typo: supprise -> surprise via 4c56793 tests/getnc_exop: Finish a comment in getnc_exop.py via 37aa11c tests/getnc_exop: Improve the ridalloc test by performing an alloc against a new master via a3baf4b objectclass_attrs: correctly indent a comment from da67acb build: Fix build with perl on debian sid.
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 79dd22aacb4c12bd008d9ad354ec5ec088560748 Author: Clive Ferreira <cliveferre...@catalyst.net.nz> Date: Tue Oct 11 15:32:54 2016 +1300 objectclass_attrs: Only abort on a missing attribute when an attribute is both MUST and replicated If an attribute is not replicated or constructed, it is quite normal for it to be missing. This is the case with both rIDNextRid and rIDPreviousAllocationPool. This currently prevents us switching the RID master. On Windows, missing this attribute does not cause any problems for the RID manager. We may now remove the knownfail entry added earlier. Signed-off-by: Clive Ferreira <cliveferre...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Pair-programmed-with: Garming Sam <garm...@catalyst.net.nz> Pair-programmed-with: Bob Campbell <bobcampb...@catalyst.net.nz> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 Autobuild-User(master): Garming Sam <garm...@samba.org> Autobuild-Date(master): Wed Nov 2 01:28:44 CET 2016 on sn-devel-144 commit e0aa05609556cf7bc93d585944542d630862ba0f Author: Clive Ferreira <cliveferre...@catalyst.net.nz> Date: Thu Oct 20 16:20:49 2016 +1300 typo: supprise -> surprise Signed-off-by: Clive Ferreira <cliveferre...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Pair-programmed-with: Garming Sam <garm...@catalyst.net.nz> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 commit 4c567932165229e7fa9c33b071e9fabe79d9eef0 Author: Garming Sam <garm...@catalyst.net.nz> Date: Thu Oct 20 16:19:43 2016 +1300 tests/getnc_exop: Finish a comment in getnc_exop.py Signed-off-by: Garming Sam <garm...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 commit 37aa11ce5b2b91cd0d84f6c7370d64674fcf5479 Author: Bob Campbell <bobcampb...@catalyst.net.nz> Date: Mon Oct 10 16:58:57 2016 +1300 tests/getnc_exop: Improve the ridalloc test by performing an alloc against a new master Currently we fail against ourselves due to rIDNextRid and rIDPreviousAllocationPool normally being unset, despite being mandatory attributes (being the only attributes in this situation). Pair-programmed-with: Garming Sam <garm...@catalyst.net.nz> Pair-programmed-with: Clive Ferreira <cliveferre...@catalyst.net.nz> Signed-off-by: Bob Campbell <bobcampb...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 commit a3baf4b8049d222b8be71dce3bc1cd46b8391f73 Author: Clive Ferreira <cliveferre...@catalyst.net.nz> Date: Tue Oct 11 15:33:06 2016 +1300 objectclass_attrs: correctly indent a comment Signed-off-by: Clive Ferreira <cliveferre...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Pair-programmed-with: Garming Sam <garm...@catalyst.net.nz> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 ----------------------------------------------------------------------- Summary of changes: source4/dsdb/samdb/ldb_modules/objectclass_attrs.c | 36 ++++++---- source4/dsdb/samdb/ldb_modules/rootdse.c | 2 +- source4/torture/drs/python/getnc_exop.py | 78 +++++++++++++++++++++- 3 files changed, 102 insertions(+), 14 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c index c83c2e9..e239fb9 100644 --- a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c +++ b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c @@ -426,21 +426,33 @@ static int attr_handler2(struct oc_context *ac) * replicated. */ if (found_must_contain[0] != NULL && - ldb_msg_check_string_attribute(msg, "isDeleted", "TRUE") == 0 && - ldb_request_get_control(ac->req, DSDB_CONTROL_DBCHECK) == NULL) { - ldb_asprintf_errstring(ldb, "objectclass_attrs: at least one mandatory attribute ('%s') on entry '%s' wasn't specified!", - found_must_contain[0], - ldb_dn_get_linearized(msg->dn)); - return LDB_ERR_OBJECT_CLASS_VIOLATION; + ldb_msg_check_string_attribute(msg, "isDeleted", "TRUE") == 0) { + + for (i = 0; found_must_contain[i] != NULL; i++) { + const struct dsdb_attribute *broken_attr = dsdb_attribute_by_lDAPDisplayName(ac->schema, + found_must_contain[i]); + + bool replicated = (broken_attr->systemFlags & + (DS_FLAG_ATTR_NOT_REPLICATED | DS_FLAG_ATTR_IS_CONSTRUCTED)) == 0; + + if (replicated) { + ldb_asprintf_errstring(ldb, "objectclass_attrs: at least one mandatory " + "attribute ('%s') on entry '%s' wasn't specified!", + found_must_contain[i], + ldb_dn_get_linearized(msg->dn)); + return LDB_ERR_OBJECT_CLASS_VIOLATION; + } + } } if (isSchemaAttr) { - /* Before really adding an attribute in the database, - * let's check that we can translate it into a dbsd_attribute and - * that we can find a valid syntax object. - * If not it's better to reject this attribute than not be able - * to start samba next time due to schema being unloadable. - */ + /* + * Before really adding an attribute in the database, + * let's check that we can translate it into a dsdb_attribute and + * that we can find a valid syntax object. + * If not it's better to reject this attribute than not be able + * to start samba next time due to schema being unloadable. + */ struct dsdb_attribute *att = talloc(ac, struct dsdb_attribute); const struct dsdb_syntax *attrSyntax; WERROR status; diff --git a/source4/dsdb/samdb/ldb_modules/rootdse.c b/source4/dsdb/samdb/ldb_modules/rootdse.c index 6a1b8ef..86ca89f 100644 --- a/source4/dsdb/samdb/ldb_modules/rootdse.c +++ b/source4/dsdb/samdb/ldb_modules/rootdse.c @@ -1515,7 +1515,7 @@ static int rootdse_become_master(struct ldb_module *module, /* * We always delete the transaction, not commit it, because - * this gives the least supprise to this supprising action (as + * this gives the least surprise to this surprising action (as * we will never record anything done to this point */ rootdse_del_trans(module); diff --git a/source4/torture/drs/python/getnc_exop.py b/source4/torture/drs/python/getnc_exop.py index d058e66..941d323 100644 --- a/source4/torture/drs/python/getnc_exop.py +++ b/source4/torture/drs/python/getnc_exop.py @@ -256,7 +256,7 @@ class DrsReplicaSyncTestCase(drs_base.DrsBaseTestCase, ExopBaseTest): # has an RODC, it can gain links on the server account object def test_do_ridalloc_get_anc(self): - """Test doing a RID allocation with a valid destination DSA guid and """ + """Test doing a RID allocation with a valid destination DSA guid and GET_ANC flag""" fsmo_dn = ldb.Dn(self.ldb_dc1, "CN=RID Manager$,CN=System," + self.ldb_dc1.domain_dn()) (fsmo_owner, fsmo_not_owner) = self._determine_fSMORoleOwner(fsmo_dn) @@ -289,6 +289,82 @@ class DrsReplicaSyncTestCase(drs_base.DrsBaseTestCase, ExopBaseTest): # We don't check the linked_attributes_count as if the domain # has an RODC, it can gain links on the server account object + def test_edit_rid_master(self): + """Test doing a RID allocation after changing the RID master from the original one. + This should set rIDNextRID to 0 on the new RID master.""" + # 1. a. Transfer role to non-RID master + # b. Check that it succeeds correctly + # + # 2. a. Call the RID alloc against the former master. + # b. Check that it succeeds. + fsmo_dn = ldb.Dn(self.ldb_dc1, "CN=RID Manager$,CN=System," + self.ldb_dc1.domain_dn()) + (fsmo_owner, fsmo_not_owner) = self._determine_fSMORoleOwner(fsmo_dn) + + # 1. Swap RID master role + m = ldb.Message() + m.dn = ldb.Dn(self.ldb_dc1, "") + m["becomeRidMaster"] = ldb.MessageElement("1", ldb.FLAG_MOD_REPLACE, + "becomeRidMaster") + + # Make sure that ldb_dc1 == RID Master + + server_dn = str(ldb.Dn(self.ldb_dc1, self.ldb_dc1.get_dsServiceName()).parent()) + + # self.ldb_dc1 == LOCALDC + if server_dn == fsmo_owner['server_dn']: + # ldb_dc1 == VAMPIREDC + ldb_dc1, ldb_dc2 = self.ldb_dc2, self.ldb_dc1 + else: + # Otherwise switch the two + ldb_dc1, ldb_dc2 = self.ldb_dc1, self.ldb_dc2 + + try: + # ldb_dc1 is now RID MASTER (as VAMPIREDC) + ldb_dc1.modify(m) + except ldb.LdbError, (num, msg): + self.fail("Failed to reassign RID Master " + msg) + + try: + # 2. Perform a RID alloc + req8 = self._exop_req8(dest_dsa=fsmo_owner["ntds_guid"], + invocation_id=fsmo_not_owner["invocation_id"], + nc_dn_str=fsmo_dn, + exop=drsuapi.DRSUAPI_EXOP_FSMO_RID_ALLOC) + + (drs, drs_handle) = self._ds_bind(fsmo_not_owner["dns_name"]) + # 3. Make sure the allocation succeeds + try: + (level, ctr) = drs.DsGetNCChanges(drs_handle, 8, req8) + except RuntimeError, e: + self.fail("RID allocation failed: " + str(e)) + + fsmo_dn = ldb.Dn(self.ldb_dc1, "CN=RID Manager$,CN=System," + self.ldb_dc1.domain_dn()) + + self.assertEqual(level, 6, "Expected level 6 response!") + self.assertEqual(ctr.source_dsa_guid, misc.GUID(fsmo_not_owner["ntds_guid"])) + self.assertEqual(ctr.source_dsa_invocation_id, misc.GUID(fsmo_not_owner["invocation_id"])) + ctr6 = ctr + self.assertEqual(ctr6.extended_ret, drsuapi.DRSUAPI_EXOP_ERR_SUCCESS) + self.assertEqual(ctr6.object_count, 3) + self.assertNotEqual(ctr6.first_object, None) + self.assertEqual(ldb.Dn(ldb_dc2, ctr6.first_object.object.identifier.dn), fsmo_dn) + self.assertNotEqual(ctr6.first_object.next_object, None) + self.assertNotEqual(ctr6.first_object.next_object.next_object, None) + second_object = ctr6.first_object.next_object.object + self.assertEqual(ldb.Dn(self.ldb_dc1, second_object.identifier.dn), fsmo_owner["rid_set_dn"]) + third_object = ctr6.first_object.next_object.next_object.object + self.assertEqual(ldb.Dn(self.ldb_dc1, third_object.identifier.dn), fsmo_owner["server_acct_dn"]) + finally: + # Swap the RID master back for other tests + m = ldb.Message() + m.dn = ldb.Dn(ldb_dc2, "") + m["becomeRidMaster"] = ldb.MessageElement("1", ldb.FLAG_MOD_REPLACE, "becomeRidMaster") + try: + ldb_dc2.modify(m) + except ldb.LdbError, (num, msg): + self.fail("Failed to restore RID Master " + msg) + + class DrsReplicaPrefixMapTestCase(drs_base.DrsBaseTestCase, ExopBaseTest): def setUp(self): super(DrsReplicaPrefixMapTestCase, self).setUp() -- Samba Shared Repository