2010-03-23 18:04:30 +03:00
/*
2005-04-19 19:11:58 +04:00
Unix SMB / CIFS implementation .
Test suite for libnet calls .
Copyright ( C ) Rafal Szczesniak 2005
2010-03-23 18:04:30 +03:00
2005-04-19 19:11:58 +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
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-04-19 19:11:58 +04:00
( at your option ) any later version .
2010-03-23 18:04:30 +03:00
2005-04-19 19:11:58 +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
2005-04-19 19:11:58 +04:00
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-19 19:11:58 +04:00
*/
# include "includes.h"
2010-04-14 00:06:51 +04:00
# include "torture/rpc/torture_rpc.h"
2006-09-19 23:15:36 +04:00
# include "torture/libnet/usertest.h"
2005-12-28 18:38:36 +03:00
# include "libnet/libnet.h"
2006-03-15 02:35:30 +03:00
# include "librpc/gen_ndr/ndr_samr_c.h"
2007-09-08 16:42:09 +04:00
# include "param/param.h"
2007-10-07 02:28:14 +04:00
2010-05-28 06:14:47 +04:00
# include "torture/libnet/proto.h"
2005-04-19 19:11:58 +04:00
2010-03-23 17:31:27 +03:00
static bool test_useradd ( struct torture_context * tctx ,
struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2005-04-19 19:11:58 +04:00
struct policy_handle * domain_handle ,
const char * name )
{
NTSTATUS status ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2005-06-11 14:33:31 +04:00
struct libnet_rpc_useradd user ;
2010-03-23 18:04:30 +03:00
2005-04-19 19:11:58 +04:00
user . in . domain_handle = * domain_handle ;
user . in . username = name ;
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Testing libnet_rpc_useradd \n " ) ;
2005-05-10 22:17:40 +04:00
2014-01-14 15:11:17 +04:00
status = libnet_rpc_useradd ( tctx - > ev , p - > binding_handle , mem_ctx , & user ) ;
2005-04-19 19:11:58 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Failed to call libnet_rpc_useradd - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2005-04-19 19:11:58 +04:00
}
2010-03-23 18:04:30 +03:00
2005-04-19 19:11:58 +04:00
return ret ;
}
2010-03-23 17:31:27 +03:00
static bool test_useradd_async ( struct torture_context * tctx ,
struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2005-05-10 22:17:40 +04:00
struct policy_handle * handle , const char * username )
{
NTSTATUS status ;
struct composite_context * c ;
2005-06-11 14:33:31 +04:00
struct libnet_rpc_useradd user ;
2005-05-10 22:17:40 +04:00
user . in . domain_handle = * handle ;
user . in . username = username ;
2010-03-23 18:04:30 +03:00
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Testing async libnet_rpc_useradd \n " ) ;
2010-03-23 18:04:30 +03:00
2014-01-14 15:11:17 +04:00
c = libnet_rpc_useradd_send ( mem_ctx , tctx - > ev , p - > binding_handle ,
& user , msg_handler ) ;
2005-05-10 22:17:40 +04:00
if ( ! c ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Failed to call async libnet_rpc_useradd \n " ) ;
2007-10-07 02:28:14 +04:00
return false ;
2005-05-10 22:17:40 +04:00
}
2005-06-11 14:33:31 +04:00
status = libnet_rpc_useradd_recv ( c , mem_ctx , & user ) ;
2005-05-10 22:17:40 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Calling async libnet_rpc_useradd failed - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2005-05-10 22:17:40 +04:00
}
2007-10-07 02:28:14 +04:00
return true ;
2005-05-10 22:17:40 +04:00
}
2010-03-23 18:04:30 +03:00
static bool test_usermod ( struct torture_context * tctx , struct dcerpc_pipe * p ,
2008-02-29 02:46:44 +03:00
TALLOC_CTX * mem_ctx ,
2006-09-19 23:15:36 +04:00
struct policy_handle * handle , int num_changes ,
2006-09-21 03:42:58 +04:00
struct libnet_rpc_usermod * mod , char * * username )
2005-04-21 11:25:16 +04:00
{
2006-09-19 23:15:36 +04:00
const char * logon_scripts [ ] = { " start_login.cmd " , " login.bat " , " start.cmd " } ;
const char * home_dirs [ ] = { " \\ \\ srv \\ home " , " \\ \\ homesrv \\ home \\ user " , " \\ \\ pdcsrv \\ domain " } ;
const char * home_drives [ ] = { " H: " , " z: " , " I: " , " J: " , " n: " } ;
const char * homedir , * homedrive , * logonscript ;
2008-03-07 01:05:24 +03:00
const uint32_t flags [ ] = { ( ACB_DISABLED | ACB_NORMAL | ACB_PW_EXPIRED ) ,
2006-10-02 10:00:14 +04:00
( ACB_NORMAL | ACB_PWNOEXP ) ,
2008-03-07 01:05:24 +03:00
( ACB_NORMAL | ACB_PW_EXPIRED ) } ;
2006-09-19 23:15:36 +04:00
2005-04-21 11:25:16 +04:00
NTSTATUS status ;
2006-09-19 23:15:36 +04:00
struct timeval now ;
enum test_fields testfld ;
int i ;
2006-09-21 03:42:58 +04:00
ZERO_STRUCT ( * mod ) ;
2006-09-19 23:15:36 +04:00
srandom ( ( unsigned ) time ( NULL ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . username = talloc_strdup ( mem_ctx , * username ) ;
mod - > in . domain_handle = * handle ;
2006-09-19 23:15:36 +04:00
2010-03-23 18:04:30 +03:00
torture_comment ( tctx , " modifying user (%d simultaneous change(s)) \n " ,
2008-02-29 02:46:44 +03:00
num_changes ) ;
2006-09-19 23:15:36 +04:00
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " fields to change: [ " ) ;
2006-09-19 23:15:36 +04:00
2010-05-22 06:03:16 +04:00
for ( i = 0 ; i < num_changes & & i < = USER_FIELD_LAST ; i + + ) {
2006-09-19 23:15:36 +04:00
const char * fldname ;
2010-05-22 06:03:16 +04:00
testfld = ( random ( ) % USER_FIELD_LAST ) + 1 ;
2006-09-19 23:15:36 +04:00
2010-08-31 13:30:17 +04:00
GetTimeOfDay ( & now ) ;
2006-09-19 23:15:36 +04:00
switch ( testfld ) {
2010-05-25 18:24:45 +04:00
case acct_name :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . account_name ) ;
mod - > in . change . account_name = talloc_asprintf ( mem_ctx , TEST_CHG_ACCOUNTNAME ,
2006-10-12 01:40:07 +04:00
( int ) ( random ( ) % 100 ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_ACCOUNT_NAME ;
2006-09-19 23:15:36 +04:00
fldname = " account_name " ;
2006-09-21 03:42:58 +04:00
* username = talloc_strdup ( mem_ctx , mod - > in . change . account_name ) ;
2006-09-19 23:15:36 +04:00
break ;
2010-05-25 18:24:45 +04:00
case acct_full_name :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . full_name ) ;
mod - > in . change . full_name = talloc_asprintf ( mem_ctx , TEST_CHG_FULLNAME ,
2006-09-19 23:15:36 +04:00
( int ) random ( ) , ( int ) random ( ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_FULL_NAME ;
2006-09-19 23:15:36 +04:00
fldname = " full_name " ;
break ;
2010-05-25 18:24:45 +04:00
case acct_description :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . description ) ;
mod - > in . change . description = talloc_asprintf ( mem_ctx , TEST_CHG_DESCRIPTION ,
2006-09-19 23:15:36 +04:00
random ( ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_DESCRIPTION ;
2006-09-19 23:15:36 +04:00
fldname = " description " ;
break ;
2010-03-23 18:04:30 +03:00
2010-05-25 18:24:45 +04:00
case acct_home_directory :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . home_directory ) ;
2006-09-19 23:15:36 +04:00
homedir = home_dirs [ random ( ) % ( sizeof ( home_dirs ) / sizeof ( char * ) ) ] ;
2006-09-21 03:42:58 +04:00
mod - > in . change . home_directory = talloc_strdup ( mem_ctx , homedir ) ;
mod - > in . change . fields | = USERMOD_FIELD_HOME_DIRECTORY ;
2006-10-12 01:40:07 +04:00
fldname = " home_directory " ;
2006-09-19 23:15:36 +04:00
break ;
2010-05-25 18:24:45 +04:00
case acct_home_drive :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . home_drive ) ;
2006-09-19 23:15:36 +04:00
homedrive = home_drives [ random ( ) % ( sizeof ( home_drives ) / sizeof ( char * ) ) ] ;
2006-09-21 03:42:58 +04:00
mod - > in . change . home_drive = talloc_strdup ( mem_ctx , homedrive ) ;
mod - > in . change . fields | = USERMOD_FIELD_HOME_DRIVE ;
2006-10-12 01:40:07 +04:00
fldname = " home_drive " ;
2006-09-19 23:15:36 +04:00
break ;
2010-05-25 18:24:45 +04:00
case acct_comment :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . comment ) ;
mod - > in . change . comment = talloc_asprintf ( mem_ctx , TEST_CHG_COMMENT ,
2006-09-19 23:15:36 +04:00
random ( ) , random ( ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_COMMENT ;
2006-09-19 23:15:36 +04:00
fldname = " comment " ;
break ;
2010-05-25 18:24:45 +04:00
case acct_logon_script :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . logon_script ) ;
2006-09-19 23:15:36 +04:00
logonscript = logon_scripts [ random ( ) % ( sizeof ( logon_scripts ) / sizeof ( char * ) ) ] ;
2006-09-21 03:42:58 +04:00
mod - > in . change . logon_script = talloc_strdup ( mem_ctx , logonscript ) ;
mod - > in . change . fields | = USERMOD_FIELD_LOGON_SCRIPT ;
2006-10-12 01:40:07 +04:00
fldname = " logon_script " ;
2006-09-19 23:15:36 +04:00
break ;
2010-05-25 18:24:45 +04:00
case acct_profile_path :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . profile_path ) ;
mod - > in . change . profile_path = talloc_asprintf ( mem_ctx , TEST_CHG_PROFILEPATH ,
2006-09-19 23:15:36 +04:00
( long int ) random ( ) , ( unsigned int ) random ( ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_PROFILE_PATH ;
2006-10-12 01:40:07 +04:00
fldname = " profile_path " ;
2006-09-19 23:15:36 +04:00
break ;
case acct_expiry :
2006-09-21 03:42:58 +04:00
continue_if_field_set ( mod - > in . change . acct_expiry ) ;
2006-09-19 23:15:36 +04:00
now = timeval_add ( & now , ( random ( ) % ( 31 * 24 * 60 * 60 ) ) , 0 ) ;
2007-09-08 20:46:30 +04:00
mod - > in . change . acct_expiry = ( struct timeval * ) talloc_memdup ( mem_ctx , & now , sizeof ( now ) ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . fields | = USERMOD_FIELD_ACCT_EXPIRY ;
2006-09-19 23:15:36 +04:00
fldname = " acct_expiry " ;
break ;
2006-10-02 10:00:14 +04:00
case acct_flags :
continue_if_field_set ( mod - > in . change . acct_flags ) ;
2008-02-28 02:32:06 +03:00
mod - > in . change . acct_flags = flags [ random ( ) % ARRAY_SIZE ( flags ) ] ;
2006-10-12 01:40:07 +04:00
mod - > in . change . fields | = USERMOD_FIELD_ACCT_FLAGS ;
2006-10-02 10:00:14 +04:00
fldname = " acct_flags " ;
2006-09-19 23:15:36 +04:00
break ;
default :
2006-09-21 03:42:58 +04:00
fldname = talloc_asprintf ( mem_ctx , " unknown_field (%d) " , testfld ) ;
2006-09-19 23:15:36 +04:00
break ;
}
2008-03-07 01:05:24 +03:00
torture_comment ( tctx , ( ( i < num_changes - 1 ) ? " %s, " : " %s " ) , fldname ) ;
2006-09-19 23:15:36 +04:00
}
2008-02-29 02:46:44 +03:00
torture_comment ( tctx , " ] \n " ) ;
2006-09-19 23:15:36 +04:00
2014-01-14 15:11:17 +04:00
status = libnet_rpc_usermod ( tctx - > ev , p - > binding_handle , mem_ctx , mod ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " Failed to call sync libnet_rpc_usermod " ) ;
2005-04-21 11:25:16 +04:00
2007-10-07 02:28:14 +04:00
return true ;
2005-04-21 11:25:16 +04:00
}
2010-03-23 17:31:27 +03:00
static bool test_userdel ( struct torture_context * tctx ,
struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2006-09-19 23:15:36 +04:00
struct policy_handle * handle , const char * username )
2005-07-22 02:33:47 +04:00
{
NTSTATUS status ;
2006-09-19 23:15:36 +04:00
struct libnet_rpc_userdel user ;
2010-03-23 18:04:30 +03:00
2014-01-14 15:11:17 +04:00
ZERO_STRUCT ( user ) ;
2005-07-22 02:33:47 +04:00
user . in . domain_handle = * handle ;
user . in . username = username ;
2010-03-23 18:04:30 +03:00
2014-01-14 15:11:17 +04:00
status = libnet_rpc_userdel ( tctx - > ev , p - > binding_handle , mem_ctx , & user ) ;
2005-07-22 02:33:47 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " Failed to call sync libnet_rpc_userdel - %s \n " , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
return false ;
2005-07-22 02:33:47 +04:00
}
2007-10-07 02:28:14 +04:00
return true ;
2005-07-22 02:33:47 +04:00
}
2006-09-21 03:42:58 +04:00
# define CMP_LSA_STRING_FLD(fld, flags) \
if ( ( mod - > in . change . fields & flags ) & & \
! strequal ( i - > fld . string , mod - > in . change . fld ) ) { \
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " '%s' field does not match \n " , # fld ) ; \
torture_comment ( tctx , " received: '%s' \n " , i - > fld . string ) ; \
torture_comment ( tctx , " expected: '%s' \n " , mod - > in . change . fld ) ; \
2007-10-07 02:28:14 +04:00
return false ; \
2006-09-21 03:42:58 +04:00
}
# define CMP_TIME_FLD(fld, flags) \
if ( mod - > in . change . fields & flags ) { \
nttime_to_timeval ( & t , i - > fld ) ; \
if ( timeval_compare ( & t , mod - > in . change . fld ) ) { \
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " '%s' field does not match \n " , # fld ) ; \
torture_comment ( tctx , " received: '%s (+%ld us)' \n " , \
2012-09-08 11:21:47 +04:00
timestring ( mem_ctx , t . tv_sec ) , ( long ) t . tv_usec ) ; \
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " expected: '%s (+%ld us)' \n " , \
2007-09-27 19:51:07 +04:00
timestring ( mem_ctx , mod - > in . change . fld - > tv_sec ) , \
2012-09-08 11:21:47 +04:00
( long ) mod - > in . change . fld - > tv_usec ) ; \
2007-10-07 02:28:14 +04:00
return false ; \
2006-09-21 03:42:58 +04:00
} \
}
# define CMP_NUM_FLD(fld, flags) \
if ( ( mod - > in . change . fields & flags ) & & \
( i - > fld ! = mod - > in . change . fld ) ) { \
2010-03-23 17:31:27 +03:00
torture_comment ( tctx , " '%s' field does not match \n " , # fld ) ; \
torture_comment ( tctx , " received: '%04x' \n " , i - > fld ) ; \
torture_comment ( tctx , " expected: '%04x' \n " , mod - > in . change . fld ) ; \
2007-10-07 02:28:14 +04:00
return false ; \
2006-09-21 03:42:58 +04:00
}
2010-03-23 18:04:30 +03:00
static bool test_compare ( struct torture_context * tctx ,
2008-02-29 02:46:44 +03:00
struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2006-09-21 03:42:58 +04:00
struct policy_handle * handle , struct libnet_rpc_usermod * mod ,
const char * username )
{
NTSTATUS status ;
struct libnet_rpc_userinfo info ;
struct samr_UserInfo21 * i ;
struct timeval t ;
ZERO_STRUCT ( info ) ;
info . in . username = username ;
info . in . domain_handle = * handle ;
info . in . level = 21 ; /* the most rich infolevel available */
2014-01-14 15:11:17 +04:00
status = libnet_rpc_userinfo ( tctx - > ev , p - > binding_handle , mem_ctx , & info ) ;
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( tctx , status , " Failed to call sync libnet_rpc_userinfo " ) ;
2006-09-21 03:42:58 +04:00
i = & info . out . info . info21 ;
CMP_LSA_STRING_FLD ( account_name , USERMOD_FIELD_ACCOUNT_NAME ) ;
CMP_LSA_STRING_FLD ( full_name , USERMOD_FIELD_FULL_NAME ) ;
CMP_LSA_STRING_FLD ( description , USERMOD_FIELD_DESCRIPTION ) ;
CMP_LSA_STRING_FLD ( comment , USERMOD_FIELD_COMMENT ) ;
CMP_LSA_STRING_FLD ( logon_script , USERMOD_FIELD_LOGON_SCRIPT ) ;
CMP_LSA_STRING_FLD ( profile_path , USERMOD_FIELD_PROFILE_PATH ) ;
CMP_LSA_STRING_FLD ( home_directory , USERMOD_FIELD_HOME_DIRECTORY ) ;
CMP_LSA_STRING_FLD ( home_drive , USERMOD_FIELD_HOME_DRIVE ) ;
CMP_TIME_FLD ( acct_expiry , USERMOD_FIELD_ACCT_EXPIRY ) ;
CMP_NUM_FLD ( acct_flags , USERMOD_FIELD_ACCT_FLAGS )
2007-10-07 02:28:14 +04:00
return true ;
2006-09-21 03:42:58 +04:00
}
2007-10-07 02:28:14 +04:00
bool torture_useradd ( struct torture_context * torture )
2005-04-19 19:11:58 +04:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
2005-07-08 12:09:02 +04:00
struct lsa_String domain_name ;
2007-09-27 19:51:07 +04:00
struct dom_sid2 sid ;
2005-06-24 05:14:43 +04:00
const char * name = TEST_USERNAME ;
2005-04-19 19:11:58 +04:00
TALLOC_CTX * mem_ctx ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2010-03-15 11:37:42 +03:00
struct dcerpc_binding_handle * b ;
2005-04-19 19:11:58 +04:00
mem_ctx = talloc_init ( " test_useradd " ) ;
2010-03-23 18:04:30 +03:00
status = torture_rpc_connection ( torture ,
2005-04-19 19:11:58 +04:00
& p ,
2007-08-20 01:23:03 +04:00
& ndr_table_samr ) ;
2010-03-23 18:04:30 +03:00
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( torture , status , " RPC connect failed " ) ;
2010-03-15 11:37:42 +03:00
b = p - > binding_handle ;
2005-04-19 19:11:58 +04:00
2010-07-16 08:32:42 +04:00
domain_name . string = lpcfg_workgroup ( torture - > lp_ctx ) ;
2010-05-28 06:06:55 +04:00
if ( ! test_domain_open ( torture , b , & domain_name , mem_ctx , & h , & sid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-19 19:11:58 +04:00
goto done ;
}
2010-03-23 17:31:27 +03:00
if ( ! test_useradd ( torture , p , mem_ctx , & h , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-19 19:11:58 +04:00
goto done ;
}
2010-03-15 11:37:42 +03:00
if ( ! test_user_cleanup ( torture , b , mem_ctx , & h , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-21 05:00:30 +04:00
goto done ;
}
2010-05-28 06:06:55 +04:00
if ( ! test_domain_open ( torture , b , & domain_name , mem_ctx , & h , & sid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-05-10 22:17:40 +04:00
goto done ;
}
2010-03-23 17:31:27 +03:00
if ( ! test_useradd_async ( torture , p , mem_ctx , & h , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-05-10 22:17:40 +04:00
goto done ;
}
2010-03-15 11:37:42 +03:00
if ( ! test_user_cleanup ( torture , b , mem_ctx , & h , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-05-10 22:17:40 +04:00
goto done ;
}
2005-04-19 19:11:58 +04:00
done :
talloc_free ( mem_ctx ) ;
return ret ;
}
2005-04-21 11:25:16 +04:00
2007-09-08 20:46:30 +04:00
bool torture_userdel ( struct torture_context * torture )
2005-04-21 11:25:16 +04:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
2005-07-08 12:09:02 +04:00
struct lsa_String domain_name ;
2007-09-27 19:51:07 +04:00
struct dom_sid2 sid ;
uint32_t rid ;
2005-06-24 05:14:43 +04:00
const char * name = TEST_USERNAME ;
2005-04-21 11:25:16 +04:00
TALLOC_CTX * mem_ctx ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2010-03-15 11:37:42 +03:00
struct dcerpc_binding_handle * b ;
2005-04-21 11:25:16 +04:00
mem_ctx = talloc_init ( " test_userdel " ) ;
2010-03-23 18:04:30 +03:00
status = torture_rpc_connection ( torture ,
2005-04-21 11:25:16 +04:00
& p ,
2007-08-20 01:23:03 +04:00
& ndr_table_samr ) ;
2010-03-23 18:04:30 +03:00
2005-04-22 19:13:01 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2007-10-07 02:28:14 +04:00
return false ;
2005-04-22 19:13:01 +04:00
}
2010-03-15 11:37:42 +03:00
b = p - > binding_handle ;
2005-04-21 11:25:16 +04:00
2010-07-16 08:32:42 +04:00
domain_name . string = lpcfg_workgroup ( torture - > lp_ctx ) ;
2010-05-28 06:06:55 +04:00
if ( ! test_domain_open ( torture , b , & domain_name , mem_ctx , & h , & sid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-21 11:25:16 +04:00
goto done ;
}
2010-03-15 11:37:42 +03:00
if ( ! test_user_create ( torture , b , mem_ctx , & h , name , & rid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-21 11:25:16 +04:00
goto done ;
}
2010-03-23 18:04:30 +03:00
2010-03-23 17:31:27 +03:00
if ( ! test_userdel ( torture , p , mem_ctx , & h , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-04-21 11:25:16 +04:00
goto done ;
}
2010-03-23 18:04:30 +03:00
2005-04-21 11:25:16 +04:00
done :
talloc_free ( mem_ctx ) ;
return ret ;
}
2005-07-22 02:33:47 +04:00
2007-10-07 02:28:14 +04:00
bool torture_usermod ( struct torture_context * torture )
2005-07-22 02:33:47 +04:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
struct lsa_String domain_name ;
2007-09-27 19:51:07 +04:00
struct dom_sid2 sid ;
uint32_t rid ;
2006-09-21 03:42:58 +04:00
int i ;
2006-09-19 23:15:36 +04:00
char * name ;
2005-07-22 02:33:47 +04:00
TALLOC_CTX * mem_ctx ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2010-03-15 11:37:42 +03:00
struct dcerpc_binding_handle * b ;
2006-08-22 23:28:44 +04:00
2005-07-22 02:33:47 +04:00
mem_ctx = talloc_init ( " test_userdel " ) ;
2010-03-23 18:04:30 +03:00
status = torture_rpc_connection ( torture ,
2005-07-22 02:33:47 +04:00
& p ,
2007-08-20 01:23:03 +04:00
& ndr_table_samr ) ;
2010-03-23 18:04:30 +03:00
2008-02-29 02:46:44 +03:00
torture_assert_ntstatus_ok ( torture , status , " RPC connect " ) ;
2010-03-15 11:37:42 +03:00
b = p - > binding_handle ;
2005-07-22 02:33:47 +04:00
2010-07-16 08:32:42 +04:00
domain_name . string = lpcfg_workgroup ( torture - > lp_ctx ) ;
2006-09-19 23:15:36 +04:00
name = talloc_strdup ( mem_ctx , TEST_USERNAME ) ;
2005-07-22 02:33:47 +04:00
2010-05-28 06:06:55 +04:00
if ( ! test_domain_open ( torture , b , & domain_name , mem_ctx , & h , & sid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-07-22 02:33:47 +04:00
goto done ;
}
2010-03-15 11:37:42 +03:00
if ( ! test_user_create ( torture , b , mem_ctx , & h , name , & rid ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-07-22 02:33:47 +04:00
goto done ;
}
2010-03-23 18:04:30 +03:00
2010-05-22 06:03:16 +04:00
for ( i = USER_FIELD_FIRST ; i < = USER_FIELD_LAST ; i + + ) {
2006-09-21 03:42:58 +04:00
struct libnet_rpc_usermod m ;
2005-07-23 14:27:45 +04:00
2008-02-29 02:46:44 +03:00
if ( ! test_usermod ( torture , p , mem_ctx , & h , i , & m , & name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2006-10-02 10:00:14 +04:00
goto cleanup ;
2006-09-21 03:42:58 +04:00
}
2006-09-19 23:15:36 +04:00
2008-02-29 02:46:44 +03:00
if ( ! test_compare ( torture , p , mem_ctx , & h , & m , name ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2006-10-02 10:00:14 +04:00
goto cleanup ;
2006-09-21 03:42:58 +04:00
}
2005-07-22 02:33:47 +04:00
}
2010-03-23 18:04:30 +03:00
cleanup :
2010-06-10 03:02:06 +04:00
if ( ! test_user_cleanup ( torture , b , mem_ctx , & h , TEST_USERNAME ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-07-22 02:33:47 +04:00
goto done ;
}
done :
talloc_free ( mem_ctx ) ;
return ret ;
}