The branch, v3-6-test has been updated
       via  1bb222d s3-nmbd: use NETLOGON_NT_VERSION_1 in 
LOGON_PRIMARY_RESPONSE.
       via  4662162 s3-nmbd: use autogenerated marshalling for 
LOGON_SAM_LOGON_REQUEST.
       via  2a136a9 s3-nmbd: use autogenerated marshalling for 
LOGON_PRIMARY_QUERY.
       via  b870be6 s3-nmbd: use autogenerated marshalling for LOGON_REQUEST.
       via  fdc0251 s3-nmbd: handle source_name in one location in 
nmbd_process_logon().
       via  23d217a s3-nmbd: use nbt_netlogon_packet in process_logon_packet().
       via  b04c8e0 libcli/netlogon: add LOGON_REQUEST handling to 
pull_nbt_netlogon_response().
       via  72d58e9 libcli/netlogon: add LOGON_RESPONSE2 to 
pull_nbt_netlogon_response().
       via  a80ec29 libcli/netlogon: add NETLOGON_RESPONSE2 to 
push_nbt_netlogon_response().
       via  9a0695a s4-waf: fix bin/python/samba/dcerpc/nbt.so.
       via  930ca32 s4-smbtorture: add torture ndr nbt testsuite.
       via  ece5080 nbt: add nbt_netlogon_response2 to IDL.
       via  37664fd nbt: add NETLOGON_LOGON_REQUEST.
       via  672949f nbt: add decode_nbt_netlogon_packet() to IDL.
       via  9fe70c2 s3-nmbd: fix indentation in process_logon_packet().
       via  1363767 s3-nmbd: remove trailing whitespace in nmbd_processlogon.c
      from  c9d78fc s3: Fix the charset_pull routine (bug 7531)

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


- Log -----------------------------------------------------------------
commit 1bb222d88dbd8a4004d5c4f5e05a2ead18a430ea
Author: Günther Deschner <g...@samba.org>
Date:   Thu Sep 9 23:13:33 2010 +0200

    s3-nmbd: use NETLOGON_NT_VERSION_1 in LOGON_PRIMARY_RESPONSE.
    
    Guenther
    (cherry picked from commit 9f4c1a2a7b9c94df821413acb4fb61327e605f7f)

commit 4662162393915fbf3b82696cb60696c8742a81d4
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 18:55:27 2010 +0200

    s3-nmbd: use autogenerated marshalling for LOGON_SAM_LOGON_REQUEST.
    
    Guenther
    (cherry picked from commit 71b95703f99d2a5b71c8d31abf04e2a05336afb8)

commit 2a136a90707c5b73fa14c4239578fbc6d800f275
Author: Günther Deschner <g...@samba.org>
Date:   Thu Sep 9 13:16:21 2010 +0200

    s3-nmbd: use autogenerated marshalling for LOGON_PRIMARY_QUERY.
    
    Couldn't find any reproducer for a short request, so removing it for now.
    
    Guenther
    (cherry picked from commit 36d7efa75a799522b8ac5995509573d667213799)

commit b870be6cf0ed7901ce79586a794b9d6fa7e8be0a
Author: Günther Deschner <g...@samba.org>
Date:   Thu Sep 9 22:39:05 2010 +0200

    s3-nmbd: use autogenerated marshalling for LOGON_REQUEST.
    
    Guenther
    (cherry picked from commit bfda968e0776dfc95e761ffd3a91f72702286fee)

commit fdc0251603f11c3d7d269fd603b72d2881f709a0
Author: Günther Deschner <g...@samba.org>
Date:   Thu Sep 9 22:38:37 2010 +0200

    s3-nmbd: handle source_name in one location in nmbd_process_logon().
    
    Guenther
    (cherry picked from commit f002b7fa1b4162e691abb68eb95eee2a809faaf5)

commit 23d217aa7839d2c203ab3fa581732f274fc4793c
Author: Günther Deschner <g...@samba.org>
Date:   Tue Sep 7 11:41:05 2010 +0200

    s3-nmbd: use nbt_netlogon_packet in process_logon_packet().
    
    Guenther
    (cherry picked from commit 5fc7d14b064d83b40c65a8c41ea05a9b43af6f5d)

commit b04c8e0cc7cc077dc69c14cff14deb3c384a7a6e
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 11:58:04 2010 +0200

    libcli/netlogon: add LOGON_REQUEST handling to pull_nbt_netlogon_response().
    
    Guenther
    (cherry picked from commit fe30e359670d67e9a8b8ccd22d4eb6d363f88827)

commit 72d58e950c4043f706ac21e079338bd7f5321c7a
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 18:59:19 2010 +0200

    libcli/netlogon: add LOGON_RESPONSE2 to pull_nbt_netlogon_response().
    
    Guenther
    (cherry picked from commit 9a1dbe04a8f1a7cbd0352504990c9240fdd22dae)

commit a80ec29c5af21a6599b59eb303b8bd52ccd33d57
Author: Günther Deschner <g...@samba.org>
Date:   Tue Sep 7 22:41:44 2010 +0200

    libcli/netlogon: add NETLOGON_RESPONSE2 to push_nbt_netlogon_response().
    
    Guenther
    (cherry picked from commit daa948df2bf23f15bcdb4df170306ef71d952e7c)

commit 9a0695ad5dbdc27b579b1d118bb43460d6c999d1
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 23:23:09 2010 +0200

    s4-waf: fix bin/python/samba/dcerpc/nbt.so.
    
    Thanks to Brad Hards for pointing this out.
    
    Guenther

commit 930ca329db9dd064aada99bcda15fd93f8a7e973
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 11:18:40 2010 +0200

    s4-smbtorture: add torture ndr nbt testsuite.
    
    Guenther
    (cherry picked from commit 81ece84b789c64243db1661df6c9fa590d19490f)

commit ece50807cac6b133eeec42cea941fc4fdf1b764e
Author: Günther Deschner <g...@samba.org>
Date:   Tue Sep 7 22:41:06 2010 +0200

    nbt: add nbt_netlogon_response2 to IDL.
    
    Guenther
    (cherry picked from commit 1217809c465a35b0a2727111d820007097b2b611)

commit 37664fd79bebc2b76d86a5a487233e29a17ecf16
Author: Günther Deschner <g...@samba.org>
Date:   Tue Sep 7 13:16:27 2010 +0200

    nbt: add NETLOGON_LOGON_REQUEST.
    
    Guenther
    (cherry picked from commit 8f8ff8bb29cb6f07ddcb310a089b695dbe176b34)

commit 672949f7eca50e323375935e7106cf02128f1b0c
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 11:19:48 2010 +0200

    nbt: add decode_nbt_netlogon_packet() to IDL.
    
    Guenther
    (cherry picked from commit 778950ca9322700c10c92b411873309398aa8dd1)

commit 9fe70c2f27ad6fcd06d4ac126f521a23058bdefc
Author: Günther Deschner <g...@samba.org>
Date:   Tue Sep 7 11:50:39 2010 +0200

    s3-nmbd: fix indentation in process_logon_packet().
    
    purely cosmetic, no code change.
    
    Guenther
    (cherry picked from commit 958df10a44f1370ab46f8ed571e6927e1e182d87)

commit 1363767084e24f5d4587a2edb07497321a940e5c
Author: Günther Deschner <g...@samba.org>
Date:   Wed Sep 8 19:01:10 2010 +0200

    s3-nmbd: remove trailing whitespace in nmbd_processlogon.c
    
    Guenther
    (cherry picked from commit ed68eb768b59835b96099d3073a5aa8b1da0e082)

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

Summary of changes:
 libcli/netlogon.c                |   20 +
 libcli/netlogon.h                |    3 +-
 librpc/idl/nbt.idl               |   26 +-
 source3/nmbd/nmbd_processlogon.c |  913 +++++++++++++-------------------------
 source4/librpc/wscript_build     |    6 +-
 source4/torture/config.mk        |    2 +-
 source4/torture/ndr/nbt.c        |   70 +++
 source4/torture/ndr/ndr.c        |    1 +
 source4/torture/wscript_build    |    2 +-
 9 files changed, 438 insertions(+), 605 deletions(-)
 create mode 100644 source4/torture/ndr/nbt.c


Changeset truncated at 500 lines:

diff --git a/libcli/netlogon.c b/libcli/netlogon.c
index d9b0196..ceb1c85 100644
--- a/libcli/netlogon.c
+++ b/libcli/netlogon.c
@@ -194,7 +194,17 @@ NTSTATUS push_nbt_netlogon_response(DATA_BLOB *data, 
TALLOC_CTX *mem_ctx,
                        data, mem_ctx, 
                        &response->data.samlogon);
                break;
+       case NETLOGON_RESPONSE2:
+               ndr_err = ndr_push_struct_blob(data, mem_ctx,
+                                              &response->data.response2,
+                                              
(ndr_push_flags_fn_t)ndr_push_nbt_netlogon_response2);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       return ndr_map_error2ntstatus(ndr_err);
+               }
+               status = NT_STATUS_OK;
+               break;
        }
+
        return status;
 }
 
@@ -228,6 +238,15 @@ NTSTATUS pull_nbt_netlogon_response(DATA_BLOB *data, 
TALLOC_CTX *mem_ctx,
                status = NT_STATUS_OK;
                response->response_type = NETLOGON_GET_PDC;
                break;
+       case LOGON_RESPONSE2:
+               ndr_err = ndr_pull_struct_blob(data, mem_ctx, 
&response->data.response2,
+                       (ndr_pull_flags_fn_t)ndr_pull_nbt_netlogon_response2);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       return ndr_map_error2ntstatus(ndr_err);
+               }
+               status = NT_STATUS_OK;
+               response->response_type = NETLOGON_RESPONSE2;
+               break;
        case LOGON_SAM_LOGON_RESPONSE:
        case LOGON_SAM_LOGON_PAUSE_RESPONSE:
        case LOGON_SAM_LOGON_USER_UNKNOWN:
@@ -242,6 +261,7 @@ NTSTATUS pull_nbt_netlogon_response(DATA_BLOB *data, 
TALLOC_CTX *mem_ctx,
 
        /* These levels are queries, not responses */
        case LOGON_PRIMARY_QUERY:
+       case LOGON_REQUEST:
        case NETLOGON_ANNOUNCE_UAS:
        case LOGON_SAM_LOGON_REQUEST:
                status = NT_STATUS_INVALID_NETWORK_RESPONSE;
diff --git a/libcli/netlogon.h b/libcli/netlogon.h
index 6ca3de3..3e626ed 100644
--- a/libcli/netlogon.h
+++ b/libcli/netlogon.h
@@ -42,10 +42,11 @@ struct netlogon_samlogon_response
 
 struct nbt_netlogon_response
 {
-       enum {NETLOGON_GET_PDC, NETLOGON_SAMLOGON} response_type;
+       enum {NETLOGON_GET_PDC, NETLOGON_SAMLOGON, NETLOGON_RESPONSE2} 
response_type;
        union {
                struct nbt_netlogon_response_from_pdc get_pdc;
                struct netlogon_samlogon_response samlogon;
+               struct nbt_netlogon_response2 response2;
        } data;
 };
 
diff --git a/librpc/idl/nbt.idl b/librpc/idl/nbt.idl
index 897abb2..6eff674 100644
--- a/librpc/idl/nbt.idl
+++ b/librpc/idl/nbt.idl
@@ -10,7 +10,9 @@
 
 import "misc.idl", "security.idl", "svcctl.idl", "samr.idl";
 [
-       helper("../libcli/netlogon.h", "../libcli/nbt/libnbt.h")
+       helper("../libcli/netlogon.h", "../libcli/nbt/libnbt.h"),
+       helpstring("NBT messages"),
+       uuid("6def41b6-86e4-4c32-997c-ed33af7bcd8e")
 ]
 interface nbt
 {
@@ -377,6 +379,8 @@ interface nbt
        } netlogon_nt_version_flags;
 
        typedef [enum16bit,public] enum {
+               LOGON_REQUEST                     = 0,
+               LOGON_RESPONSE2                   = 6,
                LOGON_PRIMARY_QUERY               = 7,  /* Was also 
NETLOGON_QUERY_FOR_PDC */
                NETLOGON_ANNOUNCE_UAS             = 10,
                NETLOGON_RESPONSE_FROM_PDC        = 12,
@@ -413,6 +417,15 @@ interface nbt
                uint16               lm20_token;
        } NETLOGON_SAM_LOGON_REQUEST;
 
+       typedef struct {
+               astring              computer_name;
+               astring              user_name;
+               astring              mailslot_name;
+               uint8                request_count;
+               uint16               lmnt_token;
+               uint16               lm20_token;
+       } NETLOGON_LOGON_REQUEST;
+
        typedef [flag(NDR_NOALIGN),public] struct {
                netlogon_command command;
                nstring              pdc_name;
@@ -492,6 +505,12 @@ interface nbt
                uint16               lm20_token;
        } nbt_netlogon_response_from_pdc;
 
+       typedef [flag(NDR_NOALIGN),public] struct {
+               netlogon_command command;
+               astring pdc_name;
+               uint16 lm20_token;
+       } nbt_netlogon_response2;
+
        typedef enum netr_SamDatabaseID netr_SamDatabaseID;
 
        /* used to announce SAM changes - MS-NRPC 2.2.1.5.1 */
@@ -520,6 +539,7 @@ interface nbt
        } NETLOGON_DB_CHANGE;
 
        typedef [nodiscriminant] union {
+               [case(LOGON_REQUEST)]  NETLOGON_LOGON_REQUEST logon0;
                [case(LOGON_SAM_LOGON_REQUEST)]       
NETLOGON_SAM_LOGON_REQUEST logon;
                [case(LOGON_PRIMARY_QUERY)] nbt_netlogon_query_for_pdc pdc;
                [case(NETLOGON_ANNOUNCE_UAS)] NETLOGON_DB_CHANGE uas;
@@ -542,6 +562,10 @@ interface nbt
                [switch_is(command)] nbt_netlogon_request req;
        } nbt_netlogon_packet;
 
+       void decode_nbt_netlogon_packet(
+               [in] nbt_netlogon_packet packet
+               );
+
        /********************************************************/
        /* \MAILSLOT\BROWSE mailslot requests                   */
        /* for details see http://ubiqx.org/cifs/Browsing.html  */
diff --git a/source3/nmbd/nmbd_processlogon.c b/source3/nmbd/nmbd_processlogon.c
index 273f3d3..aa4a85c 100644
--- a/source3/nmbd/nmbd_processlogon.c
+++ b/source3/nmbd/nmbd_processlogon.c
@@ -1,24 +1,24 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    NBT netbios routines and daemon - version 2
    Copyright (C) Andrew Tridgell 1994-1998
    Copyright (C) Luke Kenneth Casson Leighton 1994-1998
    Copyright (C) Jeremy Allison 1994-2003
    Copyright (C) Jim McDonough <j...@us.ibm.com> 2002
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-   
+
    Revision History:
 
 */
@@ -280,7 +280,7 @@ static void nmbd_proxy_logon_done(struct tevent_req *subreq)
                return;
        }
 
-       status = push_netlogon_samlogon_response(&response, state, 
+       status = push_netlogon_samlogon_response(&response, state,
                                                 &state->io.out.netlogon);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("failed to push netlogon_samlogon_response: %s\n",
@@ -304,29 +304,22 @@ static void nmbd_proxy_logon_done(struct tevent_req 
*subreq)
 Process a domain logon packet
 **************************************************************************/
 
-void process_logon_packet(struct packet_struct *p, char *buf,int len, 
+void process_logon_packet(struct packet_struct *p, char *buf,int len,
                           const char *mailslot)
 {
+       fstring source_name;
        struct dgram_packet *dgram = &p->packet.dgram;
-       fstring my_name;
-       fstring reply_name;
-       char outbuf[1024];
-       int code;
-       uint16 token = 0;
-       uint32 ntversion = 0;
-       uint16 lmnttoken = 0;
-       uint16 lm20token = 0;
-       uint32 domainsidsize;
-       bool short_request = False;
-       char *getdc;
-       char *uniuser; /* Unicode user name. */
-       fstring ascuser;
-       char *unicomp; /* Unicode computer name. */
-       size_t size;
        struct sockaddr_storage ss;
        const struct sockaddr_storage *pss;
        struct in_addr ip;
 
+       DATA_BLOB blob_in, blob_out;
+       enum ndr_err_code ndr_err;
+       struct nbt_netlogon_packet request;
+       struct nbt_netlogon_response response;
+       NTSTATUS status;
+       const char *pdc_name;
+
        in_addr_to_sockaddr_storage(&ss, p->ip);
        pss = iface_ip((struct sockaddr *)&ss);
        if (!pss) {
@@ -337,599 +330,319 @@ void process_logon_packet(struct packet_struct *p, char 
*buf,int len,
        }
        ip = ((struct sockaddr_in *)pss)->sin_addr;
 
-       memset(outbuf, 0, sizeof(outbuf));
-
        if (!lp_domain_logons()) {
                DEBUG(5,("process_logon_packet: Logon packet received from IP 
%s and domain \
 logons are not enabled.\n", inet_ntoa(p->ip) ));
                return;
        }
 
-       fstrcpy(my_name, global_myname());
-
-       code = get_safe_SVAL(buf,len,buf,0,-1);
-       DEBUG(4,("process_logon_packet: Logon from %s: code = 0x%x\n", 
inet_ntoa(p->ip), code));
-
-       switch (code) {
-               case 0:
-                       {
-                               fstring mach_str, user_str, getdc_str;
-                               char *q = buf + 2;
-                               char *machine = q;
-                               char *user = skip_string(buf,len,machine);
-
-                               if (!user || PTR_DIFF(user, buf) >= len) {
-                                       DEBUG(0,("process_logon_packet: bad 
packet\n"));
-                                       return;
-                               }
-                               getdc = skip_string(buf,len,user);
-
-                               if (!getdc || PTR_DIFF(getdc, buf) >= len) {
-                                       DEBUG(0,("process_logon_packet: bad 
packet\n"));
-                                       return;
-                               }
-                               q = skip_string(buf,len,getdc);
-
-                               if (!q || PTR_DIFF(q + 5, buf) > len) {
-                                       DEBUG(0,("process_logon_packet: bad 
packet\n"));
-                                       return;
-                               }
-                               token = SVAL(q,3);
-
-                               fstrcpy(reply_name,my_name);
-
-                               pull_ascii_fstring(mach_str, machine);
-                               pull_ascii_fstring(user_str, user);
-                               pull_ascii_fstring(getdc_str, getdc);
-
-                               DEBUG(5,("process_logon_packet: Domain login 
request from %s at IP %s user=%s token=%x\n",
-                                       
mach_str,inet_ntoa(p->ip),user_str,token));
-
-                               q = outbuf;
-                               SSVAL(q, 0, 6);
-                               q += 2;
-
-                               fstrcpy(reply_name, "\\\\");
-                               fstrcat(reply_name, my_name);
-                               size = push_ascii(q,reply_name,
-                                               sizeof(outbuf)-PTR_DIFF(q, 
outbuf),
-                                               STR_TERMINATE);
-                               if (size == (size_t)-1) {
-                                       return;
-                               }
-                               q = skip_string(outbuf,sizeof(outbuf),q); /* 
PDC name */
-
-                               SSVAL(q, 0, token);
-                               q += 2;
-
-                               dump_data(4, (uint8 *)outbuf, PTR_DIFF(q, 
outbuf));
-
-                               send_mailslot(True, getdc_str,
-                                               outbuf,PTR_DIFF(q,outbuf),
-                                               global_myname(), 0x0,
-                                               mach_str,
-                                               dgram->source_name.name_type,
-                                               p->ip, ip, p->port);
-                               break;
+       pull_ascii_nstring(source_name, sizeof(source_name), 
dgram->source_name.name);
+
+       pdc_name = talloc_asprintf(talloc_tos(), "\\\\%s", global_myname());
+       if (!pdc_name) {
+               return;
+       }
+
+       ZERO_STRUCT(request);
+
+       blob_in = data_blob_const(buf, len);
+
+       ndr_err = ndr_pull_struct_blob(&blob_in, talloc_tos(), &request,
+               (ndr_pull_flags_fn_t)ndr_pull_nbt_netlogon_packet);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DEBUG(1,("process_logon_packet: Failed to pull logon 
packet\n"));
+               return;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_DEBUG(nbt_netlogon_packet, &request);
+       }
+
+       DEBUG(4,("process_logon_packet: Logon from %s: code = 0x%x\n",
+               inet_ntoa(p->ip), request.command));
+
+       switch (request.command) {
+       case LOGON_REQUEST: {
+
+               struct nbt_netlogon_response2 response2;
+
+               DEBUG(5,("process_logon_packet: Domain login request from %s at 
IP %s user=%s token=%x\n",
+                       request.req.logon0.computer_name, inet_ntoa(p->ip),
+                       request.req.logon0.user_name,
+                       request.req.logon0.lm20_token));
+
+               response2.command       = LOGON_RESPONSE2;
+               response2.pdc_name      = pdc_name;
+               response2.lm20_token    = 0xffff;
+
+               response.response_type = NETLOGON_RESPONSE2;
+               response.data.response2 = response2;
+
+               status = push_nbt_netlogon_response(&blob_out, talloc_tos(), 
&response);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0,("process_logon_packet: failed to push 
packet\n"));
+                       return;
+               }
+
+               if (DEBUGLEVEL >= 10) {
+                       NDR_PRINT_DEBUG(nbt_netlogon_response2, 
&response.data.response2);
+               }
+
+               send_mailslot(True, request.req.logon0.mailslot_name,
+                               (char *)blob_out.data,
+                               blob_out.length,
+                               global_myname(), 0x0,
+                               source_name,
+                               dgram->source_name.name_type,
+                               p->ip, ip, p->port);
+               break;
+       }
+
+       case LOGON_PRIMARY_QUERY: {
+
+               struct nbt_netlogon_response_from_pdc get_pdc;
+
+               if (!lp_domain_master()) {
+                       /* We're not Primary Domain Controller -- ignore this */
+                       return;
+               }
+
+               DEBUG(5,("process_logon_packet: GETDC request from %s at IP %s, 
"
+                       "reporting %s domain %s 0x%x ntversion=%x lm_nt 
token=%x lm_20 token=%x\n",
+                       request.req.pdc.computer_name,
+                       inet_ntoa(p->ip),
+                       global_myname(),
+                       lp_workgroup(),
+                       NETLOGON_RESPONSE_FROM_PDC,
+                       request.req.pdc.nt_version,
+                       request.req.pdc.lmnt_token,
+                       request.req.pdc.lm20_token));
+
+               get_pdc.command                 = NETLOGON_RESPONSE_FROM_PDC;
+               get_pdc.pdc_name                = global_myname();
+               get_pdc._pad                    = data_blob_null;
+               get_pdc.unicode_pdc_name        = global_myname();
+               get_pdc.domain_name             = lp_workgroup();
+               get_pdc.nt_version              = NETLOGON_NT_VERSION_1;
+               get_pdc.lmnt_token              = 0xffff;
+               get_pdc.lm20_token              = 0xffff;
+
+               response.response_type = NETLOGON_GET_PDC;
+               response.data.get_pdc = get_pdc;
+
+               status = push_nbt_netlogon_response(&blob_out, talloc_tos(), 
&response);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0,("process_logon_packet: failed to push 
packet\n"));
+                       return;
+               }
+
+               if (DEBUGLEVEL >= 10) {
+                       NDR_PRINT_DEBUG(nbt_netlogon_response_from_pdc, 
&response.data.get_pdc);
+               }
+
+               send_mailslot(True, request.req.pdc.mailslot_name,
+                       (char *)blob_out.data,
+                       blob_out.length,
+                       global_myname(), 0x0,
+                       source_name,
+                       dgram->source_name.name_type,
+                       p->ip, ip, p->port);
+
+               return;
+       }
+
+       case LOGON_SAM_LOGON_REQUEST: {
+               char *source_addr;
+               bool user_unknown = false;
+
+               struct netlogon_samlogon_response samlogon;
+
+               if (global_nmbd_proxy_logon) {
+                       nmbd_proxy_logon(global_nmbd_proxy_logon,
+                                        ip, p, (uint8_t *)buf, len);
+                       return;
+               }
+
+               source_addr = SMB_STRDUP(inet_ntoa(dgram->header.source_ip));
+               if (source_addr == NULL) {
+                       DEBUG(3, ("out of memory copying client"
+                                 " address string\n"));
+                       return;
+               }
+
+               DEBUG(5,("process_logon_packet: LOGON_SAM_LOGON_REQUEST request 
from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
+                       request.req.logon.computer_name,
+                       inet_ntoa(p->ip),
+                       request.req.logon.user_name,
+                       pdc_name,
+                       lp_workgroup(),
+                       LOGON_SAM_LOGON_RESPONSE,
+                       request.req.logon.lmnt_token));
+
+               if (!request.req.logon.user_name) {
+                       user_unknown = true;
+               }
+
+               /* we want the simple version unless we are an ADS PDC..which 
means  */
+               /* never, at least for now */
+
+               if ((request.req.logon.nt_version < (NETLOGON_NT_VERSION_1 | 
NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_5EX_WITH_IP)) ||
+                   (SEC_ADS != lp_security()) || (ROLE_DOMAIN_PDC != 
lp_server_role())) {
+
+                       struct NETLOGON_SAM_LOGON_RESPONSE_NT40 nt4;
+
+                       nt4.command             = user_unknown ? 
LOGON_SAM_LOGON_USER_UNKNOWN :
+                                                                
LOGON_SAM_LOGON_RESPONSE;
+                       nt4.pdc_name            = pdc_name;
+                       nt4.user_name           = request.req.logon.user_name;
+                       nt4.domain_name         = lp_workgroup();
+                       nt4.nt_version          = NETLOGON_NT_VERSION_1;
+                       nt4.lmnt_token          = 0xffff;
+                       nt4.lm20_token          = 0xffff;
+
+                       samlogon.ntver = NETLOGON_NT_VERSION_1;
+                       samlogon.data.nt4 = nt4;
+
+                       if (DEBUGLEVEL >= 10) {
+                               
NDR_PRINT_DEBUG(NETLOGON_SAM_LOGON_RESPONSE_NT40, &nt4);
                        }
+               }
+#ifdef HAVE_ADS
+               else {
 
-               case LOGON_PRIMARY_QUERY:
-                       {
-                               fstring mach_str, getdc_str;
-                               fstring source_name;
-                               char *q = buf + 2;
-                               char *machine = q;
-
-                               if (!lp_domain_master()) {
-                                       /* We're not Primary Domain Controller 
-- ignore this */
-                                       return;
-                               }
-
-                               getdc = skip_string(buf,len,machine);
-
-                               if (!getdc || PTR_DIFF(getdc, buf) >= len) {
-                                       DEBUG(0,("process_logon_packet: bad 
packet\n"));
-                                       return;
-                               }
-                               q = skip_string(buf,len,getdc);
-
-                               if (!q || PTR_DIFF(q, buf) >= len) {
-                                       DEBUG(0,("process_logon_packet: bad 
packet\n"));
-                                       return;
-                               }
-                               q = ALIGN2(q, buf);
-
-                               /* At this point we can work out if this is a 
W9X or NT style
-                                  request. Experiments show that the 
difference is wether the
-                                  packet ends here. For a W9X request we now 
end with a pair of
-                                  bytes (usually 0xFE 0xFF) whereas with NT we 
have two further
-                                  strings - the following is a simple way of 
detecting this */


-- 
Samba Shared Repository

Reply via email to