2005-10-07 08:12:05 +00:00
/*
Unix SMB / CIFS implementation .
DRSUapi tests
Copyright ( C ) Andrew Tridgell 2003
Copyright ( C ) Stefan ( metze ) Metzmacher 2004
Copyright ( C ) Andrew Bartlett < abartlet @ samba . org > 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 02:07:03 +00:00
the Free Software Foundation ; either version 3 of the License , or
2005-10-07 08:12:05 +00:00
( 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
2007-07-10 02:07:03 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-10-07 08:12:05 +00:00
*/
# include "includes.h"
2006-01-03 13:41:17 +00:00
# include "torture/torture.h"
2006-03-14 23:35:30 +00:00
# include "librpc/gen_ndr/ndr_drsuapi_c.h"
2006-03-14 15:02:05 +00:00
# include "torture/rpc/rpc.h"
2005-10-13 04:24:49 +00:00
# include "ldb/include/ldb.h"
2006-11-17 11:19:15 +00:00
# include "libcli/security/security.h"
2007-09-10 23:47:29 +00:00
# include "param/param.h"
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
static BOOL test_DsCrackNamesMatrix ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
2005-10-07 08:12:05 +00:00
struct DsPrivate * priv , const char * dn ,
const char * user_principal_name , const char * service_principal_name )
{
NTSTATUS status ;
2007-09-10 23:47:29 +00:00
BOOL ret = True ;
2005-10-07 08:12:05 +00:00
struct drsuapi_DsCrackNames r ;
enum drsuapi_DsNameFormat formats [ ] = {
DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
DRSUAPI_DS_NAME_FORMAT_DISPLAY ,
DRSUAPI_DS_NAME_FORMAT_GUID ,
DRSUAPI_DS_NAME_FORMAT_CANONICAL ,
DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX ,
DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN
} ;
2005-10-13 04:24:49 +00:00
struct drsuapi_DsNameString names [ ARRAY_SIZE ( formats ) ] ;
2005-10-07 08:12:05 +00:00
int i , j ;
const char * n_matrix [ ARRAY_SIZE ( formats ) ] [ ARRAY_SIZE ( formats ) ] ;
const char * n_from [ ARRAY_SIZE ( formats ) ] ;
ZERO_STRUCT ( r ) ;
r . in . bind_handle = & priv - > bind_handle ;
r . in . level = 1 ;
2006-12-28 22:51:56 +00:00
r . in . req . req1 . codepage = 1252 ; /* german */
r . in . req . req1 . language = 0x00000407 ; /* german */
2005-10-07 08:12:05 +00:00
r . in . req . req1 . count = 1 ;
r . in . req . req1 . names = names ;
r . in . req . req1 . format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS ;
n_matrix [ 0 ] [ 0 ] = dn ;
for ( i = 0 ; i < ARRAY_SIZE ( formats ) ; i + + ) {
r . in . req . req1 . format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ;
r . in . req . req1 . format_desired = formats [ i ] ;
names [ 0 ] . str = dn ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " testing DsCrackNames (matrix prep) with name '%s' from format: %d desired format:%d " ,
names [ 0 ] . str , r . in . req . req1 . format_offered , r . in . req . req1 . format_desired ) ;
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " testing DsCrackNames (matrix prep) with name '%s' from format: %d desired format:%d " ,
2006-12-28 22:51:56 +00:00
names [ 0 ] . str , r . in . req . req1 . format_offered , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
}
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
switch ( formats [ i ] ) {
case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL :
2007-09-10 23:47:29 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE ) {
printf ( __location__ " : Unexpected error (%d): This name lookup should fail \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
return False ;
}
printf ( " (expected) error \n " ) ;
2005-10-07 08:12:05 +00:00
break ;
case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL :
2007-09-10 23:47:29 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_NO_MAPPING ) {
printf ( __location__ " : Unexpected error (%d): This name lookup should fail \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
return False ;
}
printf ( " (expected) error \n " ) ;
2005-10-07 08:12:05 +00:00
break ;
case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN :
case DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY :
2007-09-10 23:47:29 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR ) {
printf ( __location__ " : Unexpected error (%d): This name lookup should fail \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
return False ;
}
printf ( " (expected) error \n " ) ;
2005-10-07 08:12:05 +00:00
break ;
default :
2007-09-10 23:47:29 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " Error: %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
return False ;
}
2005-10-07 08:12:05 +00:00
}
switch ( formats [ i ] ) {
case DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL :
n_from [ i ] = user_principal_name ;
break ;
case DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL :
n_from [ i ] = service_principal_name ;
break ;
case DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY :
case DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN :
n_from [ i ] = NULL ;
break ;
default :
n_from [ i ] = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
2007-09-10 23:47:29 +00:00
printf ( " %s \n " , n_from [ i ] ) ;
2005-10-07 08:12:05 +00:00
}
}
for ( i = 0 ; i < ARRAY_SIZE ( formats ) ; i + + ) {
for ( j = 0 ; j < ARRAY_SIZE ( formats ) ; j + + ) {
r . in . req . req1 . format_offered = formats [ i ] ;
r . in . req . req1 . format_desired = formats [ j ] ;
if ( ! n_from [ i ] ) {
n_matrix [ i ] [ j ] = NULL ;
continue ;
}
names [ 0 ] . str = n_from [ i ] ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " testing DsCrackNames (matrix) with name '%s' from format: %d desired format:%d failed - %s " ,
names [ 0 ] . str , r . in . req . req1 . format_offered , r . in . req . req1 . format_desired , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " testing DsCrackNames (matrix) with name '%s' from format: %d desired format:%d failed - %s " ,
names [ 0 ] . str , r . in . req . req1 . format_offered , r . in . req . req1 . format_desired ,
win_errstr ( r . out . result ) ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status = = DRSUAPI_DS_NAME_STATUS_OK ) {
n_matrix [ i ] [ j ] = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
} else {
n_matrix [ i ] [ j ] = NULL ;
}
}
}
for ( i = 0 ; i < ARRAY_SIZE ( formats ) ; i + + ) {
for ( j = 0 ; j < ARRAY_SIZE ( formats ) ; j + + ) {
if ( n_matrix [ i ] [ j ] = = n_from [ j ] ) {
/* We don't have a from name for these yet (and we can't map to them to find it out) */
} else if ( n_matrix [ i ] [ j ] = = NULL & & n_from [ i ] = = NULL ) {
/* we can't map to these two */
} else if ( n_matrix [ i ] [ j ] = = NULL & & formats [ j ] = = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ) {
} else if ( n_matrix [ i ] [ j ] = = NULL & & formats [ j ] = = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ) {
2007-09-10 23:47:29 +00:00
} else if ( n_matrix [ i ] [ j ] = = NULL & & n_from [ j ] ! = NULL ) {
printf ( " dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: %s should be %s \n " , formats [ i ] , formats [ j ] , n_matrix [ i ] [ j ] , n_from [ j ] ) ;
ret = False ;
} else if ( n_matrix [ i ] [ j ] ! = NULL & & n_from [ j ] = = NULL ) {
printf ( " dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: %s should be %s \n " , formats [ i ] , formats [ j ] , n_matrix [ i ] [ j ] , n_from [ j ] ) ;
ret = False ;
} else if ( strcmp ( n_matrix [ i ] [ j ] , n_from [ j ] ) ! = 0 ) {
printf ( " dcerpc_drsuapi_DsCrackNames mismatch - from %d to %d: %s should be %s \n " , formats [ i ] , formats [ j ] , n_matrix [ i ] [ j ] , n_from [ j ] ) ;
ret = False ;
2005-10-07 08:12:05 +00:00
}
}
}
2007-09-10 23:47:29 +00:00
return ret ;
2005-10-07 08:12:05 +00:00
}
2007-09-10 23:47:29 +00:00
BOOL test_DsCrackNames ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx ,
struct DsPrivate * priv )
2005-10-07 08:12:05 +00:00
{
NTSTATUS status ;
struct drsuapi_DsCrackNames r ;
struct drsuapi_DsNameString names [ 1 ] ;
2007-09-10 23:47:29 +00:00
BOOL ret = True ;
2005-10-07 08:12:05 +00:00
const char * dns_domain ;
const char * nt4_domain ;
const char * FQDN_1779_name ;
2006-11-22 00:59:34 +00:00
struct ldb_context * ldb ;
2005-10-13 04:24:49 +00:00
struct ldb_dn * FQDN_1779_dn ;
struct ldb_dn * realm_dn ;
2005-10-20 04:55:56 +00:00
const char * realm_dn_str ;
2005-10-13 04:24:49 +00:00
const char * realm_canonical ;
const char * realm_canonical_ex ;
2005-10-07 08:12:05 +00:00
const char * user_principal_name ;
2005-10-28 06:44:24 +00:00
char * user_principal_name_short ;
2005-10-07 08:12:05 +00:00
const char * service_principal_name ;
2005-10-13 02:07:29 +00:00
const char * canonical_name ;
const char * canonical_ex_name ;
2006-12-11 23:59:03 +00:00
const char * dom_sid ;
const char * test_dc = torture_join_netbios_name ( priv - > join ) ;
2005-10-07 08:12:05 +00:00
ZERO_STRUCT ( r ) ;
r . in . bind_handle = & priv - > bind_handle ;
r . in . level = 1 ;
2006-12-28 22:51:56 +00:00
r . in . req . req1 . codepage = 1252 ; /* german */
r . in . req . req1 . language = 0x00000407 ; /* german */
2005-10-07 08:12:05 +00:00
r . in . req . req1 . count = 1 ;
r . in . req . req1 . names = names ;
r . in . req . req1 . format_flags = DRSUAPI_DS_NAME_FLAG_NO_FLAGS ;
2006-11-17 11:19:15 +00:00
r . in . req . req1 . format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ;
2005-10-07 08:12:05 +00:00
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ;
2006-11-17 11:19:15 +00:00
2007-09-10 23:47:29 +00:00
dom_sid = dom_sid_string ( mem_ctx , torture_join_sid ( priv - > join ) ) ;
2006-11-17 11:19:15 +00:00
2006-12-11 23:59:03 +00:00
names [ 0 ] . str = dom_sid ;
2005-10-07 08:12:05 +00:00
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
dns_domain = r . out . ctr . ctr1 - > array [ 0 ] . dns_domain_name ;
nt4_domain = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_GUID ;
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
priv - > domain_dns_name = r . out . ctr . ctr1 - > array [ 0 ] . dns_domain_name ;
priv - > domain_guid_str = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
GUID_from_string ( priv - > domain_guid_str , & priv - > domain_guid ) ;
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ;
2007-09-10 23:47:29 +00:00
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
2005-10-07 08:12:05 +00:00
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2006-11-22 00:59:34 +00:00
2007-09-10 23:47:29 +00:00
ldb = ldb_init ( mem_ctx ) ;
2005-10-13 04:24:49 +00:00
2005-10-20 04:55:56 +00:00
realm_dn_str = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
2007-09-10 23:47:29 +00:00
realm_dn = ldb_dn_new ( mem_ctx , ldb , realm_dn_str ) ;
realm_canonical = ldb_dn_canonical_string ( mem_ctx , realm_dn ) ;
if ( strcmp ( realm_canonical ,
talloc_asprintf ( mem_ctx , " %s/ " , dns_domain ) ) ! = 0 ) {
printf ( " local Round trip on canonical name failed: %s != %s! \n " ,
realm_canonical ,
talloc_asprintf ( mem_ctx , " %s/ " , dns_domain ) ) ;
return False ;
} ;
2005-10-13 04:24:49 +00:00
2007-09-10 23:47:29 +00:00
realm_canonical_ex = ldb_dn_canonical_ex_string ( mem_ctx , realm_dn ) ;
2007-08-31 22:34:52 +00:00
2007-09-10 23:47:29 +00:00
if ( strcmp ( realm_canonical_ex ,
talloc_asprintf ( mem_ctx , " %s \n " , dns_domain ) ) ! = 0 ) {
printf ( " local Round trip on canonical ex name failed: %s != %s! \n " ,
realm_canonical ,
talloc_asprintf ( mem_ctx , " %s \n " , dns_domain ) ) ;
return False ;
} ;
2005-10-07 08:12:05 +00:00
2005-10-13 02:07:29 +00:00
r . in . req . req1 . format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ;
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ;
names [ 0 ] . str = nt4_domain ;
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
2005-10-07 08:12:05 +00:00
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
2005-10-13 02:07:29 +00:00
priv - > domain_obj_dn = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
2005-10-07 08:12:05 +00:00
r . in . req . req1 . format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ;
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ;
2007-09-10 23:47:29 +00:00
names [ 0 ] . str = talloc_asprintf ( mem_ctx , " %s%s$ " , nt4_domain , test_dc ) ;
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
2006-12-11 23:59:03 +00:00
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2005-10-07 08:12:05 +00:00
2005-10-13 02:07:29 +00:00
FQDN_1779_name = r . out . ctr . ctr1 - > array [ 0 ] . result_name ;
2005-10-07 08:12:05 +00:00
2007-02-21 13:03:24 +00:00
r . in . req . req1 . format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ;
r . in . req . req1 . format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ;
names [ 0 ] . str = priv - > domain_guid_str ;
2007-09-10 23:47:29 +00:00
printf ( " testing DsCrackNames with name '%s' desired format:%d \n " ,
2007-02-21 13:03:24 +00:00
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed - %s \n " , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = DRSUAPI_DS_NAME_STATUS_OK ) {
printf ( " DsCrackNames failed on name - %d \n " , r . out . ctr . ctr1 - > array [ 0 ] . status ) ;
ret = False ;
}
if ( ! ret ) {
return ret ;
}
2007-02-21 13:03:24 +00:00
2007-09-10 23:47:29 +00:00
if ( strcmp ( priv - > domain_dns_name , r . out . ctr . ctr1 - > array [ 0 ] . dns_domain_name ) ! = 0 ) {
printf ( " DsCrackNames failed to return same DNS name - expected %s got %s \n " , priv - > domain_dns_name , r . out . ctr . ctr1 - > array [ 0 ] . dns_domain_name ) ;
return False ;
}
2007-02-21 13:03:24 +00:00
2007-09-10 23:47:29 +00:00
FQDN_1779_dn = ldb_dn_new ( mem_ctx , ldb , FQDN_1779_name ) ;
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
canonical_name = ldb_dn_canonical_string ( mem_ctx , FQDN_1779_dn ) ;
canonical_ex_name = ldb_dn_canonical_ex_string ( mem_ctx , FQDN_1779_dn ) ;
2005-10-07 08:12:05 +00:00
2007-09-10 23:47:29 +00:00
user_principal_name = talloc_asprintf ( mem_ctx , " %s$@%s " , test_dc , dns_domain ) ;
2005-10-28 06:44:24 +00:00
/* form up a user@DOMAIN */
2007-09-10 23:47:29 +00:00
user_principal_name_short = talloc_asprintf ( mem_ctx , " %s$@%s " , test_dc , nt4_domain ) ;
2005-10-28 06:44:24 +00:00
/* variable nt4_domain includs a trailing \ */
user_principal_name_short [ strlen ( user_principal_name_short ) - 1 ] = ' \0 ' ;
2007-09-10 23:47:29 +00:00
service_principal_name = talloc_asprintf ( mem_ctx , " HOST/%s " , test_dc ) ;
2005-10-07 08:12:05 +00:00
{
struct {
enum drsuapi_DsNameFormat format_offered ;
enum drsuapi_DsNameFormat format_desired ;
const char * comment ;
const char * str ;
const char * expected_str ;
2007-04-07 05:14:23 +00:00
const char * expected_dns ;
2005-10-07 08:12:05 +00:00
enum drsuapi_DsNameStatus status ;
2006-12-21 00:53:38 +00:00
enum drsuapi_DsNameStatus alternate_status ;
2005-10-13 02:07:29 +00:00
enum drsuapi_DsNameFlags flags ;
2007-09-10 23:47:29 +00:00
BOOL skip ;
2005-10-07 08:12:05 +00:00
} crack [ ] = {
2005-10-13 02:07:29 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = user_principal_name ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-28 06:44:24 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = user_principal_name_short ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2007-04-07 05:14:23 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = service_principal_name ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s.%s " , test_dc , dns_domain ) ,
2005-10-07 08:12:05 +00:00
. comment = " ServicePrincipal Name " ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL ,
. str = FQDN_1779_name ,
2005-10-13 02:07:29 +00:00
. expected_str = canonical_name ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2006-12-21 00:22:20 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_CANONICAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = canonical_name ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-13 02:07:29 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX ,
. str = FQDN_1779_name ,
. expected_str = canonical_ex_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2006-12-21 00:22:20 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = canonical_ex_name ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-13 02:07:29 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL ,
. str = FQDN_1779_name ,
. comment = " DN to cannoical syntactial only " ,
. status = DRSUAPI_DS_NAME_STATUS_OK ,
. expected_str = canonical_name ,
. flags = DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX ,
. str = FQDN_1779_name ,
. comment = " DN to cannoical EX syntactial only " ,
. status = DRSUAPI_DS_NAME_STATUS_OK ,
. expected_str = canonical_ex_name ,
. flags = DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_DISPLAY ,
. str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_GUID ,
. str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-13 02:07:29 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. str = priv - > domain_guid_str ,
. comment = " Domain GUID to NT4 ACCOUNT " ,
. expected_str = nt4_domain ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL ,
. str = priv - > domain_guid_str ,
. comment = " Domain GUID to Canonical " ,
2007-09-10 23:47:29 +00:00
. expected_str = talloc_asprintf ( mem_ctx , " %s/ " , dns_domain ) ,
2005-10-13 02:07:29 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX ,
. str = priv - > domain_guid_str ,
. comment = " Domain GUID to Canonical EX " ,
2007-09-10 23:47:29 +00:00
. expected_str = talloc_asprintf ( mem_ctx , " %s \n " , dns_domain ) ,
2005-10-13 02:07:29 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_DISPLAY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = " CN=Microsoft Corporation,L=Redmond,S=Washington,C=US " ,
. comment = " display name for Microsoft Support Account " ,
2006-12-21 00:53:38 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK ,
2007-04-07 03:03:01 +00:00
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE ,
2007-09-29 18:00:19 +00:00
. skip = lp_parm_bool ( global_loadparm , NULL , " torture " , " samba4 " , False )
2005-10-07 08:12:05 +00:00
} ,
2006-12-11 23:59:03 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , torture_join_user_guid ( priv - > join ) ) ,
2006-12-11 23:59:03 +00:00
. comment = " Account GUID -> DN " ,
. expected_str = FQDN_1779_name ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , torture_join_user_guid ( priv - > join ) ) ,
2006-12-11 23:59:03 +00:00
. comment = " Account GUID -> NT4 Account " ,
2007-09-10 23:47:29 +00:00
. expected_str = talloc_asprintf ( mem_ctx , " %s%s$ " , nt4_domain , test_dc ) ,
2006-12-11 23:59:03 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > dcinfo . site_guid ) ,
2005-10-07 08:12:05 +00:00
. comment = " Site GUID " ,
2006-12-11 23:59:03 +00:00
. expected_str = priv - > dcinfo . site_dn ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
2006-12-11 23:59:03 +00:00
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > dcinfo . computer_guid ) ,
2005-10-07 08:12:05 +00:00
. comment = " Computer GUID " ,
2006-12-11 23:59:03 +00:00
. expected_str = priv - > dcinfo . computer_dn ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > dcinfo . computer_guid ) ,
2006-12-11 23:59:03 +00:00
. comment = " Computer GUID -> NT4 Account " ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > dcinfo . server_guid ) ,
2005-10-07 08:12:05 +00:00
. comment = " Server GUID " ,
2006-12-11 23:59:03 +00:00
. expected_str = priv - > dcinfo . server_dn ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > dcinfo . ntds_guid ) ,
2005-10-07 08:12:05 +00:00
. comment = " NTDS GUID " ,
2006-12-11 23:59:03 +00:00
. expected_str = priv - > dcinfo . ntds_dn ,
2007-04-07 03:03:01 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK ,
. skip = GUID_all_zero ( & priv - > dcinfo . ntds_guid )
2005-10-07 08:12:05 +00:00
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_DISPLAY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = test_dc ,
2006-11-17 11:19:15 +00:00
. comment = " DISLPAY NAME search for DC short name " ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " krbtgt/%s " , dns_domain ) ,
2005-10-07 08:12:05 +00:00
. comment = " Looking for KRBTGT as a serivce principal " ,
2007-04-07 05:14:23 +00:00
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
. expected_dns = dns_domain
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " bogus/%s " , dns_domain ) ,
2007-04-07 05:14:23 +00:00
. comment = " Looking for bogus serivce principal " ,
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
. expected_dns = dns_domain
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " bogus/%s.%s " , test_dc , dns_domain ) ,
2007-04-07 05:14:23 +00:00
. comment = " Looking for bogus serivce on test DC " ,
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
2007-09-10 23:47:29 +00:00
. expected_dns = talloc_asprintf ( mem_ctx , " %s.%s " , test_dc , dns_domain )
2005-10-07 08:12:05 +00:00
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " krbtgt " ) ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2005-10-20 04:55:56 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2005-10-28 05:46:22 +00:00
. comment = " Looking for the kadmin/changepw service as a serivce principal " ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " kadmin/changepw " ) ,
2005-10-20 04:55:56 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK ,
2007-09-10 23:47:29 +00:00
. expected_str = talloc_asprintf ( mem_ctx , " CN=krbtgt,CN=Users,%s " , realm_dn_str ) ,
2006-12-21 00:53:38 +00:00
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
2005-10-20 04:55:56 +00:00
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s.%s@%s " ,
2005-10-07 08:12:05 +00:00
test_dc , dns_domain ,
dns_domain ) ,
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY
} ,
2005-10-28 05:46:22 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s.%s@%s " ,
2005-10-28 05:46:22 +00:00
test_dc , dns_domain ,
" BOGUS " ) ,
2007-04-07 05:14:23 +00:00
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
. expected_dns = " BOGUS "
2005-10-28 05:46:22 +00:00
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s.%s@%s " ,
2005-10-28 05:46:22 +00:00
test_dc , " REALLY " ,
" BOGUS " ) ,
2007-04-07 05:14:23 +00:00
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
. expected_dns = " BOGUS "
2005-10-28 05:46:22 +00:00
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s.%s " ,
2005-10-28 05:46:22 +00:00
test_dc , dns_domain ) ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " cifs/%s " ,
2005-10-28 05:46:22 +00:00
test_dc ) ,
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = " NOT A GUID " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = " NOT A SID " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = " NOT AN NT4 NAME " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_GUID ,
. comment = " Unparsable DN " ,
. str = " NOT A DN " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Unparsable user principal " ,
. str = " NOT A PRINCIPAL " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Unparsable service principal " ,
. str = " NOT A SERVICE PRINCIPAL " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_GUID ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " BIND GUID (ie, not in the directory) " ,
2007-09-10 23:47:29 +00:00
. str = GUID_string2 ( mem_ctx , & priv - > bind_guid ) ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Unqualified Machine account as user principal " ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " %s$ " , test_dc ) ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Machine account as service principal " ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " %s$ " , test_dc ) ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2005-10-28 03:39:14 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Full Machine account as service principal " ,
. str = user_principal_name ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " Realm as an NT4 domain lookup " ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " %s \\ " , dns_domain ) ,
2005-10-07 08:12:05 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2006-12-11 23:59:03 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " BUILTIN \\ -> DN " ,
. str = " BUILTIN \\ " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2007-09-11 00:19:10 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " NT AUTHORITY \\ -> DN " ,
. str = " NT AUTHORITY \\ " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " NT AUTHORITY \\ ANONYMOUS LOGON -> DN " ,
. str = " NT AUTHORITY \\ ANONYMOUS LOGON " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " NT AUTHORITY \\ SYSTEM -> DN " ,
. str = " NT AUTHORITY \\ SYSTEM " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. comment = " BUITIN SID -> NT4 account " ,
. str = SID_BUILTIN ,
2006-12-21 00:53:38 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING ,
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
2005-10-07 08:12:05 +00:00
} ,
2006-12-11 23:59:03 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = SID_BUILTIN ,
. comment = " Builtin Domain SID -> DN " ,
. status = DRSUAPI_DS_NAME_STATUS_OK ,
2007-09-10 23:47:29 +00:00
. expected_str = talloc_asprintf ( mem_ctx , " CN=Builtin,%s " , realm_dn_str ) ,
2006-12-21 00:53:38 +00:00
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
2006-12-11 23:59:03 +00:00
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. str = SID_BUILTIN_ADMINISTRATORS ,
2006-12-11 23:59:03 +00:00
. comment = " Builtin Administrors SID -> DN " ,
2006-12-21 00:53:38 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK ,
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
2005-10-07 08:12:05 +00:00
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. str = SID_BUILTIN_ADMINISTRATORS ,
2006-12-11 23:59:03 +00:00
. comment = " Builtin Administrors SID -> NT4 Account " ,
2006-12-21 00:53:38 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK ,
. alternate_status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE
2005-10-07 08:12:05 +00:00
} ,
2007-09-11 00:19:10 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. str = SID_NT_ANONYMOUS ,
. comment = " NT Anonymous SID -> NT4 Account " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
. str = SID_NT_SYSTEM ,
. comment = " NT SYSTEM SID -> NT4 Account " ,
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
} ,
2006-11-17 11:19:15 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2006-12-11 23:59:03 +00:00
. comment = " Domain SID -> DN " ,
. str = dom_sid ,
. expected_str = realm_dn_str ,
2006-11-17 11:19:15 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT ,
2006-12-11 23:59:03 +00:00
. comment = " Domain SID -> NT4 account " ,
. str = dom_sid ,
. expected_str = nt4_domain ,
2006-11-17 11:19:15 +00:00
. status = DRSUAPI_DS_NAME_STATUS_OK
} ,
2005-10-07 08:12:05 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
2007-04-07 03:03:01 +00:00
. comment = " invalid user principal name " ,
2005-10-07 08:12:05 +00:00
. str = " foo@bar " ,
2007-04-07 05:14:23 +00:00
. status = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY ,
. expected_dns = " bar "
2005-10-07 08:12:05 +00:00
} ,
2007-04-07 03:03:01 +00:00
{
. format_offered = DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL ,
. format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779 ,
. comment = " invalid user principal name in valid domain " ,
2007-09-10 23:47:29 +00:00
. str = talloc_asprintf ( mem_ctx , " invalidusername@%s " , dns_domain ) ,
2007-04-07 03:03:01 +00:00
. status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND
}
2005-10-07 08:12:05 +00:00
} ;
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( crack ) ; i + + ) {
2006-12-28 22:51:56 +00:00
const char * comment ;
2005-10-13 02:07:29 +00:00
r . in . req . req1 . format_flags = crack [ i ] . flags ;
2005-10-07 08:12:05 +00:00
r . in . req . req1 . format_offered = crack [ i ] . format_offered ;
r . in . req . req1 . format_desired = crack [ i ] . format_desired ;
names [ 0 ] . str = crack [ i ] . str ;
if ( crack [ i ] . comment ) {
2007-09-10 23:47:29 +00:00
comment = talloc_asprintf ( mem_ctx , " '%s' with name '%s' desired format:%d \n " ,
2006-12-28 22:51:56 +00:00
crack [ i ] . comment , names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
2005-10-07 08:12:05 +00:00
} else {
2007-09-10 23:47:29 +00:00
comment = talloc_asprintf ( mem_ctx , " '%s' desired format:%d \n " ,
2005-10-07 08:12:05 +00:00
names [ 0 ] . str , r . in . req . req1 . format_desired ) ;
}
2007-04-07 03:03:01 +00:00
if ( crack [ i ] . skip ) {
printf ( " skipping: %s " , comment ) ;
continue ;
}
2007-09-10 23:47:29 +00:00
status = dcerpc_drsuapi_DsCrackNames ( p , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
const char * errstr = nt_errstr ( status ) ;
if ( NT_STATUS_EQUAL ( status , NT_STATUS_NET_WRITE_FAULT ) ) {
errstr = dcerpc_errstr ( mem_ctx , p - > last_fault_code ) ;
}
printf ( " dcerpc_drsuapi_DsCrackNames failed on %s - %s \n " , comment , errstr ) ;
ret = False ;
} else if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
printf ( " DsCrackNames failed - %s \n " , win_errstr ( r . out . result ) ) ;
ret = False ;
} else if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = crack [ i ] . status ) {
2006-12-21 00:53:38 +00:00
if ( crack [ i ] . alternate_status ) {
2007-09-10 23:47:29 +00:00
if ( r . out . ctr . ctr1 - > array [ 0 ] . status ! = crack [ i ] . alternate_status ) {
printf ( " DsCrackNames unexpected status %d, wanted %d or %d on: %s \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . status ,
crack [ i ] . status ,
crack [ i ] . alternate_status ,
comment ) ;
ret = False ;
}
2006-12-21 00:53:38 +00:00
} else {
2007-09-10 23:47:29 +00:00
printf ( " DsCrackNames unexpected status %d, wanted %d on: %s \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . status ,
crack [ i ] . status ,
comment ) ;
ret = False ;
2006-12-21 00:53:38 +00:00
}
2005-10-13 04:24:49 +00:00
} else if ( crack [ i ] . expected_str
& & ( strcmp ( r . out . ctr . ctr1 - > array [ 0 ] . result_name ,
crack [ i ] . expected_str ) ! = 0 ) ) {
2007-04-22 09:17:25 +00:00
if ( strcasecmp ( r . out . ctr . ctr1 - > array [ 0 ] . result_name ,
crack [ i ] . expected_str ) ! = 0 ) {
2007-09-10 23:47:29 +00:00
printf ( " DsCrackNames failed - got %s, expected %s on %s \n " ,
2007-04-22 09:17:25 +00:00
r . out . ctr . ctr1 - > array [ 0 ] . result_name ,
crack [ i ] . expected_str , comment ) ;
2007-09-10 23:47:29 +00:00
ret = False ;
2007-04-22 09:17:25 +00:00
} else {
2007-09-10 23:47:29 +00:00
printf ( " (warning) DsCrackNames returned different case - got %s, expected %s on %s \n " ,
2007-04-22 09:17:25 +00:00
r . out . ctr . ctr1 - > array [ 0 ] . result_name ,
crack [ i ] . expected_str , comment ) ;
}
2007-09-10 23:47:29 +00:00
} else if ( crack [ i ] . expected_dns
& & ( strcmp ( r . out . ctr . ctr1 - > array [ 0 ] . dns_domain_name ,
crack [ i ] . expected_dns ) ! = 0 ) ) {
printf ( " DsCrackNames failed - got DNS name %s, expected %s on %s \n " ,
r . out . ctr . ctr1 - > array [ 0 ] . result_name ,
crack [ i ] . expected_str , comment ) ;
ret = False ;
}
2005-10-07 08:12:05 +00:00
}
}
2007-09-10 23:47:29 +00:00
if ( ! test_DsCrackNamesMatrix ( p , mem_ctx , priv , FQDN_1779_name ,
2005-10-07 08:12:05 +00:00
user_principal_name , service_principal_name ) ) {
2007-09-10 23:47:29 +00:00
ret = False ;
2005-10-07 08:12:05 +00:00
}
2007-09-10 23:47:29 +00:00
return ret ;
2005-10-07 08:12:05 +00:00
}