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

Reply via email to