2003-11-21 16:14:17 +03:00
/*
Unix SMB / CIFS implementation .
test suite for epmapper rpc operations
Copyright ( C ) Andrew Tridgell 2003
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
2003-11-21 16:14:17 +03: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/>.
2003-11-21 16:14:17 +03:00
*/
# include "includes.h"
2006-03-15 02:35:30 +03:00
# include "librpc/gen_ndr/ndr_epmapper_c.h"
2007-08-21 23:35:43 +04:00
# include "librpc/ndr/ndr_table.h"
2008-04-02 06:53:27 +04:00
# include "librpc/rpc/dcerpc_proto.h"
2010-04-14 00:06:51 +04:00
# include "torture/rpc/torture_rpc.h"
2011-01-25 20:49:32 +03:00
# include "lib/util/util_net.h"
2011-02-24 03:55:45 +03:00
# include "librpc/rpc/rpc_common.h"
2003-11-21 16:14:17 +03:00
2003-11-24 08:28:10 +03:00
/*
display any protocol tower
*/
2010-12-23 22:57:28 +03:00
static void display_tower ( struct torture_context * tctx , struct epm_tower * twr )
2003-11-24 08:28:10 +03:00
{
int i ;
2010-12-23 22:57:28 +03:00
for ( i = 0 ; i < twr - > num_floors ; i + + ) {
torture_comment ( tctx ,
" %s " ,
epm_floor_string ( tctx , & twr - > floors [ i ] ) ) ;
2003-11-24 08:28:10 +03:00
}
2010-12-23 22:57:28 +03:00
torture_comment ( tctx , " \n " ) ;
2003-11-24 08:28:10 +03:00
}
2011-01-25 20:49:32 +03:00
static bool test_Insert ( struct torture_context * tctx ,
struct dcerpc_binding_handle * h ,
struct ndr_syntax_id object ,
const char * annotation ,
2014-02-04 05:31:10 +04:00
const struct dcerpc_binding * b )
2011-01-25 20:49:32 +03:00
{
struct epm_Insert r ;
NTSTATUS status ;
r . in . num_ents = 1 ;
r . in . entries = talloc_array ( tctx , struct epm_entry_t , 1 ) ;
if ( torture_setting_bool ( tctx , " samba4 " , false ) ) {
torture_skip ( tctx , " Skip Insert test against Samba4 " ) ;
}
/* FIXME zero */
ZERO_STRUCT ( r . in . entries [ 0 ] . object ) ;
r . in . entries [ 0 ] . annotation = annotation ;
r . in . entries [ 0 ] . tower = talloc ( tctx , struct epm_twr_t ) ;
status = dcerpc_binding_build_tower ( tctx ,
b ,
& r . in . entries [ 0 ] . tower - > tower ) ;
torture_assert_ntstatus_ok ( tctx ,
status ,
" Unable to build tower from binding struct " ) ;
r . in . replace = 0 ;
/* shoot! */
status = dcerpc_epm_Insert_r ( h , tctx , & r ) ;
if ( NT_STATUS_IS_ERR ( status ) ) {
torture_comment ( tctx ,
" epm_Insert failed - %s \n " ,
nt_errstr ( status ) ) ;
return false ;
}
if ( r . out . result ! = EPMAPPER_STATUS_OK ) {
torture_comment ( tctx ,
" epm_Insert failed - internal error: 0x%.4x \n " ,
r . out . result ) ;
return false ;
}
return true ;
}
static bool test_Delete ( struct torture_context * tctx ,
struct dcerpc_binding_handle * h ,
const char * annotation ,
2014-02-04 05:31:10 +04:00
const struct dcerpc_binding * b )
2011-01-25 20:49:32 +03:00
{
NTSTATUS status ;
struct epm_Delete r ;
r . in . num_ents = 1 ;
r . in . entries = talloc_array ( tctx , struct epm_entry_t , 1 ) ;
ZERO_STRUCT ( r . in . entries [ 0 ] . object ) ;
r . in . entries [ 0 ] . annotation = annotation ;
r . in . entries [ 0 ] . tower = talloc ( tctx , struct epm_twr_t ) ;
status = dcerpc_binding_build_tower ( tctx ,
b ,
& r . in . entries [ 0 ] . tower - > tower ) ;
torture_assert_ntstatus_ok ( tctx ,
status ,
" Unable to build tower from binding struct " ) ;
r . in . num_ents = 1 ;
status = dcerpc_epm_Delete_r ( h , tctx , & r ) ;
if ( NT_STATUS_IS_ERR ( status ) ) {
torture_comment ( tctx ,
" epm_Delete failed - %s \n " ,
nt_errstr ( status ) ) ;
return false ;
}
if ( r . out . result ! = EPMAPPER_STATUS_OK ) {
torture_comment ( tctx ,
" epm_Delete failed - internal error: 0x%.4x \n " ,
r . out . result ) ;
return false ;
}
return true ;
}
static bool test_Map_tcpip ( struct torture_context * tctx ,
struct dcerpc_binding_handle * h ,
struct ndr_syntax_id map_syntax )
{
struct epm_Map r ;
struct GUID uuid ;
struct policy_handle entry_handle ;
struct ndr_syntax_id syntax ;
2014-01-30 12:14:00 +04:00
struct dcerpc_binding * map_binding ;
2011-01-25 20:49:32 +03:00
struct epm_twr_t map_tower ;
struct epm_twr_p_t towers [ 20 ] ;
struct epm_tower t ;
uint32_t num_towers ;
uint32_t port ;
uint32_t i ;
long int p ;
const char * tmp ;
const char * ip ;
char * ptr ;
NTSTATUS status ;
torture_comment ( tctx , " Testing epm_Map \n " ) ;
ZERO_STRUCT ( uuid ) ;
ZERO_STRUCT ( entry_handle ) ;
r . in . object = & uuid ;
r . in . map_tower = & map_tower ;
r . in . entry_handle = & entry_handle ;
r . out . entry_handle = & entry_handle ;
r . in . max_towers = 10 ;
r . out . towers = towers ;
r . out . num_towers = & num_towers ;
/* Create map tower */
2014-01-30 12:14:00 +04:00
status = dcerpc_parse_binding ( tctx , " ncacn_ip_tcp:[135] " , & map_binding ) ;
torture_assert_ntstatus_ok ( tctx , status ,
" epm_Map_tcpip failed: can't create map_binding " ) ;
2014-01-30 12:14:00 +04:00
status = dcerpc_binding_set_abstract_syntax ( map_binding , & map_syntax ) ;
torture_assert_ntstatus_ok ( tctx , status ,
" epm_Map_tcpip failed: set map_syntax " ) ;
2011-01-25 20:49:32 +03:00
2014-01-30 12:14:00 +04:00
status = dcerpc_binding_build_tower ( tctx , map_binding ,
2011-01-25 20:49:32 +03:00
& map_tower . tower ) ;
torture_assert_ntstatus_ok ( tctx , status ,
" epm_Map_tcpip failed: can't create map_tower " ) ;
torture_comment ( tctx ,
" epm_Map request for '%s': \n " ,
ndr_interface_name ( & map_syntax . uuid , map_syntax . if_version ) ) ;
display_tower ( tctx , & r . in . map_tower - > tower ) ;
status = dcerpc_epm_Map_r ( h , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " epm_Map_simple failed " ) ;
torture_assert ( tctx , r . out . result = = EPMAPPER_STATUS_OK ,
" epm_Map_tcpip failed: result is not EPMAPPER_STATUS_OK " ) ;
/* Check the result */
t = r . out . towers [ 0 ] . twr - > tower ;
/* Check if we got the correct RPC interface identifier */
dcerpc_floor_get_lhs_data ( & t . floors [ 0 ] , & syntax ) ;
torture_assert ( tctx , ndr_syntax_id_equal ( & syntax , & map_syntax ) ,
" epm_Map_tcpip failed: Interface identifier mismatch " ) ;
torture_comment ( tctx ,
" epm_Map_tcpip response for '%s': \n " ,
ndr_interface_name ( & syntax . uuid , syntax . if_version ) ) ;
dcerpc_floor_get_lhs_data ( & t . floors [ 1 ] , & syntax ) ;
2012-03-18 19:46:57 +04:00
torture_assert ( tctx , ndr_syntax_id_equal ( & syntax , & ndr_transfer_syntax_ndr ) ,
2011-01-25 20:49:32 +03:00
" epm_Map_tcpip failed: floor 2 is not NDR encoded " ) ;
torture_assert ( tctx , t . floors [ 2 ] . lhs . protocol = = EPM_PROTOCOL_NCACN ,
" epm_Map_tcpip failed: floor 3 is not NCACN_IP_TCP " ) ;
tmp = dcerpc_floor_get_rhs_data ( tctx , & t . floors [ 3 ] ) ;
p = strtol ( tmp , & ptr , 10 ) ;
port = p & 0xffff ;
torture_assert ( tctx , port > 1024 & & port < 65535 , " epm_Map_tcpip failed " ) ;
ip = dcerpc_floor_get_rhs_data ( tctx , & t . floors [ 4 ] ) ;
torture_assert ( tctx , is_ipaddress ( ip ) , " epm_Map_tcpip failed " ) ;
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
if ( r . out . towers [ i ] . twr ) {
display_tower ( tctx , & t ) ;
}
}
return true ;
}
static bool test_Map_full ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
const struct ndr_syntax_id obj = {
{ 0x8a885d04 , 0x1ceb , 0x11c9 , { 0x9f , 0xe8 } , { 0x08 , 0x00 , 0x2b , 0x10 , 0x48 , 0x60 } } ,
2
} ;
struct dcerpc_binding_handle * h = p - > binding_handle ;
const char * annotation = " SMBTORTURE " ;
struct dcerpc_binding * b ;
NTSTATUS status ;
bool ok ;
status = dcerpc_parse_binding ( tctx , " ncacn_ip_tcp:216.83.154.106[41768] " , & b ) ;
torture_assert_ntstatus_ok ( tctx ,
status ,
" Unable to generate dcerpc_binding struct " ) ;
2014-02-04 05:31:10 +04:00
status = dcerpc_binding_set_abstract_syntax ( b , & obj ) ;
torture_assert_ntstatus_ok ( tctx , status , " dcerpc_binding_set_abstract_syntax " ) ;
2011-01-25 20:49:32 +03:00
ok = test_Insert ( tctx , h , obj , annotation , b ) ;
if ( ! ok ) {
return false ;
}
ok = test_Map_tcpip ( tctx , h , obj ) ;
if ( ! ok ) {
return false ;
}
ok = test_Delete ( tctx , h , annotation , b ) ;
if ( ! ok ) {
return false ;
}
return true ;
}
static bool test_Map_display ( struct dcerpc_binding_handle * b ,
struct torture_context * tctx ,
2014-01-31 02:00:40 +04:00
struct epm_entry_t * entry )
2003-11-24 13:15:17 +03:00
{
NTSTATUS status ;
2014-01-31 02:00:40 +04:00
struct epm_twr_t * twr = entry - > tower ;
2003-11-24 13:15:17 +03:00
struct epm_Map r ;
2014-01-31 02:00:40 +04:00
struct GUID uuid = entry - > object ;
2003-11-24 13:15:17 +03:00
struct policy_handle handle ;
2007-08-18 10:57:49 +04:00
struct ndr_syntax_id syntax ;
2007-04-04 02:43:35 +04:00
uint32_t num_towers ;
2011-01-12 19:41:05 +03:00
uint32_t i ;
2003-11-24 13:15:17 +03:00
ZERO_STRUCT ( handle ) ;
r . in . object = & uuid ;
r . in . map_tower = twr ;
2011-01-12 19:41:05 +03:00
r . in . entry_handle = & handle ;
2003-11-24 13:15:17 +03:00
r . out . entry_handle = & handle ;
2011-01-12 19:41:05 +03:00
r . in . max_towers = 10 ;
2007-04-04 02:43:35 +04:00
r . out . num_towers = & num_towers ;
2003-11-24 13:15:17 +03:00
2006-03-26 04:59:17 +04:00
dcerpc_floor_get_lhs_data ( & twr - > tower . floors [ 0 ] , & syntax ) ;
2003-11-27 10:28:46 +03:00
2011-01-12 19:41:05 +03:00
torture_comment ( tctx ,
" epm_Map results for '%s': \n " ,
ndr_interface_name ( & syntax . uuid , syntax . if_version ) ) ;
2003-11-27 10:28:46 +03:00
2014-01-31 02:00:40 +04:00
status = dcerpc_epm_Map_r ( b , tctx , & r ) ;
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
if ( r . out . towers [ i ] . twr ) {
display_tower ( tctx , & r . out . towers [ i ] . twr - > tower ) ;
}
}
}
2011-01-12 19:41:05 +03:00
/* RPC protocol identifier */
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 2 ] . lhs . protocol = EPM_PROTOCOL_NCACN ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 2 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 2 ] . rhs . ncacn . minor_version = 0 ;
2011-01-12 19:41:05 +03:00
/* Port address */
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 3 ] . lhs . protocol = EPM_PROTOCOL_TCP ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 3 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 3 ] . rhs . tcp . port = 0 ;
2003-11-27 10:28:46 +03:00
2011-01-12 19:41:05 +03:00
/* Transport */
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 4 ] . lhs . protocol = EPM_PROTOCOL_IP ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 4 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2005-02-01 07:12:44 +03:00
twr - > tower . floors [ 4 ] . rhs . ip . ipaddr = " 0.0.0.0 " ;
2004-10-31 21:40:08 +03:00
2011-01-12 19:41:05 +03:00
status = dcerpc_epm_Map_r ( b , tctx , & r ) ;
2004-10-31 21:40:08 +03:00
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
2006-11-22 19:55:21 +03:00
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
2004-10-31 21:40:08 +03:00
if ( r . out . towers [ i ] . twr ) {
2011-01-12 19:41:05 +03:00
display_tower ( tctx , & r . out . towers [ i ] . twr - > tower ) ;
2004-10-31 21:40:08 +03:00
}
2003-11-27 10:28:46 +03:00
}
2004-10-31 21:40:08 +03:00
}
twr - > tower . floors [ 3 ] . lhs . protocol = EPM_PROTOCOL_HTTP ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 3 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 3 ] . rhs . http . port = 0 ;
2003-11-24 13:15:17 +03:00
2011-01-12 19:41:05 +03:00
status = dcerpc_epm_Map_r ( b , tctx , & r ) ;
2004-10-31 21:40:08 +03:00
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
2006-11-22 19:55:21 +03:00
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
2004-10-31 21:40:08 +03:00
if ( r . out . towers [ i ] . twr ) {
2011-01-12 19:41:05 +03:00
display_tower ( tctx , & r . out . towers [ i ] . twr - > tower ) ;
2003-11-27 10:28:46 +03:00
}
}
}
2004-10-31 21:40:08 +03:00
2004-11-09 01:18:18 +03:00
twr - > tower . floors [ 3 ] . lhs . protocol = EPM_PROTOCOL_UDP ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 3 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2014-01-31 02:00:40 +04:00
twr - > tower . floors [ 3 ] . rhs . udp . port = 0 ;
2004-11-09 01:18:18 +03:00
2011-01-12 19:41:05 +03:00
status = dcerpc_epm_Map_r ( b , tctx , & r ) ;
2004-11-09 01:18:18 +03:00
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
2006-11-22 19:55:21 +03:00
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
2004-11-09 01:18:18 +03:00
if ( r . out . towers [ i ] . twr ) {
2011-01-12 19:41:05 +03:00
display_tower ( tctx , & r . out . towers [ i ] . twr - > tower ) ;
2004-11-09 01:18:18 +03:00
}
}
}
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 3 ] . lhs . protocol = EPM_PROTOCOL_SMB ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 3 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 3 ] . rhs . smb . unc = " " ;
twr - > tower . floors [ 4 ] . lhs . protocol = EPM_PROTOCOL_NETBIOS ;
2005-02-04 04:32:19 +03:00
twr - > tower . floors [ 4 ] . lhs . lhs_data = data_blob ( NULL , 0 ) ;
2004-10-31 21:40:08 +03:00
twr - > tower . floors [ 4 ] . rhs . netbios . name = " " ;
2011-01-12 19:41:05 +03:00
status = dcerpc_epm_Map_r ( b , tctx , & r ) ;
2004-10-31 21:40:08 +03:00
if ( NT_STATUS_IS_OK ( status ) & & r . out . result = = 0 ) {
2011-01-12 19:41:05 +03:00
for ( i = 0 ; i < * r . out . num_towers ; i + + ) {
2004-10-31 21:40:08 +03:00
if ( r . out . towers [ i ] . twr ) {
2011-01-12 19:41:05 +03:00
display_tower ( tctx , & r . out . towers [ i ] . twr - > tower ) ;
2004-10-31 21:40:08 +03:00
}
}
}
/* FIXME: Extend to do other protocols as well (ncacn_unix_stream, ncalrpc) */
2011-01-12 19:41:05 +03:00
return true ;
}
static bool test_Map_simple ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
NTSTATUS status ;
struct epm_Lookup r ;
struct policy_handle entry_handle ;
uint32_t num_ents = 0 ;
struct dcerpc_binding_handle * h = p - > binding_handle ;
ZERO_STRUCT ( entry_handle ) ;
torture_comment ( tctx , " Testing epm_Map \n " ) ;
/* get all elements */
r . in . inquiry_type = RPC_C_EP_ALL_ELTS ;
r . in . object = NULL ;
r . in . interface_id = NULL ;
r . in . vers_option = RPC_C_VERS_ALL ;
r . in . entry_handle = & entry_handle ;
r . in . max_ents = 10 ;
r . out . entry_handle = & entry_handle ;
r . out . num_ents = & num_ents ;
do {
int i ;
status = dcerpc_epm_Lookup_r ( h , tctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) | |
r . out . result ! = EPMAPPER_STATUS_OK ) {
break ;
}
for ( i = 0 ; i < * r . out . num_ents ; i + + ) {
if ( r . out . entries [ i ] . tower - > tower . num_floors = = 5 ) {
2014-01-31 02:00:40 +04:00
test_Map_display ( h , tctx , & r . out . entries [ i ] ) ;
2011-01-12 19:41:05 +03:00
}
}
} while ( NT_STATUS_IS_OK ( status ) & &
r . out . result = = EPMAPPER_STATUS_OK & &
* r . out . num_ents = = r . in . max_ents & &
2012-03-18 20:44:24 +04:00
! ndr_policy_handle_empty ( & entry_handle ) ) ;
2011-01-12 19:41:05 +03:00
torture_assert_ntstatus_ok ( tctx , status , " epm_Map_simple failed " ) ;
torture_assert ( tctx ,
2012-03-18 20:44:24 +04:00
ndr_policy_handle_empty ( & entry_handle ) ,
2011-01-12 19:41:05 +03:00
" epm_Map_simple failed - The policy handle should be emtpy. " ) ;
2007-10-07 02:28:14 +04:00
return true ;
2003-11-24 13:15:17 +03:00
}
2010-12-23 15:07:39 +03:00
static bool test_LookupHandleFree ( struct torture_context * tctx ,
struct dcerpc_binding_handle * h ,
struct policy_handle * entry_handle ) {
NTSTATUS status ;
struct epm_LookupHandleFree r ;
if ( torture_setting_bool ( tctx , " samba4 " , false ) ) {
torture_skip ( tctx , " Skip Insert test against Samba4 " ) ;
}
2012-03-18 20:44:24 +04:00
if ( ndr_policy_handle_empty ( entry_handle ) ) {
2010-12-23 15:07:39 +03:00
torture_comment ( tctx ,
" epm_LookupHandleFree failed - empty policy_handle \n " ) ;
return false ;
}
r . in . entry_handle = entry_handle ;
2010-12-23 22:57:28 +03:00
r . out . entry_handle = entry_handle ;
2010-12-23 15:07:39 +03:00
status = dcerpc_epm_LookupHandleFree_r ( h , tctx , & r ) ;
if ( NT_STATUS_IS_ERR ( status ) ) {
torture_comment ( tctx ,
" epm_LookupHandleFree failed - %s \n " ,
nt_errstr ( status ) ) ;
return false ;
}
if ( r . out . result ! = EPMAPPER_STATUS_OK ) {
torture_comment ( tctx ,
" epm_LookupHandleFree failed - internal error: "
" 0x%.4x \n " ,
r . out . result ) ;
return false ;
}
return true ;
}
2010-12-23 22:57:28 +03:00
static bool test_Lookup_simple ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2003-11-21 16:14:17 +03:00
{
NTSTATUS status ;
struct epm_Lookup r ;
2010-12-23 22:57:28 +03:00
struct policy_handle entry_handle ;
uint32_t num_ents = 0 ;
struct dcerpc_binding_handle * h = p - > binding_handle ;
2003-11-21 16:14:17 +03:00
2010-12-23 22:57:28 +03:00
ZERO_STRUCT ( entry_handle ) ;
2003-11-21 16:14:17 +03:00
2010-12-23 22:57:28 +03:00
torture_comment ( tctx , " Testing epm_Lookup \n " ) ;
/* get all elements */
r . in . inquiry_type = RPC_C_EP_ALL_ELTS ;
r . in . object = NULL ;
r . in . interface_id = NULL ;
r . in . vers_option = RPC_C_VERS_ALL ;
r . in . entry_handle = & entry_handle ;
2003-11-24 08:28:10 +03:00
r . in . max_ents = 10 ;
2010-12-23 22:57:28 +03:00
r . out . entry_handle = & entry_handle ;
2007-04-04 02:43:35 +04:00
r . out . num_ents = & num_ents ;
2003-11-21 16:14:17 +03:00
do {
2003-11-24 13:15:17 +03:00
int i ;
2005-01-06 12:24:41 +03:00
2010-12-23 22:57:28 +03:00
status = dcerpc_epm_Lookup_r ( h , tctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) | |
r . out . result ! = EPMAPPER_STATUS_OK ) {
2003-11-24 13:15:17 +03:00
break ;
}
2005-01-06 12:24:41 +03:00
2010-12-23 22:57:28 +03:00
torture_comment ( tctx ,
" epm_Lookup returned %d events, entry_handle: %s \n " ,
* r . out . num_ents ,
GUID_string ( tctx , & entry_handle . uuid ) ) ;
for ( i = 0 ; i < * r . out . num_ents ; i + + ) {
torture_comment ( tctx ,
2014-01-24 14:00:04 +04:00
" \n Found '%s' Object[%s] \n " ,
r . out . entries [ i ] . annotation ,
GUID_string ( tctx , & r . out . entries [ i ] . object ) ) ;
2005-01-06 12:24:41 +03:00
2007-08-28 20:24:18 +04:00
display_tower ( tctx , & r . out . entries [ i ] . tower - > tower ) ;
2003-11-21 16:14:17 +03:00
}
2010-12-23 22:57:28 +03:00
} while ( NT_STATUS_IS_OK ( status ) & &
r . out . result = = EPMAPPER_STATUS_OK & &
2006-11-22 19:55:21 +03:00
* r . out . num_ents = = r . in . max_ents & &
2012-03-18 20:44:24 +04:00
! ndr_policy_handle_empty ( & entry_handle ) ) ;
2003-11-21 16:14:17 +03:00
2010-12-23 22:57:28 +03:00
torture_assert_ntstatus_ok ( tctx , status , " epm_Lookup failed " ) ;
torture_assert ( tctx , r . out . result = = EPMAPPER_STATUS_NO_MORE_ENTRIES , " epm_Lookup failed " ) ;
torture_assert ( tctx ,
2012-03-18 20:44:24 +04:00
ndr_policy_handle_empty ( & entry_handle ) ,
2010-12-23 22:57:28 +03:00
" epm_Lookup failed - The policy handle should be emtpy. " ) ;
2003-11-21 16:14:17 +03:00
2007-08-28 20:24:18 +04:00
return true ;
2003-11-21 16:14:17 +03:00
}
2010-12-24 12:35:47 +03:00
/*
* This test starts a epm_Lookup request , but doesn ' t finish the
* call terminates the search . So it will call epm_LookupHandleFree .
*/
static bool test_Lookup_terminate_search ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
bool ok ;
NTSTATUS status ;
struct epm_Lookup r ;
struct policy_handle entry_handle ;
uint32_t i , num_ents = 0 ;
struct dcerpc_binding_handle * h = p - > binding_handle ;
ZERO_STRUCT ( entry_handle ) ;
torture_comment ( tctx , " Testing epm_Lookup and epm_LookupHandleFree \n " ) ;
/* get all elements */
r . in . inquiry_type = RPC_C_EP_ALL_ELTS ;
r . in . object = NULL ;
r . in . interface_id = NULL ;
r . in . vers_option = RPC_C_VERS_ALL ;
r . in . entry_handle = & entry_handle ;
r . in . max_ents = 2 ;
r . out . entry_handle = & entry_handle ;
r . out . num_ents = & num_ents ;
status = dcerpc_epm_Lookup_r ( h , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " epm_Lookup failed " ) ;
torture_assert ( tctx , r . out . result = = EPMAPPER_STATUS_OK , " epm_Lookup failed " ) ;
torture_comment ( tctx ,
" epm_Lookup returned %d events, entry_handle: %s \n " ,
* r . out . num_ents ,
GUID_string ( tctx , & entry_handle . uuid ) ) ;
for ( i = 0 ; i < * r . out . num_ents ; i + + ) {
torture_comment ( tctx ,
" \n Found '%s' \n " ,
r . out . entries [ i ] . annotation ) ;
}
ok = test_LookupHandleFree ( tctx ,
h ,
& entry_handle ) ;
if ( ! ok ) {
return false ;
}
return true ;
}
2010-10-05 13:17:31 +04:00
static bool test_Insert_noreplace ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2005-01-09 17:24:51 +03:00
{
2010-10-05 13:17:31 +04:00
bool ok ;
2005-01-09 17:24:51 +03:00
NTSTATUS status ;
struct epm_Insert r ;
2010-10-05 13:17:31 +04:00
struct dcerpc_binding * b ;
struct dcerpc_binding_handle * h = p - > binding_handle ;
2005-01-09 17:24:51 +03:00
2010-10-05 13:17:31 +04:00
torture_comment ( tctx , " Testing epm_Insert(noreplace) and epm_Delete \n " ) ;
if ( torture_setting_bool ( tctx , " samba4 " , false ) ) {
torture_skip ( tctx , " Skip Insert test against Samba4 " ) ;
}
2005-01-09 17:24:51 +03:00
2010-10-05 13:17:31 +04:00
r . in . num_ents = 1 ;
2007-08-28 20:24:18 +04:00
r . in . entries = talloc_array ( tctx , struct epm_entry_t , 1 ) ;
2010-10-05 13:17:31 +04:00
2005-01-09 17:24:51 +03:00
ZERO_STRUCT ( r . in . entries [ 0 ] . object ) ;
r . in . entries [ 0 ] . annotation = " smbtorture endpoint " ;
2010-10-05 13:17:31 +04:00
status = dcerpc_parse_binding ( tctx , " ncalrpc:[SMBTORTURE] " , & b ) ;
torture_assert_ntstatus_ok ( tctx ,
status ,
" Unable to generate dcerpc_binding struct " ) ;
2005-01-09 17:24:51 +03:00
2007-08-28 20:24:18 +04:00
r . in . entries [ 0 ] . tower = talloc ( tctx , struct epm_twr_t ) ;
2005-01-09 17:24:51 +03:00
2010-10-05 13:17:31 +04:00
status = dcerpc_binding_build_tower ( tctx ,
b ,
& r . in . entries [ 0 ] . tower - > tower ) ;
torture_assert_ntstatus_ok ( tctx ,
status ,
" Unable to build tower from binding struct " ) ;
2005-01-09 17:24:51 +03:00
r . in . replace = 0 ;
2010-10-05 13:17:31 +04:00
status = dcerpc_epm_Insert_r ( h , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " epm_Insert failed " ) ;
2005-01-09 17:24:51 +03:00
2010-10-05 13:17:31 +04:00
torture_assert ( tctx , r . out . result = = 0 , " epm_Insert failed " ) ;
2005-01-09 17:24:51 +03:00
2011-01-26 00:50:42 +03:00
ok = test_Delete ( tctx , h , " smbtorture " , b ) ;
2010-10-05 13:17:31 +04:00
if ( ! ok ) {
return false ;
2005-01-09 17:24:51 +03:00
}
2007-08-28 20:24:18 +04:00
return true ;
2005-01-09 17:24:51 +03:00
}
2011-01-18 18:42:34 +03:00
#if 0
/*
* The MS - RPCE documentation states that this function isn ' t implemented and
* SHOULD NOT be called by a client .
*/
2007-08-28 20:24:18 +04:00
static bool test_InqObject ( struct torture_context * tctx , struct dcerpc_pipe * p )
2005-01-01 01:12:44 +03:00
{
NTSTATUS status ;
struct epm_InqObject r ;
2010-03-15 12:59:05 +03:00
struct dcerpc_binding_handle * b = p - > binding_handle ;
2005-01-01 01:12:44 +03:00
2007-08-28 20:24:18 +04:00
r . in . epm_object = talloc ( tctx , struct GUID ) ;
2007-08-20 01:23:03 +04:00
* r . in . epm_object = ndr_table_epmapper . syntax_id . uuid ;
2005-01-01 01:12:44 +03:00
2010-03-15 12:59:05 +03:00
status = dcerpc_epm_InqObject_r ( b , tctx , & r ) ;
2007-08-28 20:24:18 +04:00
torture_assert_ntstatus_ok ( tctx , status , " InqObject failed " ) ;
2005-01-01 01:12:44 +03:00
2007-08-28 20:24:18 +04:00
return true ;
2005-01-01 01:12:44 +03:00
}
2011-01-18 18:42:34 +03:00
# endif
2005-01-01 01:12:44 +03:00
2007-08-28 20:24:18 +04:00
struct torture_suite * torture_rpc_epmapper ( TALLOC_CTX * mem_ctx )
2003-11-21 16:14:17 +03:00
{
2010-12-11 05:26:31 +03:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " epmapper " ) ;
2007-08-28 20:24:18 +04:00
struct torture_rpc_tcase * tcase ;
2010-12-11 05:26:31 +03:00
2010-10-05 13:17:31 +04:00
tcase = torture_suite_add_rpc_iface_tcase ( suite ,
" epmapper " ,
& ndr_table_epmapper ) ;
2003-11-21 16:14:17 +03:00
2011-01-26 16:18:15 +03:00
/* This is a stack */
2010-10-05 13:17:31 +04:00
torture_rpc_tcase_add_test ( tcase ,
2011-01-26 16:18:15 +03:00
" Map_simple " ,
test_Map_simple ) ;
2010-12-24 12:35:47 +03:00
torture_rpc_tcase_add_test ( tcase ,
2011-01-26 16:18:15 +03:00
" Map_full " ,
test_Map_full ) ;
2010-12-23 22:57:28 +03:00
torture_rpc_tcase_add_test ( tcase ,
" Lookup_simple " ,
test_Lookup_simple ) ;
2011-01-25 20:49:32 +03:00
torture_rpc_tcase_add_test ( tcase ,
2011-01-26 16:18:15 +03:00
" Lookup_terminate_search " ,
test_Lookup_terminate_search ) ;
2011-01-12 19:41:05 +03:00
torture_rpc_tcase_add_test ( tcase ,
2011-01-26 16:18:15 +03:00
" Insert_noreplace " ,
test_Insert_noreplace ) ;
2011-01-12 19:41:05 +03:00
2007-08-28 20:24:18 +04:00
return suite ;
2003-11-21 16:14:17 +03:00
}
2010-10-05 13:17:31 +04:00
/* vim: set ts=8 sw=8 noet cindent syntax=c.doxygen: */