2010-03-23 18:04:30 +03:00
/*
2007-09-27 19:47:43 +04:00
Unix SMB / CIFS implementation .
Test suite for libnet calls .
Copyright ( C ) Rafal Szczesniak 2007
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
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 .
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
/*
* These are more general use functions shared among the tests .
*/
# include "includes.h"
# include "torture/rpc/rpc.h"
# include "libnet/libnet.h"
# include "librpc/gen_ndr/ndr_samr_c.h"
2010-03-15 11:37:42 +03:00
# include "torture/libnet/utils.h"
2007-09-27 19:47:43 +04:00
2010-03-23 18:04:30 +03:00
bool test_opendomain ( struct torture_context * tctx ,
2010-03-11 13:33:10 +03:00
struct dcerpc_binding_handle * b , TALLOC_CTX * mem_ctx ,
2007-09-27 19:47:43 +04:00
struct policy_handle * handle , struct lsa_String * domname ,
2008-11-07 04:42:45 +03:00
struct dom_sid2 * sid_p )
2007-09-27 19:47:43 +04:00
{
NTSTATUS status ;
struct policy_handle h , domain_handle ;
struct samr_Connect r1 ;
struct samr_LookupDomain r2 ;
2008-11-07 04:42:45 +03:00
struct dom_sid2 * sid = NULL ;
2007-09-27 19:47:43 +04:00
struct samr_OpenDomain r3 ;
2010-03-23 18:04:30 +03:00
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " connecting \n " ) ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r1 . in . system_name = 0 ;
r1 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r1 . out . connect_handle = & h ;
2010-03-23 18:04:30 +03:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_Connect_r ( b , mem_ctx , & r1 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " Connect failed " ) ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r2 . in . connect_handle = & h ;
r2 . in . domain_name = domname ;
2008-11-07 04:42:45 +03:00
r2 . out . sid = & sid ;
2007-09-27 19:47:43 +04:00
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " domain lookup on %s \n " , domname - > string ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_LookupDomain_r ( b , mem_ctx , & r2 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " LookupDomain failed " ) ;
2007-09-27 19:47:43 +04:00
r3 . in . connect_handle = & h ;
r3 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2008-11-07 04:42:45 +03:00
r3 . in . sid = * r2 . out . sid ;
2007-09-27 19:47:43 +04:00
r3 . out . domain_handle = & domain_handle ;
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " opening domain \n " ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_OpenDomain_r ( b , mem_ctx , & r3 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " OpenDomain failed " ) ;
* handle = domain_handle ;
2007-09-27 19:47:43 +04:00
2008-11-07 04:42:45 +03:00
* sid_p = * * r2 . out . sid ;
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2010-03-11 13:33:10 +03:00
bool test_user_cleanup ( struct torture_context * tctx ,
struct dcerpc_binding_handle * b ,
2008-02-29 02:46:44 +03:00
TALLOC_CTX * mem_ctx , struct policy_handle * domain_handle ,
2007-09-27 19:47:43 +04:00
const char * name )
{
NTSTATUS status ;
struct samr_LookupNames r1 ;
struct samr_OpenUser r2 ;
struct samr_DeleteUser r3 ;
struct lsa_String names [ 2 ] ;
uint32_t rid ;
struct policy_handle user_handle ;
2008-11-05 16:28:17 +03:00
struct samr_Ids rids , types ;
2007-09-27 19:47:43 +04:00
names [ 0 ] . string = name ;
r1 . in . domain_handle = domain_handle ;
r1 . in . num_names = 1 ;
r1 . in . names = names ;
2008-11-05 16:28:17 +03:00
r1 . out . rids = & rids ;
r1 . out . types = & types ;
2010-03-23 18:04:30 +03:00
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " user account lookup '%s' \n " , name ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_LookupNames_r ( b , mem_ctx , & r1 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " LookupNames failed " ) ;
2007-09-27 19:47:43 +04:00
2008-11-05 16:28:17 +03:00
rid = r1 . out . rids - > ids [ 0 ] ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r2 . in . domain_handle = domain_handle ;
r2 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r2 . in . rid = rid ;
r2 . out . user_handle = & user_handle ;
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " opening user account \n " ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_OpenUser_r ( b , mem_ctx , & r2 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " OpenUser failed " ) ;
2007-09-27 19:47:43 +04:00
r3 . in . user_handle = & user_handle ;
r3 . out . user_handle = & user_handle ;
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " deleting user account \n " ) ;
2010-03-23 18:04:30 +03:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_DeleteUser_r ( b , mem_ctx , & r3 ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " DeleteUser failed " ) ;
2010-03-23 18:04:30 +03:00
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2010-03-23 18:04:30 +03:00
bool test_user_create ( struct torture_context * tctx ,
2010-03-11 13:33:10 +03:00
struct dcerpc_binding_handle * b ,
TALLOC_CTX * mem_ctx ,
2007-09-27 19:47:43 +04:00
struct policy_handle * handle , const char * name ,
uint32_t * rid )
{
NTSTATUS status ;
struct lsa_String username ;
struct samr_CreateUser r ;
struct policy_handle user_handle ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
username . string = name ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r . in . domain_handle = handle ;
r . in . account_name = & username ;
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r . out . user_handle = & user_handle ;
r . out . rid = rid ;
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " creating user account %s \n " , name ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_CreateUser_r ( b , mem_ctx , & r ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " CreateUser failed - %s \n " , nt_errstr ( status ) ) ;
2007-09-27 19:47:43 +04:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " User (%s) already exists - attempting to delete and recreate account again \n " , name ) ;
2010-03-11 13:33:10 +03:00
if ( ! test_user_cleanup ( tctx , b , mem_ctx , handle , name ) ) {
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " creating user account \n " ) ;
2010-03-23 18:04:30 +03:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_CreateUser_r ( b , mem_ctx , & r ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " CreateUser failed " ) ;
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2010-03-23 17:31:27 +03:00
bool test_group_cleanup ( struct torture_context * tctx ,
struct dcerpc_binding_handle * b , TALLOC_CTX * mem_ctx ,
2007-09-27 19:47:43 +04:00
struct policy_handle * domain_handle ,
const char * name )
{
NTSTATUS status ;
struct samr_LookupNames r1 ;
struct samr_OpenGroup r2 ;
struct samr_DeleteDomainGroup r3 ;
struct lsa_String names [ 2 ] ;
uint32_t rid ;
struct policy_handle group_handle ;
2008-11-05 16:28:17 +03:00
struct samr_Ids rids , types ;
2007-09-27 19:47:43 +04:00
names [ 0 ] . string = name ;
r1 . in . domain_handle = domain_handle ;
r1 . in . num_names = 1 ;
r1 . in . names = names ;
2008-11-05 16:28:17 +03:00
r1 . out . rids = & rids ;
r1 . out . types = & types ;
2010-03-23 18:04:30 +03:00
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " group account lookup '%s' \n " , name ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_LookupNames_r ( b , mem_ctx , & r1 ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " LookupNames failed - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2008-11-05 16:28:17 +03:00
rid = r1 . out . rids - > ids [ 0 ] ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r2 . in . domain_handle = domain_handle ;
r2 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r2 . in . rid = rid ;
r2 . out . group_handle = & group_handle ;
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " opening group account \n " ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_OpenGroup_r ( b , mem_ctx , & r2 ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " OpenGroup failed - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
r3 . in . group_handle = & group_handle ;
r3 . out . group_handle = & group_handle ;
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " deleting group account \n " ) ;
2010-03-23 18:04:30 +03:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_DeleteDomainGroup_r ( b , mem_ctx , & r3 ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " DeleteGroup failed - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2010-03-23 18:04:30 +03:00
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2010-03-23 17:31:27 +03:00
bool test_group_create ( struct torture_context * tctx ,
struct dcerpc_binding_handle * b , TALLOC_CTX * mem_ctx ,
2007-09-27 19:47:43 +04:00
struct policy_handle * handle , const char * name ,
uint32_t * rid )
{
NTSTATUS status ;
struct lsa_String groupname ;
struct samr_CreateDomainGroup r ;
struct policy_handle group_handle ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
groupname . string = name ;
2010-03-23 18:04:30 +03:00
2007-09-27 19:47:43 +04:00
r . in . domain_handle = handle ;
r . in . name = & groupname ;
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r . out . group_handle = & group_handle ;
r . out . rid = rid ;
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " creating group account %s \n " , name ) ;
2007-09-27 19:47:43 +04:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_CreateDomainGroup_r ( b , mem_ctx , & r ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " CreateGroup failed - %s \n " , nt_errstr ( status ) ) ;
2007-09-27 19:47:43 +04:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Group (%s) already exists - attempting to delete and recreate account again \n " , name ) ;
if ( ! test_group_cleanup ( tctx , b , mem_ctx , handle , name ) ) {
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " creating group account \n " ) ;
2010-03-23 18:04:30 +03:00
2010-03-11 13:33:10 +03:00
status = dcerpc_samr_CreateDomainGroup_r ( b , mem_ctx , & r ) ;
2007-09-27 19:47:43 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " CreateGroup failed - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
2007-10-07 02:28:14 +04:00
return false ;
2007-09-27 19:47:43 +04:00
}
2007-10-07 02:28:14 +04:00
return true ;
2007-09-27 19:47:43 +04:00
}
void msg_handler ( struct monitor_msg * m )
{
struct msg_rpc_open_user * msg_open ;
struct msg_rpc_query_user * msg_query ;
struct msg_rpc_close_user * msg_close ;
struct msg_rpc_create_user * msg_create ;
switch ( m - > type ) {
case mon_SamrOpenUser :
msg_open = ( struct msg_rpc_open_user * ) m - > data ;
printf ( " monitor_msg: user opened (rid=%d, access_mask=0x%08x) \n " ,
msg_open - > rid , msg_open - > access_mask ) ;
break ;
case mon_SamrQueryUser :
msg_query = ( struct msg_rpc_query_user * ) m - > data ;
printf ( " monitor_msg: user queried (level=%d) \n " , msg_query - > level ) ;
break ;
case mon_SamrCloseUser :
msg_close = ( struct msg_rpc_close_user * ) m - > data ;
printf ( " monitor_msg: user closed (rid=%d) \n " , msg_close - > rid ) ;
break ;
case mon_SamrCreateUser :
msg_create = ( struct msg_rpc_create_user * ) m - > data ;
printf ( " monitor_msg: user created (rid=%d) \n " , msg_create - > rid ) ;
break ;
}
}