[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Mon Nov 11 16:58:02 MST 2013


The branch, master has been updated
       via  0dd512e s4:torture/netlogon: Test netlogon with additional attrs
       via  767bd6a s4:torture/ldap: Add test for netlogon over tcp
       via  e306250 libcli/cldap: Add utility to create netlogon filter
       via  68ebb09 s4:dsdb: Move cldap netlogon functions into samdb/ldb_modules
       via  7106dcf s4:cldap_server: Do not handle netlogon ourself anymore
       via  0620c79 s4:dsdb/rootdse: Support netlogon request
       via  7a5a625 s4:dsdb/rootdse: Pass rootdse context to rootdse_add_dynamic
       via  3721274 s4:cldap_server: Move netlogon parsing into utility function
       via  ca8acb6 provision: Fix string replacement ordering
       via  32ee231 s4:torture/cldap: Fix a typo
      from  490418d gpo: Fix CID 1034880 Resource leak

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


- Log -----------------------------------------------------------------
commit 0dd512eead6dc999511e9e21f5304a224653db85
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Thu Oct 31 21:23:57 2013 +0100

    s4:torture/netlogon: Test netlogon with additional attrs
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>
    
    se enter the commit message for your changes. Lines starting
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Tue Nov 12 00:57:19 CET 2013 on sn-devel-104

commit 767bd6a4d49efce1c554bb0bc8130d74331b0bd8
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Mon Oct 28 14:21:20 2013 +0100

    s4:torture/ldap: Add test for netlogon over tcp
    
    This patch moves the udp netlogon tests from cldap.c
    to netlogon.c and passes a generic netlogon-send
    function as parameter.
    
    Therefore a tcp replacement for cldap_netlogon is also added.
    The two variants tcp and udp are added as 2 new torture tests:
    
    ldap.netlogon-udp & ldap.netlogon-tcp
    Both tests succeed.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit e306250a250d20a43cbe4c72ece34ebd475fa39c
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Mon Oct 28 14:19:57 2013 +0100

    libcli/cldap: Add utility to create netlogon filter
    
    This utility is splitted of from cldap_netlogon_send.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 68ebb09193e73cff4389ccb9e3b190b12ee0a84a
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Tue Nov 5 20:39:56 2013 +0100

    s4:dsdb: Move cldap netlogon functions into samdb/ldb_modules
    
    As netlogon is handled by the samdb now,
    the corresponding functions should live there as well.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 7106dcf2b8525ec653f24e417d846f9d00172b6d
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Fri Nov 1 10:52:02 2013 +0100

    s4:cldap_server: Do not handle netlogon ourself anymore
    
    Netlogon is now handled by the ldb rootdse module.
    
    The netlogon files will be moved to dsdb in the next commit.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 0620c79d76b69811fd6c00d912db05477d894724
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Sun Oct 27 06:55:48 2013 +0100

    s4:dsdb/rootdse: Support netlogon request
    
    This patch adds support for a netlogon ldap style request
    over the tcp socket.  This is available since win2k3+ [1].
    
    The automatic client join & configuration daemon "realmd" makes
    use of this ability.
    Realmd can now be used to join a computer to a samba 4 domain.
    (See also:
    https://lists.samba.org/archive/samba-technical/2013-October/095606.html)
    
    Tested with:
    ldapsearch -h samba-srv -x -b '' -s base "(&(NtVer=\06\00\00\00)(AAC=\00\00\00\00))" NetLogon
    
    And compared the result in wireshark with cldap request issued by
    examples/misc/cldap.pl.
    
    [1]: http://wiki.wireshark.org/MS-CLDAP?action=recall&rev=8
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 7a5a62547bc10053fb1e4850e0acacb6a837f36f
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Fri Nov 1 06:55:41 2013 +0100

    s4:dsdb/rootdse: Pass rootdse context to rootdse_add_dynamic
    
    This replaced the *module parameter, and uses ac->module in the function
    instead, same for *req and *attrs.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 372127416825a8a947cd976f8a4165611c006c43
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Sun Oct 27 16:07:04 2013 +0100

    s4:cldap_server: Move netlogon parsing into utility function
    
    To be used later by netlogon-request over ldap.
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit ca8acb681a1ccaddf85376ff30c9b13b1a4c943d
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Fri Sep 6 16:20:43 2013 +0200

    provision: Fix string replacement ordering
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

commit 32ee231da590d7b8aee74728a423b282ae845bce
Author: Benjamin Franzke <benjaminfranzke at googlemail.com>
Date:   Fri Nov 1 10:24:43 2013 +0100

    s4:torture/cldap: Fix a typo
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    Reviewed-by: Nadezhda Ivanova <nivanova at symas.com>

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

Summary of changes:
 libcli/cldap/cldap.c                               |   90 +++--
 libcli/cldap/cldap.h                               |    2 +
 python/samba/provision/__init__.py                 |    2 +-
 source4/cldap_server/cldap_server.c                |   12 -
 source4/cldap_server/cldap_server.h                |   15 -
 source4/cldap_server/rootdse.c                     |    5 +
 source4/cldap_server/wscript_build                 |    2 +-
 .../samdb/ldb_modules}/netlogon.c                  |   94 ++---
 source4/dsdb/samdb/ldb_modules/rootdse.c           |  122 +++++--
 source4/dsdb/samdb/ldb_modules/util.h              |    2 +
 source4/dsdb/samdb/ldb_modules/wscript_build       |    2 +-
 source4/ldap_server/ldap_backend.c                 |    3 +
 source4/nbt_server/dgram/netlogon.c                |    2 +-
 source4/nbt_server/wscript_build                   |    2 +-
 source4/rpc_server/netlogon/dcerpc_netlogon.c      |    2 +-
 source4/rpc_server/wscript_build                   |    2 +-
 source4/torture/ldap/cldap.c                       |  331 +----------------
 source4/torture/ldap/common.c                      |    2 +
 source4/torture/ldap/{cldap.c => netlogon.c}       |  394 ++++++++++++--------
 source4/torture/wscript_build                      |    2 +-
 20 files changed, 449 insertions(+), 639 deletions(-)
 rename source4/{cldap_server => dsdb/samdb/ldb_modules}/netlogon.c (87%)
 copy source4/torture/ldap/{cldap.c => netlogon.c} (61%)


Changeset truncated at 500 lines:

diff --git a/libcli/cldap/cldap.c b/libcli/cldap/cldap.c
index 24ce39f..e543091 100644
--- a/libcli/cldap/cldap.c
+++ b/libcli/cldap/cldap.c
@@ -882,81 +882,91 @@ struct cldap_netlogon_state {
 	struct cldap_search search;
 };
 
-static void cldap_netlogon_state_done(struct tevent_req *subreq);
-/*
-  queue a cldap netlogon for send
-*/
-struct tevent_req *cldap_netlogon_send(TALLOC_CTX *mem_ctx,
-				       struct tevent_context *ev,
-				       struct cldap_socket *cldap,
-				       const struct cldap_netlogon *io)
+char *cldap_netlogon_create_filter(TALLOC_CTX *mem_ctx,
+				   const struct cldap_netlogon *io)
 {
-	struct tevent_req *req, *subreq;
-	struct cldap_netlogon_state *state;
 	char *filter;
-	static const char * const attr[] = { "NetLogon", NULL };
 
-	req = tevent_req_create(mem_ctx, &state,
-				struct cldap_netlogon_state);
-	if (!req) {
+	filter = talloc_asprintf(mem_ctx, "(&(NtVer=%s)",
+				 ldap_encode_ndr_uint32(mem_ctx, io->in.version));
+	if (filter == NULL)
 		return NULL;
-	}
 
-	filter = talloc_asprintf(state, "(&(NtVer=%s)", 
-				 ldap_encode_ndr_uint32(state, io->in.version));
-	if (tevent_req_nomem(filter, req)) {
-		goto post;
-	}
 	if (io->in.user) {
 		filter = talloc_asprintf_append_buffer(filter, "(User=%s)", io->in.user);
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	if (io->in.host) {
 		filter = talloc_asprintf_append_buffer(filter, "(Host=%s)", io->in.host);
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	if (io->in.realm) {
 		filter = talloc_asprintf_append_buffer(filter, "(DnsDomain=%s)", io->in.realm);
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	if (io->in.acct_control != -1) {
 		filter = talloc_asprintf_append_buffer(filter, "(AAC=%s)", 
-						ldap_encode_ndr_uint32(state, io->in.acct_control));
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+						ldap_encode_ndr_uint32(mem_ctx, io->in.acct_control));
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	if (io->in.domain_sid) {
-		struct dom_sid *sid = dom_sid_parse_talloc(state, io->in.domain_sid);
-		if (tevent_req_nomem(sid, req)) {
-			goto post;
+		struct dom_sid *sid = dom_sid_parse_talloc(mem_ctx, io->in.domain_sid);
+		if (filter == NULL) {
+			return NULL;
 		}
 		filter = talloc_asprintf_append_buffer(filter, "(domainSid=%s)",
-						ldap_encode_ndr_dom_sid(state, sid));
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+						ldap_encode_ndr_dom_sid(mem_ctx, sid));
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	if (io->in.domain_guid) {
 		struct GUID guid;
 		NTSTATUS status;
 		status = GUID_from_string(io->in.domain_guid, &guid);
-		if (tevent_req_nterror(req, status)) {
-			goto post;
+		if (filter == NULL) {
+			return NULL;
 		}
 		filter = talloc_asprintf_append_buffer(filter, "(DomainGuid=%s)",
-						ldap_encode_ndr_GUID(state, &guid));
-		if (tevent_req_nomem(filter, req)) {
-			goto post;
+						ldap_encode_ndr_GUID(mem_ctx, &guid));
+		if (filter == NULL) {
+			return NULL;
 		}
 	}
 	filter = talloc_asprintf_append_buffer(filter, ")");
+
+	return filter;
+}
+
+static void cldap_netlogon_state_done(struct tevent_req *subreq);
+/*
+  queue a cldap netlogon for send
+*/
+struct tevent_req *cldap_netlogon_send(TALLOC_CTX *mem_ctx,
+				       struct tevent_context *ev,
+				       struct cldap_socket *cldap,
+				       const struct cldap_netlogon *io)
+{
+	struct tevent_req *req, *subreq;
+	struct cldap_netlogon_state *state;
+	char *filter;
+	static const char * const attr[] = { "NetLogon", NULL };
+
+	req = tevent_req_create(mem_ctx, &state,
+				struct cldap_netlogon_state);
+	if (!req) {
+		return NULL;
+	}
+
+	filter = cldap_netlogon_create_filter(state, io);
 	if (tevent_req_nomem(filter, req)) {
 		goto post;
 	}
diff --git a/libcli/cldap/cldap.h b/libcli/cldap/cldap.h
index 0bc9454..cd76fee 100644
--- a/libcli/cldap/cldap.h
+++ b/libcli/cldap/cldap.h
@@ -123,6 +123,8 @@ NTSTATUS cldap_netlogon_recv(struct tevent_req *req,
 NTSTATUS cldap_netlogon(struct cldap_socket *cldap,
 			TALLOC_CTX *mem_ctx,
 			struct cldap_netlogon *io);
+char *cldap_netlogon_create_filter(TALLOC_CTX *mem_ctx,
+				   const struct cldap_netlogon *io);
 
 NTSTATUS cldap_netlogon_reply(struct cldap_socket *cldap,
 			      uint32_t message_id,
diff --git a/python/samba/provision/__init__.py b/python/samba/provision/__init__.py
index 4920735..151444d 100644
--- a/python/samba/provision/__init__.py
+++ b/python/samba/provision/__init__.py
@@ -599,7 +599,7 @@ def guess_names(lp=None, hostname=None, domain=None, dnsdomain=None,
         raise ProvisioningError("guess_names: 'realm =' was not specified in supplied %s.  Please remove the smb.conf file and let provision generate it" % lp.configfile)
 
     if lp.get("realm").upper() != realm:
-        raise ProvisioningError("guess_names: 'realm=%s' in %s must match chosen realm '%s'!  Please remove the smb.conf file and let provision generate it" % (lp.get("realm").upper(), realm, lp.configfile))
+        raise ProvisioningError("guess_names: 'realm=%s' in %s must match chosen realm '%s'!  Please remove the smb.conf file and let provision generate it" % (lp.get("realm").upper(), lp.configfile, realm))
 
     if lp.get("server role").lower() != serverrole:
         raise ProvisioningError("guess_names: 'server role=%s' in %s must match chosen server role '%s'!  Please remove the smb.conf file and let provision generate it" % (lp.get("server role"), lp.configfile, serverrole))
diff --git a/source4/cldap_server/cldap_server.c b/source4/cldap_server/cldap_server.c
index a6248d4..774142e 100644
--- a/source4/cldap_server/cldap_server.c
+++ b/source4/cldap_server/cldap_server.c
@@ -80,18 +80,6 @@ static void cldapd_request_handler(struct cldap_socket *cldap,
 		return;
 	}
 
-	if (search->num_attributes == 1 &&
-	    strcasecmp(search->attributes[0], "netlogon") == 0) {
-		cldapd_netlogon_request(cldap,
-					cldapd,
-					in,
-					in->ldap_msg->messageid,
-					search->tree,
-					in->src);
-		talloc_free(in);
-		return;
-	}
-
 	cldapd_rootdse_request(cldap, cldapd, in,
 			       in->ldap_msg->messageid,
 			       search, in->src);
diff --git a/source4/cldap_server/cldap_server.h b/source4/cldap_server/cldap_server.h
index fe7788f..0725284 100644
--- a/source4/cldap_server/cldap_server.h
+++ b/source4/cldap_server/cldap_server.h
@@ -32,19 +32,4 @@ struct cldapd_server {
 
 struct ldap_SearchRequest;
 
-/* used by netlogon DCE/RPC server */
-NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
-                                         TALLOC_CTX *mem_ctx,
-                                         const char *domain,
-                                         const char *netbios_domain,
-                                         struct dom_sid *domain_sid,
-                                         const char *domain_guid,
-                                         const char *user,
-                                         uint32_t acct_control,
-                                         const char *src_address,
-                                         uint32_t version,
-                                         struct loadparm_context *lp_ctx,
-                                         struct netlogon_samlogon_response *netlogon,
-					 bool fill_on_blank_request);
-
 #include "cldap_server/proto.h"
diff --git a/source4/cldap_server/rootdse.c b/source4/cldap_server/rootdse.c
index b895616..3f389ce 100644
--- a/source4/cldap_server/rootdse.c
+++ b/source4/cldap_server/rootdse.c
@@ -158,6 +158,11 @@ void cldapd_rootdse_request(struct cldap_socket *cldap,
 	reply.response		= NULL;
 	reply.result		= &result;
 
+	/* Note: The remoteAddress should rather be set on a ldb request.
+	 * We can set this savely on the context here,
+	 * since cldapd_rootdse_fill operates synchronously. */
+	ldb_set_opaque(cldapd->samctx, "remoteAddress", src);
+
 	cldapd_rootdse_fill(cldapd, tmp_ctx, search, &reply.response,
 			    reply.result);
 
diff --git a/source4/cldap_server/wscript_build b/source4/cldap_server/wscript_build
index 6ffdb4a..928b91b 100644
--- a/source4/cldap_server/wscript_build
+++ b/source4/cldap_server/wscript_build
@@ -10,7 +10,7 @@ bld.SAMBA_MODULE('service_cldap',
 
 
 bld.SAMBA_SUBSYSTEM('CLDAPD',
-	source='netlogon.c rootdse.c',
+	source='rootdse.c',
 	autoproto='proto.h',
 	deps='cli_cldap ldbsamba'
 	)
diff --git a/source4/cldap_server/netlogon.c b/source4/dsdb/samdb/ldb_modules/netlogon.c
similarity index 87%
rename from source4/cldap_server/netlogon.c
rename to source4/dsdb/samdb/ldb_modules/netlogon.c
index 6d5efb5..a381da8 100644
--- a/source4/cldap_server/netlogon.c
+++ b/source4/dsdb/samdb/ldb_modules/netlogon.c
@@ -25,11 +25,11 @@
 #include <ldb_errors.h>
 #include "lib/events/events.h"
 #include "smbd/service_task.h"
-#include "cldap_server/cldap_server.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "libcli/ldap/ldap_ndr.h"
 #include "libcli/security/security.h"
 #include "dsdb/samdb/samdb.h"
+#include "dsdb/samdb/ldb_modules/util.h"
 #include "auth/auth.h"
 #include "ldb_wrap.h"
 #include "system/network.h"
@@ -369,27 +369,26 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
 	return NT_STATUS_OK;
 }
 
-
-/*
-  handle incoming cldap requests
-*/
-void cldapd_netlogon_request(struct cldap_socket *cldap,
-			     struct cldapd_server *cldapd,
-			     TALLOC_CTX *tmp_ctx,
-			     uint32_t message_id,
-			     struct ldb_parse_tree *tree,
-			     struct tsocket_address *src)
+NTSTATUS parse_netlogon_request(struct ldb_parse_tree *tree,
+				struct loadparm_context *lp_ctx,
+				TALLOC_CTX *tmp_ctx,
+				const char **domain,
+				const char **host,
+				const char **user,
+				const char **domain_guid,
+				struct dom_sid **domain_sid,
+				int *acct_control,
+				int *version)
 {
 	unsigned int i;
-	const char *domain = NULL;
-	const char *host = NULL;
-	const char *user = NULL;
-	const char *domain_guid = NULL;
-	struct dom_sid *domain_sid = NULL;
-	int acct_control = -1;
-	int version = -1;
-	struct netlogon_samlogon_response netlogon;
-	NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
+
+	*domain = NULL;
+	*host = NULL;
+	*user = NULL;
+	*domain_guid = NULL;
+	*domain_sid = NULL;
+	*acct_control = -1;
+	*version = -1;
 
 	if (tree->operation != LDB_OP_AND) goto failed;
 
@@ -398,12 +397,12 @@ void cldapd_netlogon_request(struct cldap_socket *cldap,
 		struct ldb_parse_tree *t = tree->u.list.elements[i];
 		if (t->operation != LDB_OP_EQUALITY) goto failed;
 		if (strcasecmp(t->u.equality.attr, "DnsDomain") == 0) {
-			domain = talloc_strndup(tmp_ctx, 
+			*domain = talloc_strndup(tmp_ctx,
 						(const char *)t->u.equality.value.data,
 						t->u.equality.value.length);
 		}
 		if (strcasecmp(t->u.equality.attr, "Host") == 0) {
-			host = talloc_strndup(tmp_ctx, 
+			*host = talloc_strndup(tmp_ctx,
 					      (const char *)t->u.equality.value.data,
 					      t->u.equality.value.length);
 		}
@@ -413,70 +412,49 @@ void cldapd_netlogon_request(struct cldap_socket *cldap,
 			enc_status = ldap_decode_ndr_GUID(tmp_ctx, 
 							  t->u.equality.value, &guid);
 			if (NT_STATUS_IS_OK(enc_status)) {
-				domain_guid = GUID_string(tmp_ctx, &guid);
+				*domain_guid = GUID_string(tmp_ctx, &guid);
 			}
 		}
 		if (strcasecmp(t->u.equality.attr, "DomainSid") == 0) {
 			enum ndr_err_code ndr_err;
 
-			domain_sid = talloc(tmp_ctx, struct dom_sid);
-			if (domain_sid == NULL) {
+			*domain_sid = talloc(tmp_ctx, struct dom_sid);
+			if (*domain_sid == NULL) {
 				goto failed;
 			}
 			ndr_err = ndr_pull_struct_blob(&t->u.equality.value,
-						       domain_sid, domain_sid,
+						       *domain_sid, *domain_sid,
 						       (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
 			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-				talloc_free(domain_sid);
+				talloc_free(*domain_sid);
 				goto failed;
 			}
 		}
 		if (strcasecmp(t->u.equality.attr, "User") == 0) {
-			user = talloc_strndup(tmp_ctx, 
-					      (const char *)t->u.equality.value.data,
-					      t->u.equality.value.length);
+			*user = talloc_strndup(tmp_ctx,
+					       (const char *)t->u.equality.value.data,
+					       t->u.equality.value.length);
 		}
 		if (strcasecmp(t->u.equality.attr, "NtVer") == 0 &&
 		    t->u.equality.value.length == 4) {
-			version = IVAL(t->u.equality.value.data, 0);
+			*version = IVAL(t->u.equality.value.data, 0);
 		}
 		if (strcasecmp(t->u.equality.attr, "AAC") == 0 &&
 		    t->u.equality.value.length == 4) {
-			acct_control = IVAL(t->u.equality.value.data, 0);
+			*acct_control = IVAL(t->u.equality.value.data, 0);
 		}
 	}
 
-	if ((domain == NULL) && (domain_guid == NULL) && (domain_sid == NULL)) {
-		domain = lpcfg_dnsdomain(cldapd->task->lp_ctx);
+	if ((*domain == NULL) && (*domain_guid == NULL) && (*domain_sid == NULL)) {
+		*domain = lpcfg_dnsdomain(lp_ctx);
 	}
 
-	if (version == -1) {
+	if (*version == -1) {
 		goto failed;
 	}
 
-	DEBUG(5,("cldap netlogon query domain=%s host=%s user=%s version=%d guid=%s\n",
-		 domain, host, user, version, domain_guid));
-
-	status = fill_netlogon_samlogon_response(cldapd->samctx, tmp_ctx,
-						 domain, NULL, domain_sid,
-						 domain_guid,
-						 user, acct_control,
-						 tsocket_address_inet_addr_string(src, tmp_ctx),
-						 version, cldapd->task->lp_ctx,
-						 &netlogon, false);
-	if (!NT_STATUS_IS_OK(status)) {
-		goto failed;
-	}
-
-	status = cldap_netlogon_reply(cldap, message_id, src, version, &netlogon);
-	if (!NT_STATUS_IS_OK(status)) {
-		goto failed;
-	}
+	return NT_STATUS_OK;
 
-	return;
-	
 failed:
-	DEBUG(2,("cldap netlogon query failed domain=%s host=%s version=%d - %s\n",
-		 domain, host, version, nt_errstr(status)));
-	cldap_empty_reply(cldap, message_id, src);
+	return NT_STATUS_UNSUCCESSFUL;
 }
diff --git a/source4/dsdb/samdb/ldb_modules/rootdse.c b/source4/dsdb/samdb/ldb_modules/rootdse.c
index 167201e..f905aa2 100644
--- a/source4/dsdb/samdb/ldb_modules/rootdse.c
+++ b/source4/dsdb/samdb/ldb_modules/rootdse.c
@@ -34,6 +34,8 @@
 #include "param/param.h"
 #include "lib/messaging/irpc.h"
 #include "librpc/gen_ndr/ndr_irpc_c.h"
+#include "lib/tsocket/tsocket.h"
+#include "cldap_server/cldap_server.h"
 
 struct private_data {
 	unsigned int num_controls;
@@ -43,6 +45,12 @@ struct private_data {
 	bool block_anonymous;
 };
 
+struct rootdse_context {
+	struct ldb_module *module;
+	struct ldb_request *req;
+	struct ldb_val netlogon;
+};
+
 /*
   return 1 if a specific attribute has been requested
 */
@@ -216,11 +224,11 @@ static int dsdb_module_we_are_master(struct ldb_module *module, struct ldb_dn *d
 /*
   add dynamically generated attributes to rootDSE result
 */
-static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *msg,
-			       const char * const *attrs, struct ldb_request *req)
+static int rootdse_add_dynamic(struct rootdse_context *ac, struct ldb_message *msg)
 {
 	struct ldb_context *ldb;
-	struct private_data *priv = talloc_get_type(ldb_module_get_private(module), struct private_data);
+	struct private_data *priv = talloc_get_type(ldb_module_get_private(ac->module), struct private_data);
+	const char * const *attrs = ac->req->op.search.attrs;
 	char **server_sasl;
 	const struct dsdb_schema *schema;
 	int *val;
@@ -241,7 +249,7 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 	};
 	unsigned int i;
 
-	ldb = ldb_module_get_ctx(module);
+	ldb = ldb_module_get_ctx(ac->module);
 	schema = dsdb_get_schema(ldb, NULL);
 
 	msg->dn = ldb_dn_new(msg, ldb, NULL);
@@ -262,11 +270,11 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 		struct ldb_result *res;
 		int ret;
 		const char *dns_attrs[] = { "dNSHostName", NULL };
-		ret = dsdb_module_search_dn(module, msg, &res, samdb_server_dn(ldb, msg),
+		ret = dsdb_module_search_dn(ac->module, msg, &res, samdb_server_dn(ldb, msg),
 					    dns_attrs,
 					    DSDB_FLAG_NEXT_MODULE |
 					    DSDB_FLAG_AS_SYSTEM,
-					    req);
+					    ac->req);
 		if (ret == LDB_SUCCESS) {
 			const char *hostname = ldb_msg_find_attr_as_string(res->msgs[0], "dNSHostName", NULL);
 			if (hostname != NULL) {
@@ -402,7 +410,7 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 
 		for (i=0; i<3; i++) {
 			bool master;
-			int ret = dsdb_module_we_are_master(module, dns[i], &master, req);
+			int ret = dsdb_module_we_are_master(ac->module, dns[i], &master, ac->req);
 			if (ret != LDB_SUCCESS) {
 				goto failed;
 			}
@@ -472,9 +480,15 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 		}
 	}
 
+	if (ac->netlogon.length > 0) {
+		if (ldb_msg_add_steal_value(msg, "netlogon", &ac->netlogon) != LDB_SUCCESS) {
+			goto failed;
+		}
+	}
+
 	/* TODO: lots more dynamic attributes should be added here */
 
-	edn_control = ldb_request_get_control(req, LDB_CONTROL_EXTENDED_DN_OID);
+	edn_control = ldb_request_get_control(ac->req, LDB_CONTROL_EXTENDED_DN_OID);
 
 	/* convert any GUID attributes to be in the right form */
 	for (i=0; guid_attrs[i]; i++) {
@@ -486,17 +500,17 @@ static int rootdse_add_dynamic(struct ldb_module *module, struct ldb_message *ms
 
 		if (!do_attribute(attrs, guid_attrs[i])) continue;
 
-		attr_dn = ldb_msg_find_attr_as_dn(ldb, req, msg, guid_attrs[i]);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list