2003-11-15 09:00:21 +03:00
/*
Unix SMB / CIFS implementation .
test suite for samr rpc operations
Copyright ( C ) Andrew Tridgell 2003
2003-12-03 06:10:10 +03:00
Copyright ( C ) Andrew Bartlett < abartlet @ samba . org > 2003
2003-11-15 09:00:21 +03: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 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"
2004-11-01 13:30:34 +03:00
# include "librpc/gen_ndr/ndr_lsa.h"
# include "librpc/gen_ndr/ndr_samr.h"
2004-11-02 09:14:15 +03:00
# include "lib/crypto/crypto.h"
2003-11-15 09:00:21 +03:00
2004-06-05 07:22:10 +04:00
# define TEST_ACCOUNT_NAME "samrtorturetest"
2003-12-19 06:59:27 +03:00
# define TEST_ALIASNAME "samrtorturetestalias"
2004-04-17 09:54:55 +04:00
# define TEST_GROUPNAME "samrtorturetestgroup"
2003-12-03 06:10:10 +03:00
# define TEST_MACHINENAME "samrtorturetestmach$"
# define TEST_DOMAINNAME "samrtorturetestdom$"
2003-11-19 06:20:32 +03:00
2003-12-19 06:59:27 +03:00
2003-11-20 06:09:19 +03:00
static BOOL test_QueryUserInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ) ;
2004-04-18 08:32:04 +04:00
static BOOL test_QueryUserInfo2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ) ;
2003-12-19 06:59:27 +03:00
static BOOL test_QueryAliasInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ) ;
2004-11-13 16:45:41 +03:00
static void init_samr_String ( struct samr_String * string , const char * s )
2003-11-19 06:20:32 +03:00
{
2004-11-13 16:45:41 +03:00
string - > string = s ;
2003-11-19 06:20:32 +03:00
}
2004-11-13 16:45:41 +03:00
BOOL test_samr_handle_Close ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
2003-11-15 23:47:59 +03:00
{
NTSTATUS status ;
struct samr_Close r ;
r . in . handle = handle ;
r . out . handle = handle ;
status = dcerpc_samr_Close ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Close handle failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2004-04-23 09:40:18 +04:00
static BOOL test_Shutdown ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_Shutdown r ;
2004-12-31 04:02:22 +03:00
if ( ! lp_parm_bool ( - 1 , " torture " , " dangerous " , False ) ) {
2004-04-23 09:40:18 +04:00
printf ( " samr_Shutdown disabled - enable dangerous tests to use \n " ) ;
return True ;
}
2004-09-21 07:51:38 +04:00
r . in . connect_handle = handle ;
2004-04-23 09:40:18 +04:00
printf ( " testing samr_Shutdown \n " ) ;
status = dcerpc_samr_Shutdown ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " samr_Shutdown failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
static BOOL test_SetDsrmPassword ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_SetDsrmPassword r ;
2004-11-13 16:45:41 +03:00
struct samr_String string ;
2004-06-04 15:58:46 +04:00
struct samr_Password hash ;
2004-04-23 09:40:18 +04:00
2004-12-31 04:02:22 +03:00
if ( ! lp_parm_bool ( - 1 , " torture " , " dangerous " , False ) ) {
2004-04-23 09:40:18 +04:00
printf ( " samr_SetDsrmPassword disabled - enable dangerous tests to use \n " ) ;
return True ;
}
E_md4hash ( " TeSTDSRM123 " , hash . hash ) ;
2004-11-13 16:45:41 +03:00
init_samr_String ( & string , " Administrator " ) ;
2004-04-23 09:40:18 +04:00
2004-11-13 16:45:41 +03:00
r . in . name = & string ;
2004-04-23 09:40:18 +04:00
r . in . unknown = 0 ;
r . in . hash = & hash ;
printf ( " testing samr_SetDsrmPassword \n " ) ;
status = dcerpc_samr_SetDsrmPassword ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( status , NT_STATUS_NOT_SUPPORTED ) ) {
printf ( " samr_SetDsrmPassword failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2003-11-15 23:47:59 +03:00
2003-11-18 08:20:54 +03:00
static BOOL test_QuerySecurity ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QuerySecurity r ;
2003-12-20 02:44:26 +03:00
struct samr_SetSecurity s ;
2003-11-18 08:20:54 +03:00
r . in . handle = handle ;
r . in . sec_info = 7 ;
status = dcerpc_samr_QuerySecurity ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QuerySecurity failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-06-07 13:01:40 +04:00
if ( r . out . sdbuf = = NULL ) {
2004-05-28 17:23:30 +04:00
return False ;
}
2003-12-20 02:44:26 +03:00
s . in . handle = handle ;
s . in . sec_info = 7 ;
s . in . sdbuf = r . out . sdbuf ;
status = dcerpc_samr_SetSecurity ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetSecurity failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
status = dcerpc_samr_QuerySecurity ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QuerySecurity failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-18 08:20:54 +03:00
return True ;
}
2003-11-20 10:20:59 +03:00
static BOOL test_SetUserInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-10-20 06:08:36 +04:00
struct policy_handle * handle , uint32_t base_acct_flags )
2003-11-20 10:20:59 +03:00
{
NTSTATUS status ;
2003-11-20 13:29:54 +03:00
struct samr_SetUserInfo s ;
2004-04-21 10:23:29 +04:00
struct samr_SetUserInfo2 s2 ;
2003-11-20 13:29:54 +03:00
struct samr_QueryUserInfo q ;
2003-11-20 13:53:08 +03:00
struct samr_QueryUserInfo q0 ;
2003-11-20 10:20:59 +03:00
union samr_UserInfo u ;
BOOL ret = True ;
2004-10-20 06:08:36 +04:00
uint32_t user_extra_flags = 0 ;
if ( base_acct_flags = = ACB_NORMAL ) {
/* Don't know what this is, but it is always here for users - you can't get rid of it */
user_extra_flags = 0x20000 ;
}
2004-09-21 07:51:38 +04:00
s . in . user_handle = handle ;
2003-11-20 13:29:54 +03:00
s . in . info = & u ;
2004-04-21 10:23:29 +04:00
2004-09-21 07:51:38 +04:00
s2 . in . user_handle = handle ;
2004-04-21 10:23:29 +04:00
s2 . in . info = & u ;
2004-09-21 07:51:38 +04:00
q . in . user_handle = handle ;
2003-11-20 13:29:54 +03:00
q . out . info = & u ;
2003-11-20 13:53:08 +03:00
q0 = q ;
2003-11-20 13:29:54 +03:00
# define TESTCALL(call, r) \
status = dcerpc_samr_ # # call ( p , mem_ctx , & r ) ; \
if ( ! NT_STATUS_IS_OK ( status ) ) { \
printf ( # call " level %u failed - %s (line %d) \n " , \
r . in . level , nt_errstr ( status ) , __LINE__ ) ; \
ret = False ; \
break ; \
}
# define STRING_EQUAL(s1, s2, field) \
if ( ( s1 & & ! s2 ) | | ( s2 & & ! s1 ) | | strcmp ( s1 , s2 ) ) { \
printf ( " Failed to set %s to '%s' (line %d) \n " , \
# field, s2, __LINE__); \
ret = False ; \
break ; \
}
# define INT_EQUAL(i1, i2, field) \
if ( i1 ! = i2 ) { \
2004-10-20 06:08:36 +04:00
printf ( " Failed to set %s to 0x%x - got 0x%x (line %d) \n " , \
# field, i2, i1, __LINE__); \
2003-11-20 13:29:54 +03:00
ret = False ; \
break ; \
}
2004-11-13 16:45:41 +03:00
# define TEST_USERINFO_STRING(lvl1, field1, lvl2, field2, value, fpval) do { \
2003-11-20 13:29:54 +03:00
printf ( " field test %d/%s vs %d/%s \n " , lvl1 , # field1 , lvl2 , # field2 ) ; \
q . in . level = lvl1 ; \
TESTCALL ( QueryUserInfo , q ) \
s . in . level = lvl1 ; \
2004-04-21 10:23:29 +04:00
s2 . in . level = lvl1 ; \
2003-11-20 13:29:54 +03:00
u = * q . out . info ; \
2004-01-19 11:59:14 +03:00
if ( lvl1 = = 21 ) { \
2004-04-22 11:28:18 +04:00
ZERO_STRUCT ( u . info21 ) ; \
2004-01-19 11:59:14 +03:00
u . info21 . fields_present = fpval ; \
} \
2004-11-13 16:45:41 +03:00
init_samr_String ( & u . info # # lvl1 . field1 , value ) ; \
2003-11-20 13:29:54 +03:00
TESTCALL ( SetUserInfo , s ) \
2004-04-21 10:23:29 +04:00
TESTCALL ( SetUserInfo2 , s2 ) \
2004-11-13 16:45:41 +03:00
init_samr_String ( & u . info # # lvl1 . field1 , " " ) ; \
2003-11-20 13:29:54 +03:00
TESTCALL ( QueryUserInfo , q ) ; \
u = * q . out . info ; \
2004-11-13 16:45:41 +03:00
STRING_EQUAL ( u . info # # lvl1 . field1 . string , value , field1 ) ; \
2003-11-20 13:29:54 +03:00
q . in . level = lvl2 ; \
TESTCALL ( QueryUserInfo , q ) \
u = * q . out . info ; \
2004-11-13 16:45:41 +03:00
STRING_EQUAL ( u . info # # lvl2 . field2 . string , value , field2 ) ; \
2003-11-20 13:29:54 +03:00
} while ( 0 )
2004-10-20 06:08:36 +04:00
# define TEST_USERINFO_INT_EXP(lvl1, field1, lvl2, field2, value, exp_value, fpval) do { \
2003-11-20 13:29:54 +03:00
printf ( " field test %d/%s vs %d/%s \n " , lvl1 , # field1 , lvl2 , # field2 ) ; \
q . in . level = lvl1 ; \
TESTCALL ( QueryUserInfo , q ) \
s . in . level = lvl1 ; \
2004-04-21 10:23:29 +04:00
s2 . in . level = lvl1 ; \
2003-11-20 13:29:54 +03:00
u = * q . out . info ; \
2004-01-19 11:59:14 +03:00
if ( lvl1 = = 21 ) { \
2004-05-25 21:50:17 +04:00
uint8_t * bitmap = u . info21 . logon_hours . bitmap ; \
2004-04-22 11:28:18 +04:00
ZERO_STRUCT ( u . info21 ) ; \
2004-04-30 07:57:48 +04:00
if ( fpval = = SAMR_FIELD_LOGON_HOURS ) { \
2004-04-22 11:28:18 +04:00
u . info21 . logon_hours . units_per_week = 168 ; \
u . info21 . logon_hours . bitmap = bitmap ; \
} \
2004-01-19 11:59:14 +03:00
u . info21 . fields_present = fpval ; \
} \
2004-04-22 11:28:18 +04:00
u . info # # lvl1 . field1 = value ; \
2003-11-20 13:29:54 +03:00
TESTCALL ( SetUserInfo , s ) \
2004-04-21 10:23:29 +04:00
TESTCALL ( SetUserInfo2 , s2 ) \
2003-11-20 13:29:54 +03:00
u . info # # lvl1 . field1 = 0 ; \
TESTCALL ( QueryUserInfo , q ) ; \
u = * q . out . info ; \
2004-10-20 06:08:36 +04:00
INT_EQUAL ( u . info # # lvl1 . field1 , exp_value , field1 ) ; \
2003-11-20 13:29:54 +03:00
q . in . level = lvl2 ; \
TESTCALL ( QueryUserInfo , q ) \
u = * q . out . info ; \
2004-10-20 06:08:36 +04:00
INT_EQUAL ( u . info # # lvl2 . field2 , exp_value , field1 ) ; \
2003-11-20 13:29:54 +03:00
} while ( 0 )
2003-11-20 13:53:08 +03:00
2004-10-20 06:08:36 +04:00
# define TEST_USERINFO_INT(lvl1, field1, lvl2, field2, value, fpval) do { \
TEST_USERINFO_INT_EXP ( lvl1 , field1 , lvl2 , field2 , value , value , fpval ) ; \
} while ( 0 )
2003-11-20 13:53:08 +03:00
q0 . in . level = 12 ;
do { TESTCALL ( QueryUserInfo , q0 ) } while ( 0 ) ;
2003-11-20 10:20:59 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 2 , comment , 1 , comment , " xx2-1 comment " , 0 ) ;
TEST_USERINFO_STRING ( 2 , comment , 21 , comment , " xx2-21 comment " , 0 ) ;
TEST_USERINFO_STRING ( 21 , comment , 21 , comment , " xx21-21 comment " ,
2004-04-30 07:57:48 +04:00
SAMR_FIELD_COMMENT ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 6 , full_name , 1 , full_name , " xx6-1 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 6 , full_name , 3 , full_name , " xx6-3 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 6 , full_name , 5 , full_name , " xx6-5 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 6 , full_name , 6 , full_name , " xx6-6 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 6 , full_name , 8 , full_name , " xx6-8 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 6 , full_name , 21 , full_name , " xx6-21 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 8 , full_name , 21 , full_name , " xx8-21 full_name " , 0 ) ;
TEST_USERINFO_STRING ( 21 , full_name , 21 , full_name , " xx21-21 full_name " ,
2004-04-30 07:57:48 +04:00
SAMR_FIELD_NAME ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 11 , logon_script , 3 , logon_script , " xx11-3 logon_script " , 0 ) ;
TEST_USERINFO_STRING ( 11 , logon_script , 5 , logon_script , " xx11-5 logon_script " , 0 ) ;
TEST_USERINFO_STRING ( 11 , logon_script , 21 , logon_script , " xx11-21 logon_script " , 0 ) ;
TEST_USERINFO_STRING ( 21 , logon_script , 21 , logon_script , " xx21-21 logon_script " ,
2004-04-30 07:57:48 +04:00
SAMR_FIELD_LOGON_SCRIPT ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 12 , profile_path , 3 , profile_path , " xx12-3 profile_path " , 0 ) ;
TEST_USERINFO_STRING ( 12 , profile_path , 5 , profile_path , " xx12-5 profile_path " , 0 ) ;
TEST_USERINFO_STRING ( 12 , profile_path , 21 , profile_path , " xx12-21 profile_path " , 0 ) ;
TEST_USERINFO_STRING ( 21 , profile_path , 21 , profile_path , " xx21-21 profile_path " ,
2004-06-05 07:22:10 +04:00
SAMR_FIELD_PROFILE_PATH ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 13 , description , 1 , description , " xx13-1 description " , 0 ) ;
TEST_USERINFO_STRING ( 13 , description , 5 , description , " xx13-5 description " , 0 ) ;
TEST_USERINFO_STRING ( 13 , description , 21 , description , " xx13-21 description " , 0 ) ;
TEST_USERINFO_STRING ( 21 , description , 21 , description , " xx21-21 description " ,
2004-04-30 07:57:48 +04:00
SAMR_FIELD_DESCRIPTION ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 14 , workstations , 3 , workstations , " 14workstation3 " , 0 ) ;
TEST_USERINFO_STRING ( 14 , workstations , 5 , workstations , " 14workstation4 " , 0 ) ;
TEST_USERINFO_STRING ( 14 , workstations , 21 , workstations , " 14workstation21 " , 0 ) ;
TEST_USERINFO_STRING ( 21 , workstations , 21 , workstations , " 21workstation21 " ,
2004-04-30 07:57:48 +04:00
SAMR_FIELD_WORKSTATION ) ;
2004-01-19 11:59:14 +03:00
2004-11-13 16:45:41 +03:00
TEST_USERINFO_STRING ( 20 , parameters , 21 , parameters , " xx20-21 parameters " , 0 ) ;
TEST_USERINFO_STRING ( 21 , parameters , 21 , parameters , " xx21-21 parameters " ,
SAMR_FIELD_PARAMETERS ) ;
2004-01-19 11:59:14 +03:00
TEST_USERINFO_INT ( 2 , country_code , 21 , country_code , __LINE__ , 0 ) ;
2004-04-30 07:57:48 +04:00
TEST_USERINFO_INT ( 21 , country_code , 21 , country_code , __LINE__ ,
SAMR_FIELD_COUNTRY_CODE ) ;
2004-01-19 11:59:14 +03:00
TEST_USERINFO_INT ( 2 , code_page , 21 , code_page , __LINE__ , 0 ) ;
2004-04-30 07:57:48 +04:00
TEST_USERINFO_INT ( 21 , code_page , 21 , code_page , __LINE__ ,
SAMR_FIELD_CODE_PAGE ) ;
2004-01-19 11:59:14 +03:00
2004-04-23 09:40:18 +04:00
TEST_USERINFO_INT ( 4 , logon_hours . bitmap [ 3 ] , 3 , logon_hours . bitmap [ 3 ] , 1 , 0 ) ;
TEST_USERINFO_INT ( 4 , logon_hours . bitmap [ 3 ] , 5 , logon_hours . bitmap [ 3 ] , 2 , 0 ) ;
TEST_USERINFO_INT ( 4 , logon_hours . bitmap [ 3 ] , 21 , logon_hours . bitmap [ 3 ] , 3 , 0 ) ;
2004-04-30 07:57:48 +04:00
TEST_USERINFO_INT ( 21 , logon_hours . bitmap [ 3 ] , 21 , logon_hours . bitmap [ 3 ] , 4 ,
SAMR_FIELD_LOGON_HOURS ) ;
2003-11-20 13:53:08 +03:00
2004-10-20 06:08:36 +04:00
TEST_USERINFO_INT_EXP ( 16 , acct_flags , 5 , acct_flags ,
( base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ ) ,
( base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ | user_extra_flags ) ,
0 ) ;
TEST_USERINFO_INT_EXP ( 16 , acct_flags , 5 , acct_flags ,
( base_acct_flags | ACB_DISABLED ) ,
( base_acct_flags | ACB_DISABLED | user_extra_flags ) ,
0 ) ;
/* Setting PWNOEXP clears the magic 0x20000 flag */
TEST_USERINFO_INT_EXP ( 16 , acct_flags , 5 , acct_flags ,
( base_acct_flags | ACB_DISABLED | ACB_PWNOEXP ) ,
( base_acct_flags | ACB_DISABLED | ACB_PWNOEXP ) ,
0 ) ;
TEST_USERINFO_INT_EXP ( 16 , acct_flags , 21 , acct_flags ,
( base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ ) ,
( base_acct_flags | ACB_DISABLED | ACB_HOMDIRREQ | user_extra_flags ) ,
0 ) ;
/* The 'autolock' flag doesn't stick - check this */
TEST_USERINFO_INT_EXP ( 16 , acct_flags , 21 , acct_flags ,
( base_acct_flags | ACB_DISABLED | ACB_AUTOLOCK ) ,
( base_acct_flags | ACB_DISABLED | user_extra_flags ) ,
0 ) ;
TEST_USERINFO_INT_EXP ( 21 , acct_flags , 21 , acct_flags ,
( base_acct_flags | ACB_DISABLED ) ,
( base_acct_flags | ACB_DISABLED | user_extra_flags ) ,
SAMR_FIELD_ACCT_FLAGS ) ;
2003-12-19 06:59:27 +03:00
#if 0
/* these fail with win2003 - it appears you can't set the primary gid?
the set succeeds , but the gid isn ' t changed . Very weird ! */
2003-11-20 13:53:08 +03:00
TEST_USERINFO_INT ( 9 , primary_gid , 1 , primary_gid , 513 ) ;
TEST_USERINFO_INT ( 9 , primary_gid , 3 , primary_gid , 513 ) ;
TEST_USERINFO_INT ( 9 , primary_gid , 5 , primary_gid , 513 ) ;
TEST_USERINFO_INT ( 9 , primary_gid , 21 , primary_gid , 513 ) ;
2003-12-19 06:59:27 +03:00
# endif
return ret ;
}
2004-04-22 10:19:48 +04:00
/*
generate a random password for password change tests
*/
2004-10-20 06:08:36 +04:00
static char * samr_rand_pass ( TALLOC_CTX * mem_ctx , int min_len )
2004-04-22 10:19:48 +04:00
{
2004-10-20 06:08:36 +04:00
size_t len = MAX ( 8 , min_len ) + ( random ( ) % 6 ) ;
2004-05-15 11:51:38 +04:00
char * s = generate_random_str ( mem_ctx , len ) ;
2004-04-22 10:19:48 +04:00
printf ( " Generated password '%s' \n " , s ) ;
2004-05-15 11:51:38 +04:00
return s ;
2004-04-22 10:19:48 +04:00
}
2004-04-21 09:01:31 +04:00
static BOOL test_SetUserPass ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-04-22 10:19:48 +04:00
struct policy_handle * handle , char * * password )
2004-04-21 09:01:31 +04:00
{
NTSTATUS status ;
struct samr_SetUserInfo s ;
union samr_UserInfo u ;
BOOL ret = True ;
2004-05-09 17:37:17 +04:00
DATA_BLOB session_key ;
2004-10-20 06:08:36 +04:00
char * newpass ;
struct samr_GetUserPwInfo pwp ;
int policy_min_pw_len = 0 ;
pwp . in . user_handle = handle ;
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & pwp ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = pwp . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-04-21 09:01:31 +04:00
2004-09-21 07:51:38 +04:00
s . in . user_handle = handle ;
2004-04-21 09:01:31 +04:00
s . in . info = & u ;
s . in . level = 24 ;
2004-04-22 10:19:48 +04:00
encode_pw_buffer ( u . info24 . password . data , newpass , STR_UNICODE ) ;
2004-05-10 15:23:50 +04:00
/* w2k3 ignores this length */
2004-09-23 04:10:40 +04:00
u . info24 . pw_len = strlen_m ( newpass ) * 2 ;
2004-04-21 09:01:31 +04:00
2004-05-09 17:37:17 +04:00
status = dcerpc_fetch_session_key ( p , & session_key ) ;
2004-04-21 09:01:31 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u - no session key - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
return False ;
}
2004-06-04 03:15:16 +04:00
arcfour_crypt_blob ( u . info24 . password . data , 516 , & session_key ) ;
2004-04-21 09:01:31 +04:00
printf ( " Testing SetUserInfo level 24 (set password) \n " ) ;
status = dcerpc_samr_SetUserInfo ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u failed - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
ret = False ;
2004-04-22 10:19:48 +04:00
} else {
* password = newpass ;
2004-04-21 09:01:31 +04:00
}
return ret ;
}
2004-04-28 17:15:49 +04:00
2004-04-30 07:57:48 +04:00
static BOOL test_SetUserPass_23 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-10-20 06:08:36 +04:00
struct policy_handle * handle , uint32 fields_present ,
char * * password )
2004-04-30 07:57:48 +04:00
{
NTSTATUS status ;
struct samr_SetUserInfo s ;
union samr_UserInfo u ;
BOOL ret = True ;
2004-05-09 17:37:17 +04:00
DATA_BLOB session_key ;
2004-10-20 06:08:36 +04:00
char * newpass ;
struct samr_GetUserPwInfo pwp ;
int policy_min_pw_len = 0 ;
pwp . in . user_handle = handle ;
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & pwp ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = pwp . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-04-30 07:57:48 +04:00
2004-09-21 07:51:38 +04:00
s . in . user_handle = handle ;
2004-04-30 07:57:48 +04:00
s . in . info = & u ;
s . in . level = 23 ;
ZERO_STRUCT ( u ) ;
2004-10-20 06:08:36 +04:00
u . info23 . info . fields_present = fields_present ;
2004-04-30 07:57:48 +04:00
encode_pw_buffer ( u . info23 . password . data , newpass , STR_UNICODE ) ;
2004-05-09 17:37:17 +04:00
status = dcerpc_fetch_session_key ( p , & session_key ) ;
2004-04-30 07:57:48 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u - no session key - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
return False ;
}
2004-06-04 03:15:16 +04:00
arcfour_crypt_blob ( u . info23 . password . data , 516 , & session_key ) ;
2004-04-30 07:57:48 +04:00
printf ( " Testing SetUserInfo level 23 (set password) \n " ) ;
status = dcerpc_samr_SetUserInfo ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u failed - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
ret = False ;
} else {
* password = newpass ;
}
return ret ;
}
2004-04-28 17:15:49 +04:00
static BOOL test_SetUserPassEx ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle , char * * password )
{
NTSTATUS status ;
struct samr_SetUserInfo s ;
union samr_UserInfo u ;
BOOL ret = True ;
2004-05-09 17:37:17 +04:00
DATA_BLOB session_key ;
DATA_BLOB confounded_session_key = data_blob_talloc ( mem_ctx , NULL , 16 ) ;
2004-05-25 21:50:17 +04:00
uint8_t confounder [ 16 ] ;
2004-10-20 06:08:36 +04:00
char * newpass ;
2004-04-28 17:15:49 +04:00
struct MD5Context ctx ;
2004-10-20 06:08:36 +04:00
struct samr_GetUserPwInfo pwp ;
int policy_min_pw_len = 0 ;
pwp . in . user_handle = handle ;
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & pwp ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = pwp . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-04-28 17:15:49 +04:00
2004-09-21 07:51:38 +04:00
s . in . user_handle = handle ;
2004-04-28 17:15:49 +04:00
s . in . info = & u ;
s . in . level = 26 ;
encode_pw_buffer ( u . info26 . password . data , newpass , STR_UNICODE ) ;
u . info26 . pw_len = strlen ( newpass ) ;
2004-05-09 17:37:17 +04:00
status = dcerpc_fetch_session_key ( p , & session_key ) ;
2004-04-28 17:15:49 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u - no session key - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
return False ;
}
2004-07-14 16:14:07 +04:00
generate_random_buffer ( ( uint8_t * ) confounder , 16 ) ;
2004-04-28 17:15:49 +04:00
MD5Init ( & ctx ) ;
MD5Update ( & ctx , confounder , 16 ) ;
2004-05-09 17:37:17 +04:00
MD5Update ( & ctx , session_key . data , session_key . length ) ;
MD5Final ( confounded_session_key . data , & ctx ) ;
2004-04-28 17:15:49 +04:00
2004-06-04 03:15:16 +04:00
arcfour_crypt_blob ( u . info26 . password . data , 516 , & confounded_session_key ) ;
2004-04-28 17:15:49 +04:00
memcpy ( & u . info26 . password . data [ 516 ] , confounder , 16 ) ;
printf ( " Testing SetUserInfo level 26 (set password ex) \n " ) ;
status = dcerpc_samr_SetUserInfo ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u failed - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
ret = False ;
} else {
* password = newpass ;
}
return ret ;
}
2004-04-30 07:57:48 +04:00
static BOOL test_SetUserPass_25 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-10-20 06:08:36 +04:00
struct policy_handle * handle , uint32 fields_present ,
char * * password )
2004-04-30 07:57:48 +04:00
{
NTSTATUS status ;
struct samr_SetUserInfo s ;
union samr_UserInfo u ;
BOOL ret = True ;
2004-05-09 17:37:17 +04:00
DATA_BLOB session_key ;
DATA_BLOB confounded_session_key = data_blob_talloc ( mem_ctx , NULL , 16 ) ;
2004-04-30 07:57:48 +04:00
struct MD5Context ctx ;
2004-10-20 06:08:36 +04:00
uint8_t confounder [ 16 ] ;
char * newpass ;
struct samr_GetUserPwInfo pwp ;
int policy_min_pw_len = 0 ;
pwp . in . user_handle = handle ;
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & pwp ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = pwp . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-04-30 07:57:48 +04:00
2004-09-21 07:51:38 +04:00
s . in . user_handle = handle ;
2004-04-30 07:57:48 +04:00
s . in . info = & u ;
s . in . level = 25 ;
ZERO_STRUCT ( u ) ;
2004-10-20 06:08:36 +04:00
u . info25 . info . fields_present = fields_present ;
2004-04-30 07:57:48 +04:00
encode_pw_buffer ( u . info25 . password . data , newpass , STR_UNICODE ) ;
2004-05-09 17:37:17 +04:00
status = dcerpc_fetch_session_key ( p , & session_key ) ;
2004-04-30 07:57:48 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u - no session key - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
return False ;
}
2004-07-14 16:14:07 +04:00
generate_random_buffer ( ( uint8_t * ) confounder , 16 ) ;
2004-04-30 07:57:48 +04:00
MD5Init ( & ctx ) ;
MD5Update ( & ctx , confounder , 16 ) ;
2004-05-09 17:37:17 +04:00
MD5Update ( & ctx , session_key . data , session_key . length ) ;
MD5Final ( confounded_session_key . data , & ctx ) ;
2004-04-30 07:57:48 +04:00
2004-06-04 03:15:16 +04:00
arcfour_crypt_blob ( u . info25 . password . data , 516 , & confounded_session_key ) ;
2004-04-30 07:57:48 +04:00
memcpy ( & u . info25 . password . data [ 516 ] , confounder , 16 ) ;
printf ( " Testing SetUserInfo level 25 (set password ex) \n " ) ;
status = dcerpc_samr_SetUserInfo ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetUserInfo level %u failed - %s \n " ,
s . in . level , nt_errstr ( status ) ) ;
ret = False ;
} else {
* password = newpass ;
}
return ret ;
}
2003-12-19 06:59:27 +03:00
static BOOL test_SetAliasInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_SetAliasInfo r ;
struct samr_QueryAliasInfo q ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 2 , 3 } ;
2003-12-19 06:59:27 +03:00
int i ;
BOOL ret = True ;
/* Ignoring switch level 1, as that includes the number of members for the alias
* and setting this to a wrong value might have negative consequences
*/
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing SetAliasInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . alias_handle = handle ;
2003-12-19 06:59:27 +03:00
r . in . level = levels [ i ] ;
switch ( r . in . level ) {
2004-12-27 14:27:30 +03:00
case 2 : init_samr_String ( & r . in . info - > name , TEST_ALIASNAME ) ; break ;
case 3 : init_samr_String ( & r . in . info - > description ,
2003-12-19 06:59:27 +03:00
" Test Description, should test I18N as well " ) ; break ;
}
status = dcerpc_samr_SetAliasInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetAliasInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2004-09-21 07:51:38 +04:00
q . in . alias_handle = handle ;
2003-12-19 06:59:27 +03:00
q . in . level = levels [ i ] ;
status = dcerpc_samr_QueryAliasInfo ( p , mem_ctx , & q ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryAliasInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
2003-11-20 13:53:08 +03:00
2003-11-20 10:20:59 +03:00
return ret ;
}
2003-12-19 06:59:27 +03:00
static BOOL test_GetGroupsForUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * user_handle )
{
struct samr_GetGroupsForUser r ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " testing GetGroupsForUser \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . user_handle = user_handle ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_GetGroupsForUser ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetGroupsForUser failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-21 10:23:29 +04:00
static BOOL test_GetDomPwInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-11-13 16:45:41 +03:00
struct samr_String * domain_name )
2004-04-21 10:23:29 +04:00
{
NTSTATUS status ;
struct samr_GetDomPwInfo r ;
BOOL ret = True ;
r . in . name = domain_name ;
2004-11-13 16:45:41 +03:00
printf ( " Testing GetDomPwInfo with name %s \n " , r . in . name - > string ) ;
2004-05-26 11:33:05 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetDomPwInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
r . in . name - > string = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
printf ( " Testing GetDomPwInfo with name %s \n " , r . in . name - > string ) ;
2004-04-21 10:23:29 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetDomPwInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
r . in . name - > string = " \\ \\ __NONAME__ " ;
printf ( " Testing GetDomPwInfo with name %s \n " , r . in . name - > string ) ;
2004-05-26 11:33:05 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetDomPwInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
r . in . name - > string = " \\ \\ Builtin " ;
printf ( " Testing GetDomPwInfo with name %s \n " , r . in . name - > string ) ;
2004-05-26 11:33:05 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetDomPwInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-04-21 10:23:29 +04:00
return ret ;
}
2003-11-21 16:14:17 +03:00
static BOOL test_GetUserPwInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_GetUserPwInfo r ;
BOOL ret = True ;
printf ( " Testing GetUserPwInfo \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . user_handle = handle ;
2003-11-21 16:14:17 +03:00
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetUserPwInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-18 08:06:15 +04:00
static NTSTATUS test_LookupName ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle , const char * name ,
2004-05-25 20:24:13 +04:00
uint32_t * rid )
2004-04-18 08:06:15 +04:00
{
NTSTATUS status ;
struct samr_LookupNames n ;
2004-11-13 16:45:41 +03:00
struct samr_String sname [ 2 ] ;
2004-04-18 08:06:15 +04:00
2004-11-13 16:45:41 +03:00
init_samr_String ( & sname [ 0 ] , name ) ;
2004-04-18 08:06:15 +04:00
2004-09-21 07:51:38 +04:00
n . in . domain_handle = domain_handle ;
2004-04-18 08:06:15 +04:00
n . in . num_names = 1 ;
2004-05-08 03:57:35 +04:00
n . in . names = sname ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_LookupNames ( p , mem_ctx , & n ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
* rid = n . out . rids . ids [ 0 ] ;
2004-05-08 03:57:35 +04:00
} else {
return status ;
}
2004-11-13 16:45:41 +03:00
init_samr_String ( & sname [ 1 ] , " xxNONAMExx " ) ;
2004-05-08 03:57:35 +04:00
n . in . num_names = 2 ;
status = dcerpc_samr_LookupNames ( p , mem_ctx , & n ) ;
if ( ! NT_STATUS_EQUAL ( status , STATUS_SOME_UNMAPPED ) ) {
printf ( " LookupNames[2] failed - %s \n " , nt_errstr ( status ) ) ;
return status ;
}
2004-11-13 16:45:41 +03:00
init_samr_String ( & sname [ 1 ] , " xxNONAMExx " ) ;
2004-05-08 03:57:35 +04:00
n . in . num_names = 0 ;
status = dcerpc_samr_LookupNames ( p , mem_ctx , & n ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupNames[0] failed - %s \n " , nt_errstr ( status ) ) ;
2004-04-18 08:06:15 +04:00
}
return status ;
}
static NTSTATUS test_OpenUser_byname ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle ,
const char * name , struct policy_handle * user_handle )
{
NTSTATUS status ;
struct samr_OpenUser r ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-04-18 08:06:15 +04:00
status = test_LookupName ( p , mem_ctx , domain_handle , name , & rid ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return status ;
}
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-04-18 08:06:15 +04:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . user_handle = user_handle ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_OpenUser ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenUser_byname(%s) failed - %s \n " , name , nt_errstr ( status ) ) ;
}
return status ;
}
2004-07-15 09:13:08 +04:00
#if 0
static BOOL test_ChangePasswordNT3 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_ChangePasswordUser r ;
BOOL ret = True ;
struct samr_Password hash1 , hash2 , hash3 , hash4 , hash5 , hash6 ;
struct policy_handle user_handle ;
char * oldpass = " test " ;
char * newpass = " test2 " ;
uint8_t old_nt_hash [ 16 ] , new_nt_hash [ 16 ] ;
uint8_t old_lm_hash [ 16 ] , new_lm_hash [ 16 ] ;
status = test_OpenUser_byname ( p , mem_ctx , handle , " testuser " , & user_handle ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
printf ( " Testing ChangePasswordUser for user 'testuser' \n " ) ;
printf ( " old password: %s \n " , oldpass ) ;
printf ( " new password: %s \n " , newpass ) ;
E_md4hash ( oldpass , old_nt_hash ) ;
E_md4hash ( newpass , new_nt_hash ) ;
E_deshash ( oldpass , old_lm_hash ) ;
E_deshash ( newpass , new_lm_hash ) ;
E_old_pw_hash ( new_lm_hash , old_lm_hash , hash1 . hash ) ;
E_old_pw_hash ( old_lm_hash , new_lm_hash , hash2 . hash ) ;
E_old_pw_hash ( new_nt_hash , old_nt_hash , hash3 . hash ) ;
E_old_pw_hash ( old_nt_hash , new_nt_hash , hash4 . hash ) ;
E_old_pw_hash ( old_lm_hash , new_nt_hash , hash5 . hash ) ;
E_old_pw_hash ( old_nt_hash , new_lm_hash , hash6 . hash ) ;
r . in . handle = & user_handle ;
r . in . lm_present = 1 ;
r . in . old_lm_crypted = & hash1 ;
r . in . new_lm_crypted = & hash2 ;
r . in . nt_present = 1 ;
r . in . old_nt_crypted = & hash3 ;
r . in . new_nt_crypted = & hash4 ;
r . in . cross1_present = 1 ;
r . in . nt_cross = & hash5 ;
r . in . cross2_present = 1 ;
r . in . lm_cross = & hash6 ;
status = dcerpc_samr_ChangePasswordUser ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " ChangePasswordUser failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & user_handle ) ) {
2004-07-15 09:13:08 +04:00
ret = False ;
}
return ret ;
}
# endif
2004-04-18 08:06:15 +04:00
static BOOL test_ChangePasswordUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-04-22 10:19:48 +04:00
struct policy_handle * handle , char * * password )
2004-04-18 08:06:15 +04:00
{
NTSTATUS status ;
struct samr_ChangePasswordUser r ;
BOOL ret = True ;
2004-06-04 15:58:46 +04:00
struct samr_Password hash1 , hash2 , hash3 , hash4 , hash5 , hash6 ;
2004-04-18 08:06:15 +04:00
struct policy_handle user_handle ;
2004-04-22 10:19:48 +04:00
char * oldpass = * password ;
2004-05-25 21:50:17 +04:00
uint8_t old_nt_hash [ 16 ] , new_nt_hash [ 16 ] ;
uint8_t old_lm_hash [ 16 ] , new_lm_hash [ 16 ] ;
2004-04-18 08:06:15 +04:00
2004-10-20 06:08:36 +04:00
char * newpass ;
struct samr_GetUserPwInfo pwp ;
int policy_min_pw_len = 0 ;
2004-06-05 07:22:10 +04:00
status = test_OpenUser_byname ( p , mem_ctx , handle , TEST_ACCOUNT_NAME , & user_handle ) ;
2004-04-18 08:06:15 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2004-10-20 06:08:36 +04:00
pwp . in . user_handle = & user_handle ;
status = dcerpc_samr_GetUserPwInfo ( p , mem_ctx , & pwp ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = pwp . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-04-18 08:06:15 +04:00
printf ( " Testing ChangePasswordUser \n " ) ;
2004-04-22 10:19:48 +04:00
E_md4hash ( oldpass , old_nt_hash ) ;
E_md4hash ( newpass , new_nt_hash ) ;
E_deshash ( oldpass , old_lm_hash ) ;
E_deshash ( newpass , new_lm_hash ) ;
2004-04-26 07:07:46 +04:00
E_old_pw_hash ( new_lm_hash , old_lm_hash , hash1 . hash ) ;
E_old_pw_hash ( old_lm_hash , new_lm_hash , hash2 . hash ) ;
E_old_pw_hash ( new_nt_hash , old_nt_hash , hash3 . hash ) ;
E_old_pw_hash ( old_nt_hash , new_nt_hash , hash4 . hash ) ;
E_old_pw_hash ( old_lm_hash , new_nt_hash , hash5 . hash ) ;
E_old_pw_hash ( old_nt_hash , new_lm_hash , hash6 . hash ) ;
2004-04-18 08:06:15 +04:00
2004-09-21 07:51:38 +04:00
r . in . user_handle = & user_handle ;
2004-04-26 07:07:46 +04:00
r . in . lm_present = 1 ;
r . in . old_lm_crypted = & hash1 ;
r . in . new_lm_crypted = & hash2 ;
r . in . nt_present = 1 ;
r . in . old_nt_crypted = & hash3 ;
r . in . new_nt_crypted = & hash4 ;
r . in . cross1_present = 1 ;
r . in . nt_cross = & hash5 ;
r . in . cross2_present = 1 ;
r . in . lm_cross = & hash6 ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_ChangePasswordUser ( p , mem_ctx , & r ) ;
2004-04-26 07:07:46 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2004-04-18 08:06:15 +04:00
printf ( " ChangePasswordUser failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2004-04-26 07:07:46 +04:00
} else {
* password = newpass ;
2004-04-18 08:06:15 +04:00
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & user_handle ) ) {
2004-04-18 08:06:15 +04:00
ret = False ;
}
return ret ;
}
2004-04-19 09:48:03 +04:00
static BOOL test_OemChangePasswordUser2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-04-22 10:19:48 +04:00
struct policy_handle * handle , char * * password )
2004-04-19 09:48:03 +04:00
{
NTSTATUS status ;
struct samr_OemChangePasswordUser2 r ;
BOOL ret = True ;
2004-06-04 15:58:46 +04:00
struct samr_Password lm_verifier ;
2004-04-21 09:01:31 +04:00
struct samr_CryptPassword lm_pass ;
2004-04-19 09:48:03 +04:00
struct samr_AsciiName server , account ;
2004-04-22 10:19:48 +04:00
char * oldpass = * password ;
2004-10-20 06:08:36 +04:00
char * newpass ;
2004-05-25 21:50:17 +04:00
uint8_t old_lm_hash [ 16 ] , new_lm_hash [ 16 ] ;
2004-04-19 09:48:03 +04:00
2004-10-20 06:08:36 +04:00
struct samr_GetDomPwInfo dom_pw_info ;
int policy_min_pw_len = 0 ;
2004-11-13 16:45:41 +03:00
struct samr_String domain_name ;
domain_name . string = " " ;
2004-10-20 06:08:36 +04:00
dom_pw_info . in . name = & domain_name ;
2004-04-19 09:48:03 +04:00
printf ( " Testing OemChangePasswordUser2 \n " ) ;
2004-10-20 06:08:36 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & dom_pw_info ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = dom_pw_info . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-11-13 16:45:41 +03:00
server . string = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
account . string = TEST_ACCOUNT_NAME ;
2004-04-19 09:48:03 +04:00
2004-04-21 09:01:31 +04:00
E_deshash ( oldpass , old_lm_hash ) ;
E_deshash ( newpass , new_lm_hash ) ;
2004-04-22 10:19:48 +04:00
encode_pw_buffer ( lm_pass . data , newpass , STR_ASCII ) ;
2004-06-04 03:15:16 +04:00
arcfour_crypt ( lm_pass . data , old_lm_hash , 516 ) ;
2004-04-21 09:01:31 +04:00
E_old_pw_hash ( new_lm_hash , old_lm_hash , lm_verifier . hash ) ;
2004-04-19 09:48:03 +04:00
r . in . server = & server ;
r . in . account = & account ;
2004-04-21 09:01:31 +04:00
r . in . password = & lm_pass ;
r . in . hash = & lm_verifier ;
2004-04-19 09:48:03 +04:00
status = dcerpc_samr_OemChangePasswordUser2 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OemChangePasswordUser2 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2004-04-22 10:19:48 +04:00
} else {
* password = newpass ;
2004-04-19 09:48:03 +04:00
}
return ret ;
}
2004-04-22 10:19:48 +04:00
2004-04-19 09:48:03 +04:00
static BOOL test_ChangePasswordUser2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-04-22 10:19:48 +04:00
struct policy_handle * handle , char * * password )
2004-04-19 09:48:03 +04:00
{
NTSTATUS status ;
struct samr_ChangePasswordUser2 r ;
BOOL ret = True ;
2004-11-13 16:45:41 +03:00
struct samr_String server , account ;
2004-04-19 09:48:03 +04:00
struct samr_CryptPassword nt_pass , lm_pass ;
2004-06-04 15:58:46 +04:00
struct samr_Password nt_verifier , lm_verifier ;
2004-04-22 10:19:48 +04:00
char * oldpass = * password ;
2004-10-20 06:08:36 +04:00
char * newpass ;
2004-05-25 21:50:17 +04:00
uint8_t old_nt_hash [ 16 ] , new_nt_hash [ 16 ] ;
uint8_t old_lm_hash [ 16 ] , new_lm_hash [ 16 ] ;
2004-04-19 09:48:03 +04:00
2004-10-20 06:08:36 +04:00
struct samr_GetDomPwInfo dom_pw_info ;
int policy_min_pw_len = 0 ;
2004-11-13 16:45:41 +03:00
struct samr_String domain_name ;
domain_name . string = " " ;
2004-10-20 06:08:36 +04:00
dom_pw_info . in . name = & domain_name ;
2004-04-19 09:48:03 +04:00
printf ( " Testing ChangePasswordUser2 \n " ) ;
2004-10-20 06:08:36 +04:00
status = dcerpc_samr_GetDomPwInfo ( p , mem_ctx , & dom_pw_info ) ;
if ( NT_STATUS_IS_OK ( status ) ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = dom_pw_info . out . info . min_password_length ;
2004-10-20 06:08:36 +04:00
}
newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-11-13 16:45:41 +03:00
server . string = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
init_samr_String ( & account , TEST_ACCOUNT_NAME ) ;
2004-04-19 09:48:03 +04:00
2004-04-21 09:01:31 +04:00
E_md4hash ( oldpass , old_nt_hash ) ;
E_md4hash ( newpass , new_nt_hash ) ;
E_deshash ( oldpass , old_lm_hash ) ;
E_deshash ( newpass , new_lm_hash ) ;
2004-04-22 10:19:48 +04:00
encode_pw_buffer ( lm_pass . data , newpass , STR_ASCII | STR_TERMINATE ) ;
2004-06-04 03:15:16 +04:00
arcfour_crypt ( lm_pass . data , old_lm_hash , 516 ) ;
2004-11-26 08:58:03 +03:00
E_old_pw_hash ( new_nt_hash , old_lm_hash , lm_verifier . hash ) ;
2004-04-21 09:01:31 +04:00
encode_pw_buffer ( nt_pass . data , newpass , STR_UNICODE ) ;
2004-06-04 03:15:16 +04:00
arcfour_crypt ( nt_pass . data , old_nt_hash , 516 ) ;
2004-04-21 09:01:31 +04:00
E_old_pw_hash ( new_nt_hash , old_nt_hash , nt_verifier . hash ) ;
2004-04-19 09:48:03 +04:00
r . in . server = & server ;
r . in . account = & account ;
r . in . nt_password = & nt_pass ;
r . in . nt_verifier = & nt_verifier ;
r . in . lm_change = 1 ;
r . in . lm_password = & lm_pass ;
r . in . lm_verifier = & lm_verifier ;
status = dcerpc_samr_ChangePasswordUser2 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " ChangePasswordUser2 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2004-04-22 10:19:48 +04:00
} else {
* password = newpass ;
}
return ret ;
}
static BOOL test_ChangePasswordUser3 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-10-20 06:08:36 +04:00
struct policy_handle * handle ,
int policy_min_pw_len ,
char * * password )
2004-04-22 10:19:48 +04:00
{
NTSTATUS status ;
struct samr_ChangePasswordUser3 r ;
BOOL ret = True ;
2004-11-13 16:45:41 +03:00
struct samr_String server , account ;
2004-04-22 10:19:48 +04:00
struct samr_CryptPassword nt_pass , lm_pass ;
2004-06-04 15:58:46 +04:00
struct samr_Password nt_verifier , lm_verifier ;
2004-04-22 10:19:48 +04:00
char * oldpass = * password ;
2004-10-20 06:08:36 +04:00
char * newpass = samr_rand_pass ( mem_ctx , policy_min_pw_len ) ;
2004-05-25 21:50:17 +04:00
uint8_t old_nt_hash [ 16 ] , new_nt_hash [ 16 ] ;
uint8_t old_lm_hash [ 16 ] , new_lm_hash [ 16 ] ;
2004-04-22 10:19:48 +04:00
printf ( " Testing ChangePasswordUser3 \n " ) ;
2004-11-13 16:45:41 +03:00
server . string = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
init_samr_String ( & account , TEST_ACCOUNT_NAME ) ;
2004-04-22 10:19:48 +04:00
E_md4hash ( oldpass , old_nt_hash ) ;
E_md4hash ( newpass , new_nt_hash ) ;
E_deshash ( oldpass , old_lm_hash ) ;
E_deshash ( newpass , new_lm_hash ) ;
encode_pw_buffer ( lm_pass . data , newpass , STR_UNICODE ) ;
2004-06-04 03:15:16 +04:00
arcfour_crypt ( lm_pass . data , old_nt_hash , 516 ) ;
2004-11-26 08:58:03 +03:00
E_old_pw_hash ( new_nt_hash , old_lm_hash , lm_verifier . hash ) ;
2004-04-22 10:19:48 +04:00
encode_pw_buffer ( nt_pass . data , newpass , STR_UNICODE ) ;
2004-06-04 03:15:16 +04:00
arcfour_crypt ( nt_pass . data , old_nt_hash , 516 ) ;
2004-04-22 10:19:48 +04:00
E_old_pw_hash ( new_nt_hash , old_nt_hash , nt_verifier . hash ) ;
r . in . server = & server ;
r . in . account = & account ;
r . in . nt_password = & nt_pass ;
r . in . nt_verifier = & nt_verifier ;
r . in . lm_change = 1 ;
r . in . lm_password = & lm_pass ;
r . in . lm_verifier = & lm_verifier ;
r . in . password3 = NULL ;
status = dcerpc_samr_ChangePasswordUser3 ( p , mem_ctx , & r ) ;
2004-10-20 06:08:36 +04:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_PASSWORD_RESTRICTION )
& & ! policy_min_pw_len ) {
if ( r . out . dominfo ) {
2004-11-17 14:56:13 +03:00
policy_min_pw_len = r . out . dominfo - > min_password_length ;
2004-10-20 06:08:36 +04:00
}
if ( policy_min_pw_len ) /* try again with the right min password length */ {
ret = test_ChangePasswordUser3 ( p , mem_ctx , handle , policy_min_pw_len , password ) ;
} else {
printf ( " ChangePasswordUser3 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
} else if ( ! NT_STATUS_IS_OK ( status ) ) {
2004-04-22 10:19:48 +04:00
printf ( " ChangePasswordUser3 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
} else {
* password = newpass ;
2004-04-19 09:48:03 +04:00
}
return ret ;
}
2003-12-19 06:59:27 +03:00
static BOOL test_GetMembersInAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * alias_handle )
{
struct samr_GetMembersInAlias r ;
struct lsa_SidArray sids ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing GetMembersInAlias \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . alias_handle = alias_handle ;
2003-12-19 06:59:27 +03:00
r . out . sids = & sids ;
status = dcerpc_samr_GetMembersInAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " GetMembersInAlias failed - %s \n " ,
nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
static BOOL test_AddMemberToAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * alias_handle ,
2003-12-19 07:13:39 +03:00
const struct dom_sid * domain_sid )
2003-12-19 06:59:27 +03:00
{
2004-04-23 08:21:22 +04:00
struct samr_AddAliasMember r ;
struct samr_DeleteAliasMember d ;
2003-12-19 06:59:27 +03:00
NTSTATUS status ;
BOOL ret = True ;
2003-12-19 07:13:39 +03:00
struct dom_sid * sid ;
2003-12-19 06:59:27 +03:00
2003-12-19 07:13:39 +03:00
sid = dom_sid_add_rid ( mem_ctx , domain_sid , 512 ) ;
2003-12-19 06:59:27 +03:00
2004-04-23 08:21:22 +04:00
printf ( " testing AddAliasMember \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . alias_handle = alias_handle ;
2003-12-19 07:13:39 +03:00
r . in . sid = sid ;
2003-12-19 06:59:27 +03:00
2004-04-23 08:21:22 +04:00
status = dcerpc_samr_AddAliasMember ( p , mem_ctx , & r ) ;
2003-12-19 06:59:27 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2004-04-23 08:21:22 +04:00
printf ( " AddAliasMember failed - %s \n " , nt_errstr ( status ) ) ;
2003-12-19 06:59:27 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
d . in . alias_handle = alias_handle ;
2003-12-19 07:13:39 +03:00
d . in . sid = sid ;
2003-12-19 06:59:27 +03:00
2004-04-23 08:21:22 +04:00
status = dcerpc_samr_DeleteAliasMember ( p , mem_ctx , & d ) ;
2003-12-19 06:59:27 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2004-04-23 08:21:22 +04:00
printf ( " DelAliasMember failed - %s \n " , nt_errstr ( status ) ) ;
2003-12-19 06:59:27 +03:00
ret = False ;
}
return ret ;
}
2003-11-20 10:20:59 +03:00
2004-04-19 09:48:03 +04:00
static BOOL test_AddMultipleMembersToAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * alias_handle )
{
struct samr_AddMultipleMembersToAlias a ;
struct samr_RemoveMultipleMembersFromAlias r ;
NTSTATUS status ;
BOOL ret = True ;
struct lsa_SidArray sids ;
printf ( " testing AddMultipleMembersToAlias \n " ) ;
2004-09-21 07:51:38 +04:00
a . in . alias_handle = alias_handle ;
2004-04-19 09:48:03 +04:00
a . in . sids = & sids ;
sids . num_sids = 3 ;
sids . sids = talloc_array_p ( mem_ctx , struct lsa_SidPtr , 3 ) ;
sids . sids [ 0 ] . sid = dom_sid_parse_talloc ( mem_ctx , " S-1-5-32-1-2-3-1 " ) ;
sids . sids [ 1 ] . sid = dom_sid_parse_talloc ( mem_ctx , " S-1-5-32-1-2-3-2 " ) ;
sids . sids [ 2 ] . sid = dom_sid_parse_talloc ( mem_ctx , " S-1-5-32-1-2-3-3 " ) ;
status = dcerpc_samr_AddMultipleMembersToAlias ( p , mem_ctx , & a ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " AddMultipleMembersToAlias failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
printf ( " testing RemoveMultipleMembersFromAlias \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . alias_handle = alias_handle ;
2004-04-19 09:48:03 +04:00
r . in . sids = & sids ;
status = dcerpc_samr_RemoveMultipleMembersFromAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " RemoveMultipleMembersFromAlias failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
/* strange! removing twice doesn't give any error */
status = dcerpc_samr_RemoveMultipleMembersFromAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " RemoveMultipleMembersFromAlias failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
/* but removing an alias that isn't there does */
sids . sids [ 2 ] . sid = dom_sid_parse_talloc ( mem_ctx , " S-1-5-32-1-2-3-4 " ) ;
status = dcerpc_samr_RemoveMultipleMembersFromAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_OBJECT_NAME_NOT_FOUND , status ) ) {
printf ( " RemoveMultipleMembersFromAlias failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-18 08:06:15 +04:00
static BOOL test_TestPrivateFunctionsUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * user_handle )
{
struct samr_TestPrivateFunctionsUser r ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing TestPrivateFunctionsUser \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . user_handle = user_handle ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_TestPrivateFunctionsUser ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_NOT_IMPLEMENTED , status ) ) {
printf ( " TestPrivateFunctionsUser failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2003-11-20 06:09:19 +03:00
static BOOL test_user_ops ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-10-20 06:08:36 +04:00
struct policy_handle * handle , uint32_t base_acct_flags )
2003-11-20 06:09:19 +03:00
{
BOOL ret = True ;
if ( ! test_QuerySecurity ( p , mem_ctx , handle ) ) {
ret = False ;
}
if ( ! test_QueryUserInfo ( p , mem_ctx , handle ) ) {
ret = False ;
}
2004-04-18 08:32:04 +04:00
if ( ! test_QueryUserInfo2 ( p , mem_ctx , handle ) ) {
ret = False ;
}
2004-10-20 06:08:36 +04:00
if ( ! test_SetUserInfo ( p , mem_ctx , handle , base_acct_flags ) ) {
2003-11-20 10:20:59 +03:00
ret = False ;
}
2003-11-21 16:14:17 +03:00
if ( ! test_GetUserPwInfo ( p , mem_ctx , handle ) ) {
ret = False ;
}
2004-04-18 08:06:15 +04:00
if ( ! test_TestPrivateFunctionsUser ( p , mem_ctx , handle ) ) {
ret = False ;
}
2003-11-20 06:09:19 +03:00
return ret ;
}
2003-12-19 06:59:27 +03:00
static BOOL test_alias_ops ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2003-12-19 07:13:39 +03:00
struct policy_handle * alias_handle ,
const struct dom_sid * domain_sid )
2003-12-19 06:59:27 +03:00
{
BOOL ret = True ;
if ( ! test_QuerySecurity ( p , mem_ctx , alias_handle ) ) {
ret = False ;
}
if ( ! test_QueryAliasInfo ( p , mem_ctx , alias_handle ) ) {
ret = False ;
}
if ( ! test_SetAliasInfo ( p , mem_ctx , alias_handle ) ) {
ret = False ;
}
2004-09-22 10:46:30 +04:00
if ( ! test_AddMemberToAlias ( p , mem_ctx , alias_handle , domain_sid ) ) {
2003-12-19 06:59:27 +03:00
ret = False ;
}
2004-04-19 09:48:03 +04:00
if ( ! test_AddMultipleMembersToAlias ( p , mem_ctx , alias_handle ) ) {
ret = False ;
}
2003-12-19 06:59:27 +03:00
return ret ;
}
2003-11-15 23:47:59 +03:00
2004-04-17 10:40:50 +04:00
2004-04-27 10:36:39 +04:00
BOOL test_DeleteUser_byname ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle , const char * name )
2004-04-17 10:40:50 +04:00
{
NTSTATUS status ;
struct samr_DeleteUser d ;
2004-09-21 07:51:38 +04:00
struct policy_handle user_handle ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-04-17 10:40:50 +04:00
status = test_LookupName ( p , mem_ctx , handle , name , & rid ) ;
2003-11-20 10:20:59 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
status = test_OpenUser_byname ( p , mem_ctx , handle , name , & user_handle ) ;
2003-11-20 10:20:59 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
d . in . user_handle = & user_handle ;
d . out . user_handle = & user_handle ;
2003-11-20 10:20:59 +03:00
status = dcerpc_samr_DeleteUser ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
return True ;
failed :
printf ( " DeleteUser_byname(%s) failed - %s \n " , name , nt_errstr ( status ) ) ;
return False ;
}
2004-04-17 09:54:55 +04:00
static BOOL test_DeleteGroup_byname ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle , const char * name )
{
NTSTATUS status ;
struct samr_OpenGroup r ;
struct samr_DeleteDomainGroup d ;
struct policy_handle group_handle ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-04-17 09:54:55 +04:00
2004-04-17 10:40:50 +04:00
status = test_LookupName ( p , mem_ctx , handle , name , & rid ) ;
2004-04-17 09:54:55 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-04-17 10:40:50 +04:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . group_handle = & group_handle ;
2004-04-17 09:54:55 +04:00
status = dcerpc_samr_OpenGroup ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
d . in . group_handle = & group_handle ;
d . out . group_handle = & group_handle ;
2004-04-17 09:54:55 +04:00
status = dcerpc_samr_DeleteDomainGroup ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
return True ;
failed :
printf ( " DeleteGroup_byname(%s) failed - %s \n " , name , nt_errstr ( status ) ) ;
return False ;
}
2003-12-19 06:59:27 +03:00
static BOOL test_DeleteAlias_byname ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle , const char * name )
{
NTSTATUS status ;
struct samr_OpenAlias r ;
struct samr_DeleteDomAlias d ;
struct policy_handle alias_handle ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2003-12-19 06:59:27 +03:00
printf ( " testing DeleteAlias_byname \n " ) ;
2004-04-17 10:40:50 +04:00
status = test_LookupName ( p , mem_ctx , domain_handle , name , & rid ) ;
2003-12-19 06:59:27 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-04-17 10:40:50 +04:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . alias_handle = & alias_handle ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_OpenAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
2004-09-21 07:51:38 +04:00
d . in . alias_handle = & alias_handle ;
d . out . alias_handle = & alias_handle ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_DeleteDomAlias ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto failed ;
}
return True ;
failed :
printf ( " DeleteUser_byname(%s) failed - %s \n " , name , nt_errstr ( status ) ) ;
return False ;
}
static BOOL test_DeleteAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * alias_handle )
{
struct samr_DeleteDomAlias d ;
NTSTATUS status ;
2004-02-10 23:49:59 +03:00
BOOL ret = True ;
2003-12-19 06:59:27 +03:00
printf ( " Testing DeleteAlias \n " ) ;
2004-09-21 07:51:38 +04:00
d . in . alias_handle = alias_handle ;
d . out . alias_handle = alias_handle ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_DeleteDomAlias ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteAlias failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
static BOOL test_CreateAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2003-12-19 07:13:39 +03:00
struct policy_handle * domain_handle ,
struct policy_handle * alias_handle ,
const struct dom_sid * domain_sid )
2003-12-19 06:59:27 +03:00
{
NTSTATUS status ;
struct samr_CreateDomAlias r ;
2004-11-13 16:45:41 +03:00
struct samr_String name ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2003-12-19 06:59:27 +03:00
BOOL ret = True ;
2004-11-13 16:45:41 +03:00
init_samr_String ( & name , TEST_ALIASNAME ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2003-12-19 06:59:27 +03:00
r . in . aliasname = & name ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-21 07:51:38 +04:00
r . out . alias_handle = alias_handle ;
2003-12-19 06:59:27 +03:00
r . out . rid = & rid ;
2004-11-13 16:45:41 +03:00
printf ( " Testing CreateAlias (%s) \n " , r . in . aliasname - > string ) ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_CreateDomAlias ( p , mem_ctx , & r ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ACCESS_DENIED ) ) {
2004-11-13 16:45:41 +03:00
printf ( " Server refused create of '%s' \n " , r . in . aliasname - > string ) ;
2003-12-19 06:59:27 +03:00
return True ;
}
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ALIAS_EXISTS ) ) {
2004-11-13 16:45:41 +03:00
if ( ! test_DeleteAlias_byname ( p , mem_ctx , domain_handle , r . in . aliasname - > string ) ) {
2003-12-19 06:59:27 +03:00
return False ;
}
status = dcerpc_samr_CreateDomAlias ( p , mem_ctx , & r ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " CreateAlias failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-09-22 10:46:30 +04:00
if ( ! test_alias_ops ( p , mem_ctx , alias_handle , domain_sid ) ) {
2003-12-19 06:59:27 +03:00
ret = False ;
}
return ret ;
}
2003-11-20 10:20:59 +03:00
2004-04-22 10:19:48 +04:00
static BOOL test_ChangePassword ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle , char * * password )
{
BOOL ret = True ;
if ( ! * password ) {
return False ;
}
if ( ! test_ChangePasswordUser ( p , mem_ctx , domain_handle , password ) ) {
ret = False ;
}
if ( ! test_ChangePasswordUser2 ( p , mem_ctx , domain_handle , password ) ) {
ret = False ;
}
if ( ! test_OemChangePasswordUser2 ( p , mem_ctx , domain_handle , password ) ) {
ret = False ;
}
2004-10-20 06:08:36 +04:00
/* we change passwords twice - this has the effect of verifying
they were changed correctly for the final call */
if ( ! test_ChangePasswordUser3 ( p , mem_ctx , domain_handle , 0 , password ) ) {
ret = False ;
}
if ( ! test_ChangePasswordUser3 ( p , mem_ctx , domain_handle , 0 , password ) ) {
2004-04-22 10:19:48 +04:00
ret = False ;
}
return ret ;
}
2003-11-18 13:21:05 +03:00
static BOOL test_CreateUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2003-12-19 06:59:27 +03:00
struct policy_handle * domain_handle , struct policy_handle * user_handle )
2003-11-18 13:21:05 +03:00
{
NTSTATUS status ;
struct samr_CreateUser r ;
2003-12-03 06:10:10 +03:00
struct samr_QueryUserInfo q ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-04-22 10:19:48 +04:00
char * password = NULL ;
2003-12-03 06:10:10 +03:00
2004-10-20 06:08:36 +04:00
int i ;
const uint32 password_fields [ ] = {
SAMR_FIELD_PASSWORD ,
SAMR_FIELD_PASSWORD2 ,
SAMR_FIELD_PASSWORD | SAMR_FIELD_PASSWORD2 ,
0
} ;
2003-12-03 06:10:10 +03:00
/* This call creates a 'normal' account - check that it really does */
2004-05-25 20:24:13 +04:00
const uint32_t acct_flags = ACB_NORMAL ;
2004-11-13 16:45:41 +03:00
struct samr_String name ;
2003-11-20 06:09:19 +03:00
BOOL ret = True ;
2003-11-18 13:21:05 +03:00
2004-11-13 16:45:41 +03:00
init_samr_String ( & name , TEST_ACCOUNT_NAME ) ;
2003-11-18 13:21:05 +03:00
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-06-05 07:22:10 +04:00
r . in . account_name = & name ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-21 07:51:38 +04:00
r . out . user_handle = user_handle ;
2003-11-18 13:21:05 +03:00
r . out . rid = & rid ;
2004-11-13 16:45:41 +03:00
printf ( " Testing CreateUser(%s) \n " , r . in . account_name - > string ) ;
2003-11-18 13:21:05 +03:00
status = dcerpc_samr_CreateUser ( p , mem_ctx , & r ) ;
2003-11-20 04:02:09 +03:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ACCESS_DENIED ) ) {
2004-11-13 16:45:41 +03:00
printf ( " Server refused create of '%s' \n " , r . in . account_name - > string ) ;
2003-12-19 06:59:27 +03:00
ZERO_STRUCTP ( user_handle ) ;
2003-11-20 04:02:09 +03:00
return True ;
}
2003-11-20 10:20:59 +03:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
2004-11-13 16:45:41 +03:00
if ( ! test_DeleteUser_byname ( p , mem_ctx , domain_handle , r . in . account_name - > string ) ) {
2003-11-20 10:20:59 +03:00
return False ;
}
status = dcerpc_samr_CreateUser ( p , mem_ctx , & r ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
2003-11-18 13:21:05 +03:00
printf ( " CreateUser failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-09-21 07:51:38 +04:00
q . in . user_handle = user_handle ;
2003-12-03 06:10:10 +03:00
q . in . level = 16 ;
status = dcerpc_samr_QueryUserInfo ( p , mem_ctx , & q ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryUserInfo level %u failed - %s \n " ,
q . in . level , nt_errstr ( status ) ) ;
ret = False ;
} else {
2003-12-17 05:35:04 +03:00
if ( ( q . out . info - > info16 . acct_flags & acct_flags ) ! = acct_flags ) {
2003-12-03 06:10:10 +03:00
printf ( " QuerUserInfo level 16 failed, it returned 0x%08x (%u) when we expected flags of 0x%08x (%u) \n " ,
q . out . info - > info16 . acct_flags , q . out . info - > info16 . acct_flags ,
acct_flags , acct_flags ) ;
ret = False ;
}
}
2004-10-20 06:08:36 +04:00
if ( ! test_user_ops ( p , mem_ctx , user_handle , acct_flags ) ) {
2004-04-18 08:06:15 +04:00
ret = False ;
}
2004-04-22 10:19:48 +04:00
if ( ! test_SetUserPass ( p , mem_ctx , user_handle , & password ) ) {
2004-04-19 09:48:03 +04:00
ret = False ;
2004-04-22 10:19:48 +04:00
}
2004-04-19 09:48:03 +04:00
2004-10-20 06:08:36 +04:00
for ( i = 0 ; password_fields [ i ] ; i + + ) {
if ( ! test_SetUserPass_23 ( p , mem_ctx , user_handle , password_fields [ i ] , & password ) ) {
ret = False ;
}
/* check it was set right */
if ( ! test_ChangePasswordUser3 ( p , mem_ctx , domain_handle , 0 , & password ) ) {
ret = False ;
}
}
2004-04-28 17:15:49 +04:00
2004-10-20 06:08:36 +04:00
for ( i = 0 ; password_fields [ i ] ; i + + ) {
if ( ! test_SetUserPass_25 ( p , mem_ctx , user_handle , password_fields [ i ] , & password ) ) {
ret = False ;
}
/* check it was set right */
if ( ! test_ChangePasswordUser3 ( p , mem_ctx , domain_handle , 0 , & password ) ) {
ret = False ;
}
}
2004-04-30 07:57:48 +04:00
2004-10-20 06:08:36 +04:00
if ( ! test_SetUserPassEx ( p , mem_ctx , user_handle , & password ) ) {
2004-04-19 09:48:03 +04:00
ret = False ;
2004-04-22 10:19:48 +04:00
}
2004-04-19 09:48:03 +04:00
2004-04-22 10:19:48 +04:00
if ( ! test_ChangePassword ( p , mem_ctx , domain_handle , & password ) ) {
2003-11-20 06:09:19 +03:00
ret = False ;
2004-04-22 10:19:48 +04:00
}
2003-12-19 06:59:27 +03:00
return ret ;
}
static BOOL test_DeleteUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * user_handle )
{
struct samr_DeleteUser d ;
NTSTATUS status ;
2004-02-10 23:49:59 +03:00
BOOL ret = True ;
2003-12-19 06:59:27 +03:00
2003-11-18 13:21:05 +03:00
printf ( " Testing DeleteUser \n " ) ;
2004-09-21 07:51:38 +04:00
d . in . user_handle = user_handle ;
d . out . user_handle = user_handle ;
2003-11-18 13:21:05 +03:00
status = dcerpc_samr_DeleteUser ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteUser failed - %s \n " , nt_errstr ( status ) ) ;
2003-11-20 06:09:19 +03:00
ret = False ;
2003-11-18 13:21:05 +03:00
}
2003-11-20 06:09:19 +03:00
return ret ;
2003-11-18 13:21:05 +03:00
}
2003-12-03 06:10:10 +03:00
static BOOL test_CreateUser2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2003-12-19 06:59:27 +03:00
struct policy_handle * handle )
2003-12-03 06:10:10 +03:00
{
NTSTATUS status ;
struct samr_CreateUser2 r ;
struct samr_QueryUserInfo q ;
struct samr_DeleteUser d ;
2004-09-21 07:51:38 +04:00
struct policy_handle user_handle ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-11-13 16:45:41 +03:00
struct samr_String name ;
2003-12-03 06:10:10 +03:00
BOOL ret = True ;
int i ;
struct {
2004-05-25 20:24:13 +04:00
uint32_t acct_flags ;
2003-12-03 06:10:10 +03:00
const char * account_name ;
NTSTATUS nt_status ;
} account_types [ ] = {
2004-06-05 07:22:10 +04:00
{ ACB_NORMAL , TEST_ACCOUNT_NAME , NT_STATUS_OK } ,
{ ACB_NORMAL | ACB_DISABLED , TEST_ACCOUNT_NAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_NORMAL | ACB_PWNOEXP , TEST_ACCOUNT_NAME , NT_STATUS_INVALID_PARAMETER } ,
2003-12-03 06:10:10 +03:00
{ ACB_WSTRUST , TEST_MACHINENAME , NT_STATUS_OK } ,
{ ACB_WSTRUST | ACB_DISABLED , TEST_MACHINENAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_WSTRUST | ACB_PWNOEXP , TEST_MACHINENAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_SVRTRUST , TEST_MACHINENAME , NT_STATUS_OK } ,
{ ACB_SVRTRUST | ACB_DISABLED , TEST_MACHINENAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_SVRTRUST | ACB_PWNOEXP , TEST_MACHINENAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_DOMTRUST , TEST_DOMAINNAME , NT_STATUS_OK } ,
{ ACB_DOMTRUST | ACB_DISABLED , TEST_DOMAINNAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_DOMTRUST | ACB_PWNOEXP , TEST_DOMAINNAME , NT_STATUS_INVALID_PARAMETER } ,
2004-06-05 07:22:10 +04:00
{ 0 , TEST_ACCOUNT_NAME , NT_STATUS_INVALID_PARAMETER } ,
{ ACB_DISABLED , TEST_ACCOUNT_NAME , NT_STATUS_INVALID_PARAMETER } ,
2003-12-03 06:10:10 +03:00
{ 0 , NULL , NT_STATUS_INVALID_PARAMETER }
} ;
for ( i = 0 ; account_types [ i ] . account_name ; i + + ) {
2004-05-25 20:24:13 +04:00
uint32_t acct_flags = account_types [ i ] . acct_flags ;
uint32_t access_granted ;
2003-12-03 06:10:10 +03:00
2004-11-13 16:45:41 +03:00
init_samr_String ( & name , account_types [ i ] . account_name ) ;
2003-12-03 06:10:10 +03:00
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-06-05 07:22:10 +04:00
r . in . account_name = & name ;
2003-12-03 06:10:10 +03:00
r . in . acct_flags = acct_flags ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-21 07:51:38 +04:00
r . out . user_handle = & user_handle ;
2003-12-03 06:10:10 +03:00
r . out . access_granted = & access_granted ;
r . out . rid = & rid ;
2004-11-13 16:45:41 +03:00
printf ( " Testing CreateUser2(%s, 0x%x) \n " , r . in . account_name - > string , acct_flags ) ;
2003-12-03 06:10:10 +03:00
status = dcerpc_samr_CreateUser2 ( p , mem_ctx , & r ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ACCESS_DENIED ) ) {
2004-11-13 16:45:41 +03:00
printf ( " Server refused create of '%s' \n " , r . in . account_name - > string ) ;
2003-12-03 06:10:10 +03:00
continue ;
} else if ( NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
2004-11-13 16:45:41 +03:00
if ( ! test_DeleteUser_byname ( p , mem_ctx , handle , r . in . account_name - > string ) ) {
2003-12-03 06:10:10 +03:00
return False ;
}
status = dcerpc_samr_CreateUser2 ( p , mem_ctx , & r ) ;
}
if ( ! NT_STATUS_EQUAL ( status , account_types [ i ] . nt_status ) ) {
printf ( " CreateUser2 failed gave incorrect error return - %s (should be %s) \n " ,
nt_errstr ( status ) , nt_errstr ( account_types [ i ] . nt_status ) ) ;
ret = False ;
}
if ( NT_STATUS_IS_OK ( status ) ) {
2004-09-21 07:51:38 +04:00
q . in . user_handle = & user_handle ;
2003-12-03 06:10:10 +03:00
q . in . level = 16 ;
status = dcerpc_samr_QueryUserInfo ( p , mem_ctx , & q ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryUserInfo level %u failed - %s \n " ,
q . in . level , nt_errstr ( status ) ) ;
ret = False ;
} else {
2003-12-17 05:35:04 +03:00
if ( ( q . out . info - > info16 . acct_flags & acct_flags ) ! = acct_flags ) {
printf ( " QuerUserInfo level 16 failed, it returned 0x%08x when we expected flags of 0x%08x \n " ,
2003-12-03 06:10:10 +03:00
q . out . info - > info16 . acct_flags ,
acct_flags ) ;
ret = False ;
}
}
2004-10-20 06:08:36 +04:00
if ( ! test_user_ops ( p , mem_ctx , & user_handle , acct_flags ) ) {
2003-12-03 06:10:10 +03:00
ret = False ;
}
2003-12-19 06:59:27 +03:00
printf ( " Testing DeleteUser (createuser2 test) \n " ) ;
2003-12-03 06:10:10 +03:00
2004-09-21 07:51:38 +04:00
d . in . user_handle = & user_handle ;
d . out . user_handle = & user_handle ;
2003-12-03 06:10:10 +03:00
status = dcerpc_samr_DeleteUser ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteUser failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
}
}
return ret ;
}
2003-11-15 15:38:06 +03:00
static BOOL test_QueryAliasInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryAliasInfo r ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 } ;
2003-11-15 15:38:06 +03:00
int i ;
BOOL ret = True ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryAliasInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . alias_handle = handle ;
2003-11-15 15:38:06 +03:00
r . in . level = levels [ i ] ;
status = dcerpc_samr_QueryAliasInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryAliasInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
2003-11-15 15:14:22 +03:00
static BOOL test_QueryGroupInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
2004-04-22 11:28:18 +04:00
{
NTSTATUS status ;
struct samr_QueryGroupInfo r ;
2004-10-07 07:47:38 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
2004-04-22 11:28:18 +04:00
int i ;
BOOL ret = True ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryGroupInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . group_handle = handle ;
2004-04-22 11:28:18 +04:00
r . in . level = levels [ i ] ;
status = dcerpc_samr_QueryGroupInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryGroupInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
2004-10-07 07:47:38 +04:00
static BOOL test_QueryGroupMember ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryGroupMember r ;
BOOL ret = True ;
printf ( " Testing QueryGroupMember \n " ) ;
r . in . group_handle = handle ;
status = dcerpc_samr_QueryGroupMember ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryGroupInfo failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-22 11:28:18 +04:00
static BOOL test_SetGroupInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
2003-11-15 15:14:22 +03:00
{
NTSTATUS status ;
struct samr_QueryGroupInfo r ;
2004-04-17 10:19:51 +04:00
struct samr_SetGroupInfo s ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 } ;
uint16_t set_ok [ ] = { 0 , 1 , 1 , 1 } ;
2003-11-15 15:14:22 +03:00
int i ;
BOOL ret = True ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryGroupInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . group_handle = handle ;
2003-11-15 15:14:22 +03:00
r . in . level = levels [ i ] ;
status = dcerpc_samr_QueryGroupInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryGroupInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2004-04-17 10:19:51 +04:00
printf ( " Testing SetGroupInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
s . in . group_handle = handle ;
2004-04-17 10:19:51 +04:00
s . in . level = levels [ i ] ;
s . in . info = r . out . info ;
2004-08-04 10:01:10 +04:00
#if 0
/* disabled this, as it changes the name only from the point of view of samr,
but leaves the name from the point of view of w2k3 internals ( and ldap ) . This means
the name is still reserved , so creating the old name fails , but deleting by the old name
also fails */
2004-05-09 19:39:12 +04:00
if ( s . in . level = = 2 ) {
2004-11-13 16:45:41 +03:00
init_samr_String ( & s . in . info - > string , " NewName " ) ;
2004-05-09 19:39:12 +04:00
}
2004-08-04 10:01:10 +04:00
# endif
2004-05-09 19:39:12 +04:00
2004-04-22 11:28:18 +04:00
if ( s . in . level = = 4 ) {
2004-11-13 16:45:41 +03:00
init_samr_String ( & s . in . info - > description , " test description " ) ;
2004-04-22 11:28:18 +04:00
}
2004-04-17 10:19:51 +04:00
status = dcerpc_samr_SetGroupInfo ( p , mem_ctx , & s ) ;
if ( set_ok [ i ] ) {
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetGroupInfo level %u failed - %s \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
} else {
if ( ! NT_STATUS_EQUAL ( NT_STATUS_INVALID_INFO_CLASS , status ) ) {
printf ( " SetGroupInfo level %u gave %s - should have been NT_STATUS_INVALID_INFO_CLASS \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
}
2003-11-15 15:14:22 +03:00
}
return ret ;
}
2003-11-15 13:03:12 +03:00
static BOOL test_QueryUserInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryUserInfo r ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,
2003-11-15 14:34:01 +03:00
11 , 12 , 13 , 14 , 16 , 17 , 20 , 21 } ;
2003-11-15 13:58:29 +03:00
int i ;
BOOL ret = True ;
2003-11-15 13:03:12 +03:00
2003-11-15 13:58:29 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryUserInfo level %u \n " , levels [ i ] ) ;
2003-11-15 13:03:12 +03:00
2004-09-21 07:51:38 +04:00
r . in . user_handle = handle ;
2003-11-15 13:58:29 +03:00
r . in . level = levels [ i ] ;
2003-11-15 13:03:12 +03:00
2003-11-15 13:58:29 +03:00
status = dcerpc_samr_QueryUserInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryUserInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
2003-11-15 13:03:12 +03:00
2003-11-15 13:58:29 +03:00
return ret ;
2003-11-15 13:03:12 +03:00
}
2004-04-18 08:32:04 +04:00
static BOOL test_QueryUserInfo2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryUserInfo2 r ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,
2004-04-18 08:32:04 +04:00
11 , 12 , 13 , 14 , 16 , 17 , 20 , 21 } ;
int i ;
BOOL ret = True ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryUserInfo2 level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . user_handle = handle ;
2004-04-18 08:32:04 +04:00
r . in . level = levels [ i ] ;
status = dcerpc_samr_QueryUserInfo2 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryUserInfo2 level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
2003-11-15 13:03:12 +03:00
static BOOL test_OpenUser ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-05-25 20:24:13 +04:00
struct policy_handle * handle , uint32_t rid )
2003-11-15 13:03:12 +03:00
{
NTSTATUS status ;
struct samr_OpenUser r ;
2004-09-21 07:51:38 +04:00
struct policy_handle user_handle ;
2003-11-15 15:14:22 +03:00
BOOL ret = True ;
2003-11-15 13:03:12 +03:00
printf ( " Testing OpenUser(%u) \n " , rid ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2003-11-15 13:03:12 +03:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . user_handle = & user_handle ;
2003-11-15 13:03:12 +03:00
status = dcerpc_samr_OpenUser ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenUser(%u) failed - %s \n " , rid , nt_errstr ( status ) ) ;
return False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QuerySecurity ( p , mem_ctx , & user_handle ) ) {
2003-11-18 08:20:54 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QueryUserInfo ( p , mem_ctx , & user_handle ) ) {
2003-11-15 15:14:22 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QueryUserInfo2 ( p , mem_ctx , & user_handle ) ) {
2004-04-18 08:32:04 +04:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_GetUserPwInfo ( p , mem_ctx , & user_handle ) ) {
2003-11-21 16:14:17 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_GetGroupsForUser ( p , mem_ctx , & user_handle ) ) {
2003-12-19 06:59:27 +03:00
ret = False ;
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & user_handle ) ) {
2003-11-15 23:47:59 +03:00
ret = False ;
}
2003-11-15 15:14:22 +03:00
return ret ;
}
static BOOL test_OpenGroup ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-05-25 20:24:13 +04:00
struct policy_handle * handle , uint32_t rid )
2003-11-15 15:14:22 +03:00
{
NTSTATUS status ;
struct samr_OpenGroup r ;
2004-09-21 07:51:38 +04:00
struct policy_handle group_handle ;
2003-11-15 15:14:22 +03:00
BOOL ret = True ;
printf ( " Testing OpenGroup(%u) \n " , rid ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2003-11-15 15:14:22 +03:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . group_handle = & group_handle ;
2003-11-15 15:14:22 +03:00
status = dcerpc_samr_OpenGroup ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenGroup(%u) failed - %s \n " , rid , nt_errstr ( status ) ) ;
2003-11-15 13:03:12 +03:00
return False ;
}
2003-11-15 15:14:22 +03:00
2004-09-21 07:51:38 +04:00
if ( ! test_QuerySecurity ( p , mem_ctx , & group_handle ) ) {
2003-11-18 08:20:54 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QueryGroupInfo ( p , mem_ctx , & group_handle ) ) {
2003-11-15 15:14:22 +03:00
ret = False ;
}
2004-10-07 07:47:38 +04:00
if ( ! test_QueryGroupMember ( p , mem_ctx , & group_handle ) ) {
ret = False ;
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & group_handle ) ) {
2003-11-15 23:47:59 +03:00
ret = False ;
}
2003-11-15 15:14:22 +03:00
return ret ;
2003-11-15 13:03:12 +03:00
}
2003-11-15 15:38:06 +03:00
static BOOL test_OpenAlias ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-05-25 20:24:13 +04:00
struct policy_handle * handle , uint32_t rid )
2003-11-15 15:38:06 +03:00
{
NTSTATUS status ;
struct samr_OpenAlias r ;
2004-09-21 07:51:38 +04:00
struct policy_handle alias_handle ;
2003-11-15 15:38:06 +03:00
BOOL ret = True ;
printf ( " Testing OpenAlias(%u) \n " , rid ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2003-11-15 15:38:06 +03:00
r . in . rid = rid ;
2004-09-21 07:51:38 +04:00
r . out . alias_handle = & alias_handle ;
2003-11-15 15:38:06 +03:00
status = dcerpc_samr_OpenAlias ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenAlias(%u) failed - %s \n " , rid , nt_errstr ( status ) ) ;
return False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QuerySecurity ( p , mem_ctx , & alias_handle ) ) {
2003-11-18 08:20:54 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_QueryAliasInfo ( p , mem_ctx , & alias_handle ) ) {
2003-11-15 15:38:06 +03:00
ret = False ;
}
2004-09-21 07:51:38 +04:00
if ( ! test_GetMembersInAlias ( p , mem_ctx , & alias_handle ) ) {
2003-12-19 06:59:27 +03:00
ret = False ;
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & alias_handle ) ) {
2003-11-15 23:47:59 +03:00
ret = False ;
}
2003-11-15 15:38:06 +03:00
return ret ;
}
2003-11-15 12:39:48 +03:00
static BOOL test_EnumDomainUsers ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_EnumDomainUsers r ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2003-11-15 13:03:12 +03:00
int i ;
BOOL ret = True ;
2003-11-20 06:09:19 +03:00
struct samr_LookupNames n ;
2003-11-20 06:18:07 +03:00
struct samr_LookupRids lr ;
2003-11-15 12:39:48 +03:00
printf ( " Testing EnumDomainUsers \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2003-11-15 12:39:48 +03:00
r . in . resume_handle = & resume_handle ;
r . in . acct_flags = 0 ;
2004-05-25 20:24:13 +04:00
r . in . max_size = ( uint32_t ) - 1 ;
2003-11-15 12:39:48 +03:00
r . out . resume_handle = & resume_handle ;
status = dcerpc_samr_EnumDomainUsers ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomainUsers failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-15 13:03:12 +03:00
if ( ! r . out . sam ) {
return False ;
}
2003-11-20 06:09:19 +03:00
if ( r . out . sam - > count = = 0 ) {
return True ;
}
2003-11-15 13:03:12 +03:00
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
if ( ! test_OpenUser ( p , mem_ctx , handle , r . out . sam - > entries [ i ] . idx ) ) {
ret = False ;
}
}
2003-11-20 06:09:19 +03:00
printf ( " Testing LookupNames \n " ) ;
2004-09-21 07:51:38 +04:00
n . in . domain_handle = handle ;
2003-11-20 06:09:19 +03:00
n . in . num_names = r . out . sam - > count ;
2004-12-03 09:24:38 +03:00
n . in . names = talloc_array_p ( mem_ctx , struct samr_String , r . out . sam - > count ) ;
2003-11-20 06:09:19 +03:00
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
n . in . names [ i ] = r . out . sam - > entries [ i ] . name ;
}
status = dcerpc_samr_LookupNames ( p , mem_ctx , & n ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupNames failed - %s \n " , nt_errstr ( status ) ) ;
2003-11-20 06:18:07 +03:00
ret = False ;
}
printf ( " Testing LookupRids \n " ) ;
2004-09-21 07:51:38 +04:00
lr . in . domain_handle = handle ;
2003-11-20 06:18:07 +03:00
lr . in . num_rids = r . out . sam - > count ;
2004-12-03 09:24:38 +03:00
lr . in . rids = talloc_array_p ( mem_ctx , uint32_t , r . out . sam - > count ) ;
2003-11-20 06:18:07 +03:00
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
lr . in . rids [ i ] = r . out . sam - > entries [ i ] . idx ;
}
status = dcerpc_samr_LookupRids ( p , mem_ctx , & lr ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupRids failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2003-11-20 06:09:19 +03:00
}
2003-11-15 13:03:12 +03:00
return ret ;
2003-11-15 12:39:48 +03:00
}
2004-08-30 17:05:03 +04:00
/*
try blasting the server with a bunch of sync requests
*/
static BOOL test_EnumDomainUsers_async ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_EnumDomainUsers r ;
uint32_t resume_handle = 0 ;
int i ;
# define ASYNC_COUNT 100
struct rpc_request * req [ ASYNC_COUNT ] ;
2004-12-31 04:02:22 +03:00
if ( ! lp_parm_bool ( - 1 , " torture " , " dangerous " , False ) ) {
2004-09-10 07:38:16 +04:00
printf ( " samr async test disabled - enable dangerous tests to use \n " ) ;
return True ;
}
2004-08-30 17:05:03 +04:00
printf ( " Testing EnumDomainUsers_async \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-08-30 17:05:03 +04:00
r . in . resume_handle = & resume_handle ;
r . in . acct_flags = 0 ;
r . in . max_size = ( uint32_t ) - 1 ;
r . out . resume_handle = & resume_handle ;
for ( i = 0 ; i < ASYNC_COUNT ; i + + ) {
req [ i ] = dcerpc_samr_EnumDomainUsers_send ( p , mem_ctx , & r ) ;
}
for ( i = 0 ; i < ASYNC_COUNT ; i + + ) {
status = dcerpc_ndr_request_recv ( req [ i ] ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomainUsers[%d] failed - %s \n " ,
i , nt_errstr ( status ) ) ;
return False ;
}
}
printf ( " %d async requests OK \n " , i ) ;
return True ;
}
2003-11-15 12:39:48 +03:00
static BOOL test_EnumDomainGroups ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_EnumDomainGroups r ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2003-11-15 15:14:22 +03:00
int i ;
BOOL ret = True ;
2003-11-15 12:39:48 +03:00
printf ( " Testing EnumDomainGroups \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2003-11-15 12:39:48 +03:00
r . in . resume_handle = & resume_handle ;
2004-05-25 20:24:13 +04:00
r . in . max_size = ( uint32_t ) - 1 ;
2003-11-15 12:39:48 +03:00
r . out . resume_handle = & resume_handle ;
status = dcerpc_samr_EnumDomainGroups ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomainGroups failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-15 15:14:22 +03:00
if ( ! r . out . sam ) {
return False ;
}
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
if ( ! test_OpenGroup ( p , mem_ctx , handle , r . out . sam - > entries [ i ] . idx ) ) {
ret = False ;
}
}
return ret ;
2003-11-15 12:39:48 +03:00
}
2003-11-15 13:03:12 +03:00
static BOOL test_EnumDomainAliases ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_EnumDomainAliases r ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2003-11-15 15:38:06 +03:00
int i ;
BOOL ret = True ;
2003-11-15 13:03:12 +03:00
printf ( " Testing EnumDomainAliases \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2003-11-15 13:03:12 +03:00
r . in . resume_handle = & resume_handle ;
2004-09-22 07:36:17 +04:00
r . in . acct_flags = ( uint32_t ) - 1 ;
2003-11-15 13:03:12 +03:00
r . out . resume_handle = & resume_handle ;
status = dcerpc_samr_EnumDomainAliases ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomainAliases failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-15 15:38:06 +03:00
if ( ! r . out . sam ) {
return False ;
}
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
if ( ! test_OpenAlias ( p , mem_ctx , handle , r . out . sam - > entries [ i ] . idx ) ) {
ret = False ;
}
}
return ret ;
2003-11-15 13:03:12 +03:00
}
2004-04-18 08:06:15 +04:00
static BOOL test_GetDisplayEnumerationIndex ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_GetDisplayEnumerationIndex r ;
BOOL ret = True ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
uint16_t ok_lvl [ ] = { 1 , 1 , 1 , 0 , 0 } ;
2004-04-18 08:06:15 +04:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing GetDisplayEnumerationIndex level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-04-18 08:06:15 +04:00
r . in . level = levels [ i ] ;
2004-11-13 16:45:41 +03:00
init_samr_String ( & r . in . name , TEST_ACCOUNT_NAME ) ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_GetDisplayEnumerationIndex ( p , mem_ctx , & r ) ;
2004-04-22 11:28:18 +04:00
if ( ok_lvl [ i ] & &
! NT_STATUS_IS_OK ( status ) & &
! NT_STATUS_EQUAL ( NT_STATUS_NO_MORE_ENTRIES , status ) ) {
2004-04-18 08:06:15 +04:00
printf ( " GetDisplayEnumerationIndex level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2004-04-18 08:32:04 +04:00
2004-11-13 16:45:41 +03:00
init_samr_String ( & r . in . name , " zzzzzzzz " ) ;
2004-04-18 08:32:04 +04:00
status = dcerpc_samr_GetDisplayEnumerationIndex ( p , mem_ctx , & r ) ;
2004-04-22 11:28:18 +04:00
if ( ok_lvl [ i ] & & ! NT_STATUS_EQUAL ( NT_STATUS_NO_MORE_ENTRIES , status ) ) {
2004-04-18 08:32:04 +04:00
printf ( " GetDisplayEnumerationIndex level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
static BOOL test_GetDisplayEnumerationIndex2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_GetDisplayEnumerationIndex2 r ;
BOOL ret = True ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
uint16_t ok_lvl [ ] = { 1 , 1 , 1 , 0 , 0 } ;
2004-04-18 08:32:04 +04:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing GetDisplayEnumerationIndex2 level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-04-18 08:32:04 +04:00
r . in . level = levels [ i ] ;
2004-11-13 16:45:41 +03:00
init_samr_String ( & r . in . name , TEST_ACCOUNT_NAME ) ;
2004-04-18 08:32:04 +04:00
status = dcerpc_samr_GetDisplayEnumerationIndex2 ( p , mem_ctx , & r ) ;
2004-04-22 11:28:18 +04:00
if ( ok_lvl [ i ] & &
! NT_STATUS_IS_OK ( status ) & &
! NT_STATUS_EQUAL ( NT_STATUS_NO_MORE_ENTRIES , status ) ) {
2004-04-18 08:32:04 +04:00
printf ( " GetDisplayEnumerationIndex2 level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
init_samr_String ( & r . in . name , " zzzzzzzz " ) ;
2004-04-18 08:32:04 +04:00
status = dcerpc_samr_GetDisplayEnumerationIndex2 ( p , mem_ctx , & r ) ;
2004-04-22 11:28:18 +04:00
if ( ok_lvl [ i ] & & ! NT_STATUS_EQUAL ( NT_STATUS_NO_MORE_ENTRIES , status ) ) {
2004-04-18 08:32:04 +04:00
printf ( " GetDisplayEnumerationIndex2 level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2004-04-18 08:06:15 +04:00
}
return ret ;
}
2003-11-20 15:10:41 +03:00
static BOOL test_QueryDisplayInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryDisplayInfo r ;
BOOL ret = True ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
2003-11-21 05:19:47 +03:00
int i ;
2003-11-20 15:10:41 +03:00
2003-11-21 05:19:47 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryDisplayInfo level %u \n " , levels [ i ] ) ;
2003-11-20 15:10:41 +03:00
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2003-11-21 05:19:47 +03:00
r . in . level = levels [ i ] ;
r . in . start_idx = 0 ;
r . in . max_entries = 1000 ;
2004-05-25 20:24:13 +04:00
r . in . buf_size = ( uint32_t ) - 1 ;
2003-11-20 15:10:41 +03:00
2003-11-21 05:19:47 +03:00
status = dcerpc_samr_QueryDisplayInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDisplayInfo level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
2003-11-20 15:10:41 +03:00
}
return ret ;
}
2004-04-18 08:32:04 +04:00
static BOOL test_QueryDisplayInfo2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryDisplayInfo2 r ;
BOOL ret = True ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
2004-04-18 08:32:04 +04:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryDisplayInfo2 level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-04-18 08:32:04 +04:00
r . in . level = levels [ i ] ;
r . in . start_idx = 0 ;
r . in . max_entries = 1000 ;
2004-05-25 20:24:13 +04:00
r . in . buf_size = ( uint32_t ) - 1 ;
2004-04-18 08:32:04 +04:00
status = dcerpc_samr_QueryDisplayInfo2 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDisplayInfo2 level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
2004-04-19 09:48:03 +04:00
static BOOL test_QueryDisplayInfo3 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryDisplayInfo3 r ;
BOOL ret = True ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 } ;
2004-04-19 09:48:03 +04:00
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryDisplayInfo3 level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-04-19 09:48:03 +04:00
r . in . level = levels [ i ] ;
r . in . start_idx = 0 ;
r . in . max_entries = 1000 ;
2004-05-25 20:24:13 +04:00
r . in . buf_size = ( uint32_t ) - 1 ;
2004-04-19 09:48:03 +04:00
status = dcerpc_samr_QueryDisplayInfo3 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDisplayInfo3 level %u failed - %s \n " ,
levels [ i ] , nt_errstr ( status ) ) ;
ret = False ;
}
}
return ret ;
}
2003-11-15 11:06:39 +03:00
static BOOL test_QueryDomainInfo ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryDomainInfo r ;
2004-04-17 09:25:49 +04:00
struct samr_SetDomainInfo s ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 11 , 12 , 13 } ;
uint16_t set_ok [ ] = { 1 , 0 , 1 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 1 , 0 } ;
2003-11-15 12:18:02 +03:00
int i ;
BOOL ret = True ;
2003-11-15 11:06:39 +03:00
2003-11-15 12:18:02 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryDomainInfo level %u \n " , levels [ i ] ) ;
2003-11-15 11:06:39 +03:00
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2003-11-15 12:18:02 +03:00
r . in . level = levels [ i ] ;
2003-11-15 11:06:39 +03:00
2003-11-15 12:18:02 +03:00
status = dcerpc_samr_QueryDomainInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDomainInfo level %u failed - %s \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
2004-04-17 09:25:49 +04:00
printf ( " Testing SetDomainInfo level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
s . in . domain_handle = handle ;
2004-04-17 09:25:49 +04:00
s . in . level = levels [ i ] ;
s . in . info = r . out . info ;
status = dcerpc_samr_SetDomainInfo ( p , mem_ctx , & s ) ;
if ( set_ok [ i ] ) {
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetDomainInfo level %u failed - %s \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
} else {
if ( ! NT_STATUS_EQUAL ( NT_STATUS_INVALID_INFO_CLASS , status ) ) {
printf ( " SetDomainInfo level %u gave %s - should have been NT_STATUS_INVALID_INFO_CLASS \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
}
2004-04-26 06:04:48 +04:00
status = dcerpc_samr_QueryDomainInfo ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDomainInfo level %u failed - %s \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
2003-11-15 12:18:02 +03:00
}
2003-11-15 11:06:39 +03:00
return True ;
}
2004-04-18 08:32:04 +04:00
static BOOL test_QueryDomainInfo2 ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_QueryDomainInfo2 r ;
2004-05-25 21:24:24 +04:00
uint16_t levels [ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 11 , 12 , 13 } ;
2004-04-18 08:32:04 +04:00
int i ;
BOOL ret = True ;
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
printf ( " Testing QueryDomainInfo2 level %u \n " , levels [ i ] ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = handle ;
2004-04-18 08:32:04 +04:00
r . in . level = levels [ i ] ;
status = dcerpc_samr_QueryDomainInfo2 ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDomainInfo2 level %u failed - %s \n " ,
r . in . level , nt_errstr ( status ) ) ;
ret = False ;
continue ;
}
}
return True ;
}
2004-04-15 17:17:36 +04:00
/* Test whether querydispinfo level 5 and enumdomgroups return the same
set of group names . */
static BOOL test_GroupList ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
struct samr_EnumDomainGroups q1 ;
struct samr_QueryDisplayInfo q2 ;
NTSTATUS status ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2004-04-15 17:17:36 +04:00
int i ;
BOOL ret = True ;
int num_names = 0 ;
const char * * names = NULL ;
printf ( " Testing coherency of querydispinfo vs enumdomgroups \n " ) ;
2004-09-21 07:51:38 +04:00
q1 . in . domain_handle = handle ;
2004-04-15 17:17:36 +04:00
q1 . in . resume_handle = & resume_handle ;
q1 . in . max_size = 5 ;
q1 . out . resume_handle = & resume_handle ;
status = STATUS_MORE_ENTRIES ;
while ( NT_STATUS_EQUAL ( status , STATUS_MORE_ENTRIES ) ) {
status = dcerpc_samr_EnumDomainGroups ( p , mem_ctx , & q1 ) ;
if ( ! NT_STATUS_IS_OK ( status ) & &
! NT_STATUS_EQUAL ( status , STATUS_MORE_ENTRIES ) )
break ;
for ( i = 0 ; i < q1 . out . sam - > count ; i + + ) {
add_string_to_array ( mem_ctx ,
2004-11-13 16:45:41 +03:00
q1 . out . sam - > entries [ i ] . name . string ,
2004-04-15 17:17:36 +04:00
& names , & num_names ) ;
}
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomainGroups failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
if ( ! q1 . out . sam ) {
return False ;
}
2004-09-21 07:51:38 +04:00
q2 . in . domain_handle = handle ;
2004-04-15 17:17:36 +04:00
q2 . in . level = 5 ;
q2 . in . start_idx = 0 ;
q2 . in . max_entries = 5 ;
2004-05-25 20:24:13 +04:00
q2 . in . buf_size = ( uint32_t ) - 1 ;
2004-04-15 17:17:36 +04:00
status = STATUS_MORE_ENTRIES ;
while ( NT_STATUS_EQUAL ( status , STATUS_MORE_ENTRIES ) ) {
status = dcerpc_samr_QueryDisplayInfo ( p , mem_ctx , & q2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) & &
! NT_STATUS_EQUAL ( status , STATUS_MORE_ENTRIES ) )
break ;
for ( i = 0 ; i < q2 . out . info . info5 . count ; i + + ) {
int j ;
2004-11-13 16:45:41 +03:00
const char * name = q2 . out . info . info5 . entries [ i ] . account_name . string ;
2004-04-15 17:17:36 +04:00
BOOL found = False ;
for ( j = 0 ; j < num_names ; j + + ) {
if ( names [ j ] = = NULL )
continue ;
/* Hmm. No strequal in samba4 */
if ( strequal ( names [ j ] , name ) ) {
names [ j ] = NULL ;
found = True ;
break ;
}
}
if ( ! found ) {
printf ( " QueryDisplayInfo gave name [%s] that EnumDomainGroups did not \n " ,
name ) ;
ret = False ;
}
}
q2 . in . start_idx + = q2 . out . info . info5 . count ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryDisplayInfo level 5 failed - %s \n " ,
nt_errstr ( status ) ) ;
ret = False ;
}
for ( i = 0 ; i < num_names ; i + + ) {
if ( names [ i ] ! = NULL ) {
printf ( " EnumDomainGroups gave name [%s] that QueryDisplayInfo did not \n " ,
names [ i ] ) ;
ret = False ;
}
}
return ret ;
}
2004-04-17 09:54:55 +04:00
static BOOL test_DeleteDomainGroup ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * group_handle )
{
struct samr_DeleteDomainGroup d ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing DeleteDomainGroup \n " ) ;
2004-09-21 07:51:38 +04:00
d . in . group_handle = group_handle ;
d . out . group_handle = group_handle ;
2004-04-17 09:54:55 +04:00
status = dcerpc_samr_DeleteDomainGroup ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteDomainGroup failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-18 08:06:15 +04:00
static BOOL test_TestPrivateFunctionsDomain ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle )
{
struct samr_TestPrivateFunctionsDomain r ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing TestPrivateFunctionsDomain \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-04-18 08:06:15 +04:00
status = dcerpc_samr_TestPrivateFunctionsDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_NOT_IMPLEMENTED , status ) ) {
printf ( " TestPrivateFunctionsDomain failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-21 09:01:31 +04:00
static BOOL test_RidToSid ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle )
{
struct samr_RidToSid r ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing RidToSid \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-04-21 09:01:31 +04:00
r . in . rid = 512 ;
status = dcerpc_samr_RidToSid ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " RidToSid failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
return ret ;
}
2004-04-21 10:23:29 +04:00
static BOOL test_GetBootKeyInformation ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle )
{
struct samr_GetBootKeyInformation r ;
NTSTATUS status ;
BOOL ret = True ;
printf ( " Testing GetBootKeyInformation \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-04-21 10:23:29 +04:00
status = dcerpc_samr_GetBootKeyInformation ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
2004-04-30 07:57:48 +04:00
/* w2k3 seems to fail this sometimes and pass it sometimes */
printf ( " GetBootKeyInformation (ignored) - %s \n " , nt_errstr ( status ) ) ;
2004-04-21 10:23:29 +04:00
}
return ret ;
}
2004-04-17 10:40:50 +04:00
static BOOL test_AddGroupMember ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle ,
struct policy_handle * group_handle )
{
NTSTATUS status ;
struct samr_AddGroupMember r ;
2004-04-17 10:49:26 +04:00
struct samr_DeleteGroupMember d ;
2004-04-23 08:21:22 +04:00
struct samr_QueryGroupMember q ;
struct samr_SetMemberAttributesOfGroup s ;
2004-04-17 10:40:50 +04:00
BOOL ret = True ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-04-17 10:40:50 +04:00
2004-06-05 07:22:10 +04:00
status = test_LookupName ( p , mem_ctx , domain_handle , TEST_ACCOUNT_NAME , & rid ) ;
2004-04-17 10:40:50 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2004-09-21 07:51:38 +04:00
r . in . group_handle = group_handle ;
2004-04-17 10:40:50 +04:00
r . in . rid = rid ;
r . in . flags = 0 ; /* ??? */
2004-04-17 10:49:26 +04:00
printf ( " Testing AddGroupMember and DeleteGroupMember \n " ) ;
2004-09-21 07:51:38 +04:00
d . in . group_handle = group_handle ;
2004-04-17 10:49:26 +04:00
d . in . rid = rid ;
status = dcerpc_samr_DeleteGroupMember ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_MEMBER_NOT_IN_GROUP , status ) ) {
printf ( " DeleteGroupMember gave %s - should be NT_STATUS_MEMBER_NOT_IN_GROUP \n " ,
nt_errstr ( status ) ) ;
return False ;
}
2004-04-17 10:40:50 +04:00
status = dcerpc_samr_AddGroupMember ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " AddGroupMember failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
status = dcerpc_samr_AddGroupMember ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_MEMBER_IN_GROUP , status ) ) {
printf ( " AddGroupMember gave %s - should be NT_STATUS_MEMBER_IN_GROUP \n " ,
nt_errstr ( status ) ) ;
return False ;
}
2004-04-23 08:21:22 +04:00
/* this one is quite strange. I am using random inputs in the
hope of triggering an error that might give us a clue */
2004-09-21 07:51:38 +04:00
s . in . group_handle = group_handle ;
2004-04-23 08:21:22 +04:00
s . in . unknown1 = random ( ) ;
s . in . unknown2 = random ( ) ;
status = dcerpc_samr_SetMemberAttributesOfGroup ( p , mem_ctx , & s ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " SetMemberAttributesOfGroup failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-09-21 07:51:38 +04:00
q . in . group_handle = group_handle ;
2004-04-23 08:21:22 +04:00
status = dcerpc_samr_QueryGroupMember ( p , mem_ctx , & q ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " QueryGroupMember failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-04-18 08:06:15 +04:00
2004-04-17 10:49:26 +04:00
status = dcerpc_samr_DeleteGroupMember ( p , mem_ctx , & d ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " DeleteGroupMember failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
status = dcerpc_samr_AddGroupMember ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " AddGroupMember failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-04-17 10:40:50 +04:00
return ret ;
}
2004-04-17 09:54:55 +04:00
static BOOL test_CreateDomainGroup ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle , struct policy_handle * group_handle )
{
NTSTATUS status ;
struct samr_CreateDomainGroup r ;
2004-05-25 20:24:13 +04:00
uint32_t rid ;
2004-11-13 16:45:41 +03:00
struct samr_String name ;
2004-04-17 09:54:55 +04:00
BOOL ret = True ;
2004-11-13 16:45:41 +03:00
init_samr_String ( & name , TEST_GROUPNAME ) ;
2004-04-17 09:54:55 +04:00
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-04-17 09:54:55 +04:00
r . in . name = & name ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-04-17 09:54:55 +04:00
r . out . group_handle = group_handle ;
r . out . rid = & rid ;
2004-11-13 16:45:41 +03:00
printf ( " Testing CreateDomainGroup(%s) \n " , r . in . name - > string ) ;
2004-04-17 09:54:55 +04:00
status = dcerpc_samr_CreateDomainGroup ( p , mem_ctx , & r ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_ACCESS_DENIED ) ) {
2004-11-13 16:45:41 +03:00
printf ( " Server refused create of '%s' \n " , r . in . name - > string ) ;
2004-04-17 09:54:55 +04:00
ZERO_STRUCTP ( group_handle ) ;
return True ;
}
2004-05-27 08:13:58 +04:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_GROUP_EXISTS ) | |
NT_STATUS_EQUAL ( status , NT_STATUS_USER_EXISTS ) ) {
2004-11-13 16:45:41 +03:00
if ( ! test_DeleteGroup_byname ( p , mem_ctx , domain_handle , r . in . name - > string ) ) {
2004-04-17 09:54:55 +04:00
return False ;
}
status = dcerpc_samr_CreateDomainGroup ( p , mem_ctx , & r ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " CreateDomainGroup failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-04-17 10:40:50 +04:00
if ( ! test_AddGroupMember ( p , mem_ctx , domain_handle , group_handle ) ) {
ret = False ;
}
2004-04-22 11:28:18 +04:00
if ( ! test_SetGroupInfo ( p , mem_ctx , group_handle ) ) {
ret = False ;
}
2004-04-17 09:54:55 +04:00
return ret ;
}
2004-04-15 17:17:36 +04:00
2004-04-18 08:06:15 +04:00
/*
its not totally clear what this does . It seems to accept any sid you like .
*/
static BOOL test_RemoveMemberFromForeignDomain ( struct dcerpc_pipe * p ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * domain_handle )
{
NTSTATUS status ;
struct samr_RemoveMemberFromForeignDomain r ;
2004-09-21 07:51:38 +04:00
r . in . domain_handle = domain_handle ;
2004-04-18 08:06:15 +04:00
r . in . sid = dom_sid_parse_talloc ( mem_ctx , " S-1-5-32-12-34-56-78-9 " ) ;
status = dcerpc_samr_RemoveMemberFromForeignDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " RemoveMemberFromForeignDomain failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2004-09-27 09:15:14 +04:00
static BOOL test_Connect ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle ) ;
2004-04-18 08:06:15 +04:00
2003-11-15 11:06:39 +03:00
static BOOL test_OpenDomain ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2003-12-19 07:13:39 +03:00
struct policy_handle * handle , struct dom_sid * sid )
2003-11-15 11:06:39 +03:00
{
NTSTATUS status ;
struct samr_OpenDomain r ;
struct policy_handle domain_handle ;
2003-12-19 06:59:27 +03:00
struct policy_handle user_handle ;
struct policy_handle alias_handle ;
2004-04-17 09:54:55 +04:00
struct policy_handle group_handle ;
2003-11-15 23:47:59 +03:00
BOOL ret = True ;
2003-11-15 11:06:39 +03:00
2003-12-19 06:59:27 +03:00
ZERO_STRUCT ( user_handle ) ;
ZERO_STRUCT ( alias_handle ) ;
2004-04-23 08:21:22 +04:00
ZERO_STRUCT ( group_handle ) ;
ZERO_STRUCT ( domain_handle ) ;
2003-12-19 06:59:27 +03:00
2003-11-15 11:06:39 +03:00
printf ( " Testing OpenDomain \n " ) ;
2004-09-21 07:51:38 +04:00
r . in . connect_handle = handle ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2003-11-15 11:06:39 +03:00
r . in . sid = sid ;
r . out . domain_handle = & domain_handle ;
status = dcerpc_samr_OpenDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenDomain failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2004-09-27 09:15:14 +04:00
/* run the domain tests with the main handle closed - this tests
the servers reference counting */
2004-11-13 16:45:41 +03:00
ret & = test_samr_handle_Close ( p , mem_ctx , handle ) ;
2004-09-27 09:15:14 +04:00
ret & = test_QuerySecurity ( p , mem_ctx , & domain_handle ) ;
ret & = test_RemoveMemberFromForeignDomain ( p , mem_ctx , & domain_handle ) ;
ret & = test_CreateUser2 ( p , mem_ctx , & domain_handle ) ;
ret & = test_CreateUser ( p , mem_ctx , & domain_handle , & user_handle ) ;
ret & = test_CreateAlias ( p , mem_ctx , & domain_handle , & alias_handle , sid ) ;
ret & = test_CreateDomainGroup ( p , mem_ctx , & domain_handle , & group_handle ) ;
ret & = test_QueryDomainInfo ( p , mem_ctx , & domain_handle ) ;
ret & = test_QueryDomainInfo2 ( p , mem_ctx , & domain_handle ) ;
ret & = test_EnumDomainUsers ( p , mem_ctx , & domain_handle ) ;
ret & = test_EnumDomainUsers_async ( p , mem_ctx , & domain_handle ) ;
ret & = test_EnumDomainGroups ( p , mem_ctx , & domain_handle ) ;
ret & = test_EnumDomainAliases ( p , mem_ctx , & domain_handle ) ;
ret & = test_QueryDisplayInfo ( p , mem_ctx , & domain_handle ) ;
ret & = test_QueryDisplayInfo2 ( p , mem_ctx , & domain_handle ) ;
ret & = test_QueryDisplayInfo3 ( p , mem_ctx , & domain_handle ) ;
ret & = test_GetDisplayEnumerationIndex ( p , mem_ctx , & domain_handle ) ;
ret & = test_GetDisplayEnumerationIndex2 ( p , mem_ctx , & domain_handle ) ;
ret & = test_GroupList ( p , mem_ctx , & domain_handle ) ;
ret & = test_TestPrivateFunctionsDomain ( p , mem_ctx , & domain_handle ) ;
ret & = test_RidToSid ( p , mem_ctx , & domain_handle ) ;
ret & = test_GetBootKeyInformation ( p , mem_ctx , & domain_handle ) ;
2004-04-21 10:23:29 +04:00
2003-12-19 06:59:27 +03:00
if ( ! policy_handle_empty ( & user_handle ) & &
! test_DeleteUser ( p , mem_ctx , & user_handle ) ) {
ret = False ;
}
if ( ! policy_handle_empty ( & alias_handle ) & &
2004-04-17 09:54:55 +04:00
! test_DeleteAlias ( p , mem_ctx , & alias_handle ) ) {
ret = False ;
}
if ( ! policy_handle_empty ( & group_handle ) & &
! test_DeleteDomainGroup ( p , mem_ctx , & group_handle ) ) {
2003-12-19 06:59:27 +03:00
ret = False ;
}
2004-11-13 16:45:41 +03:00
ret & = test_samr_handle_Close ( p , mem_ctx , & domain_handle ) ;
2004-09-27 09:15:14 +04:00
/* reconnect the main handle */
ret & = test_Connect ( p , mem_ctx , handle ) ;
2003-11-15 23:47:59 +03:00
return ret ;
2003-11-15 11:06:39 +03:00
}
2003-11-15 10:51:19 +03:00
static BOOL test_LookupDomain ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2004-11-13 16:45:41 +03:00
struct policy_handle * handle , struct samr_String * domain )
2003-11-15 10:51:19 +03:00
{
NTSTATUS status ;
struct samr_LookupDomain r ;
2004-11-13 16:45:41 +03:00
struct samr_String n2 ;
2004-04-21 10:23:29 +04:00
BOOL ret = True ;
2003-11-15 10:51:19 +03:00
2004-11-13 16:45:41 +03:00
printf ( " Testing LookupDomain(%s) \n " , domain - > string ) ;
2003-11-15 10:51:19 +03:00
2004-05-03 18:54:47 +04:00
/* check for correct error codes */
2004-09-21 07:51:38 +04:00
r . in . connect_handle = handle ;
2004-05-03 18:54:47 +04:00
r . in . domain = & n2 ;
2004-11-13 16:45:41 +03:00
n2 . string = NULL ;
2004-05-03 18:54:47 +04:00
status = dcerpc_samr_LookupDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_INVALID_PARAMETER , status ) ) {
printf ( " failed: LookupDomain expected NT_STATUS_INVALID_PARAMETER - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-11-13 16:45:41 +03:00
n2 . string = " xxNODOMAINxx " ;
2004-05-03 18:54:47 +04:00
status = dcerpc_samr_LookupDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_EQUAL ( NT_STATUS_NO_SUCH_DOMAIN , status ) ) {
printf ( " failed: LookupDomain expected NT_STATUS_NO_SUCH_DOMAIN - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
}
2004-09-21 07:51:38 +04:00
r . in . connect_handle = handle ;
2003-11-15 10:51:19 +03:00
r . in . domain = domain ;
status = dcerpc_samr_LookupDomain ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " LookupDomain failed - %s \n " , nt_errstr ( status ) ) ;
2004-05-03 18:54:47 +04:00
ret = False ;
2003-11-15 10:51:19 +03:00
}
2004-04-21 10:23:29 +04:00
if ( ! test_GetDomPwInfo ( p , mem_ctx , domain ) ) {
ret = False ;
}
2003-11-15 11:06:39 +03:00
if ( ! test_OpenDomain ( p , mem_ctx , handle , r . out . sid ) ) {
2004-04-21 10:23:29 +04:00
ret = False ;
2003-11-15 11:06:39 +03:00
}
2004-04-21 10:23:29 +04:00
return ret ;
2003-11-15 10:51:19 +03:00
}
2003-11-15 09:00:21 +03:00
static BOOL test_EnumDomains ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_EnumDomains r ;
2004-05-25 20:24:13 +04:00
uint32_t resume_handle = 0 ;
2003-11-15 10:51:19 +03:00
int i ;
2003-11-15 11:06:39 +03:00
BOOL ret = True ;
2003-11-15 09:00:21 +03:00
2004-09-21 07:51:38 +04:00
r . in . connect_handle = handle ;
2003-11-15 09:00:21 +03:00
r . in . resume_handle = & resume_handle ;
2004-05-25 20:24:13 +04:00
r . in . buf_size = ( uint32_t ) - 1 ;
2003-11-15 09:00:21 +03:00
r . out . resume_handle = & resume_handle ;
status = dcerpc_samr_EnumDomains ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomains failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-15 11:06:39 +03:00
if ( ! r . out . sam ) {
return False ;
}
for ( i = 0 ; i < r . out . sam - > count ; i + + ) {
if ( ! test_LookupDomain ( p , mem_ctx , handle ,
& r . out . sam - > entries [ i ] . name ) ) {
ret = False ;
2003-11-15 10:51:19 +03:00
}
}
2004-05-03 18:54:47 +04:00
status = dcerpc_samr_EnumDomains ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumDomains failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-15 11:06:39 +03:00
return ret ;
2003-11-15 09:00:21 +03:00
}
static BOOL test_Connect ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
struct samr_Connect r ;
2003-11-24 00:51:24 +03:00
struct samr_Connect2 r2 ;
2004-04-21 10:23:29 +04:00
struct samr_Connect3 r3 ;
2003-11-15 10:51:19 +03:00
struct samr_Connect4 r4 ;
2003-12-19 06:59:27 +03:00
struct samr_Connect5 r5 ;
2004-04-26 07:52:44 +04:00
union samr_ConnectInfo info ;
2004-09-28 09:44:59 +04:00
struct policy_handle h ;
BOOL ret = True , got_handle = False ;
2003-11-15 09:00:21 +03:00
2004-04-21 10:23:29 +04:00
printf ( " testing samr_Connect \n " ) ;
2003-11-15 09:00:21 +03:00
r . in . system_name = 0 ;
2004-12-02 07:37:36 +03:00
r . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-28 09:44:59 +04:00
r . out . connect_handle = & h ;
2003-11-15 09:00:21 +03:00
status = dcerpc_samr_Connect ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect failed - %s \n " , nt_errstr ( status ) ) ;
2003-11-24 00:51:24 +03:00
ret = False ;
2004-09-28 09:44:59 +04:00
} else {
got_handle = True ;
* handle = h ;
2003-11-24 00:51:24 +03:00
}
2004-04-21 10:23:29 +04:00
printf ( " testing samr_Connect2 \n " ) ;
2004-04-26 07:52:44 +04:00
r2 . in . system_name = NULL ;
2004-12-02 07:37:36 +03:00
r2 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-28 09:44:59 +04:00
r2 . out . connect_handle = & h ;
2003-11-24 00:51:24 +03:00
status = dcerpc_samr_Connect2 ( p , mem_ctx , & r2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect2 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2004-09-28 09:44:59 +04:00
} else {
if ( got_handle ) {
2004-11-13 16:45:41 +03:00
test_samr_handle_Close ( p , mem_ctx , handle ) ;
2004-09-28 09:44:59 +04:00
}
got_handle = True ;
* handle = h ;
2003-11-15 09:00:21 +03:00
}
2004-04-21 10:23:29 +04:00
printf ( " testing samr_Connect3 \n " ) ;
2004-04-26 07:52:44 +04:00
r3 . in . system_name = NULL ;
2004-04-21 10:23:29 +04:00
r3 . in . unknown = 0 ;
2004-12-02 07:37:36 +03:00
r3 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-28 09:44:59 +04:00
r3 . out . connect_handle = & h ;
2004-04-21 10:23:29 +04:00
status = dcerpc_samr_Connect3 ( p , mem_ctx , & r3 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect3 failed - %s \n " , nt_errstr ( status ) ) ;
ret = False ;
2004-09-28 09:44:59 +04:00
} else {
if ( got_handle ) {
2004-11-13 16:45:41 +03:00
test_samr_handle_Close ( p , mem_ctx , handle ) ;
2004-09-28 09:44:59 +04:00
}
got_handle = True ;
* handle = h ;
2004-04-21 10:23:29 +04:00
}
printf ( " testing samr_Connect4 \n " ) ;
2003-11-15 14:39:47 +03:00
r4 . in . system_name = " " ;
2003-11-15 10:51:19 +03:00
r4 . in . unknown = 0 ;
2004-12-02 07:37:36 +03:00
r4 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-09-28 09:44:59 +04:00
r4 . out . connect_handle = & h ;
2003-11-15 10:51:19 +03:00
status = dcerpc_samr_Connect4 ( p , mem_ctx , & r4 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect4 failed - %s \n " , nt_errstr ( status ) ) ;
2003-11-24 00:51:24 +03:00
ret = False ;
2004-09-28 09:44:59 +04:00
} else {
if ( got_handle ) {
2004-11-13 16:45:41 +03:00
test_samr_handle_Close ( p , mem_ctx , handle ) ;
2004-09-28 09:44:59 +04:00
}
got_handle = True ;
* handle = h ;
2003-11-15 10:51:19 +03:00
}
2004-04-21 10:23:29 +04:00
printf ( " testing samr_Connect5 \n " ) ;
2004-04-26 07:52:44 +04:00
info . info1 . unknown1 = 0 ;
info . info1 . unknown2 = 0 ;
2003-12-19 06:59:27 +03:00
r5 . in . system_name = " " ;
2004-12-02 07:37:36 +03:00
r5 . in . access_mask = SEC_FLAG_MAXIMUM_ALLOWED ;
2004-04-26 07:52:44 +04:00
r5 . in . level = 1 ;
r5 . in . info = & info ;
r5 . out . info = & info ;
2004-09-28 09:44:59 +04:00
r5 . out . connect_handle = & h ;
2003-12-19 06:59:27 +03:00
status = dcerpc_samr_Connect5 ( p , mem_ctx , & r5 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Connect5 failed - %s \n " , nt_errstr ( status ) ) ;
2004-04-26 07:52:44 +04:00
ret = False ;
2004-09-28 09:44:59 +04:00
} else {
if ( got_handle ) {
2004-11-13 16:45:41 +03:00
test_samr_handle_Close ( p , mem_ctx , handle ) ;
2004-09-28 09:44:59 +04:00
}
got_handle = True ;
* handle = h ;
2003-12-19 06:59:27 +03:00
}
2003-11-24 00:51:24 +03:00
return ret ;
2003-11-15 09:00:21 +03:00
}
2004-10-28 17:40:50 +04:00
BOOL torture_rpc_samr ( void )
2003-11-15 09:00:21 +03:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
TALLOC_CTX * mem_ctx ;
BOOL ret = True ;
struct policy_handle handle ;
mem_ctx = talloc_init ( " torture_rpc_samr " ) ;
2003-11-18 08:01:10 +03:00
status = torture_rpc_connection ( & p ,
DCERPC_SAMR_NAME ,
DCERPC_SAMR_UUID ,
DCERPC_SAMR_VERSION ) ;
2003-11-15 09:00:21 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2003-11-18 04:18:24 +03:00
2003-11-15 09:00:21 +03:00
if ( ! test_Connect ( p , mem_ctx , & handle ) ) {
ret = False ;
}
2003-11-18 08:20:54 +03:00
if ( ! test_QuerySecurity ( p , mem_ctx , & handle ) ) {
ret = False ;
}
2003-11-15 09:00:21 +03:00
if ( ! test_EnumDomains ( p , mem_ctx , & handle ) ) {
ret = False ;
}
2004-04-23 09:40:18 +04:00
if ( ! test_SetDsrmPassword ( p , mem_ctx , & handle ) ) {
ret = False ;
}
if ( ! test_Shutdown ( p , mem_ctx , & handle ) ) {
ret = False ;
}
2004-11-13 16:45:41 +03:00
if ( ! test_samr_handle_Close ( p , mem_ctx , & handle ) ) {
2003-11-15 23:47:59 +03:00
ret = False ;
}
2003-11-22 11:11:32 +03:00
talloc_destroy ( mem_ctx ) ;
2003-11-15 09:00:21 +03:00
torture_rpc_close ( p ) ;
return ret ;
}
2004-04-26 07:07:46 +04:00