[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-2207-gd8b2ff3

Günther Deschner gd at samba.org
Thu Apr 24 20:02:52 GMT 2008


The branch, v3-2-test has been updated
       via  d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3 (commit)
       via  2b178dcae608ecc05f62593a7a0c2a127b8b7ca2 (commit)
       via  c6ce07fdf57c8b63ba6d72b622be261723cb55e3 (commit)
       via  ce3728191b23badfd5eb92701e4cebf84273b61e (commit)
       via  c15b5d73badafdc93066197aefaaaa72e37a8b99 (commit)
      from  a132cc3c6243c049860378f56c4d415d6cb35570 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit d8b2ff3c8769e8da9c21dec483e6edb7aa2d00f3
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 24 21:53:55 2008 +0200

    mailslot/dsgetdcname: do what XP does and request nt_version 11.
    
    This allows dsgetdcname to query for a flat, non-dns domain name and
    come back with all information about the DC (site names, guid, forest,
    etc.) based on a mailslot reply. The version 11 request is downgraded
    to version 1 in case we do a query against NT4.
    
    Guenther

commit 2b178dcae608ecc05f62593a7a0c2a127b8b7ca2
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 24 21:37:42 2008 +0200

    mailslot: allow to give back struct nbt_ntlogon_packet.
    
    Guenther

commit c6ce07fdf57c8b63ba6d72b622be261723cb55e3
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 24 21:29:48 2008 +0200

    mailslot: make sure we are looking at the correct reply structure.
    
    Guenther

commit ce3728191b23badfd5eb92701e4cebf84273b61e
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 24 21:28:03 2008 +0200

    mailslot: allow to define nt_version in send_getdc_request().
    
    Guenther

commit c15b5d73badafdc93066197aefaaaa72e37a8b99
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 23 10:55:26 2008 +0200

    rpcclient: Add tiny fix for cmd_samr_get_dispinfo_idx().
    
    Guenther

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

Summary of changes:
 source/libsmb/clidgram.c      |   41 +++++++++++++++++++++++++++++++++------
 source/libsmb/dsgetdcname.c   |   42 +++++++++++++++++++++++++++++++++++-----
 source/rpcclient/cmd_samr.c   |    5 ++-
 source/winbindd/winbindd_cm.c |    5 ++-
 4 files changed, 76 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/libsmb/clidgram.c b/source/libsmb/clidgram.c
index 83e50e5..fba009d 100644
--- a/source/libsmb/clidgram.c
+++ b/source/libsmb/clidgram.c
@@ -130,7 +130,8 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
 			struct messaging_context *msg_ctx,
 			struct sockaddr_storage *dc_ss,
 			const char *domain_name,
-			const DOM_SID *sid)
+			const DOM_SID *sid,
+			uint32_t nt_version)
 {
 	struct in_addr dc_ip;
 	const char *my_acct_name = NULL;
@@ -172,7 +173,7 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
 	s->mailslot_name	= my_mailslot;
 	s->acct_control		= ACB_WSTRUST;
 	s->sid			= my_sid;
-	s->nt_version		= 1;
+	s->nt_version		= nt_version;
 	s->lmnt_token		= 0xffff;
 	s->lm20_token		= 0xffff;
 
@@ -196,7 +197,8 @@ bool send_getdc_request(TALLOC_CTX *mem_ctx,
 bool receive_getdc_response(TALLOC_CTX *mem_ctx,
 			    struct sockaddr_storage *dc_ss,
 			    const char *domain_name,
-			    const char **dc_name)
+			    const char **dc_name,
+			    struct nbt_ntlogon_packet **reply)
 {
 	struct packet_struct *packet;
 	const char *my_mailslot = NULL;
@@ -206,6 +208,9 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
 	union dgram_message_body p;
 	enum ndr_err_code ndr_err;
 
+	const char *returned_dc = NULL;
+	const char *returned_domain = NULL;
+
 	if (dc_ss->ss_family != AF_INET) {
 		return false;
 	}
@@ -267,13 +272,27 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
 		NDR_PRINT_DEBUG(nbt_ntlogon_packet, &r);
 	}
 
-	if (!strequal(r.req.reply.domain, domain_name)) {
+	switch (r.command) {
+		case NTLOGON_SAM_LOGON_REPLY:
+		case NTLOGON_SAM_LOGON_REPLY15:
+			returned_domain = r.req.reply.domain;
+			returned_dc = r.req.reply.server;
+			break;
+		case NTLOGON_RESPONSE_FROM_PDC2:
+			returned_domain = r.req.reply2.domain;
+			returned_dc = r.req.reply2.pdc_name;
+			break;
+		default:
+			return false;
+	}
+
+	if (!strequal(returned_domain, domain_name)) {
 		DEBUG(3, ("GetDC: Expected domain %s, got %s\n",
-			  domain_name, r.req.reply.domain));
+			  domain_name, returned_domain));
 		return false;
 	}
 
-	*dc_name = talloc_strdup(mem_ctx, r.req.reply.server);
+	*dc_name = talloc_strdup(mem_ctx, returned_dc);
 	if (!*dc_name) {
 		return false;
 	}
@@ -281,8 +300,16 @@ bool receive_getdc_response(TALLOC_CTX *mem_ctx,
 	if (**dc_name == '\\')	*dc_name += 1;
 	if (**dc_name == '\\')	*dc_name += 1;
 
+	if (reply) {
+		*reply = talloc_memdup(mem_ctx, &r,
+			sizeof(struct nbt_ntlogon_packet));
+		if (!*reply) {
+			return false;
+		}
+	}
+
 	DEBUG(10, ("GetDC gave name %s for domain %s\n",
-		   *dc_name, r.req.reply.domain));
+		   *dc_name, returned_domain));
 
 	return True;
 }
diff --git a/source/libsmb/dsgetdcname.c b/source/libsmb/dsgetdcname.c
index 5af65c5..fbc3bda 100644
--- a/source/libsmb/dsgetdcname.c
+++ b/source/libsmb/dsgetdcname.c
@@ -777,8 +777,13 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
 	uint32_t dc_address_type;
 	uint32_t dc_flags = 0;
 	const char *dc_name = NULL;
+	const char *dc_forest = NULL;
+	const char *dc_server_site = NULL;
+	const char *dc_client_site = NULL;
+	struct GUID *dc_domain_guid = NULL;
 	fstring tmp_dc_name;
 	struct messaging_context *msg_ctx = msg_context(mem_ctx);
+	struct nbt_ntlogon_packet *reply = NULL;
 
 	if (flags & DS_PDC_REQUIRED) {
 		name_type = NBT_NAME_PDC;
@@ -796,7 +801,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
 		}
 
 		if (send_getdc_request(mem_ctx, msg_ctx,
-				       &dclist[i].ss, domain_name, NULL))
+				       &dclist[i].ss, domain_name,
+				       NULL, 11))
 		{
 			int k;
 			smb_msleep(100);
@@ -804,7 +810,8 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
 				if (receive_getdc_response(mem_ctx,
 							   &dclist[i].ss,
 							   domain_name,
-							   &dc_name)) {
+							   &dc_name,
+							   &reply)) {
 					namecache_store(dc_name, NBT_NAME_SERVER, 1, &ip_list);
 					dc_hostname = dc_name;
 					dc_domain_name = talloc_strdup_upper(mem_ctx, domain_name);
@@ -832,6 +839,25 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
 
  make_reply:
 
+	if (reply && reply->command == NTLOGON_RESPONSE_FROM_PDC2) {
+
+		dc_flags |= reply->req.reply2.server_type;
+		dc_forest = reply->req.reply2.forest;
+		dc_server_site = reply->req.reply2.server_site;
+		dc_client_site = reply->req.reply2.client_site;
+
+		dc_domain_guid = &reply->req.reply2.domain_uuid;
+
+		if (flags & DS_RETURN_DNS_NAME) {
+			dc_domain_name = reply->req.reply2.dns_domain;
+			dc_hostname = reply->req.reply2.pdc_dns_name;
+			dc_flags |= DS_DNS_DOMAIN | DS_DNS_CONTROLLER;
+		} else if (flags & DS_RETURN_FLAT_NAME) {
+			dc_domain_name = reply->req.reply2.domain;
+			dc_hostname = reply->req.reply2.pdc_name;
+		}
+	}
+
 	if (flags & DS_IP_REQUIRED) {
 		char addr[INET6_ADDRSTRLEN];
 		print_sockaddr(addr, sizeof(addr), &dclist[i].ss);
@@ -846,16 +872,20 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx,
 		dc_flags |= NBT_SERVER_PDC | NBT_SERVER_WRITABLE;
 	}
 
+	if (dc_forest) {
+		dc_flags |= DS_DNS_FOREST;
+	}
+
 	return make_domain_controller_info(mem_ctx,
 					   dc_hostname,
 					   dc_address,
 					   dc_address_type,
-					   NULL,
+					   dc_domain_guid,
 					   dc_domain_name,
-					   NULL,
+					   dc_forest,
 					   dc_flags,
-					   NULL,
-					   NULL,
+					   dc_server_site,
+					   dc_client_site,
 					   info);
 }
 
diff --git a/source/rpcclient/cmd_samr.c b/source/rpcclient/cmd_samr.c
index 9220c20..cc92fef 100644
--- a/source/rpcclient/cmd_samr.c
+++ b/source/rpcclient/cmd_samr.c
@@ -2612,8 +2612,9 @@ static NTSTATUS cmd_samr_get_dispinfo_idx(struct rpc_pipe_client *cli,
 							&name,
 							&idx);
 
-	if (NT_STATUS_IS_OK(status)) {
-		printf("idx: %d\n", idx);
+	if (NT_STATUS_IS_OK(status) ||
+	    NT_STATUS_EQUAL(status, NT_STATUS_NO_MORE_ENTRIES)) {
+		printf("idx: %d (0x%08x)\n", idx, idx);
 	}
  done:
 
diff --git a/source/winbindd/winbindd_cm.c b/source/winbindd/winbindd_cm.c
index 822f946..d27f3e4 100644
--- a/source/winbindd/winbindd_cm.c
+++ b/source/winbindd/winbindd_cm.c
@@ -1093,12 +1093,13 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx,
 	/* try GETDC requests next */
 
 	if (send_getdc_request(mem_ctx, winbind_messaging_context(),
-			       pss, domain->name, &domain->sid)) {
+			       pss, domain->name, &domain->sid, 1)) {
 		const char *dc_name = NULL;
 		int i;
 		smb_msleep(100);
 		for (i=0; i<5; i++) {
-			if (receive_getdc_response(mem_ctx, pss, domain->name, &dc_name)) {
+			if (receive_getdc_response(mem_ctx, pss, domain->name,
+						   &dc_name, NULL)) {
 				fstrcpy(name, dc_name);
 				namecache_store(name, 0x20, 1, &ip_list);
 				return True;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list