2003-11-19 12:15:46 +03:00
/*
Unix SMB / CIFS implementation .
test suite for srvsvc rpc operations
Copyright ( C ) Stefan ( metze ) Metzmacher 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-19 12:15:46 +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-19 12:15:46 +03:00
*/
# include "includes.h"
2006-01-03 16:41:17 +03:00
# include "torture/torture.h"
2004-11-01 13:30:34 +03:00
# include "librpc/gen_ndr/ndr_srvsvc.h"
2006-03-15 02:35:30 +03:00
# include "librpc/gen_ndr/ndr_srvsvc_c.h"
2006-03-14 18:02:05 +03:00
# include "torture/rpc/rpc.h"
2003-11-19 12:15:46 +03:00
2004-07-16 13:10:36 +04:00
/**************************/
/* srvsvc_NetCharDev */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetCharDevGetInfo ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2004-07-16 13:10:36 +04:00
const char * devname )
{
NTSTATUS status ;
struct srvsvc_NetCharDevGetInfo r ;
uint32_t levels [ ] = { 0 , 1 } ;
int i ;
2007-09-02 03:01:33 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 13:10:36 +04:00
r . in . device_name = devname ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetCharDevGetInfo level %u on device '%s' \n " ,
2004-07-16 13:10:36 +04:00
r . in . level , r . in . device_name ) ;
2007-09-02 03:01:33 +04:00
status = dcerpc_srvsvc_NetCharDevGetInfo ( p , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " NetCharDevGetInfo failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetCharDevGetInfo failed " ) ;
2004-07-16 13:10:36 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:10:36 +04:00
}
2007-09-02 03:01:33 +04:00
static bool test_NetCharDevControl ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2004-07-16 13:10:36 +04:00
const char * devname )
{
NTSTATUS status ;
struct srvsvc_NetCharDevControl r ;
uint32_t opcodes [ ] = { 0 , 1 } ;
int i ;
2007-09-02 03:01:33 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 13:10:36 +04:00
r . in . device_name = devname ;
for ( i = 0 ; i < ARRAY_SIZE ( opcodes ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
r . in . opcode = opcodes [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetCharDevControl opcode %u on device '%s' \n " ,
2004-07-16 13:10:36 +04:00
r . in . opcode , r . in . device_name ) ;
2007-09-02 03:01:33 +04:00
status = dcerpc_srvsvc_NetCharDevControl ( p , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " NetCharDevControl failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetCharDevControl failed " ) ;
2004-07-16 13:10:36 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:10:36 +04:00
}
2007-08-28 17:49:34 +04:00
static bool test_NetCharDevEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2004-07-16 13:10:36 +04:00
{
NTSTATUS status ;
struct srvsvc_NetCharDevEnum r ;
struct srvsvc_NetCharDevCtr0 c0 ;
2004-07-16 13:25:52 +04:00
uint32_t levels [ ] = { 0 , 1 } ;
2004-07-16 13:10:36 +04:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 13:10:36 +04:00
r . in . ctr . ctr0 = & c0 ;
r . in . ctr . ctr0 - > count = 0 ;
r . in . ctr . ctr0 - > array = NULL ;
2005-02-10 08:09:35 +03:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2004-07-16 13:10:36 +04:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
int j ;
ZERO_STRUCT ( r . out ) ;
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetCharDevEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetCharDevEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetCharDevEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetCharDevEnum failed: %s \n " , win_errstr ( r . out . result ) ) ;
continue ;
}
2004-07-16 13:10:36 +04:00
/* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
if ( r . in . level = = 1 ) {
for ( j = 0 ; j < r . out . ctr . ctr1 - > count ; j + + ) {
const char * device ;
device = r . out . ctr . ctr1 - > array [ j ] . device ;
2007-08-28 17:49:34 +04:00
if ( ! test_NetCharDevGetInfo ( p , tctx , device ) ) {
2007-09-02 03:01:33 +04:00
return false ;
2004-07-16 13:10:36 +04:00
}
2007-08-28 17:49:34 +04:00
if ( ! test_NetCharDevControl ( p , tctx , device ) ) {
2007-09-02 03:01:33 +04:00
return false ;
2004-07-16 13:10:36 +04:00
}
}
}
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:10:36 +04:00
}
2003-11-19 12:15:46 +03:00
2004-07-16 13:25:52 +04:00
/**************************/
/* srvsvc_NetCharDevQ */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetCharDevQGetInfo ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2004-07-16 13:25:52 +04:00
const char * devicequeue )
{
NTSTATUS status ;
struct srvsvc_NetCharDevQGetInfo r ;
uint32_t levels [ ] = { 0 , 1 } ;
int i ;
2007-09-02 03:01:33 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 13:25:52 +04:00
r . in . queue_name = devicequeue ;
2007-09-02 03:01:33 +04:00
r . in . user = talloc_asprintf ( tctx , " Administrator " ) ;
2004-07-16 13:25:52 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetCharDevQGetInfo level %u on devicequeue '%s' \n " ,
2004-07-16 13:25:52 +04:00
r . in . level , r . in . queue_name ) ;
2007-09-02 03:01:33 +04:00
status = dcerpc_srvsvc_NetCharDevQGetInfo ( p , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " NetCharDevQGetInfo failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetCharDevQGetInfo failed " ) ;
2004-07-16 13:25:52 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:25:52 +04:00
}
#if 0
2007-09-02 03:01:33 +04:00
static bool test_NetCharDevQSetInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-07-16 13:25:52 +04:00
const char * devicequeue )
{
NTSTATUS status ;
struct srvsvc_NetCharDevQSetInfo r ;
uint32_t parm_error ;
uint32_t levels [ ] = { 0 , 1 } ;
int i ;
2007-09-02 03:01:33 +04:00
bool ret = true ;
2004-07-16 13:25:52 +04:00
r . in . server_unc = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
r . in . queue_name = devicequeue ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
parm_error = 0 ;
r . in . level = levels [ i ] ;
2006-09-11 05:22:28 +04:00
d_printf ( " testing NetCharDevQSetInfo level %u on devicequeue '%s' \n " ,
2004-07-16 13:25:52 +04:00
r . in . level , devicequeue ) ;
switch ( r . in . level ) {
case 0 :
2005-01-27 10:08:20 +03:00
r . in . info . info0 = talloc ( mem_ctx , struct srvsvc_NetCharDevQInfo0 ) ;
2004-07-16 13:25:52 +04:00
r . in . info . info0 - > device = r . in . queue_name ;
break ;
case 1 :
2005-01-27 10:08:20 +03:00
r . in . info . info1 = talloc ( mem_ctx , struct srvsvc_NetCharDevQInfo1 ) ;
2004-07-16 13:25:52 +04:00
r . in . info . info1 - > device = r . in . queue_name ;
r . in . info . info1 - > priority = 0x000 ;
r . in . info . info1 - > devices = r . in . queue_name ;
r . in . info . info1 - > users = 0x000 ;
r . in . info . info1 - > num_ahead = 0x000 ;
break ;
default :
break ;
}
r . in . parm_error = & parm_error ;
status = dcerpc_srvsvc_NetCharDevQSetInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-09-11 05:22:28 +04:00
d_printf ( " NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s \n " ,
2004-07-16 13:25:52 +04:00
r . in . level , r . in . queue_name , nt_errstr ( status ) ) ;
2007-09-02 03:01:33 +04:00
ret = false ;
2004-07-16 13:25:52 +04:00
continue ;
}
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
2006-09-11 05:22:28 +04:00
d_printf ( " NetCharDevQSetInfo level %u on devicequeue '%s' failed - %s \n " ,
2004-07-16 13:25:52 +04:00
r . in . level , r . in . queue_name , win_errstr ( r . out . result ) ) ;
continue ;
}
}
return ret ;
}
# endif
2007-09-02 03:01:33 +04:00
static bool test_NetCharDevQEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2004-07-16 13:25:52 +04:00
{
NTSTATUS status ;
struct srvsvc_NetCharDevQEnum r ;
struct srvsvc_NetCharDevQCtr0 c0 ;
uint32_t levels [ ] = { 0 , 1 } ;
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
r . in . user = talloc_asprintf ( tctx , " %s " , " Administrator " ) ;
2004-07-16 13:25:52 +04:00
r . in . ctr . ctr0 = & c0 ;
r . in . ctr . ctr0 - > count = 0 ;
r . in . ctr . ctr0 - > array = NULL ;
2005-02-10 08:09:35 +03:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2004-07-16 13:25:52 +04:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
int j ;
ZERO_STRUCT ( r . out ) ;
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetCharDevQEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetCharDevQEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetCharDevQEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetCharDevQEnum failed: %s \n " , win_errstr ( r . out . result ) ) ;
continue ;
}
2004-07-16 13:25:52 +04:00
/* call test_NetCharDevGetInfo and test_NetCharDevControl for each returned share */
if ( r . in . level = = 1 ) {
for ( j = 0 ; j < r . out . ctr . ctr1 - > count ; j + + ) {
const char * device ;
device = r . out . ctr . ctr1 - > array [ j ] . device ;
2007-08-28 17:49:34 +04:00
if ( ! test_NetCharDevQGetInfo ( p , tctx , device ) ) {
2007-09-02 03:01:33 +04:00
return false ;
2004-07-16 13:25:52 +04:00
}
}
}
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:25:52 +04:00
}
2004-07-19 10:41:34 +04:00
/**************************/
/* srvsvc_NetConn */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetConnEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetConnEnum r ;
struct srvsvc_NetConnCtr0 c0 ;
2004-05-25 20:24:13 +04:00
uint32_t levels [ ] = { 0 , 1 } ;
2003-11-19 12:15:46 +03:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
r . in . path = talloc_asprintf ( tctx , " %s " , " ADMIN$ " ) ;
2003-11-20 01:10:20 +03:00
r . in . ctr . ctr0 = & c0 ;
r . in . ctr . ctr0 - > count = 0 ;
r . in . ctr . ctr0 - > array = NULL ;
2004-05-25 20:24:13 +04:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2003-11-19 12:15:46 +03:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2003-11-20 01:10:20 +03:00
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetConnEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetConnEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetConnEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetConnEnum failed: %s \n " , win_errstr ( r . out . result ) ) ;
}
2003-11-19 12:15:46 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2004-07-19 10:41:34 +04:00
/**************************/
/* srvsvc_NetFile */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetFileEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetFileEnum r ;
struct srvsvc_NetFileCtr3 c3 ;
2004-05-25 20:24:13 +04:00
uint32_t levels [ ] = { 2 , 3 } ;
2003-11-19 12:15:46 +03:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2003-11-19 12:15:46 +03:00
r . in . path = NULL ;
r . in . user = NULL ;
2003-11-20 01:10:20 +03:00
r . in . ctr . ctr3 = & c3 ;
r . in . ctr . ctr3 - > count = 0 ;
r . in . ctr . ctr3 - > array = NULL ;
2004-05-25 20:24:13 +04:00
r . in . max_buffer = ( uint32_t ) 4096 ;
2003-11-19 12:15:46 +03:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2003-11-20 01:10:20 +03:00
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetFileEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetFileEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetFileEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetFileEnum failed: %s \n " , win_errstr ( r . out . result ) ) ;
}
2003-11-19 12:15:46 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2004-07-19 10:41:34 +04:00
/**************************/
/* srvsvc_NetSess */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetSessEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetSessEnum r ;
struct srvsvc_NetSessCtr0 c0 ;
2004-05-25 20:24:13 +04:00
uint32_t levels [ ] = { 0 , 1 , 2 , 10 , 502 } ;
2003-11-19 12:15:46 +03:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2003-11-19 12:15:46 +03:00
r . in . client = NULL ;
r . in . user = NULL ;
2003-11-20 01:10:20 +03:00
r . in . ctr . ctr0 = & c0 ;
r . in . ctr . ctr0 - > count = 0 ;
r . in . ctr . ctr0 - > array = NULL ;
2004-05-25 20:24:13 +04:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2003-11-19 12:15:46 +03:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2003-11-20 01:10:20 +03:00
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetSessEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetSessEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetSessEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetSessEnum failed: %s \n " , win_errstr ( r . out . result ) ) ;
}
2003-11-19 12:15:46 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2004-07-16 12:56:11 +04:00
/**************************/
/* srvsvc_NetShare */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetShareCheck ( struct dcerpc_pipe * p , struct torture_context * tctx ,
2006-03-31 17:41:49 +04:00
const char * device_name )
{
NTSTATUS status ;
struct srvsvc_NetShareCheck r ;
2007-09-02 03:01:33 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2006-03-31 17:41:49 +04:00
r . in . device_name = device_name ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx ,
" testing NetShareCheck on device '%s' \n " , r . in . device_name ) ;
2006-03-31 17:41:49 +04:00
2007-09-02 03:01:33 +04:00
status = dcerpc_srvsvc_NetShareCheck ( p , tctx , & r ) ;
torture_assert_ntstatus_ok ( tctx , status , " dcerpc_srvsvc_NetShareCheck failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetShareCheck failed " ) ;
return true ;
2006-03-31 17:41:49 +04:00
}
2007-08-28 17:49:34 +04:00
static bool test_NetShareGetInfo ( struct torture_context * tctx ,
struct dcerpc_pipe * p ,
const char * sharename , bool admin )
2004-05-14 04:24:00 +04:00
{
NTSTATUS status ;
struct srvsvc_NetShareGetInfo r ;
2006-03-31 17:41:49 +04:00
struct {
uint32_t level ;
WERROR anon_status ;
WERROR admin_status ;
} levels [ ] = {
{ 0 , WERR_OK , WERR_OK } ,
{ 1 , WERR_OK , WERR_OK } ,
{ 2 , WERR_ACCESS_DENIED , WERR_OK } ,
{ 501 , WERR_OK , WERR_OK } ,
{ 502 , WERR_ACCESS_DENIED , WERR_OK } ,
{ 1005 , WERR_OK , WERR_OK } ,
} ;
2004-05-14 04:24:00 +04:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 12:56:11 +04:00
r . in . share_name = sharename ;
2004-05-14 04:24:00 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2006-03-31 17:41:49 +04:00
WERROR expected ;
r . in . level = levels [ i ] . level ;
expected = levels [ i ] . anon_status ;
if ( admin ) expected = levels [ i ] . admin_status ;
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2004-05-14 04:24:00 +04:00
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetShareGetInfo level %u on share '%s' \n " ,
2004-05-14 04:24:00 +04:00
r . in . level , r . in . share_name ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareGetInfo ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareGetInfo failed " ) ;
torture_assert_werr_equal ( tctx , r . out . result , expected , " NetShareGetInfo failed " ) ;
2004-05-14 04:24:00 +04:00
2006-03-31 17:41:49 +04:00
if ( r . in . level ! = 2 ) continue ;
if ( ! r . out . info . info2 | | ! r . out . info . info2 - > path ) continue ;
2007-08-28 17:49:34 +04:00
if ( ! test_NetShareCheck ( p , tctx , r . out . info . info2 - > path ) ) {
2007-09-02 03:01:33 +04:00
return false ;
2006-03-31 17:41:49 +04:00
}
2004-12-31 09:19:05 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-12-31 09:19:05 +03:00
}
2007-08-28 17:49:34 +04:00
static bool test_NetShareGetInfoAdminFull ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareGetInfo ( tctx , p , " ADMIN$ " , true ) ;
}
static bool test_NetShareGetInfoAdminAnon ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareGetInfo ( tctx , p , " ADMIN$ " , false ) ;
}
static bool test_NetShareAddSetDel ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2006-09-21 00:32:36 +04:00
{
NTSTATUS status ;
struct srvsvc_NetShareAdd a ;
struct srvsvc_NetShareSetInfo r ;
struct srvsvc_NetShareGetInfo q ;
struct srvsvc_NetShareDel d ;
struct {
uint32_t level ;
WERROR expected ;
} levels [ ] = {
{ 0 , WERR_UNKNOWN_LEVEL } ,
{ 1 , WERR_OK } ,
{ 2 , WERR_OK } ,
{ 501 , WERR_UNKNOWN_LEVEL } ,
{ 502 , WERR_OK } ,
{ 1004 , WERR_OK } ,
{ 1005 , WERR_OK } ,
{ 1006 , WERR_OK } ,
/* { 1007, WERR_OK }, */
{ 1501 , WERR_OK } ,
} ;
int i ;
a . in . server_unc = r . in . server_unc = q . in . server_unc = d . in . server_unc =
2007-08-28 17:49:34 +04:00
talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
r . in . share_name = talloc_strdup ( tctx , " testshare " ) ;
2006-09-21 00:32:36 +04:00
a . in . level = 2 ;
2007-08-28 17:49:34 +04:00
a . in . info . info2 = talloc ( tctx , struct srvsvc_NetShareInfo2 ) ;
2006-09-21 00:32:36 +04:00
a . in . info . info2 - > name = r . in . share_name ;
a . in . info . info2 - > type = STYPE_DISKTREE ;
2007-08-28 17:49:34 +04:00
a . in . info . info2 - > comment = talloc_strdup ( tctx , " test comment " ) ;
2006-09-21 00:32:36 +04:00
a . in . info . info2 - > permissions = 123434566 ;
a . in . info . info2 - > max_users = - 1 ;
a . in . info . info2 - > current_users = 0 ;
2007-08-28 17:49:34 +04:00
a . in . info . info2 - > path = talloc_strdup ( tctx , " C: \\ " ) ;
2006-09-21 00:32:36 +04:00
a . in . info . info2 - > password = NULL ;
a . in . parm_error = NULL ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareAdd ( p , tctx , & a ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareAdd level 2 on share 'testshare' failed " ) ;
torture_assert_werr_ok ( tctx , a . out . result , " NetShareAdd level 2 on share 'testshare' failed " ) ;
2006-09-21 00:32:36 +04:00
r . in . parm_error = NULL ;
q . in . level = 502 ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
r . in . level = levels [ i ] . level ;
ZERO_STRUCT ( r . out ) ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetShareSetInfo level %u on share '%s' \n " ,
2006-09-21 00:32:36 +04:00
r . in . level , r . in . share_name ) ;
switch ( levels [ i ] . level ) {
case 0 :
2007-08-28 17:49:34 +04:00
r . in . info . info0 = talloc ( tctx , struct srvsvc_NetShareInfo0 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info0 - > name = r . in . share_name ;
break ;
case 1 :
2007-08-28 17:49:34 +04:00
r . in . info . info1 = talloc ( tctx , struct srvsvc_NetShareInfo1 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info1 - > name = r . in . share_name ;
r . in . info . info1 - > type = STYPE_DISKTREE ;
2007-08-28 17:49:34 +04:00
r . in . info . info1 - > comment = talloc_strdup ( tctx , " test comment 1 " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 2 :
2007-08-28 17:49:34 +04:00
r . in . info . info2 = talloc ( tctx , struct srvsvc_NetShareInfo2 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info2 - > name = r . in . share_name ;
r . in . info . info2 - > type = STYPE_DISKTREE ;
2007-08-28 17:49:34 +04:00
r . in . info . info2 - > comment = talloc_strdup ( tctx , " test comment 2 " ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info2 - > permissions = 0 ;
r . in . info . info2 - > max_users = 2 ;
r . in . info . info2 - > current_users = 1 ;
2007-08-28 17:49:34 +04:00
r . in . info . info2 - > path = talloc_strdup ( tctx , " ::BLaH:: " ) ; /* "C:\\"); */
2006-09-21 00:32:36 +04:00
r . in . info . info2 - > password = NULL ;
break ;
case 501 :
2007-08-28 17:49:34 +04:00
r . in . info . info501 = talloc ( tctx , struct srvsvc_NetShareInfo501 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info501 - > name = r . in . share_name ;
r . in . info . info501 - > type = STYPE_DISKTREE ;
2007-08-28 17:49:34 +04:00
r . in . info . info501 - > comment = talloc_strdup ( tctx , " test comment 501 " ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info501 - > csc_policy = 0 ;
break ;
case 502 :
2007-08-28 17:49:34 +04:00
r . in . info . info502 = talloc ( tctx , struct srvsvc_NetShareInfo502 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info502 - > name = r . in . share_name ;
r . in . info . info502 - > type = STYPE_DISKTREE ;
2007-08-28 17:49:34 +04:00
r . in . info . info502 - > comment = talloc_strdup ( tctx , " test comment 502 " ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info502 - > permissions = 0 ;
r . in . info . info502 - > max_users = 502 ;
r . in . info . info502 - > current_users = 1 ;
2007-08-28 17:49:34 +04:00
r . in . info . info502 - > path = talloc_strdup ( tctx , " C: \\ " ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info502 - > password = NULL ;
r . in . info . info502 - > unknown = 0 ;
r . in . info . info502 - > sd = NULL ;
break ;
case 1004 :
2007-08-28 17:49:34 +04:00
r . in . info . info1004 = talloc ( tctx , struct srvsvc_NetShareInfo1004 ) ;
r . in . info . info1004 - > comment = talloc_strdup ( tctx , " test comment 1004 " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 1005 :
2007-08-28 17:49:34 +04:00
r . in . info . info1005 = talloc ( tctx , struct srvsvc_NetShareInfo1005 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info1005 - > dfs_flags = 0 ;
break ;
case 1006 :
2007-08-28 17:49:34 +04:00
r . in . info . info1006 = talloc ( tctx , struct srvsvc_NetShareInfo1006 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info1006 - > max_users = 1006 ;
break ;
/* case 1007:
2007-08-28 17:49:34 +04:00
r . in . info . info1007 = talloc ( tctx , struct srvsvc_NetShareInfo1007 ) ;
2006-09-21 00:32:36 +04:00
r . in . info . info1007 - > flags = 0 ;
2007-08-28 17:49:34 +04:00
r . in . info . info1007 - > alternate_directory_name = talloc_strdup ( tctx , " test " ) ;
2006-09-21 00:32:36 +04:00
break ;
*/
case 1501 :
2007-08-28 17:49:34 +04:00
r . in . info . info1501 = talloc_zero ( tctx , struct sec_desc_buf ) ;
2006-09-21 00:32:36 +04:00
break ;
}
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareSetInfo ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareGetInfo failed " ) ;
torture_assert_werr_equal ( tctx , r . out . result , levels [ i ] . expected , " NetShareSetInfo failed " ) ;
2006-09-21 00:32:36 +04:00
q . in . share_name = r . in . share_name ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareGetInfo ( p , tctx , & q ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareGetInfo failed " ) ;
torture_assert_werr_ok ( tctx , q . out . result , " NetShareGetInfo failed " ) ;
torture_assert_str_equal ( tctx , q . out . info . info502 - > name , r . in . share_name ,
" share name invalid " ) ;
2006-09-21 00:32:36 +04:00
switch ( levels [ i ] . level ) {
case 0 :
break ;
case 1 :
2007-09-02 03:01:33 +04:00
torture_assert_str_equal ( tctx , q . out . info . info502 - > comment , " test comment 1 " , " comment " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 2 :
2007-09-02 03:01:33 +04:00
torture_assert_str_equal ( tctx , q . out . info . info502 - > comment , " test comment 2 " , " comment " ) ;
torture_assert_int_equal ( tctx , q . out . info . info2 - > max_users , 2 , " max users " ) ;
torture_assert_str_equal ( tctx , q . out . info . info2 - > path , " C: \\ " , " path " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 501 :
2007-09-02 03:01:33 +04:00
torture_assert_str_equal ( tctx , q . out . info . info501 - > comment , " test comment 501 " , " comment " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 502 :
2007-09-02 03:01:33 +04:00
torture_assert_str_equal ( tctx , q . out . info . info502 - > comment , " test comment 502 " , " comment " ) ;
torture_assert_int_equal ( tctx , q . out . info . info2 - > max_users , 502 , " max users " ) ;
torture_assert_str_equal ( tctx , q . out . info . info2 - > path , " C: \\ " , " path " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 1004 :
2007-09-02 03:01:33 +04:00
torture_assert_str_equal ( tctx , q . out . info . info502 - > comment , " test comment 1004 " ,
" comment " ) ;
2006-09-21 00:32:36 +04:00
break ;
case 1005 :
break ;
case 1006 :
2007-09-02 03:01:33 +04:00
torture_assert_int_equal ( tctx , q . out . info . info2 - > max_users , 1006 , " Max users " ) ;
2006-09-21 00:32:36 +04:00
break ;
/* case 1007:
break ;
*/
case 1501 :
break ;
}
}
d . in . share_name = r . in . share_name ;
d . in . reserved = 0 ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareDel ( p , tctx , & d ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareDel on share 'testshare502' failed " ) ;
torture_assert_werr_ok ( tctx , a . out . result , " NetShareDel on share 'testshare502' failed " ) ;
2006-09-21 00:32:36 +04:00
2007-09-02 03:01:33 +04:00
return true ;
2006-09-21 00:32:36 +04:00
}
2004-07-19 10:41:34 +04:00
/**************************/
/* srvsvc_NetShare */
/**************************/
2007-08-28 17:49:34 +04:00
static bool test_NetShareEnumAll ( struct torture_context * tctx ,
struct dcerpc_pipe * p ,
bool admin )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetShareEnumAll r ;
struct srvsvc_NetShareCtr0 c0 ;
2006-03-31 17:41:49 +04:00
struct {
uint32_t level ;
WERROR anon_status ;
WERROR admin_status ;
} levels [ ] = {
{ 0 , WERR_OK , WERR_OK } ,
{ 1 , WERR_OK , WERR_OK } ,
{ 2 , WERR_ACCESS_DENIED , WERR_OK } ,
{ 501 , WERR_ACCESS_DENIED , WERR_OK } ,
{ 502 , WERR_ACCESS_DENIED , WERR_OK } ,
} ;
2003-11-19 12:15:46 +03:00
int i ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle ;
2003-11-20 08:34:02 +03:00
ZERO_STRUCT ( c0 ) ;
2003-11-19 12:15:46 +03:00
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2003-11-20 01:10:20 +03:00
r . in . ctr . ctr0 = & c0 ;
2004-05-25 20:24:13 +04:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2003-11-20 08:34:02 +03:00
r . in . resume_handle = & resume_handle ;
r . out . resume_handle = & resume_handle ;
2003-11-19 12:15:46 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2004-05-14 04:24:00 +04:00
int j ;
2006-03-31 17:41:49 +04:00
WERROR expected ;
r . in . level = levels [ i ] . level ;
expected = levels [ i ] . anon_status ;
if ( admin ) expected = levels [ i ] . admin_status ;
2004-05-14 04:24:00 +04:00
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2003-11-20 08:34:02 +03:00
resume_handle = 0 ;
2006-03-31 17:41:49 +04:00
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetShareEnumAll level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareEnumAll ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareEnumAll failed " ) ;
torture_assert_werr_equal ( tctx , r . out . result , expected , " NetShareEnumAll failed " ) ;
2004-05-14 04:24:00 +04:00
/* call srvsvc_NetShareGetInfo for each returned share */
2006-03-31 17:41:49 +04:00
if ( r . in . level = = 2 & & r . out . ctr . ctr2 ) {
2004-12-31 09:19:05 +03:00
for ( j = 0 ; j < r . out . ctr . ctr2 - > count ; j + + ) {
2004-05-14 04:24:00 +04:00
const char * name ;
2004-12-31 09:19:05 +03:00
name = r . out . ctr . ctr2 - > array [ j ] . name ;
2007-08-28 17:49:34 +04:00
if ( ! test_NetShareGetInfo ( tctx , p , name , admin ) ) {
2007-09-02 03:01:33 +04:00
return false ;
2004-12-31 09:19:05 +03:00
}
2004-05-14 04:24:00 +04:00
}
2003-11-19 12:15:46 +03:00
}
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2007-08-28 17:49:34 +04:00
static bool test_NetShareEnumAllFull ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareEnumAll ( tctx , p , true ) ;
}
static bool test_NetShareEnumAllAnon ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareEnumAll ( tctx , p , false ) ;
}
static bool test_NetShareEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p , bool admin )
2004-07-16 12:56:11 +04:00
{
NTSTATUS status ;
struct srvsvc_NetShareEnum r ;
struct srvsvc_NetShareCtr0 c0 ;
2006-03-31 17:41:49 +04:00
struct {
uint32_t level ;
WERROR anon_status ;
WERROR admin_status ;
} levels [ ] = {
{ 0 , WERR_OK , WERR_OK } ,
{ 1 , WERR_OK , WERR_OK } ,
{ 2 , WERR_ACCESS_DENIED , WERR_OK } ,
{ 501 , WERR_UNKNOWN_LEVEL , WERR_UNKNOWN_LEVEL } ,
{ 502 , WERR_ACCESS_DENIED , WERR_OK } ,
} ;
2004-07-16 12:56:11 +04:00
int i ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 12:56:11 +04:00
r . in . ctr . ctr0 = & c0 ;
r . in . ctr . ctr0 - > count = 0 ;
r . in . ctr . ctr0 - > array = NULL ;
r . in . max_buffer = ( uint32_t ) - 1 ;
r . in . resume_handle = NULL ;
2003-12-15 12:18:53 +03:00
2004-07-16 12:56:11 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2006-03-31 17:41:49 +04:00
WERROR expected ;
r . in . level = levels [ i ] . level ;
expected = levels [ i ] . anon_status ;
if ( admin ) expected = levels [ i ] . admin_status ;
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2006-03-31 17:41:49 +04:00
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetShareEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetShareEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetShareEnum failed " ) ;
torture_assert_werr_equal ( tctx , r . out . result , expected , " NetShareEnum failed " ) ;
2004-07-16 12:56:11 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 12:56:11 +04:00
}
2007-08-28 17:49:34 +04:00
static bool test_NetShareEnumFull ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareEnum ( tctx , p , true ) ;
}
static bool test_NetShareEnumAnon ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
{
return test_NetShareEnum ( tctx , p , false ) ;
}
2004-07-16 13:36:17 +04:00
/**************************/
/* srvsvc_NetSrv */
/**************************/
2007-08-28 17:49:34 +04:00
static bool test_NetSrvGetInfo ( struct torture_context * tctx ,
2007-09-02 06:53:18 +04:00
struct dcerpc_pipe * p )
2004-07-16 13:36:17 +04:00
{
NTSTATUS status ;
struct srvsvc_NetSrvGetInfo r ;
struct srvsvc_NetSrvInfo503 i503 ;
uint32_t levels [ ] = { 100 , 101 , 102 , 502 , 503 } ;
int i ;
uint32_t resume_handle ;
ZERO_STRUCT ( i503 ) ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-16 13:36:17 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
resume_handle = 0 ;
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetSrvGetInfo level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetSrvGetInfo ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetSrvGetInfo failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " NetSrvGetInfo failed: %s \n " , win_errstr ( r . out . result ) ) ;
}
2004-07-16 13:36:17 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2004-07-16 13:36:17 +04:00
}
2004-07-16 12:56:11 +04:00
/**************************/
/* srvsvc_NetDisk */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetDiskEnum ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetDiskEnum r ;
2004-05-25 20:24:13 +04:00
uint32_t levels [ ] = { 0 } ;
2003-11-19 12:15:46 +03:00
int i ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2003-11-19 12:15:46 +03:00
2006-03-31 17:41:49 +04:00
ZERO_STRUCT ( r . in ) ;
2003-12-15 13:21:09 +03:00
r . in . server_unc = NULL ;
r . in . resume_handle = & resume_handle ;
2003-11-19 12:15:46 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
ZERO_STRUCT ( r . out ) ;
2004-07-16 12:56:11 +04:00
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetDiskEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetDiskEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetDiskEnum failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetDiskEnum failed " ) ;
2003-11-19 12:15:46 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2004-07-16 12:56:11 +04:00
/**************************/
/* srvsvc_NetTransport */
/**************************/
2007-08-28 17:49:34 +04:00
static bool test_NetTransportEnum ( struct torture_context * tctx ,
2007-09-02 06:53:18 +04:00
struct dcerpc_pipe * p )
2003-11-19 12:15:46 +03:00
{
NTSTATUS status ;
struct srvsvc_NetTransportEnum r ;
struct srvsvc_NetTransportCtr0 c0 ;
2004-05-25 20:24:13 +04:00
uint32_t levels [ ] = { 0 , 1 } ;
2003-11-19 12:15:46 +03:00
int i ;
2007-09-02 06:53:18 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2005-12-25 00:32:52 +03:00
r . in . transports . ctr0 = & c0 ;
r . in . transports . ctr0 - > count = 0 ;
r . in . transports . ctr0 - > array = NULL ;
2004-05-25 20:24:13 +04:00
r . in . max_buffer = ( uint32_t ) - 1 ;
2003-11-19 12:15:46 +03:00
r . in . resume_handle = NULL ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
2004-07-16 12:56:11 +04:00
ZERO_STRUCT ( r . out ) ;
2003-11-20 01:10:20 +03:00
r . in . level = levels [ i ] ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetTransportEnum level %u \n " , r . in . level ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetTransportEnum ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetTransportEnum failed " ) ;
2007-09-02 06:53:18 +04:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
torture_comment ( tctx , " unexpected result: %s \n " , win_errstr ( r . out . result ) ) ;
}
2003-11-19 12:15:46 +03:00
}
2007-09-02 03:01:33 +04:00
return true ;
2003-11-19 12:15:46 +03:00
}
2004-07-19 10:14:00 +04:00
/**************************/
/* srvsvc_NetRemoteTOD */
/**************************/
2007-09-02 03:01:33 +04:00
static bool test_NetRemoteTOD ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2004-07-19 10:14:00 +04:00
{
NTSTATUS status ;
struct srvsvc_NetRemoteTOD r ;
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2004-07-19 10:14:00 +04:00
ZERO_STRUCT ( r . out ) ;
2007-09-02 03:01:33 +04:00
torture_comment ( tctx , " testing NetRemoteTOD \n " ) ;
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetRemoteTOD ( p , tctx , & r ) ;
2007-09-02 03:01:33 +04:00
torture_assert_ntstatus_ok ( tctx , status , " NetRemoteTOD failed " ) ;
torture_assert_werr_ok ( tctx , r . out . result , " NetRemoteTOD failed " ) ;
2004-07-19 10:14:00 +04:00
2007-09-02 03:01:33 +04:00
return true ;
2004-07-19 10:14:00 +04:00
}
2006-09-11 01:51:46 +04:00
/**************************/
/* srvsvc_NetName */
/**************************/
2007-08-28 17:49:34 +04:00
static bool test_NetNameValidate ( struct torture_context * tctx ,
struct dcerpc_pipe * p )
2006-09-11 01:51:46 +04:00
{
NTSTATUS status ;
struct srvsvc_NetNameValidate r ;
char * invalidc ;
2006-09-21 00:32:36 +04:00
char * name ;
int i , n , min , max ;
2006-09-11 01:51:46 +04:00
2007-08-28 17:49:34 +04:00
r . in . server_unc = talloc_asprintf ( tctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2006-09-11 01:51:46 +04:00
r . in . flags = 0x0 ;
2006-09-11 05:22:28 +04:00
d_printf ( " testing NetNameValidate \n " ) ;
2006-09-11 01:51:46 +04:00
/* valid path types only between 1 and 13 */
for ( i = 1 ; i < 14 ; i + + ) {
2006-09-11 02:06:49 +04:00
again :
2006-09-21 00:32:36 +04:00
/* let's limit ourselves to a maximum of 4096 bytes */
2007-08-28 17:49:34 +04:00
r . in . name = name = talloc_array ( tctx , char , 4097 ) ;
2006-09-21 00:32:36 +04:00
max = 4096 ;
min = 0 ;
n = max ;
while ( 1 ) {
/* Find maximum length accepted by this type */
ZERO_STRUCT ( r . out ) ;
r . in . name_type = i ;
memset ( name , ' A ' , n ) ;
name [ n ] = ' \0 ' ;
2006-09-11 01:51:46 +04:00
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetNameValidate ( p , tctx , & r ) ;
2006-09-11 01:51:46 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-09-11 05:22:28 +04:00
d_printf ( " NetNameValidate failed while checking maximum size (%s) \n " ,
2006-09-11 01:51:46 +04:00
nt_errstr ( status ) ) ;
break ;
}
2006-09-21 00:32:36 +04:00
if ( W_ERROR_IS_OK ( r . out . result ) ) {
min = n ;
n + = ( max - min + 1 ) / 2 ;
continue ;
} else {
if ( ( min + 1 ) > = max ) break ; /* found it */
max = n ;
n - = ( max - min ) / 2 ;
continue ;
2006-09-11 01:51:46 +04:00
}
}
2007-04-12 15:42:09 +04:00
talloc_free ( name ) ;
2006-09-11 01:51:46 +04:00
2006-09-21 00:32:36 +04:00
d_printf ( " Maximum length for type %2d, flags %08x: %d \n " , i , r . in . flags , max ) ;
2006-09-11 01:51:46 +04:00
/* find invalid chars for this type check only ASCII between 0x20 and 0x7e */
2007-08-28 17:49:34 +04:00
invalidc = talloc_strdup ( tctx , " " ) ;
2006-09-11 01:51:46 +04:00
for ( n = 0x20 ; n < 0x7e ; n + + ) {
2007-08-28 17:49:34 +04:00
r . in . name = name = talloc_asprintf ( tctx , " %c " , ( char ) n ) ;
2006-09-11 01:51:46 +04:00
2007-08-28 17:49:34 +04:00
status = dcerpc_srvsvc_NetNameValidate ( p , tctx , & r ) ;
2006-09-11 01:51:46 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-09-11 05:22:28 +04:00
d_printf ( " NetNameValidate failed while checking valid chars (%s) \n " ,
2006-09-11 01:51:46 +04:00
nt_errstr ( status ) ) ;
break ;
}
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
invalidc = talloc_asprintf_append ( invalidc , " %c " , ( char ) n ) ;
}
2007-04-12 15:42:09 +04:00
talloc_free ( name ) ;
2006-09-11 01:51:46 +04:00
}
2006-09-11 05:22:28 +04:00
d_printf ( " Invalid chars for type %2d, flags %08x: \" %s \" \n " , i , r . in . flags , invalidc ) ;
2006-09-11 02:06:49 +04:00
/* only two values are accepted for flags: 0x0 and 0x80000000 */
if ( r . in . flags = = 0x0 ) {
r . in . flags = 0x80000000 ;
goto again ;
}
r . in . flags = 0x0 ;
2006-09-11 01:51:46 +04:00
}
2007-09-02 03:01:33 +04:00
return true ;
2006-09-11 01:51:46 +04:00
}
2007-08-28 17:49:34 +04:00
struct torture_suite * torture_rpc_srvsvc ( TALLOC_CTX * mem_ctx )
2003-11-19 12:15:46 +03:00
{
2007-08-28 17:49:34 +04:00
struct torture_suite * suite = torture_suite_create ( mem_ctx , " SRVSVC " ) ;
2007-08-28 20:24:18 +04:00
struct torture_rpc_tcase * tcase ;
2007-08-31 19:43:03 +04:00
struct torture_test * test ;
2007-08-28 17:49:34 +04:00
tcase = torture_suite_add_rpc_iface_tcase ( suite , " srvsvc (admin access) " , & ndr_table_srvsvc ) ;
torture_rpc_tcase_add_test ( tcase , " NetCharDevEnum " , test_NetCharDevEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetCharDevQEnum " , test_NetCharDevQEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetConnEnum " , test_NetConnEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetFileEnum " , test_NetFileEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetSessEnum " , test_NetSessEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareEnumAll " , test_NetShareEnumAllFull ) ;
torture_rpc_tcase_add_test ( tcase , " NetSrvGetInfo " , test_NetSrvGetInfo ) ;
torture_rpc_tcase_add_test ( tcase , " NetDiskEnum " , test_NetDiskEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetTransportEnum " , test_NetTransportEnum ) ;
torture_rpc_tcase_add_test ( tcase , " NetRemoteTOD " , test_NetRemoteTOD ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareEnum " , test_NetShareEnumFull ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareGetInfo " , test_NetShareGetInfoAdminFull ) ;
2007-08-31 19:43:03 +04:00
test = torture_rpc_tcase_add_test ( tcase , " NetShareAddSetDel " ,
test_NetShareAddSetDel ) ;
test - > dangerous = true ;
2007-08-28 17:49:34 +04:00
torture_rpc_tcase_add_test ( tcase , " NetNameValidate " , test_NetNameValidate ) ;
2006-09-11 01:51:46 +04:00
2007-08-28 17:49:34 +04:00
tcase = torture_suite_add_anon_rpc_iface_tcase ( suite ,
" srvsvc anonymous access " ,
& ndr_table_srvsvc ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareEnumAll " ,
test_NetShareEnumAllAnon ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareEnum " ,
test_NetShareEnumAnon ) ;
torture_rpc_tcase_add_test ( tcase , " NetShareGetInfo " ,
test_NetShareGetInfoAdminAnon ) ;
return suite ;
2003-11-19 12:15:46 +03:00
}