[SCM] Samba Shared Repository - branch master updated
Matthias Dieter Wallnöfer
mdw at samba.org
Tue Apr 13 07:30:00 MDT 2010
The branch, master has been updated
via 1e08449... s4:fill_netlogon_samlogon_reponse - fix a typo
via 7d5a8c3... s4:torture/netlogon - enhance test for "dcesrv_netr_DsRGetDCNameEx2"
via aa02f44... s4:dcesrv_netr_DsRGetDCNameEx2 - provide a much better implementation
via 4d7d6ee... s4:fill_netlogon_samlogon_response - some rework of the detection code
from 3909088... s4: prevent the autoconf build from removing source4/librpc/gen_ndr/README
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 1e08449136e87f70d581714284f86f88d54c20fd
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Tue Apr 13 15:29:12 2010 +0200
s4:fill_netlogon_samlogon_reponse - fix a typo
commit 7d5a8c3506b3bb4005820ce2ab6687bbf9c2dd40
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Tue Apr 13 09:53:28 2010 +0200
s4:torture/netlogon - enhance test for "dcesrv_netr_DsRGetDCNameEx2"
Test for right domainname handling.
commit aa02f4425579d5fb45da3216462273c973fcaa64
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date: Mon Apr 12 18:00:49 2010 +0200
s4:dcesrv_netr_DsRGetDCNameEx2 - provide a much better implementation
On the base of the "fill_netlogon_samlogon_response" call.
This removes duplicated code.
commit 4d7d6ee8202f75b44c25a747e83ddda5466aa509
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Tue Apr 13 15:18:02 2010 +0200
s4:fill_netlogon_samlogon_response - some rework of the detection code
To make it compatible by the use of the "dcesrv_netr_DsRGetDCName*" calls.
Some result checks were redundant so I removed them. In other cases I added
debug outputs. Sometimes the debug messages were misleading.
-----------------------------------------------------------------------
Summary of changes:
source4/cldap_server/cldap_server.h | 14 ++++
source4/cldap_server/netlogon.c | 44 ++++++++-----
source4/rpc_server/netlogon/dcerpc_netlogon.c | 89 ++++++++++--------------
source4/torture/rpc/netlogon.c | 20 ++++++
4 files changed, 98 insertions(+), 69 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/cldap_server/cldap_server.h b/source4/cldap_server/cldap_server.h
index da2bd20..2eaf594 100644
--- a/source4/cldap_server/cldap_server.h
+++ b/source4/cldap_server/cldap_server.h
@@ -31,4 +31,18 @@ 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);
+
#include "cldap_server/proto.h"
diff --git a/source4/cldap_server/netlogon.c b/source4/cldap_server/netlogon.c
index 86f044a..fc9cafd 100644
--- a/source4/cldap_server/netlogon.c
+++ b/source4/cldap_server/netlogon.c
@@ -73,36 +73,42 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
bool user_known;
NTSTATUS status;
- /* the domain has an optional trailing . */
+ /* the domain parameter could have an optional trailing "." */
if (domain && domain[strlen(domain)-1] == '.') {
domain = talloc_strndup(mem_ctx, domain, strlen(domain)-1);
NT_STATUS_HAVE_NO_MEMORY(domain);
}
- if (domain && strcasecmp_m(domain, lp_dnsdomain(lp_ctx)) == 0) {
+ /* Lookup using long or short domainname */
+ if (domain && (strcasecmp_m(domain, lp_dnsdomain(lp_ctx)) == 0)) {
domain_dn = ldb_get_default_basedn(sam_ctx);
}
-
- if (netbios_domain && strcasecmp_m(domain, lp_sam_name(lp_ctx))) {
+ if (netbios_domain && (strcasecmp_m(netbios_domain, lp_sam_name(lp_ctx)) == 0)) {
domain_dn = ldb_get_default_basedn(sam_ctx);
}
-
if (domain_dn) {
+ const char *domain_identifier = domain != NULL ? domain
+ : netbios_domain;
ret = ldb_search(sam_ctx, mem_ctx, &dom_res,
domain_dn, LDB_SCOPE_BASE, dom_attrs,
"objectClass=domain");
if (ret != LDB_SUCCESS) {
- DEBUG(2,("Error finding domain '%s'/'%s' in sam: %s\n", domain, ldb_dn_get_linearized(domain_dn), ldb_errstring(sam_ctx)));
+ DEBUG(2,("Error finding domain '%s'/'%s' in sam: %s\n",
+ domain_identifier,
+ ldb_dn_get_linearized(domain_dn),
+ ldb_errstring(sam_ctx)));
return NT_STATUS_NO_SUCH_DOMAIN;
}
if (dom_res->count != 1) {
- DEBUG(2,("Error finding domain '%s'/'%s' in sam\n", domain, ldb_dn_get_linearized(domain_dn)));
+ DEBUG(2,("Error finding domain '%s'/'%s' in sam\n",
+ domain_identifier,
+ ldb_dn_get_linearized(domain_dn)));
return NT_STATUS_NO_SUCH_DOMAIN;
}
}
- if ((dom_res == NULL || dom_res->count == 0) && (domain_guid || domain_sid)) {
-
+ /* Lookup using GUID or SID */
+ if ((dom_res == NULL) && (domain_guid || domain_sid)) {
if (domain_guid) {
struct GUID binary_guid;
struct ldb_val guid_val;
@@ -144,24 +150,28 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
}
if (ret != LDB_SUCCESS) {
- DEBUG(2,("Unable to find referece to GUID '%s' or SID %s in sam: %s\n",
+ DEBUG(2,("Unable to find a correct reference to GUID '%s' or SID '%s' in sam: %s\n",
domain_guid, dom_sid_string(mem_ctx, domain_sid),
ldb_errstring(sam_ctx)));
return NT_STATUS_NO_SUCH_DOMAIN;
} else if (dom_res->count == 1) {
/* Ok, now just check it is our domain */
-
- if (ldb_dn_compare(ldb_get_default_basedn(sam_ctx), dom_res->msgs[0]->dn) != 0) {
+ if (ldb_dn_compare(ldb_get_default_basedn(sam_ctx),
+ dom_res->msgs[0]->dn) != 0) {
+ DEBUG(2,("The GUID '%s' or SID '%s' doesn't identify our domain\n",
+ domain_guid,
+ dom_sid_string(mem_ctx, domain_sid)));
return NT_STATUS_NO_SUCH_DOMAIN;
}
- } else if (dom_res->count > 1) {
+ } else {
+ DEBUG(2,("Unable to find a correct reference to GUID '%s' or SID '%s' in sam\n",
+ domain_guid, dom_sid_string(mem_ctx, domain_sid)));
return NT_STATUS_NO_SUCH_DOMAIN;
}
}
-
- if ((dom_res == NULL || dom_res->count == 0)) {
- DEBUG(2,("Unable to find domain with name %s or GUID {%s}\n", domain, domain_guid));
+ if (dom_res == NULL) {
+ DEBUG(2,("Unable to get domain informations if no parameter of the list [long domainname, short domainname, GUID, SID] was specified!\n"));
return NT_STATUS_NO_SUCH_DOMAIN;
}
@@ -190,7 +200,7 @@ NTSTATUS fill_netlogon_samlogon_response(struct ldb_context *sam_ctx,
ldb_binary_encode_string(mem_ctx, user),
UF_ACCOUNTDISABLE, ds_acb2uf(acct_control));
if (ret != LDB_SUCCESS) {
- DEBUG(2,("Unable to find referece to user '%s' with ACB 0x%8x under %s: %s\n",
+ DEBUG(2,("Unable to find reference to user '%s' with ACB 0x%8x under %s: %s\n",
user, acct_control, ldb_dn_get_linearized(dom_res->msgs[0]->dn),
ldb_errstring(sam_ctx)));
return NT_STATUS_NO_SUCH_USER;
diff --git a/source4/rpc_server/netlogon/dcerpc_netlogon.c b/source4/rpc_server/netlogon/dcerpc_netlogon.c
index 698930e..5f85353 100644
--- a/source4/rpc_server/netlogon/dcerpc_netlogon.c
+++ b/source4/rpc_server/netlogon/dcerpc_netlogon.c
@@ -32,6 +32,8 @@
#include "param/param.h"
#include "lib/messaging/irpc.h"
#include "librpc/gen_ndr/ndr_irpc.h"
+#include "cldap_server/cldap_server.h"
+#include "lib/socket/socket.h"
struct netlogon_server_pipe_state {
struct netr_Credential client_challenge;
@@ -1470,13 +1472,13 @@ static WERROR dcesrv_netr_DsRGetDCNameEx2(struct dcesrv_call_state *dce_call,
TALLOC_CTX *mem_ctx,
struct netr_DsRGetDCNameEx2 *r)
{
- const char * const attrs[] = { "objectGUID", NULL };
struct ldb_context *sam_ctx;
- struct ldb_message **res;
- struct ldb_dn *domain_dn;
- int ret;
struct netr_DsRGetDCNameInfo *info;
struct loadparm_context *lp_ctx = dce_call->conn->dce_ctx->lp_ctx;
+ struct socket_address *addr;
+ char *guid_str;
+ struct netlogon_samlogon_response response;
+ NTSTATUS status;
ZERO_STRUCTP(r->out.info);
@@ -1486,63 +1488,46 @@ static WERROR dcesrv_netr_DsRGetDCNameEx2(struct dcesrv_call_state *dce_call,
return WERR_DS_UNAVAILABLE;
}
- /* Windows 7 sends the domain name in the form the user typed, so we
- * have to cope with both the short and long form here */
- if (r->in.domain_name != NULL &&
- !lp_is_my_domain_or_realm(lp_ctx, r->in.domain_name)) {
+ addr = dce_call->conn->transport.get_peer_addr(dce_call->conn, mem_ctx);
+ W_ERROR_HAVE_NO_MEMORY(addr);
+
+ /* "server_unc" is ignored by w2k3 */
+
+ /* Proof server site parameter "site_name" if it was specified */
+ if ((r->in.site_name != NULL) && (strcasecmp(r->in.site_name,
+ samdb_server_site_name(sam_ctx, mem_ctx)) != 0)) {
return WERR_NO_SUCH_DOMAIN;
}
- domain_dn = ldb_get_default_basedn(sam_ctx);
- if (domain_dn == NULL) {
- return WERR_DS_UNAVAILABLE;
- }
+ /* TODO: the flags are ignored for now */
- ret = gendb_search_dn(sam_ctx, mem_ctx,
- domain_dn, &res, attrs);
- if (ret != 1) {
- return WERR_GENERAL_FAILURE;
+ guid_str = r->in.domain_guid != NULL ?
+ GUID_string(mem_ctx, r->in.domain_guid) : NULL;
+
+ status = fill_netlogon_samlogon_response(sam_ctx, mem_ctx,
+ r->in.domain_name,
+ r->in.domain_name,
+ NULL, guid_str,
+ r->in.client_account,
+ r->in.mask, addr->addr,
+ NETLOGON_NT_VERSION_5EX_WITH_IP,
+ lp_ctx, &response);
+ if (!NT_STATUS_IS_OK(status)) {
+ return ntstatus_to_werror(status);
}
info = talloc(mem_ctx, struct netr_DsRGetDCNameInfo);
W_ERROR_HAVE_NO_MEMORY(info);
-
- /* TODO: - return real IP address
- * - check all r->in.* parameters
- * (server_unc is ignored by w2k3!)
- */
- info->dc_unc = talloc_asprintf(mem_ctx, "\\\\%s.%s",
- lp_netbios_name(lp_ctx),
- lp_dnsdomain(lp_ctx));
- W_ERROR_HAVE_NO_MEMORY(info->dc_unc);
-
- info->dc_address = talloc_strdup(mem_ctx, "\\\\0.0.0.0");
+ info->dc_unc = response.data.nt5_ex.pdc_dns_name;
+ info->dc_address = talloc_asprintf(mem_ctx, "\\\\%s",
+ response.data.nt5_ex.sockaddr.pdc_ip);
W_ERROR_HAVE_NO_MEMORY(info->dc_address);
-
- info->dc_address_type = DS_ADDRESS_TYPE_INET;
- info->domain_guid = samdb_result_guid(res[0], "objectGUID");
- info->domain_name = lp_dnsdomain(lp_ctx);
- info->forest_name = samdb_forest_name(sam_ctx, mem_ctx);
- W_ERROR_HAVE_NO_MEMORY(info->forest_name);
- info->dc_flags = DS_DNS_FOREST_ROOT |
- DS_DNS_DOMAIN |
- DS_DNS_CONTROLLER |
- DS_SERVER_WRITABLE |
- DS_SERVER_CLOSEST |
- DS_SERVER_TIMESERV |
- DS_SERVER_KDC |
- DS_SERVER_DS |
- DS_SERVER_LDAP |
- DS_SERVER_GC |
- DS_SERVER_PDC;
-
- info->dc_site_name = samdb_server_site_name(sam_ctx, mem_ctx);
- W_ERROR_HAVE_NO_MEMORY(info->dc_site_name);
-
- /* FIXME: Hardcoded site name */
- info->client_site_name = talloc_strdup(mem_ctx,
- "Default-First-Site-Name");
- W_ERROR_HAVE_NO_MEMORY(info->client_site_name);
+ info->domain_guid = response.data.nt5_ex.domain_uuid;
+ info->domain_name = response.data.nt5_ex.dns_domain;
+ info->forest_name = response.data.nt5_ex.forest;
+ info->dc_flags = response.data.nt5_ex.server_type;
+ info->dc_site_name = response.data.nt5_ex.server_site;
+ info->client_site_name = response.data.nt5_ex.client_site;
*r->out.info = info;
diff --git a/source4/torture/rpc/netlogon.c b/source4/torture/rpc/netlogon.c
index c469de9..5b3bcff 100644
--- a/source4/torture/rpc/netlogon.c
+++ b/source4/torture/rpc/netlogon.c
@@ -2193,6 +2193,13 @@ static bool test_netr_DsRGetDCName(struct torture_context *tctx,
status = dcerpc_netr_DsRGetDCName_r(b, tctx, &r);
torture_assert_ntstatus_ok(tctx, status, "DsRGetDCName");
torture_assert_werr_ok(tctx, r.out.result, "DsRGetDCName");
+
+ r.in.domain_name = lp_workgroup(tctx->lp_ctx);
+
+ status = dcerpc_netr_DsRGetDCName_r(b, tctx, &r);
+ torture_assert_ntstatus_ok(tctx, status, "DsRGetDCName");
+ torture_assert_werr_ok(tctx, r.out.result, "DsRGetDCName");
+
return test_netr_DsRGetSiteName(p, tctx,
info->dc_unc,
info->dc_site_name);
@@ -2220,6 +2227,12 @@ static bool test_netr_DsRGetDCNameEx(struct torture_context *tctx,
torture_assert_ntstatus_ok(tctx, status, "netr_DsRGetDCNameEx");
torture_assert_werr_ok(tctx, r.out.result, "netr_DsRGetDCNameEx");
+ r.in.domain_name = lp_workgroup(tctx->lp_ctx);
+
+ status = dcerpc_netr_DsRGetDCNameEx_r(b, tctx, &r);
+ torture_assert_ntstatus_ok(tctx, status, "netr_DsRGetDCNameEx");
+ torture_assert_werr_ok(tctx, r.out.result, "netr_DsRGetDCNameEx");
+
return test_netr_DsRGetSiteName(p, tctx, info->dc_unc,
info->dc_site_name);
}
@@ -2250,6 +2263,12 @@ static bool test_netr_DsRGetDCNameEx2(struct torture_context *tctx,
torture_assert_ntstatus_ok(tctx, status, "netr_DsRGetDCNameEx2");
torture_assert_werr_ok(tctx, r.out.result, "netr_DsRGetDCNameEx2");
+ r.in.domain_name = lp_workgroup(tctx->lp_ctx);
+
+ status = dcerpc_netr_DsRGetDCNameEx2_r(b, tctx, &r);
+ torture_assert_ntstatus_ok(tctx, status, "netr_DsRGetDCNameEx2");
+ torture_assert_werr_ok(tctx, r.out.result, "netr_DsRGetDCNameEx2");
+
torture_comment(tctx, "Testing netr_DsRGetDCNameEx2 with client acount\n");
r.in.client_account = TEST_MACHINE_NAME"$";
r.in.mask = ACB_SVRTRUST;
@@ -2259,6 +2278,7 @@ static bool test_netr_DsRGetDCNameEx2(struct torture_context *tctx,
status = dcerpc_netr_DsRGetDCNameEx2_r(b, tctx, &r);
torture_assert_ntstatus_ok(tctx, status, "netr_DsRGetDCNameEx2");
torture_assert_werr_ok(tctx, r.out.result, "netr_DsRGetDCNameEx2");
+
return test_netr_DsRGetSiteName(p, tctx, info->dc_unc,
info->dc_site_name);
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list