[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Sat Jan 9 01:23:56 MST 2010


The branch, master has been updated
       via  04e8237... s4-drs: base is_nc_prefix on instanceType
       via  67d8518... s4-drs: having no SPNs to change is not an error
       via  ba745a4... s4-drs: fixed writespn to ignore add/delete errors
       via  8c2d7ae... s4-dsdb: added samdb_ldb_val_case_cmp()
       via  acf33e0... s4-drs: moved the DsWriteAccountSpn call to its own file
       via  8ccedc3... s4-libnet: dsdb_wellknown_dn() in vampire code
       via  1158c13... s4-drs: need to set the getncchanges extended_ret on success too
       via  7010fad... s4-drs: calculate and send a uptodateness_vector with replication requests
       via  39730ac... s4-drs: be less verbose when we filter objects by UDV
      from  349f7ba... s4-drs: added filtering by udv in getncchanges

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 04e82370dbfc742053cd86c39cb9e8210df19651
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 18:50:30 2010 +1100

    s4-drs: base is_nc_prefix on instanceType
    
    for extended operations comparing to the ncRoot_dn is not correct

commit 67d8518f2c5bcb611e569164d31ed760c8965064
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 18:10:38 2010 +1100

    s4-drs: having no SPNs to change is not an error

commit ba745a43567062e48fe8e5b316f390b99868c309
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 17:42:59 2010 +1100

    s4-drs: fixed writespn to ignore add/delete errors
    
    When a SPN is added and already exists, it is ignored. Similarly, when
    a SPN is deleted and doesn't exist, it is ignored.

commit 8c2d7ae19e5a14ffa37af60ff4eec4d79f70040b
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 17:42:05 2010 +1100

    s4-dsdb: added samdb_ldb_val_case_cmp()

commit acf33e0d58b38c9c621e2dc0837c07a99c95acc2
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 17:11:01 2010 +1100

    s4-drs: moved the DsWriteAccountSpn call to its own file

commit 8ccedc3ac7f7bf6207d9fc778686592915781a4a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 15:57:52 2010 +1100

    s4-libnet: dsdb_wellknown_dn() in vampire code

commit 1158c138611d388fcae066a009cd6033a60a5944
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 15:12:18 2010 +1100

    s4-drs: need to set the getncchanges extended_ret on success too

commit 7010fad4eae6aa6a852a318ae59427525c9111d0
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 14:29:39 2010 +1100

    s4-drs: calculate and send a uptodateness_vector with replication requests
    
    This stops us getting objects changes twice if they came via an
    indirect path.

commit 39730ac30291b14a785a7d04a0ea271f5e0f1807
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Jan 9 14:28:00 2010 +1100

    s4-drs: be less verbose when we filter objects by UDV

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/common/util.c                  |   16 +++
 source4/dsdb/repl/drepl_out_helpers.c       |   15 +++-
 source4/dsdb/repl/drepl_partitions.c        |   74 +++++++++++++-
 source4/libnet/libnet_become_dc.c           |   77 +++-----------
 source4/rpc_server/config.mk                |    1 +
 source4/rpc_server/drsuapi/dcesrv_drsuapi.c |   75 --------------
 source4/rpc_server/drsuapi/dcesrv_drsuapi.h |    2 +
 source4/rpc_server/drsuapi/getncchanges.c   |   17 ++-
 source4/rpc_server/drsuapi/writespn.c       |  145 +++++++++++++++++++++++++++
 9 files changed, 274 insertions(+), 148 deletions(-)
 create mode 100644 source4/rpc_server/drsuapi/writespn.c


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 632025d..139ea4d 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -3198,3 +3198,19 @@ int dsdb_tombstone_lifetime(struct ldb_context *ldb, uint32_t *lifetime)
 	talloc_free(dn);
 	return LDB_SUCCESS;
 }
+
+/*
+  compare a ldb_val to a string case insensitively
+ */
+int samdb_ldb_val_case_cmp(const char *s, struct ldb_val *v)
+{
+	size_t len = strlen(s);
+	int ret;
+	if (len > v->length) return 1;
+	ret = strncasecmp(s, (const char *)v->data, v->length);
+	if (ret != 0) return ret;
+	if (v->length > len && v->data[len] != 0) {
+		return -1;
+	}
+	return 0;
+}
diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c
index 5666a66..a4f5d1f 100644
--- a/source4/dsdb/repl/drepl_out_helpers.c
+++ b/source4/dsdb/repl/drepl_out_helpers.c
@@ -261,6 +261,7 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req)
 	struct dreplsrv_drsuapi_connection *drsuapi = state->op->source_dsa->conn->drsuapi;
 	struct rpc_request *rreq;
 	struct drsuapi_DsGetNCChanges *r;
+	struct drsuapi_DsReplicaCursorCtrEx *uptodateness_vector;
 
 	r = talloc(state, struct drsuapi_DsGetNCChanges);
 	if (tevent_req_nomem(r, req)) {
@@ -280,6 +281,12 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req)
 		return;
 	}
 
+	if (partition->uptodatevector_ex.count == 0) {
+		uptodateness_vector = NULL;
+	} else {
+		uptodateness_vector = &partition->uptodatevector_ex;
+	}
+
 	r->in.bind_handle	= &drsuapi->bind_handle;
 	if (drsuapi->remote_info28.supported_extensions & DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8) {
 		r->in.level				= 8;
@@ -287,7 +294,7 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req)
 		r->in.req->req8.source_dsa_invocation_id= rf1->source_dsa_invocation_id;
 		r->in.req->req8.naming_context		= &partition->nc;
 		r->in.req->req8.highwatermark		= rf1->highwatermark;
-		r->in.req->req8.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
+		r->in.req->req8.uptodateness_vector	= uptodateness_vector;
 		r->in.req->req8.replica_flags		= rf1->replica_flags;
 		r->in.req->req8.max_object_count	= 133;
 		r->in.req->req8.max_ndr_size		= 1336811;
@@ -303,7 +310,7 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req)
 		r->in.req->req5.source_dsa_invocation_id= rf1->source_dsa_invocation_id;
 		r->in.req->req5.naming_context		= &partition->nc;
 		r->in.req->req5.highwatermark		= rf1->highwatermark;
-		r->in.req->req5.uptodateness_vector	= NULL;/*&partition->uptodatevector_ex;*/
+		r->in.req->req5.uptodateness_vector	= uptodateness_vector;
 		r->in.req->req5.replica_flags		= rf1->replica_flags;
 		r->in.req->req5.max_object_count	= 133;
 		r->in.req->req5.max_ndr_size		= 1336770;
@@ -311,6 +318,10 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req)
 		r->in.req->req5.fsmo_info		= state->op->fsmo_info;
 	}
 
+#if 0
+	NDR_PRINT_IN_DEBUG(drsuapi_DsGetNCChanges, r);
+#endif
+
 	rreq = dcerpc_drsuapi_DsGetNCChanges_send(drsuapi->pipe, r, r);
 	if (tevent_req_nomem(rreq, req)) {
 		return;
diff --git a/source4/dsdb/repl/drepl_partitions.c b/source4/dsdb/repl/drepl_partitions.c
index f5c8a70..aba7735 100644
--- a/source4/dsdb/repl/drepl_partitions.c
+++ b/source4/dsdb/repl/drepl_partitions.c
@@ -188,6 +188,65 @@ static WERROR dreplsrv_partition_add_source_dsa(struct dreplsrv_service *s,
 	return WERR_OK;
 }
 
+/*
+  convert from one udv format to the other
+ */
+static WERROR udv_convert(TALLOC_CTX *mem_ctx,
+			  const struct replUpToDateVectorCtr2 *udv,
+			  struct drsuapi_DsReplicaCursorCtrEx *udv_ex)
+{
+	int i;
+
+	udv_ex->version = 2;
+	udv_ex->reserved1 = 0;
+	udv_ex->reserved2 = 0;
+	udv_ex->count = udv->count;
+	udv_ex->cursors = talloc_array(mem_ctx, struct drsuapi_DsReplicaCursor, udv->count);
+	W_ERROR_HAVE_NO_MEMORY(udv_ex->cursors);
+
+	for (i=0; i<udv->count; i++) {
+		udv_ex->cursors[i].source_dsa_invocation_id = udv->cursors[i].source_dsa_invocation_id;
+		udv_ex->cursors[i].highest_usn = udv->cursors[i].highest_usn;
+	}
+
+	return WERR_OK;
+}
+
+/*
+  add our local UDV element for the partition
+ */
+static WERROR add_local_udv(struct dreplsrv_service *s,
+			    struct dreplsrv_partition *p,
+			    const struct GUID *our_invocation_id,
+			    struct drsuapi_DsReplicaCursorCtrEx *udv)
+{
+	int ret;
+	uint64_t highest_usn;
+	int i;
+
+	ret = dsdb_load_partition_usn(s->samdb, p->dn, &highest_usn);
+	if (ret != LDB_SUCCESS) {
+		/* nothing to add */
+		return WERR_OK;
+	}
+
+	for (i=0; i<udv->count; i++) {
+		if (GUID_equal(our_invocation_id, &udv->cursors[i].source_dsa_invocation_id)) {
+			udv->cursors[i].highest_usn = highest_usn;
+			return WERR_OK;
+		}
+	}
+
+	udv->cursors = talloc_realloc(p, udv->cursors, struct drsuapi_DsReplicaCursor, udv->count+1);
+	W_ERROR_HAVE_NO_MEMORY(udv->cursors);
+
+	udv->cursors[udv->count].source_dsa_invocation_id = *our_invocation_id;
+	udv->cursors[udv->count].highest_usn = highest_usn;
+	udv->count++;
+
+	return WERR_OK;
+}
+
 static WERROR dreplsrv_refresh_partition(struct dreplsrv_service *s,
 					 struct dreplsrv_partition *p)
 {
@@ -232,6 +291,11 @@ static WERROR dreplsrv_refresh_partition(struct dreplsrv_service *s,
 		talloc_free(nc_sid);
 	}
 
+	talloc_free(p->uptodatevector.cursors);
+	talloc_free(p->uptodatevector_ex.cursors);
+	ZERO_STRUCT(p->uptodatevector);
+	ZERO_STRUCT(p->uptodatevector_ex);
+
 	ouv_value = ldb_msg_find_ldb_val(r->msgs[0], "replUpToDateVector");
 	if (ouv_value) {
 		enum ndr_err_code ndr_err;
@@ -251,14 +315,14 @@ static WERROR dreplsrv_refresh_partition(struct dreplsrv_service *s,
 
 		p->uptodatevector.count		= ouv.ctr.ctr2.count;
 		p->uptodatevector.reserved	= ouv.ctr.ctr2.reserved;
-		talloc_free(p->uptodatevector.cursors);
 		p->uptodatevector.cursors	= talloc_steal(p, ouv.ctr.ctr2.cursors);
-	}
 
-	/*
-	 * TODO: add our own uptodatevector cursor
-	 */
+		status = udv_convert(p, &p->uptodatevector, &p->uptodatevector_ex);
+		W_ERROR_NOT_OK_RETURN(status);
 
+		status = add_local_udv(s, p, samdb_ntds_invocation_id(s->samdb), &p->uptodatevector_ex);
+		W_ERROR_NOT_OK_RETURN(status);
+	}
 
 	orf_el = ldb_msg_find_element(r->msgs[0], "repsFrom");
 	if (orf_el) {
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index b8fed68..bccdb8d 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -1031,14 +1031,6 @@ static NTSTATUS becomeDC_ldap1_infrastructure_fsmo(struct libnet_BecomeDC_state
 	struct ldb_dn *basedn;
 	struct ldb_dn *ntds_dn;
 	struct ldb_dn *server_dn;
-	static const char *_1_1_attrs[] = {
-		"1.1",
-		NULL
-	};
-	static const char *fsmo_attrs[] = {
-		"fSMORoleOwner",
-		NULL
-	};
 	static const char *dns_attrs[] = {
 		"dnsHostName",
 		NULL
@@ -1048,41 +1040,21 @@ static NTSTATUS becomeDC_ldap1_infrastructure_fsmo(struct libnet_BecomeDC_state
 		NULL
 	};
 
-	basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "<WKGUID=2fbac1870ade11d297c400c04fd8d5cd,%s>",
-				s->domain.dn_str);
-	NT_STATUS_HAVE_NO_MEMORY(basedn);
-
-	ret = ldb_search(s->ldap1.ldb, s, &r, basedn, LDB_SCOPE_BASE,
-			 _1_1_attrs, "(objectClass=*)");
-	talloc_free(basedn);
+	ret = dsdb_wellknown_dn(s->ldap1.ldb, s, samdb_base_dn(s->ldap1.ldb),
+				DS_GUID_INFRASTRUCTURE_CONTAINER,
+				&basedn);
 	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_LDAP(ret);
-	} else if (r->count != 1) {
-		talloc_free(r);
-		return NT_STATUS_INVALID_NETWORK_RESPONSE;
 	}
 
-	basedn = talloc_steal(s, r->msgs[0]->dn);
-	talloc_free(r);
-
-	ret = ldb_search(s->ldap1.ldb, s, &r, basedn, LDB_SCOPE_BASE,
-			 fsmo_attrs, "(objectClass=*)");
-	talloc_free(basedn);
+	ret = samdb_reference_dn(s->ldap1.ldb, s, basedn, "fSMORoleOwner", &ntds_dn);
 	if (ret != LDB_SUCCESS) {
+		talloc_free(basedn);
 		return NT_STATUS_LDAP(ret);
-	} else if (r->count != 1) {
-		talloc_free(r);
-		return NT_STATUS_INVALID_NETWORK_RESPONSE;
 	}
 
-	s->infrastructure_fsmo.ntds_dn_str	= samdb_result_string(r->msgs[0], "fSMORoleOwner", NULL);
-	if (!s->infrastructure_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;
-	talloc_steal(s, s->infrastructure_fsmo.ntds_dn_str);
-
-	talloc_free(r);
-
-	ntds_dn = ldb_dn_new(s, s->ldap1.ldb, s->infrastructure_fsmo.ntds_dn_str);
-	NT_STATUS_HAVE_NO_MEMORY(ntds_dn);
+	s->infrastructure_fsmo.ntds_dn_str = ldb_dn_get_linearized(ntds_dn);
+	NT_STATUS_HAVE_NO_MEMORY(s->infrastructure_fsmo.ntds_dn_str);
 
 	server_dn = ldb_dn_get_parent(s, ntds_dn);
 	NT_STATUS_HAVE_NO_MEMORY(server_dn);
@@ -2951,55 +2923,40 @@ static NTSTATUS becomeDC_ldap2_modify_computer(struct libnet_BecomeDC_state *s)
 static NTSTATUS becomeDC_ldap2_move_computer(struct libnet_BecomeDC_state *s)
 {
 	int ret;
-	struct ldb_result *r;
-	struct ldb_dn *basedn;
 	struct ldb_dn *old_dn;
 	struct ldb_dn *new_dn;
-	static const char *_1_1_attrs[] = {
-		"1.1",
-		NULL
-	};
-
-	basedn = ldb_dn_new_fmt(s, s->ldap2.ldb, "<WKGUID=a361b2ffffd211d1aa4b00c04fd7d83a,%s>",
-				s->domain.dn_str);
-	NT_STATUS_HAVE_NO_MEMORY(basedn);
 
-	ret = ldb_search(s->ldap2.ldb, s, &r, basedn, LDB_SCOPE_BASE,
-			 _1_1_attrs, "(objectClass=*)");
-	talloc_free(basedn);
+	ret = dsdb_wellknown_dn(s->ldap2.ldb, s, samdb_base_dn(s->ldap2.ldb),
+				DS_GUID_DOMAIN_CONTROLLERS_CONTAINER,
+				&new_dn);
 	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_LDAP(ret);
-	} else if (r->count != 1) {
-		talloc_free(r);
-		return NT_STATUS_INVALID_NETWORK_RESPONSE;
 	}
 
-	old_dn = ldb_dn_new(r, s->ldap2.ldb, s->dest_dsa.computer_dn_str);
-	NT_STATUS_HAVE_NO_MEMORY(old_dn);
-
-	new_dn = r->msgs[0]->dn;
-
 	if (!ldb_dn_add_child_fmt(new_dn, "CN=%s", s->dest_dsa.netbios_name)) {
-		talloc_free(r);
+		talloc_free(new_dn);
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	old_dn = ldb_dn_new(new_dn, s->ldap2.ldb, s->dest_dsa.computer_dn_str);
+	NT_STATUS_HAVE_NO_MEMORY(old_dn);
+
 	if (ldb_dn_compare(old_dn, new_dn) == 0) {
 		/* we don't need to rename if the old and new dn match */
-		talloc_free(r);
+		talloc_free(new_dn);
 		return NT_STATUS_OK;
 	}
 
 	ret = ldb_rename(s->ldap2.ldb, old_dn, new_dn);
 	if (ret != LDB_SUCCESS) {
-		talloc_free(r);
+		talloc_free(new_dn);
 		return NT_STATUS_LDAP(ret);
 	}
 
 	s->dest_dsa.computer_dn_str = ldb_dn_alloc_linearized(s, new_dn);
 	NT_STATUS_HAVE_NO_MEMORY(s->dest_dsa.computer_dn_str);
 
-	talloc_free(r);
+	talloc_free(new_dn);
 
 	return NT_STATUS_OK;
 }
diff --git a/source4/rpc_server/config.mk b/source4/rpc_server/config.mk
index 527770a..5ff1bd5 100644
--- a/source4/rpc_server/config.mk
+++ b/source4/rpc_server/config.mk
@@ -188,6 +188,7 @@ dcerpc_drsuapi_OBJ_FILES = $(rpc_serversrcdir)/drsuapi/dcesrv_drsuapi.o \
 	$(rpc_serversrcdir)/drsuapi/updaterefs.o \
 	$(rpc_serversrcdir)/drsuapi/getncchanges.o \
 	$(rpc_serversrcdir)/drsuapi/addentry.o \
+	$(rpc_serversrcdir)/drsuapi/writespn.o \
 	$(rpc_serversrcdir)/drsuapi/drsutil.o
 
 ################################################
diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
index 6a6bc8b..9edb24e 100644
--- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
+++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.c
@@ -378,81 +378,6 @@ static WERROR dcesrv_drsuapi_DsCrackNames(struct dcesrv_call_state *dce_call, TA
 	return WERR_UNKNOWN_LEVEL;
 }
 
-/* 
-  drsuapi_DsWriteAccountSpn 
-*/
-static WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-		       struct drsuapi_DsWriteAccountSpn *r)
-{
-	struct drsuapi_bind_state *b_state;
-	struct dcesrv_handle *h;
-
-	*r->out.level_out = r->in.level;
-
-	DCESRV_PULL_HANDLE_WERR(h, r->in.bind_handle, DRSUAPI_BIND_HANDLE);
-	b_state = h->data;
-
-	r->out.res = talloc(mem_ctx, union drsuapi_DsWriteAccountSpnResult);
-	W_ERROR_HAVE_NO_MEMORY(r->out.res);
-
-	switch (r->in.level) {
-		case 1: {
-			struct drsuapi_DsWriteAccountSpnRequest1 *req;
-			struct ldb_message *msg;
-			int count, i, ret;
-			req = &r->in.req->req1;
-			count = req->count;
-
-			msg = ldb_msg_new(mem_ctx);
-			if (msg == NULL) {
-				return WERR_NOMEM;
-			}
-
-			msg->dn = ldb_dn_new(msg, b_state->sam_ctx, req->object_dn);
-			if ( ! ldb_dn_validate(msg->dn)) {
-				r->out.res->res1.status = WERR_OK;
-				return WERR_OK;
-			}
-			
-			/* construct mods */
-			for (i = 0; i < count; i++) {
-				samdb_msg_add_string(b_state->sam_ctx, 
-						     msg, msg, "servicePrincipalName",
-						     req->spn_names[i].str);
-			}
-			for (i=0;i<msg->num_elements;i++) {
-				switch (req->operation) {
-				case DRSUAPI_DS_SPN_OPERATION_ADD:
- 					msg->elements[i].flags = LDB_FLAG_MOD_ADD;
-					break;
-				case DRSUAPI_DS_SPN_OPERATION_REPLACE:
-					msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
-					break;
-				case DRSUAPI_DS_SPN_OPERATION_DELETE:
-					msg->elements[i].flags = LDB_FLAG_MOD_DELETE;
-					break;
-				}
-			}
-   
-			/* Apply to database */
-
-			ret = ldb_modify(b_state->sam_ctx, msg);
-			if (ret != 0) {
-				DEBUG(0,("Failed to modify SPNs on %s: %s\n",
-					 ldb_dn_get_linearized(msg->dn), 
-					 ldb_errstring(b_state->sam_ctx)));
-				r->out.res->res1.status = WERR_ACCESS_DENIED;
-			} else {
-				r->out.res->res1.status = WERR_OK;
-			}
-
-			return WERR_OK;
-		}
-	}
-	
-	return WERR_UNKNOWN_LEVEL;
-}
-
 
 /* 
   drsuapi_DsRemoveDSServer
diff --git a/source4/rpc_server/drsuapi/dcesrv_drsuapi.h b/source4/rpc_server/drsuapi/dcesrv_drsuapi.h
index 3a64ef5..ba6bb21 100644
--- a/source4/rpc_server/drsuapi/dcesrv_drsuapi.h
+++ b/source4/rpc_server/drsuapi/dcesrv_drsuapi.h
@@ -47,6 +47,8 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
 				     struct drsuapi_DsGetNCChanges *r);
 WERROR dcesrv_drsuapi_DsAddEntry(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
 				 struct drsuapi_DsAddEntry *r);
+WERROR dcesrv_drsuapi_DsWriteAccountSpn(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+					struct drsuapi_DsWriteAccountSpn *r);
 
 char *drs_ObjectIdentifier_to_string(TALLOC_CTX *mem_ctx,
 				     struct drsuapi_DsReplicaObjectIdentifier *nc);
diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c
index 46996c7..908060a 100644
--- a/source4/rpc_server/drsuapi/getncchanges.c
+++ b/source4/rpc_server/drsuapi/getncchanges.c
@@ -102,8 +102,10 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
 	uint32_t *attids;
 	const char *rdn;
 	const struct dsdb_attribute *rdn_sa;
+	unsigned int instanceType;
 
-	if (ldb_dn_compare(ncRoot_dn, msg->dn) == 0) {
+	instanceType = ldb_msg_find_attr_as_uint(msg, "instanceType", 0);
+	if (instanceType & INSTANCE_TYPE_IS_NC_HEAD) {
 		obj->is_nc_prefix = true;
 		obj->parent_object_guid = NULL;
 	} else {
@@ -468,6 +470,10 @@ static WERROR get_nc_changes_udv(struct ldb_context *sam_ctx,
 	struct replUpToDateVectorBlob ouv;
 	int i;
 
+	udv->version = 2;
+	udv->reserved1 = 0;
+	udv->reserved2 = 0;
+
 	werr = load_udv(sam_ctx, udv, ncRoot_dn, &ouv);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
@@ -646,6 +652,7 @@ static WERROR getncchanges_rid_alloc(struct drsuapi_bind_state *b_state,
 	if (ret != LDB_SUCCESS) {
 		DEBUG(0,(__location__ ": Failed to find fSMORoleOwner in RID Manager object - %s\n",
 			 ldb_errstring(ldb)));
+		ctr6->extended_ret = DRSUAPI_EXOP_ERR_FSMO_NOT_OWNER;
 		return WERR_DS_DRA_INTERNAL_ERROR;
 	}
 
@@ -691,6 +698,8 @@ static WERROR getncchanges_rid_alloc(struct drsuapi_bind_state *b_state,
 	DEBUG(2,("Allocated RID pool for server %s\n",
 		 GUID_string(mem_ctx, &req8->destination_dsa_guid)));
 
+	ctr6->extended_ret = DRSUAPI_EXOP_ERR_SUCCESS;
+
 	return WERR_OK;
 }
 
@@ -1008,7 +1017,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
 		}
 
 		if (obj->meta_data_ctr == NULL) {
-			DEBUG(0,(__location__ ": getncchanges skipping send of object %s\n",
+			DEBUG(8,(__location__ ": getncchanges skipping send of object %s\n",
 				 ldb_dn_get_linearized(msg->dn)));
 			/* no attributes to send */
 			talloc_free(obj);
@@ -1064,10 +1073,6 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
 			  b_state->sam_ctx, (ldb_qsort_cmp_fn_t)linked_attribute_compare);
 
 		r->out.ctr->ctr6.uptodateness_vector = talloc(mem_ctx, struct drsuapi_DsReplicaCursor2CtrEx);
-		r->out.ctr->ctr6.uptodateness_vector->version = 2;
-		r->out.ctr->ctr6.uptodateness_vector->reserved1 = 0;
-		r->out.ctr->ctr6.uptodateness_vector->reserved2 = 0;
-
 		r->out.ctr->ctr6.new_highwatermark.highest_usn = r->out.ctr->ctr6.new_highwatermark.tmp_highest_usn;
 
 		werr = get_nc_changes_udv(b_state->sam_ctx, getnc_state->ncRoot_dn, 
diff --git a/source4/rpc_server/drsuapi/writespn.c b/source4/rpc_server/drsuapi/writespn.c
new file mode 100644
index 0000000..8e20c88
--- /dev/null
+++ b/source4/rpc_server/drsuapi/writespn.c
@@ -0,0 +1,145 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   implement the DsWriteAccountSpn call
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list