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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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