2005-04-06 15:17:08 +04:00
/*
Unix SMB / CIFS implementation .
NBT dgram testing
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-06 15:17:08 +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-06 15:17:08 +04:00
*/
# include "includes.h"
# include "libcli/dgram/libdgram.h"
2006-03-16 03:23:11 +03:00
# include "librpc/gen_ndr/samr.h"
# include "librpc/gen_ndr/ndr_nbt.h"
# include "librpc/gen_ndr/ndr_netlogon.h"
2005-04-06 15:17:08 +04:00
# include "lib/socket/socket.h"
# include "lib/events/events.h"
2006-03-14 18:02:05 +03:00
# include "torture/rpc/rpc.h"
2006-03-07 14:07:23 +03:00
# include "libcli/resolve/resolve.h"
# include "system/network.h"
2006-08-17 17:37:04 +04:00
# include "lib/socket/netif.h"
2007-09-08 16:42:09 +04:00
# include "param/param.h"
2005-04-06 15:17:08 +04:00
# define TEST_NAME "TORTURE_TEST"
/*
reply handler for netlogon request
*/
static void netlogon_handler ( struct dgram_mailslot_handler * dgmslot ,
struct nbt_dgram_packet * packet ,
2006-01-10 01:12:53 +03:00
struct socket_address * src )
2005-04-06 15:17:08 +04:00
{
2005-04-08 09:34:13 +04:00
NTSTATUS status ;
2008-05-21 06:37:36 +04:00
struct nbt_netlogon_response * netlogon = dgmslot - > private ;
2005-04-08 09:34:13 +04:00
2008-05-21 06:37:36 +04:00
dgmslot - > private = netlogon = talloc ( dgmslot , struct nbt_netlogon_response ) ;
if ( ! dgmslot - > private ) {
return ;
}
2005-10-14 16:22:15 +04:00
printf ( " netlogon reply from %s:%d \n " , src - > addr , src - > port ) ;
2005-04-08 09:34:13 +04:00
2008-05-21 06:37:36 +04:00
/* Fills in the netlogon pointer */
status = dgram_mailslot_netlogon_parse_response ( dgmslot , netlogon , packet , netlogon ) ;
2005-04-08 09:34:13 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Failed to parse netlogon packet from %s:%d \n " ,
2005-10-14 16:22:15 +04:00
src - > addr , src - > port ) ;
2005-04-08 09:34:13 +04:00
return ;
}
2008-05-21 06:37:36 +04:00
2005-04-06 15:17:08 +04:00
}
2005-04-08 09:34:13 +04:00
2005-04-06 15:17:08 +04:00
/* test UDP/138 netlogon requests */
2006-10-16 17:06:41 +04:00
static bool nbt_test_netlogon ( struct torture_context * tctx )
2005-04-06 15:17:08 +04:00
{
struct dgram_mailslot_handler * dgmslot ;
2008-04-22 01:58:23 +04:00
struct nbt_dgram_socket * dgmsock = nbt_dgram_socket_init ( tctx , tctx - > ev ,
2008-02-21 18:18:23 +03:00
lp_iconv_convenience ( tctx - > lp_ctx ) ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * dest ;
2006-10-16 17:06:41 +04:00
const char * myaddress ;
2005-04-06 15:17:08 +04:00
struct nbt_netlogon_packet logon ;
2008-05-21 06:37:36 +04:00
struct nbt_netlogon_response * response ;
2005-04-06 15:17:08 +04:00
struct nbt_name myname ;
NTSTATUS status ;
struct timeval tv = timeval_current ( ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * socket_address ;
2006-10-16 17:06:41 +04:00
const char * address ;
struct nbt_name name ;
2007-12-12 00:23:14 +03:00
struct interface * ifaces ;
2008-05-21 06:37:36 +04:00
2007-12-03 02:28:22 +03:00
name . name = lp_workgroup ( tctx - > lp_ctx ) ;
2006-10-16 17:06:41 +04:00
name . type = NBT_NAME_LOGON ;
name . scope = NULL ;
/* do an initial name resolution to find its IP */
torture_assert_ntstatus_ok ( tctx ,
2008-04-17 03:19:20 +04:00
resolve_name ( lp_resolve_context ( tctx - > lp_ctx ) , & name , tctx , & address , tctx - > ev ) ,
2006-11-13 22:08:11 +03:00
talloc_asprintf ( tctx , " Failed to resolve %s " , name . name ) ) ;
2006-10-16 17:06:41 +04:00
2007-12-12 00:23:20 +03:00
load_interfaces ( tctx , lp_interfaces ( tctx - > lp_ctx ) , & ifaces ) ;
2007-12-12 00:23:14 +03:00
myaddress = talloc_strdup ( dgmsock , iface_best_ip ( ifaces , address ) ) ;
2006-10-16 17:06:41 +04:00
2006-01-10 01:12:53 +03:00
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-03 02:28:22 +03:00
myaddress , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-11-13 22:08:11 +03:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
2005-04-08 09:34:13 +04:00
/* try receiving replies on port 138 first, which will only
work if we are root and smbd / nmbd are not running - fall
back to listening on any port , which means replies from
2008-05-16 07:03:01 +04:00
most windows versions won ' t be seen */
2006-01-10 01:12:53 +03:00
status = socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
2005-04-08 09:34:13 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-01-10 01:12:53 +03:00
talloc_free ( socket_address ) ;
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
myaddress , 0 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
2005-04-08 09:34:13 +04:00
}
2005-04-06 15:17:08 +04:00
/* setup a temporary mailslot listener for replies */
2005-04-08 12:57:09 +04:00
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
2008-05-21 06:37:36 +04:00
netlogon_handler , NULL ) ;
2005-04-06 15:17:08 +04:00
ZERO_STRUCT ( logon ) ;
2008-05-16 07:03:01 +04:00
logon . command = LOGON_PRIMARY_QUERY ;
2005-04-06 15:17:08 +04:00
logon . req . pdc . computer_name = TEST_NAME ;
logon . req . pdc . mailslot_name = dgmslot - > mailslot_name ;
logon . req . pdc . unicode_name = TEST_NAME ;
logon . req . pdc . nt_version = 1 ;
logon . req . pdc . lmnt_token = 0xFFFF ;
logon . req . pdc . lm20_token = 0xFFFF ;
2005-05-22 14:23:01 +04:00
make_nbt_name_client ( & myname , TEST_NAME ) ;
2005-04-06 15:17:08 +04:00
2006-01-10 01:12:53 +03:00
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-06 18:41:53 +03:00
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
2008-05-16 07:03:01 +04:00
NBT_MAILSLOT_NETLOGON ,
2005-10-14 16:22:15 +04:00
& myname , & logon ) ;
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
2005-04-06 15:17:08 +04:00
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & ! dgmslot - > private ) {
2005-04-06 15:17:08 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert ( tctx , response - > response_type = = NETLOGON_GET_PDC , " Got incorrect type of netlogon response " ) ;
torture_assert ( tctx , response - > get_pdc . command = = NETLOGON_RESPONSE_FROM_PDC , " Got incorrect netlogon response command " ) ;
2006-10-16 17:06:41 +04:00
return true ;
2005-04-06 15:17:08 +04:00
}
2005-04-14 06:36:30 +04:00
/* test UDP/138 netlogon requests */
2006-10-16 17:06:41 +04:00
static bool nbt_test_netlogon2 ( struct torture_context * tctx )
2005-04-14 06:36:30 +04:00
{
struct dgram_mailslot_handler * dgmslot ;
2008-04-22 01:58:23 +04:00
struct nbt_dgram_socket * dgmsock = nbt_dgram_socket_init ( tctx , tctx - > ev ,
2008-02-21 18:18:23 +03:00
lp_iconv_convenience ( tctx - > lp_ctx ) ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * dest ;
2006-10-16 17:06:41 +04:00
const char * myaddress ;
2005-04-14 06:36:30 +04:00
struct nbt_netlogon_packet logon ;
2008-05-21 06:37:36 +04:00
struct nbt_netlogon_response * response ;
2005-04-14 06:36:30 +04:00
struct nbt_name myname ;
NTSTATUS status ;
struct timeval tv = timeval_current ( ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * socket_address ;
2006-10-16 17:06:41 +04:00
const char * address ;
struct nbt_name name ;
2007-12-12 00:23:14 +03:00
struct interface * ifaces ;
2008-05-17 06:39:38 +04:00
struct test_join * join_ctx ;
struct cli_credentials * machine_credentials ;
const struct dom_sid * dom_sid ;
2006-10-16 17:06:41 +04:00
2007-12-03 02:28:22 +03:00
name . name = lp_workgroup ( tctx - > lp_ctx ) ;
2006-10-16 17:06:41 +04:00
name . type = NBT_NAME_LOGON ;
name . scope = NULL ;
/* do an initial name resolution to find its IP */
torture_assert_ntstatus_ok ( tctx ,
2008-04-17 03:19:20 +04:00
resolve_name ( lp_resolve_context ( tctx - > lp_ctx ) , & name , tctx , & address , tctx - > ev ) ,
2006-11-13 22:08:11 +03:00
talloc_asprintf ( tctx , " Failed to resolve %s " , name . name ) ) ;
2006-10-16 17:06:41 +04:00
2007-12-12 00:23:20 +03:00
load_interfaces ( tctx , lp_interfaces ( tctx - > lp_ctx ) , & ifaces ) ;
2007-12-12 00:23:14 +03:00
myaddress = talloc_strdup ( dgmsock , iface_best_ip ( ifaces , address ) ) ;
2006-10-16 17:06:41 +04:00
2006-01-10 01:12:53 +03:00
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-03 02:28:22 +03:00
myaddress , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
2005-04-14 06:36:30 +04:00
/* try receiving replies on port 138 first, which will only
work if we are root and smbd / nmbd are not running - fall
back to listening on any port , which means replies from
some windows versions won ' t be seen */
2006-01-10 01:12:53 +03:00
status = socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
2005-04-14 06:36:30 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-01-10 01:12:53 +03:00
talloc_free ( socket_address ) ;
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
myaddress , 0 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
2005-04-14 06:36:30 +04:00
}
/* setup a temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
2008-05-21 06:37:36 +04:00
netlogon_handler , NULL ) ;
2005-04-14 06:36:30 +04:00
ZERO_STRUCT ( logon ) ;
2008-05-16 07:03:01 +04:00
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = " " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
2008-05-21 06:37:36 +04:00
logon . req . logon . nt_version = NETLOGON_NT_VERSION_5EX_WITH_IP | NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_1 ;
2008-05-16 07:03:01 +04:00
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
2005-04-14 06:36:30 +04:00
2005-05-22 14:23:01 +04:00
make_nbt_name_client ( & myname , TEST_NAME ) ;
2005-04-14 06:36:30 +04:00
2006-01-10 01:12:53 +03:00
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-06 18:41:53 +03:00
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
2008-05-16 07:03:01 +04:00
NBT_MAILSLOT_NETLOGON ,
2005-10-14 16:22:15 +04:00
& myname , & logon ) ;
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
2005-04-14 06:36:30 +04:00
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
2005-04-14 06:36:30 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_RESPONSE_EX , " Got incorrect netlogon response command " ) ;
2008-05-21 08:49:47 +04:00
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . nt_version , NETLOGON_NT_VERSION_5EX_WITH_IP | NETLOGON_NT_VERSION_5EX | NETLOGON_NT_VERSION_1 , " Got incorrect netlogon response command " ) ;
2008-05-21 06:37:36 +04:00
/* setup (another) temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
2008-05-17 06:39:38 +04:00
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
NBT_MAILSLOT_NETLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
2008-05-17 06:39:38 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_USER_UNKNOWN , " Got incorrect netlogon response command " ) ;
torture_assert_str_equal ( tctx , response - > samlogon . nt5_ex . user_name , TEST_NAME " $ " , " Got incorrect user in netlogon response " ) ;
2008-05-17 06:39:38 +04:00
join_ctx = torture_join_domain ( tctx , TEST_NAME ,
ACB_WSTRUST , & machine_credentials ) ;
dom_sid = torture_join_sid ( join_ctx ) ;
2008-05-21 06:37:36 +04:00
/* setup (another) temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . sid = * dom_sid ;
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
NBT_MAILSLOT_NETLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
event_loop_once ( dgmsock - > event_ctx ) ;
}
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_USER_UNKNOWN , " Got incorrect netlogon response command " ) ;
/* setup (another) temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . sid = * dom_sid ;
logon . req . logon . acct_control = ACB_WSTRUST ;
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
NBT_MAILSLOT_NETLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
event_loop_once ( dgmsock - > event_ctx ) ;
}
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_RESPONSE , " Got incorrect netlogon response command " ) ;
dgmslot - > private = NULL ;
2008-05-17 06:39:38 +04:00
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . sid = * dom_sid ;
2008-05-21 06:37:36 +04:00
logon . req . logon . acct_control = ACB_NORMAL ;
2008-05-17 06:39:38 +04:00
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock , & name , dest ,
NBT_MAILSLOT_NETLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send netlogon request " ) ;
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
2008-05-17 06:39:38 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_USER_UNKNOWN , " Got incorrect netlogon response command " ) ;
2008-06-14 19:24:17 +04:00
torture_leave_domain ( tctx , join_ctx ) ;
2006-10-16 17:06:41 +04:00
return true ;
2005-04-14 06:36:30 +04:00
}
2005-04-13 09:07:04 +04:00
/* test UDP/138 ntlogon requests */
2006-10-16 17:06:41 +04:00
static bool nbt_test_ntlogon ( struct torture_context * tctx )
2005-04-13 09:07:04 +04:00
{
struct dgram_mailslot_handler * dgmslot ;
2008-04-22 01:58:23 +04:00
struct nbt_dgram_socket * dgmsock = nbt_dgram_socket_init ( tctx , tctx - > ev ,
2008-02-21 18:18:23 +03:00
lp_iconv_convenience ( tctx - > lp_ctx ) ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * dest ;
struct test_join * join_ctx ;
2008-05-21 06:37:36 +04:00
const struct dom_sid * dom_sid ;
2006-01-10 01:12:53 +03:00
struct cli_credentials * machine_credentials ;
2006-10-16 17:06:41 +04:00
const char * myaddress ;
2008-05-16 07:03:01 +04:00
struct nbt_netlogon_packet logon ;
2008-05-21 06:37:36 +04:00
struct nbt_netlogon_response * response ;
2005-04-13 09:07:04 +04:00
struct nbt_name myname ;
NTSTATUS status ;
struct timeval tv = timeval_current ( ) ;
2006-01-10 01:12:53 +03:00
struct socket_address * socket_address ;
2006-10-16 17:06:41 +04:00
const char * address ;
struct nbt_name name ;
2007-12-12 00:23:14 +03:00
struct interface * ifaces ;
2006-10-16 17:06:41 +04:00
2007-12-03 02:28:22 +03:00
name . name = lp_workgroup ( tctx - > lp_ctx ) ;
2006-10-16 17:06:41 +04:00
name . type = NBT_NAME_LOGON ;
name . scope = NULL ;
/* do an initial name resolution to find its IP */
torture_assert_ntstatus_ok ( tctx ,
2008-04-17 03:37:02 +04:00
resolve_name ( lp_resolve_context ( tctx - > lp_ctx ) , & name , tctx , & address , tctx - > ev ) ,
2006-11-13 22:08:11 +03:00
talloc_asprintf ( tctx , " Failed to resolve %s " , name . name ) ) ;
2006-10-16 17:06:41 +04:00
2007-12-12 00:23:20 +03:00
load_interfaces ( tctx , lp_interfaces ( tctx - > lp_ctx ) , & ifaces ) ;
2007-12-12 00:23:14 +03:00
myaddress = talloc_strdup ( dgmsock , iface_best_ip ( ifaces , address ) ) ;
2006-01-10 01:12:53 +03:00
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-03 02:28:22 +03:00
myaddress , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2005-04-13 09:07:04 +04:00
/* try receiving replies on port 138 first, which will only
work if we are root and smbd / nmbd are not running - fall
back to listening on any port , which means replies from
2008-05-16 07:03:01 +04:00
most windows versions won ' t be seen */
2006-01-10 01:12:53 +03:00
status = socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
2005-04-13 09:07:04 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-01-10 01:12:53 +03:00
talloc_free ( socket_address ) ;
socket_address = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
myaddress , 0 ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , socket_address ! = NULL , " Error getting address " ) ;
2006-01-10 01:12:53 +03:00
socket_listen ( dgmsock - > sock , socket_address , 0 , 0 ) ;
}
2007-12-03 17:53:28 +03:00
join_ctx = torture_join_domain ( tctx , TEST_NAME ,
2006-01-10 01:12:53 +03:00
ACB_WSTRUST , & machine_credentials ) ;
2008-05-21 06:37:36 +04:00
dom_sid = torture_join_sid ( join_ctx ) ;
2006-11-13 22:08:11 +03:00
torture_assert ( tctx , join_ctx ! = NULL ,
talloc_asprintf ( tctx , " Failed to join domain %s as %s \n " ,
2007-12-03 02:28:22 +03:00
lp_workgroup ( tctx - > lp_ctx ) , TEST_NAME ) ) ;
2005-04-13 09:07:04 +04:00
/* setup a temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
2008-05-21 06:37:36 +04:00
netlogon_handler , NULL ) ;
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_SAM_LOGON_REQUEST ;
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . acct_control = ACB_WSTRUST ;
/* Try with a SID this time */
logon . req . logon . sid = * dom_sid ;
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock ,
& name , dest ,
NBT_MAILSLOT_NTLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send ntlogon request " ) ;
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
event_loop_once ( dgmsock - > event_ctx ) ;
}
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_RESPONSE , " Got incorrect netlogon response command " ) ;
torture_assert_str_equal ( tctx , response - > samlogon . nt5_ex . user_name , TEST_NAME " $ " , " Got incorrect user in netlogon response " ) ;
/* setup a temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
2005-04-13 09:07:04 +04:00
ZERO_STRUCT ( logon ) ;
2008-05-16 07:03:01 +04:00
logon . command = LOGON_SAM_LOGON_REQUEST ;
2005-04-13 09:07:04 +04:00
logon . req . logon . request_count = 0 ;
logon . req . logon . computer_name = TEST_NAME ;
logon . req . logon . user_name = TEST_NAME " $ " ;
logon . req . logon . mailslot_name = dgmslot - > mailslot_name ;
logon . req . logon . acct_control = ACB_WSTRUST ;
2008-05-16 07:03:01 +04:00
/* Leave sid as all zero */
2005-04-13 09:07:04 +04:00
logon . req . logon . nt_version = 1 ;
logon . req . logon . lmnt_token = 0xFFFF ;
logon . req . logon . lm20_token = 0xFFFF ;
2005-05-22 14:23:01 +04:00
make_nbt_name_client ( & myname , TEST_NAME ) ;
2005-04-13 09:07:04 +04:00
2006-01-10 01:12:53 +03:00
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
2007-12-06 18:41:53 +03:00
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
2006-10-16 17:06:41 +04:00
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
2008-05-16 07:03:01 +04:00
status = dgram_mailslot_netlogon_send ( dgmsock ,
& name , dest ,
NBT_MAILSLOT_NTLOGON ,
& myname , & logon ) ;
2006-10-16 17:06:41 +04:00
torture_assert_ntstatus_ok ( tctx , status , " Failed to send ntlogon request " ) ;
2005-04-13 09:07:04 +04:00
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & dgmslot - > private = = NULL ) {
2005-04-13 09:07:04 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_SAMLOGON , " Got incorrect type of netlogon response " ) ;
map_netlogon_samlogon_response ( & response - > samlogon ) ;
torture_assert_int_equal ( tctx , response - > samlogon . nt5_ex . command , LOGON_SAM_LOGON_RESPONSE , " Got incorrect netlogon response command " ) ;
torture_assert_str_equal ( tctx , response - > samlogon . nt5_ex . user_name , TEST_NAME " $ " , " Got incorrect user in netlogon response " ) ;
/* setup (another) temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
2008-05-17 07:24:29 +04:00
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_PRIMARY_QUERY ;
logon . req . pdc . computer_name = TEST_NAME ;
logon . req . pdc . mailslot_name = dgmslot - > mailslot_name ;
logon . req . pdc . unicode_name = TEST_NAME ;
logon . req . pdc . nt_version = 1 ;
logon . req . pdc . lmnt_token = 0xFFFF ;
logon . req . pdc . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock ,
& name , dest ,
NBT_MAILSLOT_NTLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send ntlogon request " ) ;
2008-05-21 06:37:36 +04:00
while ( timeval_elapsed ( & tv ) < 5 & & ! dgmslot - > private ) {
2008-05-17 07:24:29 +04:00
event_loop_once ( dgmsock - > event_ctx ) ;
}
2008-05-21 06:37:36 +04:00
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_GET_PDC , " Got incorrect type of ntlogon response " ) ;
torture_assert_int_equal ( tctx , response - > get_pdc . command , NETLOGON_RESPONSE_FROM_PDC , " Got incorrect ntlogon response command " ) ;
2008-06-14 19:24:17 +04:00
torture_leave_domain ( tctx , join_ctx ) ;
2008-05-21 06:37:36 +04:00
/* setup (another) temporary mailslot listener for replies */
dgmslot = dgram_mailslot_temp ( dgmsock , NBT_MAILSLOT_GETDC ,
netlogon_handler , NULL ) ;
ZERO_STRUCT ( logon ) ;
logon . command = LOGON_PRIMARY_QUERY ;
logon . req . pdc . computer_name = TEST_NAME ;
logon . req . pdc . mailslot_name = dgmslot - > mailslot_name ;
logon . req . pdc . unicode_name = TEST_NAME ;
logon . req . pdc . nt_version = 1 ;
logon . req . pdc . lmnt_token = 0xFFFF ;
logon . req . pdc . lm20_token = 0xFFFF ;
make_nbt_name_client ( & myname , TEST_NAME ) ;
dest = socket_address_from_strings ( dgmsock , dgmsock - > sock - > backend_name ,
address , lp_dgram_port ( tctx - > lp_ctx ) ) ;
torture_assert ( tctx , dest ! = NULL , " Error getting address " ) ;
status = dgram_mailslot_netlogon_send ( dgmsock ,
& name , dest ,
NBT_MAILSLOT_NTLOGON ,
& myname , & logon ) ;
torture_assert_ntstatus_ok ( tctx , status , " Failed to send ntlogon request " ) ;
while ( timeval_elapsed ( & tv ) < 5 & & ! dgmslot - > private ) {
event_loop_once ( dgmsock - > event_ctx ) ;
}
response = talloc_get_type ( dgmslot - > private , struct nbt_netlogon_response ) ;
torture_assert ( tctx , response ! = NULL , " Failed to receive a netlogon reply packet " ) ;
torture_assert_int_equal ( tctx , response - > response_type , NETLOGON_GET_PDC , " Got incorrect type of ntlogon response " ) ;
torture_assert_int_equal ( tctx , response - > get_pdc . command , NETLOGON_RESPONSE_FROM_PDC , " Got incorrect ntlogon response command " ) ;
2006-10-16 17:06:41 +04:00
return true ;
2005-04-13 09:07:04 +04:00
}
2005-04-06 15:17:08 +04:00
/*
test nbt dgram operations
*/
2007-09-07 20:27:57 +04:00
struct torture_suite * torture_nbt_dgram ( TALLOC_CTX * mem_ctx )
2005-04-06 15:17:08 +04:00
{
2007-09-07 21:59:53 +04:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " DGRAM " ) ;
2005-04-06 15:17:08 +04:00
2006-10-16 17:06:41 +04:00
torture_suite_add_simple_test ( suite , " netlogon " , nbt_test_netlogon ) ;
torture_suite_add_simple_test ( suite , " netlogon2 " , nbt_test_netlogon2 ) ;
torture_suite_add_simple_test ( suite , " ntlogon " , nbt_test_ntlogon ) ;
2005-04-06 15:17:08 +04:00
2006-10-16 17:06:41 +04:00
return suite ;
2005-04-06 15:17:08 +04:00
}