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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
Date:   Sat Jan 9 17:42:05 2010 +1100

    s4-dsdb: added samdb_ldb_val_case_cmp()

commit acf33e0d58b38c9c621e2dc0837c07a99c95acc2
Author: Andrew Tridgell <[email protected]>
Date:   Sat Jan 9 17:11:01 2010 +1100

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

commit 8ccedc3ac7f7bf6207d9fc778686592915781a4a
Author: Andrew Tridgell <[email protected]>
Date:   Sat Jan 9 15:57:52 2010 +1100

    s4-libnet: dsdb_wellknown_dn() in vampire code

commit 1158c138611d388fcae066a009cd6033a60a5944
Author: Andrew Tridgell <[email protected]>
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 <[email protected]>
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 <[email protected]>
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

Reply via email to