[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