2005-04-13 09:07:04 +04:00
/*
Unix SMB / CIFS implementation .
NBT datagram ntlogon server
Copyright ( C ) Andrew Tridgell 2005
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
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-04-13 09:07:04 +04:00
( 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
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-04-13 09:07:04 +04:00
*/
# include "includes.h"
# include "nbt_server/nbt_server.h"
2020-11-20 17:27:17 +03:00
# include "samba/service_task.h"
2006-01-10 01:12:53 +03:00
# include "lib/socket/socket.h"
2006-03-16 03:23:11 +03:00
# include "librpc/gen_ndr/ndr_nbt.h"
2007-09-08 16:42:09 +04:00
# include "param/param.h"
2005-04-13 09:50:02 +04:00
/*
reply to a SAM LOGON request
*/
static void nbtd_ntlogon_sam_logon ( struct dgram_mailslot_handler * dgmslot ,
2006-03-25 12:24:53 +03:00
struct nbtd_interface * iface ,
2005-10-14 16:56:13 +04:00
struct nbt_dgram_packet * packet ,
2006-01-10 01:12:53 +03:00
const struct socket_address * src ,
2005-04-13 09:50:02 +04:00
struct nbt_ntlogon_packet * ntlogon )
{
struct nbt_name * name = & packet - > data . msg . dest_name ;
2007-10-07 01:33:16 +04:00
struct nbtd_interface * reply_iface = nbtd_find_reply_iface ( iface , src - > addr , false ) ;
2005-04-13 09:50:02 +04:00
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 ;
2007-09-28 05:17:46 +04:00
logon - > server = talloc_asprintf ( packet , " \\ \\ %s " ,
2010-07-16 08:32:42 +04:00
lpcfg_netbios_name ( iface - > nbtsrv - > task - > lp_ctx ) ) ;
2005-04-13 09:50:02 +04:00
logon - > user_name = ntlogon - > req . logon . user_name ;
2010-07-16 08:32:42 +04:00
logon - > domain = lpcfg_workgroup ( iface - > nbtsrv - > task - > lp_ctx ) ;
2005-04-13 09:50:02 +04:00
logon - > nt_version = 1 ;
logon - > lmnt_token = 0xFFFF ;
logon - > lm20_token = 0xFFFF ;
packet - > data . msg . dest_name . type = 0 ;
2006-03-25 12:24:53 +03:00
dgram_mailslot_ntlogon_reply ( reply_iface - > dgmsock ,
2005-04-13 09:50:02 +04:00
packet ,
2010-07-16 08:32:42 +04:00
lpcfg_netbios_name ( iface - > nbtsrv - > task - > lp_ctx ) ,
2005-04-13 09:50:02 +04:00
ntlogon - > req . logon . mailslot_name ,
& reply ) ;
}
2005-04-13 09:07:04 +04:00
/*
handle incoming ntlogon mailslot requests
*/
void nbtd_mailslot_ntlogon_handler ( struct dgram_mailslot_handler * dgmslot ,
2005-10-14 16:56:13 +04:00
struct nbt_dgram_packet * packet ,
2006-01-10 01:12:53 +03:00
struct socket_address * src )
2005-04-13 09:07:04 +04:00
{
NTSTATUS status = NT_STATUS_NO_MEMORY ;
struct nbtd_interface * iface =
2009-02-02 11:55:58 +03:00
talloc_get_type ( dgmslot - > private_data , struct nbtd_interface ) ;
2005-04-13 09:07:04 +04:00
struct nbt_ntlogon_packet * ntlogon =
talloc ( dgmslot , struct nbt_ntlogon_packet ) ;
struct nbtd_iface_name * iname ;
struct nbt_name * name = & packet - > data . msg . dest_name ;
if ( ntlogon = = NULL ) goto failed ;
/*
see if the we are listening on the destination netbios name
*/
iname = nbtd_find_iname ( iface , name , 0 ) ;
if ( iname = = NULL ) {
status = NT_STATUS_BAD_NETWORK_NAME ;
goto failed ;
}
DEBUG ( 2 , ( " ntlogon request to %s from %s:%d \n " ,
2005-10-14 16:56:13 +04:00
nbt_name_string ( ntlogon , name ) , src - > addr , src - > port ) ) ;
2005-04-13 09:07:04 +04:00
status = dgram_mailslot_ntlogon_parse ( dgmslot , ntlogon , packet , ntlogon ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) goto failed ;
NDR_PRINT_DEBUG ( nbt_ntlogon_packet , ntlogon ) ;
switch ( ntlogon - > command ) {
2005-04-13 09:50:02 +04:00
case NTLOGON_SAM_LOGON :
2006-03-25 12:24:53 +03:00
nbtd_ntlogon_sam_logon ( dgmslot , iface , packet , src , ntlogon ) ;
2005-04-13 09:50:02 +04:00
break ;
2005-04-13 09:07:04 +04:00
default :
DEBUG ( 2 , ( " unknown ntlogon op %d from %s:%d \n " ,
2005-10-14 16:56:13 +04:00
ntlogon - > command , src - > addr , src - > port ) ) ;
2005-04-13 09:07:04 +04:00
break ;
}
talloc_free ( ntlogon ) ;
return ;
failed :
2006-03-03 11:01:09 +03:00
DEBUG ( 2 , ( " nbtd ntlogon handler failed from %s:%d to %s - %s \n " ,
src - > addr , src - > port , nbt_name_string ( ntlogon , name ) ,
nt_errstr ( status ) ) ) ;
2005-04-13 09:07:04 +04:00
talloc_free ( ntlogon ) ;
}