The branch, master has been updated
       via  03bfd42... s4-test: Implement DRS-RPC-msDSIntId test case
       via  d595f07... s4-dsdb: fix attributes_by_msDS_IntId index sorting
       via  06f5985... s4-test: Move dsdb_schema loading into public function
       via  c30f9bd... s4-test: Move RPC-DSSYNC test in DRS-RPC test suite
       via  da074f1... s4-test: Move dssync.c to torture/drs/rpc
       via  f3c0689... s4-test: strip trailing white-spaces
      from  067b572... s4:objectclass LDB module - weak the check for the 
"rIDSet" delete constraint

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


- Log -----------------------------------------------------------------
commit 03bfd4290f70ab2de46ccd82a429fda57c8c6bb9
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Tue Aug 10 01:08:19 2010 +0300

    s4-test: Implement DRS-RPC-msDSIntId test case

commit d595f070f6ab7c6c8732c3c3a4ca39d37bcca3b4
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Tue Aug 10 21:05:47 2010 +0300

    s4-dsdb: fix attributes_by_msDS_IntId index sorting

commit 06f59855a7b4fcc6f4957d9e1a8e29e387397b50
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Sat Aug 7 12:52:07 2010 +0300

    s4-test: Move dsdb_schema loading into public function
    
    I will use this function for tests implementation later

commit c30f9bd7345cddd85502eb9d099279606959f447
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Thu Aug 5 04:55:04 2010 +0300

    s4-test: Move RPC-DSSYNC test in DRS-RPC test suite

commit da074f10e3900413a134ee8143c68f05563da13f
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Thu Aug 5 18:37:24 2010 +0300

    s4-test: Move dssync.c to torture/drs/rpc

commit f3c06892eccac1169a73615637bf82bf956ce523
Author: Kamen Mazdrashki <kame...@samba.org>
Date:   Thu Aug 5 18:35:35 2010 +0300

    s4-test: strip trailing white-spaces

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

Summary of changes:
 source4/dsdb/schema/schema_set.c     |    6 +-
 source4/selftest/tests.sh            |    2 +-
 source4/torture/drs/drs_init.c       |    3 +
 source4/torture/drs/drs_util.c       |   94 +++
 source4/torture/drs/rpc/dssync.c     | 1064 ++++++++++++++++++++++++++++++++
 source4/torture/drs/rpc/msds_intid.c |  643 +++++++++++++++++++
 source4/torture/drs/wscript_build    |    2 +-
 source4/torture/rpc/dssync.c         | 1120 ----------------------------------
 source4/torture/rpc/rpc.c            |    1 -
 source4/torture/wscript_build        |    2 +-
 10 files changed, 1812 insertions(+), 1125 deletions(-)
 create mode 100644 source4/torture/drs/rpc/dssync.c
 create mode 100644 source4/torture/drs/rpc/msds_intid.c
 delete mode 100644 source4/torture/rpc/dssync.c


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c
index b8ed7ca..344e9bb 100644
--- a/source4/dsdb/schema/schema_set.c
+++ b/source4/dsdb/schema/schema_set.c
@@ -230,6 +230,10 @@ static int dsdb_compare_attribute_by_attributeID_id(struct 
dsdb_attribute **a1,
 {
        return uint32_cmp((*a1)->attributeID_id, (*a2)->attributeID_id);
 }
+static int dsdb_compare_attribute_by_msDS_IntId(struct dsdb_attribute **a1, 
struct dsdb_attribute **a2)
+{
+       return uint32_cmp((*a1)->msDS_IntId, (*a2)->msDS_IntId);
+}
 static int dsdb_compare_attribute_by_attributeID_oid(struct dsdb_attribute 
**a1, struct dsdb_attribute **a2)
 {
        return strcasecmp((*a1)->attributeID_oid, (*a2)->attributeID_oid);
@@ -345,7 +349,7 @@ static int dsdb_setup_sorted_accessors(struct ldb_context 
*ldb,
        /* sort the arrays */
        TYPESAFE_QSORT(schema->attributes_by_lDAPDisplayName, 
schema->num_attributes, dsdb_compare_attribute_by_lDAPDisplayName);
        TYPESAFE_QSORT(schema->attributes_by_attributeID_id, 
schema->num_attributes, dsdb_compare_attribute_by_attributeID_id);
-       TYPESAFE_QSORT(schema->attributes_by_msDS_IntId, 
schema->num_int_id_attr, dsdb_compare_attribute_by_attributeID_id);
+       TYPESAFE_QSORT(schema->attributes_by_msDS_IntId, 
schema->num_int_id_attr, dsdb_compare_attribute_by_msDS_IntId);
        TYPESAFE_QSORT(schema->attributes_by_attributeID_oid, 
schema->num_attributes, dsdb_compare_attribute_by_attributeID_oid);
        TYPESAFE_QSORT(schema->attributes_by_linkID, schema->num_attributes, 
dsdb_compare_attribute_by_linkID);
 
diff --git a/source4/selftest/tests.sh b/source4/selftest/tests.sh
index 1dd507e..bc4543c 100755
--- a/source4/selftest/tests.sh
+++ b/source4/selftest/tests.sh
@@ -166,7 +166,7 @@ fi
 # that they stay passing
 ncacn_np_tests="RPC-SCHANNEL RPC-JOIN RPC-LSA RPC-DSSETUP RPC-ALTERCONTEXT 
RPC-MULTIBIND RPC-NETLOGON RPC-HANDLES RPC-SAMSYNC RPC-SAMBA3-SESSIONKEY 
RPC-SAMBA3-GETUSERNAME RPC-SAMBA3-LSA RPC-SAMBA3-BIND RPC-SAMBA3-NETLOGON 
RPC-ASYNCBIND RPC-LSALOOKUP RPC-LSA-GETUSER RPC-SCHANNEL2 RPC-AUTHCONTEXT"
 ncalrpc_tests="RPC-SCHANNEL RPC-JOIN RPC-LSA RPC-DSSETUP RPC-ALTERCONTEXT 
RPC-MULTIBIND RPC-NETLOGON RPC-DRSUAPI RPC-ASYNCBIND RPC-LSALOOKUP 
RPC-LSA-GETUSER RPC-SCHANNEL2 RPC-AUTHCONTEXT"
-ncacn_ip_tcp_tests="RPC-SCHANNEL RPC-JOIN RPC-LSA RPC-DSSETUP RPC-ALTERCONTEXT 
RPC-MULTIBIND RPC-NETLOGON RPC-HANDLES RPC-DSSYNC RPC-ASYNCBIND RPC-LSALOOKUP 
RPC-LSA-GETUSER RPC-SCHANNEL2 RPC-AUTHCONTEXT RPC-OBJECTUUID"
+ncacn_ip_tcp_tests="RPC-SCHANNEL RPC-JOIN RPC-LSA RPC-DSSETUP RPC-ALTERCONTEXT 
RPC-MULTIBIND RPC-NETLOGON RPC-HANDLES RPC-ASYNCBIND RPC-LSALOOKUP 
RPC-LSA-GETUSER RPC-SCHANNEL2 RPC-AUTHCONTEXT RPC-OBJECTUUID DRS-RPC-DSSYNC"
 slow_ncacn_np_tests="RPC-SAMLOGON RPC-SAMR RPC-SAMR-USERS RPC-SAMR-LARGE-DC 
RPC-SAMR-USERS-PRIVILEGES RPC-SAMR-PASSWORDS RPC-SAMR-PASSWORDS-PWDLASTSET"
 slow_ncalrpc_tests="RPC-SAMR RPC-SAMR-PASSWORDS"
 slow_ncacn_ip_tcp_tests="RPC-SAMR RPC-SAMR-PASSWORDS RPC-CRACKNAMES"
diff --git a/source4/torture/drs/drs_init.c b/source4/torture/drs/drs_init.c
index 35520ba..6c1f1a0 100644
--- a/source4/torture/drs/drs_init.c
+++ b/source4/torture/drs/drs_init.c
@@ -34,6 +34,9 @@ static struct torture_suite * 
torture_drs_rpc_suite(TALLOC_CTX *mem_ctx)
                talloc_autofree_context(),
                "RPC");
 
+       torture_drs_rpc_dssync_tcase(suite);
+       torture_drs_rpc_dsintid_tcase(suite);
+
        return suite;
 }
 
diff --git a/source4/torture/drs/drs_util.c b/source4/torture/drs/drs_util.c
index e917b71..ba90cde 100644
--- a/source4/torture/drs/drs_util.c
+++ b/source4/torture/drs/drs_util.c
@@ -21,6 +21,7 @@
 
 #include "includes.h"
 #include "torture/torture.h"
+#include "dsdb/samdb/samdb.h"
 #include "torture/rpc/drsuapi.h"
 #include "../lib/util/asn1.h"
 
@@ -166,3 +167,96 @@ const char * drs_util_DsAttributeId_to_string(enum 
drsuapi_DsAttributeId r)
        }
        return val;
 }
+
+
+/**
+ * Loads dsdb_schema from ldb connection using remote prefixMap.
+ * Schema will be loaded only if:
+ *  - ldb has no attached schema
+ *  - reload_schema is true
+ *
+ * This function is to be used in tests that use GetNCChanges() function
+ */
+bool drs_util_dsdb_schema_load_ldb(struct torture_context *tctx,
+                                  struct ldb_context *ldb,
+                                  const struct drsuapi_DsReplicaOIDMapping_Ctr 
*mapping_ctr,
+                                  bool reload_schema)
+{
+       int i, ret;
+       WERROR werr;
+       const char *err_msg;
+       struct ldb_result *a_res;
+       struct ldb_result *c_res;
+       struct ldb_dn *schema_dn;
+       struct dsdb_schema *ldap_schema;
+
+       ldap_schema = dsdb_get_schema(ldb, NULL);
+       if (ldap_schema && !reload_schema) {
+               return true;
+       }
+
+       schema_dn = ldb_get_schema_basedn(ldb);
+       torture_assert(tctx, schema_dn != NULL,
+                      talloc_asprintf(tctx, "ldb_get_schema_basedn() failed: 
%s", ldb_errstring(ldb)));
+
+       ldap_schema = dsdb_new_schema(ldb);
+       torture_assert(tctx, ldap_schema != NULL, "dsdb_new_schema() failed!");
+
+       werr = dsdb_load_prefixmap_from_drsuapi(ldap_schema, mapping_ctr);
+       torture_assert_werr_ok(tctx, werr,
+                              "Failed to construct prefixMap from drsuapi 
data");
+
+       /*
+        * load the attribute definitions
+        */
+       ret = ldb_search(ldb, ldap_schema, &a_res,
+                        schema_dn, LDB_SCOPE_ONELEVEL, NULL,
+                        "(objectClass=attributeSchema)");
+       if (ret != LDB_SUCCESS) {
+               err_msg = talloc_asprintf(tctx,
+                                         "failed to search attributeSchema 
objects: %s",
+                                         ldb_errstring(ldb));
+               torture_fail(tctx, err_msg);
+       }
+
+       /*
+        * load the objectClass definitions
+        */
+       ret = ldb_search(ldb, ldap_schema, &c_res,
+                        schema_dn, LDB_SCOPE_ONELEVEL, NULL,
+                        "(objectClass=classSchema)");
+       if (ret != LDB_SUCCESS) {
+               err_msg = talloc_asprintf(tctx,
+                                         "failed to search classSchema 
objects: %s",
+                                         ldb_errstring(ldb));
+               torture_fail(tctx, err_msg);
+       }
+
+       /* Build schema */
+       for (i=0; i < a_res->count; i++) {
+               werr = dsdb_attribute_from_ldb(ldb, ldap_schema, 
a_res->msgs[i]);
+               torture_assert_werr_ok(tctx, werr,
+                                      talloc_asprintf(tctx,
+                                                      
"dsdb_attribute_from_ldb() failed for: %s",
+                                                      
ldb_dn_get_linearized(a_res->msgs[i]->dn)));
+       }
+
+       for (i=0; i < c_res->count; i++) {
+               werr = dsdb_class_from_ldb(ldap_schema, c_res->msgs[i]);
+               torture_assert_werr_ok(tctx, werr,
+                                      talloc_asprintf(tctx,
+                                                      "dsdb_class_from_ldb() 
failed for: %s",
+                                                      
ldb_dn_get_linearized(c_res->msgs[i]->dn)));
+       }
+
+       talloc_free(a_res);
+       talloc_free(c_res);
+
+       ret = dsdb_set_schema(ldb, ldap_schema);
+       if (ret != LDB_SUCCESS) {
+               torture_fail(tctx,
+                            talloc_asprintf(tctx, "dsdb_set_schema() failed: 
%s", ldb_strerror(ret)));
+       }
+
+       return true;
+}
diff --git a/source4/torture/drs/rpc/dssync.c b/source4/torture/drs/rpc/dssync.c
new file mode 100644
index 0000000..5a7ceb8
--- /dev/null
+++ b/source4/torture/drs/rpc/dssync.c
@@ -0,0 +1,1064 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   DsGetNCChanges replication test
+
+   Copyright (C) Stefan (metze) Metzmacher 2005
+   Copyright (C) Brad Henry 2005
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "lib/cmdline/popt_common.h"
+#include "librpc/gen_ndr/ndr_drsuapi_c.h"
+#include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "libcli/cldap/cldap.h"
+#include "torture/torture.h"
+#include "../libcli/drsuapi/drsuapi.h"
+#include "auth/gensec/gensec.h"
+#include "param/param.h"
+#include "dsdb/samdb/samdb.h"
+#include "torture/rpc/torture_rpc.h"
+#include "torture/drs/proto.h"
+#include "lib/tsocket/tsocket.h"
+#include "libcli/resolve/resolve.h"
+
+struct DsSyncBindInfo {
+       struct dcerpc_pipe *drs_pipe;
+       struct dcerpc_binding_handle *drs_handle;
+       struct drsuapi_DsBind req;
+       struct GUID bind_guid;
+       struct drsuapi_DsBindInfoCtr our_bind_info_ctr;
+       struct drsuapi_DsBindInfo28 our_bind_info28;
+       struct drsuapi_DsBindInfo28 peer_bind_info28;
+       struct policy_handle bind_handle;
+};
+
+struct DsSyncLDAPInfo {
+       struct ldb_context *ldb;
+};
+
+struct DsSyncTest {
+       struct dcerpc_binding *drsuapi_binding;
+
+       const char *ldap_url;
+       const char *dest_address;
+       const char *domain_dn;
+       const char *config_dn;
+       const char *schema_dn;
+
+       /* what we need to do as 'Administrator' */
+       struct {
+               struct cli_credentials *credentials;
+               struct DsSyncBindInfo drsuapi;
+               struct DsSyncLDAPInfo ldap;
+       } admin;
+
+       /* what we need to do as the new dc machine account */
+       struct {
+               struct cli_credentials *credentials;
+               struct DsSyncBindInfo drsuapi;
+               struct drsuapi_DsGetDCInfo2 dc_info2;
+               struct GUID invocation_id;
+               struct GUID object_guid;
+       } new_dc;
+
+       /* info about the old dc */
+       struct {
+               struct drsuapi_DsGetDomainControllerInfo dc_info;
+       } old_dc;
+};
+
+static struct DsSyncTest *test_create_context(struct torture_context *tctx)
+{
+       NTSTATUS status;
+       struct DsSyncTest *ctx;
+       struct drsuapi_DsBindInfo28 *our_bind_info28;
+       struct drsuapi_DsBindInfoCtr *our_bind_info_ctr;
+       const char *binding = torture_setting_string(tctx, "binding", NULL);
+       struct nbt_name name;
+
+       ctx = talloc_zero(tctx, struct DsSyncTest);
+       if (!ctx) return NULL;
+
+       status = dcerpc_parse_binding(ctx, binding, &ctx->drsuapi_binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Bad binding string %s\n", binding);
+               return NULL;
+       }
+       ctx->drsuapi_binding->flags |= DCERPC_SIGN | DCERPC_SEAL;
+
+       ctx->ldap_url = talloc_asprintf(ctx, "ldap://%s";, 
ctx->drsuapi_binding->host);
+
+       make_nbt_name_server(&name, ctx->drsuapi_binding->host);
+
+       /* do an initial name resolution to find its IP */
+       status = resolve_name(lpcfg_resolve_context(tctx->lp_ctx), &name, tctx,
+                             &ctx->dest_address, tctx->ev);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to resolve %s - %s\n",
+                      name.name, nt_errstr(status));
+               return NULL;
+       }
+
+       /* ctx->admin ...*/
+       ctx->admin.credentials                          = cmdline_credentials;
+
+       our_bind_info28                         = 
&ctx->admin.drsuapi.our_bind_info28;
+       our_bind_info28->supported_extensions   = 0xFFFFFFFF;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3;
+       our_bind_info28->site_guid              = GUID_zero();
+       our_bind_info28->pid                    = 0;
+       our_bind_info28->repl_epoch             = 1;
+
+       our_bind_info_ctr                       = 
&ctx->admin.drsuapi.our_bind_info_ctr;
+       our_bind_info_ctr->length               = 28;
+       our_bind_info_ctr->info.info28          = *our_bind_info28;
+
+       GUID_from_string(DRSUAPI_DS_BIND_GUID, &ctx->admin.drsuapi.bind_guid);
+
+       ctx->admin.drsuapi.req.in.bind_guid             = 
&ctx->admin.drsuapi.bind_guid;
+       ctx->admin.drsuapi.req.in.bind_info             = our_bind_info_ctr;
+       ctx->admin.drsuapi.req.out.bind_handle          = 
&ctx->admin.drsuapi.bind_handle;
+
+       /* ctx->new_dc ...*/
+       ctx->new_dc.credentials                 = cmdline_credentials;
+
+       our_bind_info28                         = 
&ctx->new_dc.drsuapi.our_bind_info28;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_BASE;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7;
+       our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT;
+       if (lpcfg_parm_bool(tctx->lp_ctx, NULL, "dssync", "xpress", false)) {
+               our_bind_info28->supported_extensions   |= 
DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESS;
+       }
+       our_bind_info28->site_guid              = GUID_zero();
+       our_bind_info28->pid                    = 0;
+       our_bind_info28->repl_epoch             = 0;
+
+       our_bind_info_ctr                       = 
&ctx->new_dc.drsuapi.our_bind_info_ctr;
+       our_bind_info_ctr->length               = 28;
+       our_bind_info_ctr->info.info28          = *our_bind_info28;
+
+       GUID_from_string(DRSUAPI_DS_BIND_GUID_W2K3, 
&ctx->new_dc.drsuapi.bind_guid);
+
+       ctx->new_dc.drsuapi.req.in.bind_guid            = 
&ctx->new_dc.drsuapi.bind_guid;
+       ctx->new_dc.drsuapi.req.in.bind_info            = our_bind_info_ctr;
+       ctx->new_dc.drsuapi.req.out.bind_handle         = 
&ctx->new_dc.drsuapi.bind_handle;
+
+       ctx->new_dc.invocation_id                       = 
ctx->new_dc.drsuapi.bind_guid;
+
+       /* ctx->old_dc ...*/
+
+       return ctx;
+}
+
+static bool _test_DsBind(struct torture_context *tctx,
+                        struct DsSyncTest *ctx, struct cli_credentials 
*credentials, struct DsSyncBindInfo *b)
+{
+       NTSTATUS status;
+       bool ret = true;
+
+       status = dcerpc_pipe_connect_b(ctx,
+                                      &b->drs_pipe, ctx->drsuapi_binding,
+                                      &ndr_table_drsuapi,
+                                      credentials, tctx->ev, tctx->lp_ctx);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to connect to server as a BDC: %s\n", 
nt_errstr(status));
+               return false;
+       }
+       b->drs_handle = b->drs_pipe->binding_handle;
+
+       status = dcerpc_drsuapi_DsBind_r(b->drs_handle, ctx, &b->req);
+       if (!NT_STATUS_IS_OK(status)) {
+               const char *errstr = nt_errstr(status);
+               printf("dcerpc_drsuapi_DsBind failed - %s\n", errstr);
+               ret = false;
+       } else if (!W_ERROR_IS_OK(b->req.out.result)) {
+               printf("DsBind failed - %s\n", win_errstr(b->req.out.result));
+               ret = false;
+       }
+
+       ZERO_STRUCT(b->peer_bind_info28);
+       if (b->req.out.bind_info) {
+               switch (b->req.out.bind_info->length) {
+               case 24: {
+                       struct drsuapi_DsBindInfo24 *info24;
+                       info24 = &b->req.out.bind_info->info.info24;
+                       b->peer_bind_info28.supported_extensions= 
info24->supported_extensions;
+                       b->peer_bind_info28.site_guid           = 
info24->site_guid;
+                       b->peer_bind_info28.pid                 = info24->pid;
+                       b->peer_bind_info28.repl_epoch          = 0;
+                       break;
+               }
+               case 48: {
+                       struct drsuapi_DsBindInfo48 *info48;
+                       info48 = &b->req.out.bind_info->info.info48;
+                       b->peer_bind_info28.supported_extensions= 
info48->supported_extensions;
+                       b->peer_bind_info28.site_guid           = 
info48->site_guid;
+                       b->peer_bind_info28.pid                 = info48->pid;
+                       b->peer_bind_info28.repl_epoch          = 
info48->repl_epoch;
+                       break;
+               }
+               case 28:
+                       b->peer_bind_info28 = b->req.out.bind_info->info.info28;
+                       break;
+               default:
+                       printf("DsBind - warning: unknown BindInfo length: 
%u\n",
+                              b->req.out.bind_info->length);
+               }
+       }
+
+       return ret;
+}
+
+static bool test_LDAPBind(struct torture_context *tctx, struct DsSyncTest *ctx,
+                         struct cli_credentials *credentials, struct 
DsSyncLDAPInfo *l)
+{
+       bool ret = true;
+
+       struct ldb_context *ldb;
+
+       const char *modules_option[] = { "modules:paged_searches", NULL };
+       ctx->admin.ldap.ldb = ldb = ldb_init(ctx, tctx->ev);
+       if (ldb == NULL) {
+               return false;
+       }
+
+       /* Despite us loading the schema from the AD server, we need
+        * the samba handlers to get the extended DN syntax stuff */
+       ret = ldb_register_samba_handlers(ldb);
+       if (ret == -1) {
+               talloc_free(ldb);
+               return NULL;
+       }
+
+       ldb_set_modules_dir(ldb,
+                           talloc_asprintf(ldb,
+                                           "%s/ldb",
+                                           lpcfg_modulesdir(tctx->lp_ctx)));
+
+       if (ldb_set_opaque(ldb, "credentials", credentials)) {
+               talloc_free(ldb);
+               return NULL;
+       }
+
+       if (ldb_set_opaque(ldb, "loadparm", tctx->lp_ctx)) {
+               talloc_free(ldb);
+               return NULL;
+       }
+
+       ret = ldb_connect(ldb, ctx->ldap_url, 0, modules_option);
+       if (ret != LDB_SUCCESS) {
+               talloc_free(ldb);
+               torture_assert_int_equal(tctx, ret, LDB_SUCCESS, "Failed to 
make LDB connection to target");
+       }
+
+       printf("connected to LDAP: %s\n", ctx->ldap_url);
+
+       return true;
+}
+
+static bool test_GetInfo(struct torture_context *tctx, struct DsSyncTest *ctx)
+{
+       struct ldb_context *ldb = ctx->admin.ldap.ldb;
+
+       /* We must have LDB connection ready by this time */
+       SMB_ASSERT(ldb != NULL);
+
+       ctx->domain_dn = ldb_dn_get_linearized(ldb_get_default_basedn(ldb));
+       torture_assert(tctx, ctx->domain_dn != NULL, "Failed to get Domain DN");
+
+       ctx->config_dn = ldb_dn_get_linearized(ldb_get_config_basedn(ldb));
+       torture_assert(tctx, ctx->config_dn != NULL, "Failed to get Domain DN");
+
+       ctx->schema_dn = ldb_dn_get_linearized(ldb_get_schema_basedn(ldb));
+       torture_assert(tctx, ctx->schema_dn != NULL, "Failed to get Domain DN");
+
+       return true;
+}
+
+static bool test_analyse_objects(struct torture_context *tctx,
+                                struct DsSyncTest *ctx,
+                                const char *partition,
+                                const struct drsuapi_DsReplicaOIDMapping_Ctr 
*mapping_ctr,
+                                uint32_t object_count,
+                                const struct drsuapi_DsReplicaObjectListItemEx 
*first_object,
+                                const DATA_BLOB *gensec_skey)
+{
+       static uint32_t object_id;
+       const char *save_values_dir;
+       const struct drsuapi_DsReplicaObjectListItemEx *cur;
+       struct ldb_context *ldb = ctx->admin.ldap.ldb;
+       struct ldb_dn *deleted_dn;
+       WERROR status;
+       int i, j, ret;
+       struct dsdb_extended_replicated_objects *objs;
+       struct ldb_extended_dn_control *extended_dn_ctrl;


-- 
Samba Shared Repository

Reply via email to