1996-07-02 15:31:33 +00:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
NBT netbios routines and daemon - version 2
1997-05-08 01:14:17 +00:00
Copyright ( C ) Andrew Tridgell 1994 - 1997
1996-07-02 15:31:33 +00:00
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 2 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
Revision History :
14 jan 96 : lkcl @ pires . co . uk
1996-10-02 15:41:30 +00:00
added multiple workgroup domain master support
1996-07-02 15:31:33 +00:00
*/
# include "includes.h"
extern int ClientDGRAM ;
1996-10-02 15:41:30 +00:00
# define TEST_CODE /* want to debug unknown browse packets */
1996-07-02 15:31:33 +00:00
extern int DEBUGLEVEL ;
1996-10-02 15:41:30 +00:00
extern pstring myname ;
1996-07-02 15:31:33 +00:00
/****************************************************************************
process a domain logon packet
1996-08-09 18:05:34 +00:00
1996-07-02 15:31:33 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void process_logon_packet ( struct packet_struct * p , char * buf , int len )
{
struct dgram_packet * dgram = & p - > packet . dgram ;
char * logname , * q ;
1996-08-15 15:11:34 +00:00
fstring reply_name ;
1996-07-02 15:31:33 +00:00
BOOL add_slashes = False ;
pstring outbuf ;
int code , reply_code ;
1997-04-09 01:19:25 +00:00
char unknown_byte = 0 ;
uint16 request_count = 0 ;
uint16 token = 0 ;
1996-10-02 15:41:30 +00:00
1997-04-09 01:19:25 +00:00
if ( ! lp_domain_logons ( ) )
{
DEBUG ( 3 , ( " No domain logons \n " ) ) ;
return ;
}
1996-07-02 15:31:33 +00:00
1997-04-09 01:19:25 +00:00
code = SVAL ( buf , 0 ) ;
switch ( code )
1996-07-02 15:31:33 +00:00
{
1997-04-09 01:19:25 +00:00
case 0 :
{
char * machine = buf + 2 ;
char * user = skip_string ( machine , 1 ) ;
char * tmp ;
logname = skip_string ( user , 1 ) ;
tmp = skip_string ( logname , 1 ) ;
unknown_byte = CVAL ( tmp , 0 ) ;
request_count = SVAL ( tmp , 1 ) ;
token = SVAL ( tmp , 3 ) ;
reply_code = 0x6 ;
1996-10-02 15:41:30 +00:00
strcpy ( reply_name , myname ) ;
1997-04-09 01:19:25 +00:00
strupper ( reply_name ) ;
add_slashes = True ;
DEBUG ( 3 , ( " Domain login request from %s(%s) user=%s token=%x \n " ,
machine , inet_ntoa ( p - > ip ) , user , token ) ) ;
break ;
}
case 7 :
{
char * machine = buf + 2 ;
logname = skip_string ( machine , 1 ) ;
token = SVAL ( skip_string ( logname , 1 ) , 0 ) ;
strcpy ( reply_name , lp_domain_controller ( ) ) ;
if ( ! * reply_name )
{
/* oo! no domain controller. must be us, then */
strcpy ( reply_name , myname ) ;
reply_code = 0xC ;
}
else
{
/* refer logon request to the domain controller */
reply_code = 0x7 ;
}
strupper ( reply_name ) ;
DEBUG ( 3 , ( " GETDC request from %s(%s), reporting %s 0x%x token=%x \n " ,
machine , inet_ntoa ( p - > ip ) , reply_name , reply_code , token ) ) ;
break ;
}
default :
{
DEBUG ( 3 , ( " Unknown domain request %d \n " , code ) ) ;
return ;
1996-07-02 15:31:33 +00:00
}
}
bzero ( outbuf , sizeof ( outbuf ) ) ;
q = outbuf ;
SSVAL ( q , 0 , reply_code ) ;
q + = 2 ;
1997-04-09 01:19:25 +00:00
if ( token = = 0xffff | | /* LM 2.0 or later */
token = = 0xfffe ) /* WfWg networking */
{
if ( add_slashes )
1997-03-09 14:58:22 +00:00
{
1997-04-09 01:19:25 +00:00
strcpy ( q , " \\ \\ " ) ;
q + = 2 ;
1997-03-09 14:58:22 +00:00
}
1997-04-09 01:19:25 +00:00
strcpy ( q , reply_name ) ;
strupper ( q ) ;
q = skip_string ( q , 1 ) ;
if ( token = = 0xffff ) /* LM 2.0 or later */
{
SSVAL ( q , 0 , token ) ;
q + = 2 ;
}
}
1996-07-02 15:31:33 +00:00
SSVAL ( q , 0 , 0xFFFF ) ;
q + = 2 ;
1997-03-09 14:58:22 +00:00
send_mailslot_reply ( True , logname , ClientDGRAM , outbuf , PTR_DIFF ( q , outbuf ) ,
1996-10-02 15:41:30 +00:00
myname , & dgram - > source_name . name [ 0 ] , 0x20 , 0 , p - > ip ,
1996-07-02 15:31:33 +00:00
* iface_ip ( p - > ip ) ) ;
}