[SCM] Samba Shared Repository - branch master updated
Matthieu Patou
mat at samba.org
Sun Nov 13 07:48:02 MST 2011
The branch, master has been updated
via 576ea40 samba-tool: allow dbcheck to correct the originating_change_time of the deleted object container
via 85af1ed s4-dsdb: initialize correctly the value of originating_change_time for the Deleted Object Container
via b8a0772 s4-drs: check if we have a domain level >= 2k8r2 as before the isRecycled do not exists and so is always False
via a6686b9 samba-tool: dbcheck avoid problems with deleted objects
from 691fb36 s4: Simple test script to create lots of contacts to stress the LDB
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 576ea40ece6adb156b4de23c737ada5e80b7946a
Author: Matthieu Patou <mat at matws.net>
Date: Sun Nov 13 14:09:24 2011 +0100
samba-tool: allow dbcheck to correct the originating_change_time of the deleted object container
Autobuild-User: Matthieu Patou <mat at samba.org>
Autobuild-Date: Sun Nov 13 15:47:53 CET 2011 on sn-devel-104
commit 85af1ed9b8e5593b91fd5efb5e97c5abbc9feddc
Author: Matthieu Patou <mat at matws.net>
Date: Sun Nov 13 14:08:32 2011 +0100
s4-dsdb: initialize correctly the value of originating_change_time for the Deleted Object Container
commit b8a077296ac666cf45cafe7e86edc390dce0e511
Author: Matthieu Patou <mat at matws.net>
Date: Wed Oct 5 16:23:37 2011 +0200
s4-drs: check if we have a domain level >= 2k8r2 as before the isRecycled do not exists and so is always False
Having a false value cause the link on removed attribute to be always
returned which is what we try to avoid.
commit a6686b9f9893c67534c7eec73a6c301f1ebe41da
Author: Matthieu Patou <mat at matws.net>
Date: Sun Nov 13 13:15:47 2011 +0100
samba-tool: dbcheck avoid problems with deleted objects
We have to search for deleted objects as well as the previous search
might have been done with the show_deleted control. If not samba-tool
fails with no such DN error while fetching the object.
-----------------------------------------------------------------------
Summary of changes:
source4/dsdb/samdb/ldb_modules/repl_meta_data.c | 54 ++++++++++++++++++++++-
source4/rpc_server/drsuapi/getncchanges.c | 31 ++++++++++---
source4/scripting/python/samba/dbchecker.py | 36 +++++++++++++++-
3 files changed, 111 insertions(+), 10 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 194498e..b7a6a70 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -50,6 +50,7 @@
#include "lib/util/binsearch.h"
#include "lib/util/tsort.h"
+static const uint64_t DELETED_OBJECT_CONTAINER_CHANGE_TIME = 253402127999L;
struct replmd_private {
TALLOC_CTX *la_ctx;
struct la_entry *la_list;
@@ -917,7 +918,32 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
m->attid = sa->attributeID_id;
m->version = 1;
- m->originating_change_time = now;
+ if (m->attid == 0x20030) {
+ const struct ldb_val *rdn_val = ldb_dn_get_rdn_val(msg->dn);
+ const char* rdn;
+
+ if (rdn_val == NULL) {
+ ldb_oom(ldb);
+ talloc_free(ac);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ rdn = (const char*)rdn_val->data;
+ if (strcmp(rdn, "Deleted Objects") == 0) {
+ /*
+ * Set the originating_change_time to 29/12/9999 at 23:59:59
+ * as specified in MS-ADTS 7.1.1.4.2 Deleted Objects Container
+ */
+ NTTIME deleted_obj_ts;
+
+ unix_to_nt_time(&deleted_obj_ts, DELETED_OBJECT_CONTAINER_CHANGE_TIME);
+ m->originating_change_time = deleted_obj_ts;
+ } else {
+ m->originating_change_time = now;
+ }
+ } else {
+ m->originating_change_time = now;
+ }
m->originating_invocation_id = *our_invocation_id;
m->originating_usn = ac->seq_num;
m->local_usn = ac->seq_num;
@@ -1118,7 +1144,31 @@ static int replmd_update_rpmd_element(struct ldb_context *ldb,
md1 = &omd->ctr.ctr1.array[i];
md1->version++;
md1->attid = a->attributeID_id;
- md1->originating_change_time = now;
+ if (md1->attid == 0x20030) {
+ const struct ldb_val *rdn_val = ldb_dn_get_rdn_val(msg->dn);
+ const char* rdn;
+
+ if (rdn_val == NULL) {
+ ldb_oom(ldb);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ rdn = (const char*)rdn_val->data;
+ if (strcmp(rdn, "Deleted Objects") == 0) {
+ /*
+ * Set the originating_change_time to 29/12/9999 at 23:59:59
+ * as specified in MS-ADTS 7.1.1.4.2 Deleted Objects Container
+ */
+ NTTIME deleted_obj_ts;
+
+ unix_to_nt_time(&deleted_obj_ts, DELETED_OBJECT_CONTAINER_CHANGE_TIME);
+ md1->originating_change_time = deleted_obj_ts;
+ } else {
+ md1->originating_change_time = now;
+ }
+ } else {
+ md1->originating_change_time = now;
+ }
md1->originating_invocation_id = *our_invocation_id;
md1->originating_usn = *seq_num;
md1->local_usn = *seq_num;
diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c
index 61a6002..4217e22 100644
--- a/source4/rpc_server/drsuapi/getncchanges.c
+++ b/source4/rpc_server/drsuapi/getncchanges.c
@@ -366,14 +366,31 @@ static WERROR get_nc_changes_add_la(TALLOC_CTX *mem_ctx,
v = ldb_msg_find_attr_as_string(msg, "isDeleted", "false");
if (strncasecmp(v, "true", 4) == 0) {
- v = ldb_msg_find_attr_as_string(msg, "isRecycled", "false");
/*
- * Do not skip link when the object is just deleted (isRecycled not present)
- * Do it for tomstones or recycled ones
- */
- if (strncasecmp(v, "true", 4) == 0) {
- DEBUG(2, (" object %s is deleted, not returning linked attribute !\n",
- ldb_dn_get_linearized(msg->dn)));
+ * Note: we skip the transmition of the deleted link even if the other part used to
+ * know about it because when we transmit the deletion of the object, the link will
+ * be deleted too due to deletion of object where link points and Windows do so.
+ */
+ if (dsdb_functional_level(sam_ctx) >= DS_DOMAIN_FUNCTION_2008_R2) {
+ v = ldb_msg_find_attr_as_string(msg, "isRecycled", "true");
+ /*
+ * On Windows 2008R2 isRecycled is always present even if FL or DL are < FL 2K8R2
+ * if it join an existing domain with deleted objets, it firsts impose to have a
+ * schema with the is-Recycled object and for all deleted objects it adds the isRecycled
+ * either during initial replication or after the getNCChanges.
+ * Behavior of samba has been changed to always have this attribute if it's present in the schema.
+ *
+ * So if FL <2K8R2 isRecycled might be here or not but we don't care, it's meaning less.
+ * If FL >=2K8R2 we are sure that this attribute will be here.
+ * For this kind of forest level we do not return the link if the object is recycled
+ * (isRecycled = true).
+ */
+ if (strncasecmp(v, "true", 4) == 0) {
+ DEBUG(2, (" object %s is recycled, not returning linked attribute !\n",
+ ldb_dn_get_linearized(msg->dn)));
+ return WERR_OK;
+ }
+ } else {
return WERR_OK;
}
}
diff --git a/source4/scripting/python/samba/dbchecker.py b/source4/scripting/python/samba/dbchecker.py
index 7d85adf..6792538 100644
--- a/source4/scripting/python/samba/dbchecker.py
+++ b/source4/scripting/python/samba/dbchecker.py
@@ -45,6 +45,7 @@ class dbcheck(object):
self.remove_all_deleted_DN_links = False
self.fix_all_target_mismatch = False
self.fix_all_metadata = False
+ self.fix_time_metadata = False
self.fix_all_missing_backlinks = False
self.fix_all_orphaned_backlinks = False
@@ -368,6 +369,22 @@ class dbcheck(object):
return error_count
+ def get_originating_time(self, val, attid):
+ '''Read metadata properties and return the originating time for
+ a given attributeId.
+
+ :return: the originating time or 0 if not found
+ '''
+
+ repl = ndr_unpack(drsblobs.replPropertyMetaDataBlob, str(val))
+ obj = repl.ctr
+
+ for o in repl.ctr.array:
+ if o.attid == attid:
+ return o.originating_change_time
+
+ return 0
+
def process_metadata(self, val):
'''Read metadata properties and list attributes in it'''
@@ -407,7 +424,7 @@ class dbcheck(object):
attrs.append("replPropertyMetaData")
res = self.samdb.search(base=dn, scope=ldb.SCOPE_BASE,
- controls=["extended_dn:1:1", "show_recycled:1"],
+ controls=["extended_dn:1:1", "show_recycled:1", "show_deleted:1"],
attrs=attrs)
if len(res) != 1:
self.report("Object %s disappeared during check" % dn)
@@ -465,6 +482,23 @@ class dbcheck(object):
show_dn = True
if got_repl_property_meta_data:
+ rdn = (str(dn).split(","))[0]
+ if rdn == "CN=Deleted Objects":
+ isDeletedAttId = 131120
+ # It's 29/12/9999 at 23:59:59 UTC as specified in MS-ADTS 7.1.1.4.2 Deleted Objects Container
+
+ expectedTimeDo = 2650466015990000000
+ originating = self.get_originating_time(obj["replPropertyMetaData"], isDeletedAttId)
+ if originating != expectedTimeDo:
+ if self.confirm_all("Fix isDeleted originating_change_time on '%s'" % str(dn), 'fix_time_metadata'):
+ nmsg = ldb.Message()
+ nmsg.dn = dn
+ nmsg["isDeleted"] = ldb.MessageElement("TRUE", ldb.FLAG_MOD_REPLACE, "isDeleted")
+ error_count += 1
+ self.samdb.modify(nmsg, controls=["provision:0"])
+
+ else:
+ self.report("Not fixing isDeleted originating_change_time on '%s'" % str(dn))
for att in list_attrs_seen:
if not att in list_attrs_from_md:
if show_dn:
--
Samba Shared Repository
More information about the samba-cvs
mailing list