svn commit: samba r6323 - in branches/SAMBA_4_0/source:
libcli/dgram librpc/idl nbt_server/dgram
tridge at samba.org
tridge at samba.org
Wed Apr 13 05:50:03 GMT 2005
Author: tridge
Date: 2005-04-13 05:50:02 +0000 (Wed, 13 Apr 2005)
New Revision: 6323
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6323
Log:
added server side support for dgram NTLOGON requests. NT4 workstations can now login
to a Samba4 domain.
Modified:
branches/SAMBA_4_0/source/libcli/dgram/libdgram.h
branches/SAMBA_4_0/source/libcli/dgram/mailslot.c
branches/SAMBA_4_0/source/libcli/dgram/netlogon.c
branches/SAMBA_4_0/source/libcli/dgram/ntlogon.c
branches/SAMBA_4_0/source/librpc/idl/nbt.idl
branches/SAMBA_4_0/source/nbt_server/dgram/ntlogon.c
Changeset:
Modified: branches/SAMBA_4_0/source/libcli/dgram/libdgram.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/dgram/libdgram.h 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/libcli/dgram/libdgram.h 2005-04-13 05:50:02 UTC (rev 6323)
@@ -109,6 +109,7 @@
const char *mailslot_name,
dgram_mailslot_handler_t handler,
void *private);
+DATA_BLOB dgram_mailslot_data(struct nbt_dgram_packet *dgram);
NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
Modified: branches/SAMBA_4_0/source/libcli/dgram/mailslot.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/dgram/mailslot.c 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/libcli/dgram/mailslot.c 2005-04-13 05:50:02 UTC (rev 6323)
@@ -167,7 +167,7 @@
msg = &packet.data.msg;
/* this length calculation is very crude - it should be based on gensize
calls */
- msg->length = 138 + strlen(mailslot_name) + request->length;
+ msg->length = 138 + strlen(mailslot_name) + request->length;
msg->offset = 0;
msg->source_name = *src_name;
@@ -194,3 +194,21 @@
return status;
}
+
+/*
+ return the mailslot data portion from a mailslot packet
+*/
+DATA_BLOB dgram_mailslot_data(struct nbt_dgram_packet *dgram)
+{
+ struct smb_trans_body *trans = &dgram->data.msg.body.smb.body.trans;
+ DATA_BLOB ret = trans->data;
+ int pad = trans->data_offset - (70 + strlen(trans->mailslot_name));
+
+ if (pad < 0 || pad > ret.length) {
+ DEBUG(2,("Badly formatted data in mailslot - pad = %d\n", pad));
+ return data_blob(NULL, 0);
+ }
+ ret.data += pad;
+ ret.length -= pad;
+ return ret;
+}
Modified: branches/SAMBA_4_0/source/libcli/dgram/netlogon.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/dgram/netlogon.c 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/libcli/dgram/netlogon.c 2005-04-13 05:50:02 UTC (rev 6323)
@@ -101,16 +101,16 @@
struct nbt_dgram_packet *dgram,
struct nbt_netlogon_packet *netlogon)
{
- DATA_BLOB *data = &dgram->data.msg.body.smb.body.trans.data;
+ DATA_BLOB data = dgram_mailslot_data(dgram);
NTSTATUS status;
- status = ndr_pull_struct_blob(data, mem_ctx, netlogon,
+ status = ndr_pull_struct_blob(&data, mem_ctx, netlogon,
(ndr_pull_flags_fn_t)ndr_pull_nbt_netlogon_packet);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to parse netlogon packet of length %d\n",
- data->length));
+ data.length));
#if 0
- file_save("netlogon.dat", data->data, data->length);
+ file_save("netlogon.dat", data.data, data.length);
#endif
}
return status;
Modified: branches/SAMBA_4_0/source/libcli/dgram/ntlogon.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/dgram/ntlogon.c 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/libcli/dgram/ntlogon.c 2005-04-13 05:50:02 UTC (rev 6323)
@@ -101,16 +101,16 @@
struct nbt_dgram_packet *dgram,
struct nbt_ntlogon_packet *ntlogon)
{
- DATA_BLOB *data = &dgram->data.msg.body.smb.body.trans.data;
+ DATA_BLOB data = dgram_mailslot_data(dgram);
NTSTATUS status;
- status = ndr_pull_struct_blob(data, mem_ctx, ntlogon,
+ status = ndr_pull_struct_blob(&data, mem_ctx, ntlogon,
(ndr_pull_flags_fn_t)ndr_pull_nbt_ntlogon_packet);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("Failed to parse ntlogon packet of length %d\n",
- data->length));
+ data.length));
#if 0
- file_save("ntlogon.dat", data->data, data->length);
+ file_save("ntlogon.dat", data.data, data.length);
#endif
}
return status;
Modified: branches/SAMBA_4_0/source/librpc/idl/nbt.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/nbt.idl 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/librpc/idl/nbt.idl 2005-04-13 05:50:02 UTC (rev 6323)
@@ -259,7 +259,7 @@
[value(strlen(r->mailslot_name)+1+r->data.length)]
uint16 byte_count;
astring mailslot_name;
- [flag(NDR_REMAINING)] DATA_BLOB data;
+ [flag(NDR_REMAINING)] DATA_BLOB data;
} smb_trans_body;
typedef [nodiscriminant] union {
@@ -435,5 +435,4 @@
nbt_ntlogon_command command;
[switch_is(command)] nbt_ntlogon_request req;
} nbt_ntlogon_packet;
-
}
Modified: branches/SAMBA_4_0/source/nbt_server/dgram/ntlogon.c
===================================================================
--- branches/SAMBA_4_0/source/nbt_server/dgram/ntlogon.c 2005-04-13 05:42:07 UTC (rev 6322)
+++ branches/SAMBA_4_0/source/nbt_server/dgram/ntlogon.c 2005-04-13 05:50:02 UTC (rev 6323)
@@ -26,7 +26,45 @@
#include "smbd/service_task.h"
#include "lib/socket/socket.h"
+
/*
+ reply to a SAM LOGON request
+ */
+static void nbtd_ntlogon_sam_logon(struct dgram_mailslot_handler *dgmslot,
+ struct nbt_dgram_packet *packet,
+ const char *src_address, int src_port,
+ struct nbt_ntlogon_packet *ntlogon)
+{
+ struct nbt_name *name = &packet->data.msg.dest_name;
+ struct nbt_ntlogon_packet reply;
+ struct nbt_ntlogon_sam_logon_reply *logon;
+
+ /* only answer sam logon requests on the PDC or LOGON names */
+ if (name->type != NBT_NAME_PDC && name->type != NBT_NAME_LOGON) {
+ return;
+ }
+
+ /* setup a SAM LOGON reply */
+ ZERO_STRUCT(reply);
+ reply.command = NTLOGON_SAM_LOGON_REPLY;
+ logon = &reply.req.reply;
+
+ logon->server = talloc_asprintf(packet, "\\\\%s", lp_netbios_name());
+ logon->user_name = ntlogon->req.logon.user_name;
+ logon->domain = lp_workgroup();
+ logon->nt_version = 1;
+ logon->lmnt_token = 0xFFFF;
+ logon->lm20_token = 0xFFFF;
+
+ packet->data.msg.dest_name.type = 0;
+
+ dgram_mailslot_ntlogon_reply(dgmslot->dgmsock,
+ packet,
+ ntlogon->req.logon.mailslot_name,
+ &reply);
+}
+
+/*
handle incoming ntlogon mailslot requests
*/
void nbtd_mailslot_ntlogon_handler(struct dgram_mailslot_handler *dgmslot,
@@ -60,6 +98,9 @@
NDR_PRINT_DEBUG(nbt_ntlogon_packet, ntlogon);
switch (ntlogon->command) {
+ case NTLOGON_SAM_LOGON:
+ nbtd_ntlogon_sam_logon(dgmslot, packet, src_address, src_port, ntlogon);
+ break;
default:
DEBUG(2,("unknown ntlogon op %d from %s:%d\n",
ntlogon->command, src_address, src_port));
More information about the samba-cvs
mailing list