svn commit: samba r20531 - in branches/SAMBA_4_0/source/torture/libnet: .

metze at samba.org metze at samba.org
Thu Jan 4 21:09:30 GMT 2007


Author: metze
Date: 2007-01-04 21:09:29 +0000 (Thu, 04 Jan 2007)
New Revision: 20531

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20531

Log:
- create the rdn attribute which is an alias for the 'name' attribute
  because the rdn attribute isn't explicit replicated
- create the whenChanged attribute out of the meta data
- create the objectGUID attribute out of the guid of the DsReplicaObjectIdentifier*
- create the replPropertyMetaData attribute from the meta data
- dump a more verbose form of the meta data that contains the attribute names
- dump linked attributes

a lot if this functionality will move into the repl_meta_data ldb module
in one of the next steps...

metze
Modified:
   branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c


Changeset:
Modified: branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c
===================================================================
--- branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c	2007-01-04 20:46:13 UTC (rev 20530)
+++ branches/SAMBA_4_0/source/torture/libnet/libnet_BecomeDC.c	2007-01-04 21:09:29 UTC (rev 20531)
@@ -28,6 +28,13 @@
 #include "lib/events/events.h"
 #include "dsdb/samdb/samdb.h"
 #include "lib/util/dlinklist.h"
+#include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
+#include "librpc/ndr/libndr.h"
+#include "librpc/gen_ndr/ndr_drsuapi.h"
+#include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "librpc/gen_ndr/ndr_misc.h"
+#include "system/time.h"
 
 #define TORTURE_NETBIOS_NAME "smbtorturedc"
 
@@ -99,9 +106,26 @@
 				 TALLOC_CTX *mem_ctx,
 				 struct ldb_message **_msg)
 {
+	NTSTATUS nt_status;
 	WERROR status;
 	uint32_t i;
 	struct ldb_message *msg;
+	struct replPropertyMetaDataBlob md;
+	struct ldb_val md_value;
+	struct drsuapi_DsReplicaObjMetaDataCtr mdc;
+	struct ldb_val guid_value;
+	NTTIME whenChanged = 0;
+	time_t whenChanged_t;
+	const char *whenChanged_s;
+	const char *rdn_name;
+	const struct ldb_val *rdn_value;
+	const struct dsdb_attribute *rdn_attr;
+	uint32_t rdn_attid;
+	struct drsuapi_DsReplicaAttribute *name_a;
+	struct drsuapi_DsReplicaMetaData *name_d;
+	struct replPropertyMetaData1 *rdn_m;
+	struct drsuapi_DsReplicaObjMetaData *rdn_mc;
+	int ret;
 
 	msg = ldb_msg_new(mem_ctx);
 	W_ERROR_HAVE_NO_MEMORY(msg);
@@ -109,6 +133,14 @@
 	msg->dn			= ldb_dn_new(msg, s->ldb, obj->object.identifier->dn);
 	W_ERROR_HAVE_NO_MEMORY(msg->dn);
 
+	rdn_name	= ldb_dn_get_rdn_name(msg->dn);
+	rdn_attr	= dsdb_attribute_by_lDAPDisplayName(s->schema, rdn_name);
+	if (!rdn_attr) {
+		return WERR_FOOBAR;
+	}
+	rdn_attid	= rdn_attr->attributeID_id;
+	rdn_value	= ldb_dn_get_rdn_val(msg->dn);
+
 	msg->num_elements	= obj->object.attribute_ctr.num_attributes;
 	msg->elements		= talloc_array(msg, struct ldb_message_element,
 					       msg->num_elements);
@@ -121,12 +153,127 @@
 		W_ERROR_NOT_OK_RETURN(status);
 	}
 
+	if (obj->object.attribute_ctr.num_attributes != 0 && !obj->meta_data_ctr) {
+		return WERR_FOOBAR;
+	}
+
+	if (obj->object.attribute_ctr.num_attributes != obj->meta_data_ctr->count) {
+		return WERR_FOOBAR;
+	}
+
+	md.version		= 1;
+	md.reserved		= 0;
+	md.ctr.ctr1.count	= obj->meta_data_ctr->count;
+	md.ctr.ctr1.reserved	= 0;
+	md.ctr.ctr1.array	= talloc_array(mem_ctx,
+					       struct replPropertyMetaData1,
+					       md.ctr.ctr1.count + 1);
+	W_ERROR_HAVE_NO_MEMORY(md.ctr.ctr1.array);
+
+	mdc.count	= obj->meta_data_ctr->count;
+	mdc.reserved	= 0;
+	mdc.array	= talloc_array(mem_ctx,
+				       struct drsuapi_DsReplicaObjMetaData,
+				       mdc.count + 1);
+	W_ERROR_HAVE_NO_MEMORY(mdc.array);
+
+	for (i=0; i < obj->meta_data_ctr->count; i++) {
+		struct drsuapi_DsReplicaAttribute *a;
+		struct drsuapi_DsReplicaMetaData *d;
+		struct replPropertyMetaData1 *m;
+		struct drsuapi_DsReplicaObjMetaData *mc;
+
+		a = &obj->object.attribute_ctr.attributes[i];
+		d = &obj->meta_data_ctr->meta_data[i];
+		m = &md.ctr.ctr1.array[i];
+		mc = &mdc.array[i];
+
+		m->attid			= a->attid;
+		m->version			= d->version;
+		m->orginating_time		= d->orginating_time;
+		m->orginating_invocation_id	= d->orginating_invocation_id;
+		m->orginating_usn		= d->orginating_usn;
+		m->local_usn			= 0;
+
+		mc->attribute_name		= dsdb_lDAPDisplayName_by_id(s->schema, a->attid);
+		mc->version			= d->version;
+		mc->originating_last_changed	= d->orginating_time;
+		mc->originating_dsa_invocation_id= d->orginating_invocation_id;
+		mc->originating_usn		= d->orginating_usn;
+		mc->local_usn			= 0;
+
+		if (d->orginating_time > whenChanged) {
+			whenChanged = d->orginating_time;
+		}
+
+		if (a->attid == DRSUAPI_ATTRIBUTE_name) {
+			name_a = a;
+			name_d = d;
+			rdn_m = &md.ctr.ctr1.array[md.ctr.ctr1.count];
+			rdn_mc = &mdc.array[mdc.count];
+		}
+	}
+
+	if (!name_d) {
+		return WERR_FOOBAR;
+	}
+
+	ret = ldb_msg_add_value(msg, rdn_attr->lDAPDisplayName, rdn_value, NULL);
+	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+
+	nt_status = ndr_push_struct_blob(&guid_value, msg, &obj->object.identifier->guid,
+					 (ndr_push_flags_fn_t)ndr_push_GUID);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		return ntstatus_to_werror(nt_status);
+	}
+	ret = ldb_msg_add_value(msg, "objectGUID", &guid_value, NULL);
+	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+
+	whenChanged_t = nt_time_to_unix(whenChanged);
+	whenChanged_s = ldb_timestring(msg, whenChanged_t);
+	W_ERROR_HAVE_NO_MEMORY(whenChanged_s);
+	ret = ldb_msg_add_string(msg, "whenChanged", whenChanged_s);
+	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+
+	rdn_m->attid				= rdn_attid;
+	rdn_m->version				= name_d->version;
+	rdn_m->orginating_time			= name_d->orginating_time;
+	rdn_m->orginating_invocation_id		= name_d->orginating_invocation_id;
+	rdn_m->orginating_usn			= name_d->orginating_usn;
+	rdn_m->local_usn			= 0;
+	md.ctr.ctr1.count++;
+
+	rdn_mc->attribute_name			= rdn_attr->lDAPDisplayName;
+	rdn_mc->version				= name_d->version;
+	rdn_mc->originating_last_changed	= name_d->orginating_time;
+	rdn_mc->originating_dsa_invocation_id	= name_d->orginating_invocation_id;
+	rdn_mc->originating_usn			= name_d->orginating_usn;
+	rdn_mc->local_usn			= 0;
+	mdc.count++;
+
+	nt_status = ndr_push_struct_blob(&md_value, msg, &md,
+					 (ndr_push_flags_fn_t)ndr_push_replPropertyMetaDataBlob);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		return ntstatus_to_werror(nt_status);
+	}
+	ret = ldb_msg_add_value(msg, "replPropertyMetaData", &md_value, NULL);
+	if (ret != LDB_SUCCESS) {
+		return WERR_FOOBAR;
+	}
+
 	if (lp_parm_bool(-1, "become dc", "dump objects", False)) {
 		struct ldb_ldif ldif;
 		fprintf(stdout, "#\n");
 		ldif.changetype = LDB_CHANGETYPE_NONE;
 		ldif.msg = msg;
 		ldb_ldif_write_file(s->ldb, stdout, &ldif);
+		NDR_PRINT_DEBUG(drsuapi_DsReplicaObjMetaDataCtr, &mdc);
 	}
 
 	*_msg = msg;
@@ -296,6 +443,9 @@
 	uint32_t object_count;
 	struct drsuapi_DsReplicaObjectListItemEx *first_object;
 	struct drsuapi_DsReplicaObjectListItemEx *cur;
+	uint32_t linked_attributes_count;
+	struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;
+	uint32_t i;
 
 	switch (c->ctr_level) {
 	case 1:
@@ -303,12 +453,16 @@
 		total_object_count	= c->ctr1->total_object_count;
 		object_count		= c->ctr1->object_count;
 		first_object		= c->ctr1->first_object;
+		linked_attributes_count	= 0;
+		linked_attributes	= NULL;
 		break;
 	case 6:
 		mapping_ctr		= &c->ctr6->mapping_ctr;
 		total_object_count	= c->ctr6->total_object_count;
 		object_count		= c->ctr6->object_count;
 		first_object		= c->ctr6->first_object;
+		linked_attributes_count	= c->ctr6->linked_attributes_count;
+		linked_attributes	= c->ctr6->linked_attributes;
 		break;
 	default:
 		return NT_STATUS_INVALID_PARAMETER;
@@ -335,6 +489,32 @@
 		}
 	}
 
+	for (i=0; i < linked_attributes_count; i++) {
+		const struct dsdb_attribute *sa;
+
+		if (!linked_attributes[i].identifier) {
+			return NT_STATUS_FOOBAR;		
+		}
+
+		if (!linked_attributes[i].value.blob) {
+			return NT_STATUS_FOOBAR;		
+		}
+
+		sa = dsdb_attribute_by_attributeID_id(s->schema,
+						      linked_attributes[i].attid);
+		if (!sa) {
+			return NT_STATUS_FOOBAR;
+		}
+
+		if (lp_parm_bool(-1, "become dc", "dump objects", False)) {
+			DEBUG(0,("# %s\n", sa->lDAPDisplayName));
+			NDR_PRINT_DEBUG(drsuapi_DsReplicaLinkedAttribute, &linked_attributes[i]);
+			dump_data(0,
+				linked_attributes[i].value.blob->data,
+				linked_attributes[i].value.blob->length);
+		}
+	}
+
 	return NT_STATUS_OK;
 }
 



More information about the samba-cvs mailing list