r15530: added testing of generic CLDAP requests, looking at the rootDSE. Jerry
authorAndrew Tridgell <tridge@samba.org>
Thu, 11 May 2006 02:57:41 +0000 (02:57 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:05:54 +0000 (14:05 -0500)
has found that w2k3 does respond to rootDSE cldap requests. This test
shows that it does indeed work, but the expression handling is not
what you would expect
(This used to be commit 388e98e77cfd1603156ea431877e40ac886d9c08)

source4/torture/ldap/cldap.c

index 86c261a3b003f02912855a9ac753afe9f42dbe9e..78bc6063a56b02047d8c667e1675746a99073ddd 100644 (file)
 
 #include "includes.h"
 #include "libcli/cldap/cldap.h"
+#include "libcli/ldap/ldap.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "torture/torture.h"
+#include "lib/ldb/include/ldb.h"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
                ret = False; \
                goto done; \
        } \
-       if (DEBUGLVL(10)) { \
-               NDR_PRINT_UNION_DEBUG(nbt_cldap_netlogon, \
-                                     search.in.version & 0xF, \
-                                     &search.out.netlogon); \
-       } \
 } while (0)
 
 /*
@@ -165,6 +162,92 @@ done:
        return ret;     
 }
 
+/*
+  convert a ldap result message to a ldb message. This allows us to
+  use the convenient ldif dump routines in ldb to print out cldap
+  search results
+*/
+static struct ldb_message *ldap_msg_to_ldb(TALLOC_CTX *mem_ctx, struct ldap_SearchResEntry *res)
+{
+       struct ldb_message *msg;
+
+       msg = ldb_msg_new(mem_ctx);
+       msg->dn = ldb_dn_explode_or_special(msg, res->dn);
+       msg->num_elements = res->num_attributes;
+       msg->elements = talloc_steal(msg, res->attributes);
+       return msg;
+}
+
+/*
+  dump a set of cldap results
+*/
+static void cldap_dump_results(struct cldap_search *search)
+{
+       struct ldb_ldif ldif;
+       struct ldb_context *ldb;
+
+       /* we need a ldb context to use ldb_ldif_write_file() */
+       ldb = ldb_init(NULL);
+
+       ZERO_STRUCT(ldif);
+       ldif.msg = ldap_msg_to_ldb(ldb, search->out.response);
+
+       ldb_ldif_write_file(ldb, stdout, &ldif);
+
+       talloc_free(ldb);
+}
+
+/*
+  test generic cldap operations
+*/
+static BOOL test_cldap_generic(TALLOC_CTX *mem_ctx, const char *dest)
+{
+       struct cldap_socket *cldap = cldap_socket_init(mem_ctx, NULL);
+       NTSTATUS status;
+       struct cldap_search search;
+       BOOL ret = True;
+       const char *attrs[] = { "currentTime", "highestCommittedUSN", NULL };
+
+       ZERO_STRUCT(search);
+       search.in.dest_address = dest;
+       search.in.timeout = 10;
+       search.in.retries = 3;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       printf("fetching whole rootDSE\n");
+       search.in.filter = "(objectclass=*)";
+       search.in.attributes = NULL;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+
+       printf("fetching currentTime and USN\n");
+       search.in.filter = "(objectclass=*)";
+       search.in.attributes = attrs;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+
+       printf("Testing a false expression\n");
+       search.in.filter = "(&(objectclass=*)(highestCommittedUSN=2))";
+       search.in.attributes = attrs;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+       
+
+done:
+       return ret;     
+}
+
 BOOL torture_cldap(struct torture_context *torture)
 {
        TALLOC_CTX *mem_ctx;
@@ -175,6 +258,9 @@ BOOL torture_cldap(struct torture_context *torture)
 
        ret &= test_cldap_netlogon(mem_ctx, host);
 
+       /* at the moment don't consider this failing to be a failure */
+       test_cldap_generic(mem_ctx, host);
+
        talloc_free(mem_ctx);
 
        return ret;