2005-04-19 19:11:58 +04:00
/*
Unix SMB / CIFS implementation .
Test suite for libnet calls .
Copyright ( C ) Rafal Szczesniak 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( 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
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2006-03-14 18:02:05 +03:00
# include "torture/rpc/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"
2005-04-19 19:11:58 +04:00
static BOOL test_opendomain ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2005-07-08 12:09:02 +04:00
struct policy_handle * handle , struct lsa_String * domname )
2005-04-19 19:11:58 +04:00
{
NTSTATUS status ;
struct policy_handle h , domain_handle ;
struct samr_Connect r1 ;
struct samr_LookupDomain r2 ;
struct samr_OpenDomain r3 ;
printf ( " connecting \n " ) ;
r1 . in . system_name = 0 ;
r1 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r1 . out . connect_handle = & h ;
status = dcerpc_samr_Connect ( p , mem_ctx , & r1 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
r2 . in . connect_handle = & h ;
r2 . in . domain_name = domname ;
printf ( " domain lookup on %s \n " , domname - > string ) ;
status = dcerpc_samr_LookupDomain ( p , mem_ctx , & r2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupDomain failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
r3 . in . connect_handle = & h ;
r3 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r3 . in . sid = r2 . out . sid ;
r3 . out . domain_handle = & domain_handle ;
printf ( " opening domain \n " ) ;
status = dcerpc_samr_OpenDomain ( p , mem_ctx , & r3 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenDomain failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
} else {
* handle = domain_handle ;
}
return True ;
}
static BOOL test_useradd ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle ,
const char * name )
{
NTSTATUS status ;
BOOL ret = True ;
2005-06-11 14:33:31 +04:00
struct libnet_rpc_useradd user ;
2005-04-19 19:11:58 +04:00
user . in . domain_handle = * domain_handle ;
user . in . username = name ;
2005-06-11 14:33:31 +04:00
printf ( " Testing libnet_rpc_useradd \n " ) ;
2005-05-10 22:17:40 +04:00
2005-06-11 14:33:31 +04:00
status = libnet_rpc_useradd ( p , mem_ctx , & user ) ;
2005-04-19 19:11:58 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Failed to call sync rpc_composite_userinfo - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return ret ;
}
2005-05-10 22:17:40 +04:00
static void msg_handler ( struct monitor_msg * m )
{
2005-07-26 02:57:14 +04:00
struct msg_rpc_create_user * msg_create ;
2005-05-10 22:17:40 +04:00
switch ( m - > type ) {
case rpc_create_user :
2005-07-26 02:57:14 +04:00
msg_create = ( struct msg_rpc_create_user * ) m - > data ;
printf ( " monitor_msg: user created (rid=%d) \n " , msg_create - > rid ) ;
2005-05-10 22:17:40 +04:00
break ;
}
}
static BOOL test_useradd_async ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
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 ;
2005-06-11 14:33:31 +04:00
printf ( " Testing async libnet_rpc_useradd \n " ) ;
2005-05-10 22:17:40 +04:00
2005-06-11 14:33:31 +04:00
c = libnet_rpc_useradd_send ( p , & user , msg_handler ) ;
2005-05-10 22:17:40 +04:00
if ( ! c ) {
2005-06-11 14:33:31 +04:00
printf ( " Failed to call async libnet_rpc_useradd \n " ) ;
2005-05-10 22:17:40 +04:00
return False ;
}
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 ) ) {
2005-06-11 14:33:31 +04:00
printf ( " Calling async libnet_rpc_useradd failed - %s \n " , nt_errstr ( status ) ) ;
2005-05-10 22:17:40 +04:00
return False ;
}
return True ;
}
2005-04-21 05:00:30 +04:00
static BOOL test_cleanup ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle , const char * username )
{
NTSTATUS status ;
struct samr_LookupNames r1 ;
struct samr_OpenUser r2 ;
struct samr_DeleteUser r3 ;
2005-07-08 12:09:02 +04:00
struct lsa_String names [ 2 ] ;
2005-04-21 05:00:30 +04:00
uint32_t rid ;
struct policy_handle user_handle ;
names [ 0 ] . string = username ;
r1 . in . domain_handle = domain_handle ;
r1 . in . num_names = 1 ;
r1 . in . names = names ;
printf ( " user account lookup '%s' \n " , username ) ;
status = dcerpc_samr_LookupNames ( p , mem_ctx , & r1 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupNames failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
rid = r1 . out . rids . ids [ 0 ] ;
r2 . in . domain_handle = domain_handle ;
r2 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r2 . in . rid = rid ;
r2 . out . user_handle = & user_handle ;
printf ( " opening user account \n " ) ;
status = dcerpc_samr_OpenUser ( p , mem_ctx , & r2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenUser failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
r3 . in . user_handle = & user_handle ;
r3 . out . user_handle = & user_handle ;
printf ( " deleting user account \n " ) ;
status = dcerpc_samr_DeleteUser ( p , mem_ctx , & r3 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteUser failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2005-04-21 11:25:16 +04:00
static BOOL test_createuser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle , const char * user )
{
NTSTATUS status ;
2005-05-09 06:28:27 +04:00
struct policy_handle user_handle ;
2005-07-08 12:09:02 +04:00
struct lsa_String username ;
2005-04-21 16:22:48 +04:00
struct samr_CreateUser r1 ;
struct samr_Close r2 ;
2005-04-21 11:25:16 +04:00
uint32_t user_rid ;
username . string = user ;
2005-04-21 16:22:48 +04:00
r1 . in . domain_handle = handle ;
r1 . in . account_name = & username ;
r1 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
r1 . out . user_handle = & user_handle ;
r1 . out . rid = & user_rid ;
2005-04-21 11:25:16 +04:00
printf ( " creating user '%s' \n " , username . string ) ;
2005-04-21 16:22:48 +04:00
status = dcerpc_samr_CreateUser ( p , mem_ctx , & r1 ) ;
2005-04-21 11:25:16 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " CreateUser failed - %s \n " , nt_errstr ( status ) ) ;
2005-04-22 09:11:53 +04:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
printf ( " User (%s) already exists - attempting to delete and recreate account again \n " , user ) ;
if ( ! test_cleanup ( p , mem_ctx , handle , TEST_USERNAME ) ) {
return False ;
}
printf ( " creating user account \n " ) ;
status = dcerpc_samr_CreateUser ( p , mem_ctx , & r1 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " CreateUser failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2005-04-21 11:25:16 +04:00
return False ;
}
2005-04-21 16:22:48 +04:00
r2 . in . handle = & user_handle ;
r2 . out . handle = & user_handle ;
printf ( " closing user '%s' \n " , username . string ) ;
status = dcerpc_samr_Close ( p , mem_ctx , & r2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Close failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2005-04-21 11:25:16 +04:00
return True ;
}
2006-09-19 23:15:36 +04:00
static BOOL test_usermod ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
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 ;
2006-10-02 10:00:14 +04:00
const uint32_t flags [ ] = { ( ACB_DISABLED | ACB_NORMAL ) ,
( ACB_NORMAL | ACB_PWNOEXP ) ,
2006-11-28 00:56:44 +03:00
( ACB_NORMAL ) } ;
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
printf ( " modifying user (%d simultaneous change(s)) \n " , num_changes ) ;
printf ( " fields to change: [ " ) ;
2006-10-02 10:00:14 +04:00
for ( i = 0 ; i < num_changes & & i < FIELDS_NUM - 1 ; i + + ) {
2006-09-19 23:15:36 +04:00
const char * fldname ;
2006-10-02 10:00:14 +04:00
testfld = ( random ( ) % ( FIELDS_NUM - 1 ) ) + 1 ;
2006-09-19 23:15:36 +04:00
gettimeofday ( & now , NULL ) ;
switch ( testfld ) {
case account_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 ;
case 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 ;
case 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 ;
case 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 ;
case 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 ;
case 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 ;
case 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 ;
case 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 ) ;
2006-09-21 03:42:58 +04:00
mod - > in . change . acct_expiry = talloc_memdup ( mem_ctx , & now , sizeof ( now ) ) ;
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 ) ;
mod - > in . change . acct_flags = flags [ random ( ) % ( sizeof ( flags ) / sizeof ( uint32_t ) ) ] ;
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 ;
}
printf ( ( ( i < num_changes - 1 ) ? " %s, " : " %s " ) , fldname ) ;
}
printf ( " ] \n " ) ;
2006-09-21 03:42:58 +04:00
status = libnet_rpc_usermod ( p , mem_ctx , mod ) ;
2005-04-21 11:25:16 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-10-12 01:40:07 +04:00
printf ( " Failed to call sync libnet_rpc_usermod - %s \n " , nt_errstr ( status ) ) ;
2005-04-21 11:25:16 +04:00
return False ;
}
return True ;
}
2006-09-19 23:15:36 +04:00
static BOOL test_userdel ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
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 ;
2005-07-22 02:33:47 +04:00
user . in . domain_handle = * handle ;
user . in . username = username ;
2006-09-19 23:15:36 +04:00
status = libnet_rpc_userdel ( p , mem_ctx , & user ) ;
2005-07-22 02:33:47 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-09-19 23:15:36 +04:00
printf ( " Failed to call sync libnet_rpc_userdel - %s \n " , nt_errstr ( status ) ) ;
2005-07-22 02:33:47 +04:00
return False ;
}
return True ;
}
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 ) ) { \
printf ( " '%s' field does not match \n " , # fld ) ; \
printf ( " received: '%s' \n " , i - > fld . string ) ; \
printf ( " expected: '%s' \n " , mod - > in . change . fld ) ; \
return False ; \
}
# 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 ) ) { \
printf ( " '%s' field does not match \n " , # fld ) ; \
printf ( " received: '%s (+%ld us)' \n " , timestring ( mem_ctx , t . tv_sec ) , t . tv_usec ) ; \
printf ( " expected: '%s (+%ld us)' \n " , timestring ( mem_ctx , mod - > in . change . fld - > tv_sec ) , mod - > in . change . fld - > tv_usec ) ; \
return False ; \
} \
}
# define CMP_NUM_FLD(fld, flags) \
if ( ( mod - > in . change . fields & flags ) & & \
( i - > fld ! = mod - > in . change . fld ) ) { \
printf ( " '%s' field does not match \n " , # fld ) ; \
printf ( " received: '%04x' \n " , i - > fld ) ; \
printf ( " expected: '%04x' \n " , mod - > in . change . fld ) ; \
return False ; \
}
static BOOL test_compare ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
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 */
status = libnet_rpc_userinfo ( p , mem_ctx , & info ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Failed to call sync libnet_rpc_userinfo - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
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 )
return True ;
}
2006-03-25 19:01:28 +03:00
BOOL torture_useradd ( struct torture_context * torture )
2005-04-19 19:11:58 +04:00
{
NTSTATUS status ;
const char * binding ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
2005-07-08 12:09:02 +04:00
struct lsa_String domain_name ;
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 ;
BOOL ret = True ;
mem_ctx = talloc_init ( " test_useradd " ) ;
2006-10-18 18:23:19 +04:00
binding = torture_setting_string ( torture , " binding " , NULL ) ;
2005-04-19 19:11:58 +04:00
status = torture_rpc_connection ( mem_ctx ,
& p ,
2005-12-27 17:28:01 +03:00
& dcerpc_table_samr ) ;
2005-04-19 19:11:58 +04:00
2005-04-22 19:13:01 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2005-04-19 19:11:58 +04:00
domain_name . string = lp_workgroup ( ) ;
if ( ! test_opendomain ( p , mem_ctx , & h , & domain_name ) ) {
ret = False ;
goto done ;
}
if ( ! test_useradd ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
2005-04-21 05:00:30 +04:00
if ( ! test_cleanup ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
2005-05-10 22:17:40 +04:00
if ( ! test_opendomain ( p , mem_ctx , & h , & domain_name ) ) {
ret = False ;
goto done ;
}
if ( ! test_useradd_async ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
if ( ! test_cleanup ( p , mem_ctx , & h , name ) ) {
ret = False ;
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
2006-03-25 19:01:28 +03:00
BOOL torture_userdel ( struct torture_context * torture )
2005-04-21 11:25:16 +04:00
{
NTSTATUS status ;
const char * binding ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
2005-07-08 12:09:02 +04:00
struct lsa_String domain_name ;
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 ;
BOOL ret = True ;
mem_ctx = talloc_init ( " test_userdel " ) ;
2006-10-18 18:23:19 +04:00
binding = torture_setting_string ( torture , " binding " , NULL ) ;
2005-04-21 11:25:16 +04:00
status = torture_rpc_connection ( mem_ctx ,
& p ,
2005-12-27 17:28:01 +03:00
& dcerpc_table_samr ) ;
2005-04-21 11:25:16 +04:00
2005-04-22 19:13:01 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2005-04-21 11:25:16 +04:00
domain_name . string = lp_workgroup ( ) ;
if ( ! test_opendomain ( p , mem_ctx , & h , & domain_name ) ) {
ret = False ;
goto done ;
}
if ( ! test_createuser ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
2005-04-22 09:11:53 +04:00
if ( ! test_userdel ( p , mem_ctx , & h , name ) ) {
2005-04-21 11:25:16 +04:00
ret = False ;
goto done ;
}
2005-04-22 09:11:53 +04:00
2005-04-21 11:25:16 +04:00
done :
talloc_free ( mem_ctx ) ;
return ret ;
}
2005-07-22 02:33:47 +04:00
2006-03-25 19:01:28 +03:00
BOOL torture_usermod ( struct torture_context * torture )
2005-07-22 02:33:47 +04:00
{
NTSTATUS status ;
const char * binding ;
struct dcerpc_pipe * p ;
struct policy_handle h ;
struct lsa_String domain_name ;
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 ;
BOOL ret = True ;
2006-08-22 23:28:44 +04:00
2005-07-22 02:33:47 +04:00
mem_ctx = talloc_init ( " test_userdel " ) ;
2006-10-18 18:23:19 +04:00
binding = torture_setting_string ( torture , " binding " , NULL ) ;
2005-07-22 02:33:47 +04:00
status = torture_rpc_connection ( mem_ctx ,
& p ,
2005-12-27 17:28:01 +03:00
& dcerpc_table_samr ) ;
2005-07-22 02:33:47 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2006-09-19 23:15:36 +04:00
ret = False ;
goto done ;
2005-07-22 02:33:47 +04:00
}
domain_name . string = lp_workgroup ( ) ;
2006-09-19 23:15:36 +04:00
name = talloc_strdup ( mem_ctx , TEST_USERNAME ) ;
2005-07-22 02:33:47 +04:00
if ( ! test_opendomain ( p , mem_ctx , & h , & domain_name ) ) {
ret = False ;
goto done ;
}
if ( ! test_createuser ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
2006-10-02 10:00:14 +04:00
for ( i = 1 ; i < FIELDS_NUM ; i + + ) {
2006-09-21 03:42:58 +04:00
struct libnet_rpc_usermod m ;
2005-07-23 14:27:45 +04:00
2006-09-21 03:42:58 +04:00
if ( ! test_usermod ( p , mem_ctx , & h , i , & m , & name ) ) {
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
2006-09-21 03:42:58 +04:00
if ( ! test_compare ( p , mem_ctx , & h , & m , name ) ) {
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
}
2006-09-21 03:42:58 +04:00
2006-10-02 10:00:14 +04:00
cleanup :
2005-07-22 02:33:47 +04:00
if ( ! test_cleanup ( p , mem_ctx , & h , name ) ) {
ret = False ;
goto done ;
}
done :
talloc_free ( mem_ctx ) ;
return ret ;
}