2003-11-03 06:22:45 +00:00
/*
Unix SMB / CIFS implementation .
test suite for lsa rpc operations
2003-11-04 09:10:31 +00:00
2003-11-03 06:22:45 +00:00
Copyright ( C ) Andrew Tridgell 2003
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
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"
2003-11-04 11:16:07 +00:00
/*
2003-11-08 11:21:57 +00:00
these really shouldn ' t be here . . . .
2003-11-04 11:16:07 +00:00
*/
static char * lsa_sid_string_talloc ( TALLOC_CTX * mem_ctx , struct dom_sid * sid )
{
int i , ofs , maxlen ;
uint32 ia ;
char * ret ;
if ( ! sid ) {
return talloc_asprintf ( mem_ctx , " (NULL SID) " ) ;
}
maxlen = sid - > num_auths * 11 + 25 ;
ret = talloc ( mem_ctx , maxlen ) ;
if ( ! ret ) return NULL ;
ia = ( sid - > id_auth [ 5 ] ) +
( sid - > id_auth [ 4 ] < < 8 ) +
( sid - > id_auth [ 3 ] < < 16 ) +
( sid - > id_auth [ 2 ] < < 24 ) ;
ofs = snprintf ( ret , maxlen , " S-%u-%lu " ,
( unsigned int ) sid - > sid_rev_num , ( unsigned long ) ia ) ;
for ( i = 0 ; i < sid - > num_auths ; i + + ) {
ofs + = snprintf ( ret + ofs , maxlen - ofs , " -%lu " , ( unsigned long ) sid - > sub_auths [ i ] ) ;
}
return ret ;
}
2003-11-08 11:21:57 +00:00
static int dom_sid_compare ( struct dom_sid * sid1 , struct dom_sid * sid2 )
{
int i ;
if ( sid1 = = sid2 ) return 0 ;
if ( ! sid1 ) return - 1 ;
if ( ! sid2 ) return 1 ;
/* Compare most likely different rids, first: i.e start at end */
if ( sid1 - > num_auths ! = sid2 - > num_auths )
return sid1 - > num_auths - sid2 - > num_auths ;
for ( i = sid1 - > num_auths - 1 ; i > = 0 ; - - i )
if ( sid1 - > sub_auths [ i ] ! = sid2 - > sub_auths [ i ] )
return sid1 - > sub_auths [ i ] - sid2 - > sub_auths [ i ] ;
if ( sid1 - > sid_rev_num ! = sid2 - > sid_rev_num )
return sid1 - > sid_rev_num - sid2 - > sid_rev_num ;
for ( i = 0 ; i < 6 ; i + + )
if ( sid1 - > id_auth [ i ] ! = sid2 - > id_auth [ i ] )
return sid1 - > id_auth [ i ] - sid2 - > id_auth [ i ] ;
return 0 ;
}
2003-11-04 11:16:07 +00:00
2003-11-04 09:10:31 +00:00
static BOOL test_OpenPolicy ( struct dcerpc_pipe * p )
2003-11-03 06:22:45 +00:00
{
2003-11-04 09:10:31 +00:00
struct lsa_ObjectAttribute attr ;
struct policy_handle handle ;
struct lsa_QosInfo qos ;
NTSTATUS status ;
2003-11-03 06:22:45 +00:00
2003-11-04 11:16:07 +00:00
printf ( " \n testing OpenPolicy \n " ) ;
2003-11-04 09:48:33 +00:00
2003-11-04 09:10:31 +00:00
qos . impersonation_level = 2 ;
qos . context_mode = 1 ;
qos . effective_only = 0 ;
2003-11-03 06:22:45 +00:00
2003-11-04 09:10:31 +00:00
attr . root_dir = NULL ;
attr . object_name = NULL ;
attr . attributes = 0 ;
attr . sec_desc = NULL ;
attr . sec_qos = & qos ;
2003-11-03 06:22:45 +00:00
2003-11-04 09:10:31 +00:00
status = dcerpc_lsa_OpenPolicy ( p ,
" \\ " ,
& attr ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
& handle ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenPolicy failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
2003-11-03 06:22:45 +00:00
}
2003-11-04 09:10:31 +00:00
return True ;
2003-11-03 06:22:45 +00:00
}
2003-11-04 09:48:33 +00:00
2003-11-04 11:16:07 +00:00
static BOOL test_OpenPolicy2 ( struct dcerpc_pipe * p , struct policy_handle * handle )
2003-11-04 09:48:33 +00:00
{
struct lsa_ObjectAttribute attr ;
struct lsa_QosInfo qos ;
NTSTATUS status ;
2003-11-04 11:16:07 +00:00
printf ( " \n testing OpenPolicy2 \n " ) ;
2003-11-04 09:48:33 +00:00
qos . impersonation_level = 2 ;
qos . context_mode = 1 ;
qos . effective_only = 0 ;
attr . root_dir = NULL ;
attr . object_name = NULL ;
attr . attributes = 0 ;
attr . sec_desc = NULL ;
attr . sec_qos = & qos ;
status = dcerpc_lsa_OpenPolicy2 ( p ,
" \\ " ,
& attr ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
2003-11-04 11:16:07 +00:00
handle ) ;
2003-11-04 09:48:33 +00:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " OpenPolicy2 failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
return True ;
}
2003-11-04 11:16:07 +00:00
static BOOL test_EnumSids ( struct dcerpc_pipe * p ,
TALLOC_CTX * mem_ctx ,
struct policy_handle * handle )
{
NTSTATUS status ;
2003-11-08 11:21:57 +00:00
struct lsa_SidArray sids1 , sids2 ;
uint32 resume_handle ;
2003-11-04 11:16:07 +00:00
int i ;
printf ( " \n testing EnumSids \n " ) ;
2003-11-08 11:21:57 +00:00
resume_handle = 0 ;
status = dcerpc_lsa_EnumSids ( p , mem_ctx , handle , & resume_handle , 100 , & sids1 ) ;
2003-11-04 11:16:07 +00:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumSids failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
2003-11-08 11:21:57 +00:00
printf ( " Got %d sids resume_handle=%u \n " , sids1 . num_sids , resume_handle ) ;
2003-11-04 11:16:07 +00:00
2003-11-08 11:21:57 +00:00
for ( i = 0 ; i < sids1 . num_sids ; i + + ) {
printf ( " %s \n " , lsa_sid_string_talloc ( mem_ctx , sids1 . sids [ i ] . sid ) ) ;
}
if ( sids1 . num_sids < 3 ) {
return True ;
2003-11-04 11:16:07 +00:00
}
2003-11-08 11:21:57 +00:00
printf ( " trying partial listing (asking for 1 at 2) \n " ) ;
resume_handle = 2 ;
status = dcerpc_lsa_EnumSids ( p , mem_ctx , handle , & resume_handle , 1 , & sids2 ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " EnumSids failed - %s \n " , nt_errstr ( status ) ) ;
return False ;
}
if ( sids2 . num_sids ! = 1 ) {
printf ( " Returned wrong number of entries (%d) \n " , sids2 . num_sids ) ;
return False ;
}
2003-11-04 11:16:07 +00:00
return True ;
}
2003-11-03 06:22:45 +00:00
BOOL torture_rpc_lsa ( int dummy )
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
TALLOC_CTX * mem_ctx ;
2003-11-04 09:48:33 +00:00
BOOL ret = True ;
2003-11-04 11:16:07 +00:00
struct policy_handle handle ;
2003-11-03 06:22:45 +00:00
mem_ctx = talloc_init ( " torture_rpc_lsa " ) ;
status = torture_rpc_connection ( & p , " lsarpc " ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
2003-11-04 09:48:33 +00:00
if ( ! test_OpenPolicy ( p ) ) {
ret = False ;
}
2003-11-04 11:16:07 +00:00
if ( ! test_OpenPolicy2 ( p , & handle ) ) {
2003-11-04 09:48:33 +00:00
ret = False ;
}
2003-11-03 06:22:45 +00:00
2003-11-04 11:16:07 +00:00
if ( ! test_EnumSids ( p , mem_ctx , & handle ) ) {
ret = False ;
}
2003-11-03 06:22:45 +00:00
torture_rpc_close ( p ) ;
2003-11-04 09:48:33 +00:00
return ret ;
2003-11-03 06:22:45 +00:00
}