2001-12-30 08:59:43 +03:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-12-30 08:59:43 +03:00
ads ( active directory ) utility library
Copyright ( C ) Andrew Tridgell 2001
Copyright ( C ) Remus Koos 2001
Copyright ( C ) Andrew Bartlett 2001
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"
/*
build a ADS_STATUS structure
*/
ADS_STATUS ads_build_error ( enum ads_error_type etype ,
int rc , int minor_status )
{
ADS_STATUS ret ;
2002-09-25 19:19:00 +04:00
2004-01-09 17:54:33 +03:00
if ( etype = = ENUM_ADS_ERROR_NT ) {
DEBUG ( 0 , ( " don't use ads_build_error with ENUM_ADS_ERROR_NT! \n " ) ) ;
2002-09-25 19:19:00 +04:00
ret . err . rc = - 1 ;
2004-01-09 17:54:33 +03:00
ret . error_type = ENUM_ADS_ERROR_SYSTEM ;
2002-09-25 19:19:00 +04:00
ret . minor_status = 0 ;
return ret ;
}
ret . err . rc = rc ;
ret . error_type = etype ;
2001-12-30 08:59:43 +03:00
ret . minor_status = minor_status ;
return ret ;
}
2002-09-25 19:19:00 +04:00
ADS_STATUS ads_build_nt_error ( enum ads_error_type etype ,
NTSTATUS nt_status )
{
ADS_STATUS ret ;
2004-01-09 17:54:33 +03:00
if ( etype ! = ENUM_ADS_ERROR_NT ) {
DEBUG ( 0 , ( " don't use ads_build_nt_error without ENUM_ADS_ERROR_NT! \n " ) ) ;
2002-09-25 19:19:00 +04:00
ret . err . rc = - 1 ;
2004-01-09 17:54:33 +03:00
ret . error_type = ENUM_ADS_ERROR_SYSTEM ;
2002-09-25 19:19:00 +04:00
ret . minor_status = 0 ;
return ret ;
}
ret . err . nt_status = nt_status ;
ret . error_type = etype ;
ret . minor_status = 0 ;
return ret ;
}
2001-12-30 08:59:43 +03:00
/*
do a rough conversion between ads error codes and NT status codes
we ' ll need to fill this in more
*/
2002-09-25 19:19:00 +04:00
NTSTATUS ads_ntstatus ( ADS_STATUS status )
2001-12-30 08:59:43 +03:00
{
2004-01-09 17:54:33 +03:00
if ( status . error_type = = ENUM_ADS_ERROR_NT ) {
2002-09-25 19:19:00 +04:00
return status . err . nt_status ;
}
2002-10-01 22:26:00 +04:00
# ifdef HAVE_LDAP
2004-01-09 17:54:33 +03:00
if ( ( status . error_type = = ENUM_ADS_ERROR_LDAP )
2002-10-01 22:26:00 +04:00
& & ( status . err . rc = = LDAP_NO_MEMORY ) ) {
return NT_STATUS_NO_MEMORY ;
}
2004-01-08 11:19:18 +03:00
# endif
# ifdef HAVE_KRB5
2004-01-09 17:54:33 +03:00
if ( status . error_type = = ENUM_ADS_ERROR_KRB5 ) {
2004-01-08 11:19:18 +03:00
if ( status . err . rc = = KRB5KDC_ERR_PREAUTH_FAILED ) {
return NT_STATUS_LOGON_FAILURE ;
} else if ( status . err . rc = = KRB5_KDC_UNREACH ) {
return NT_STATUS_NO_LOGON_SERVERS ;
}
}
2002-10-01 22:26:00 +04:00
# endif
2002-09-25 19:19:00 +04:00
if ( ADS_ERR_OK ( status ) ) return NT_STATUS_OK ;
2001-12-30 08:59:43 +03:00
return NT_STATUS_UNSUCCESSFUL ;
}
/*
return a string for an error from a ads routine
*/
const char * ads_errstr ( ADS_STATUS status )
{
static char * ret ;
SAFE_FREE ( ret ) ;
switch ( status . error_type ) {
2004-01-09 17:54:33 +03:00
case ENUM_ADS_ERROR_SYSTEM :
2002-09-25 19:19:00 +04:00
return strerror ( status . err . rc ) ;
2001-12-30 08:59:43 +03:00
# ifdef HAVE_LDAP
2004-01-09 17:54:33 +03:00
case ENUM_ADS_ERROR_LDAP :
2002-09-25 19:19:00 +04:00
return ldap_err2string ( status . err . rc ) ;
2001-12-30 08:59:43 +03:00
# endif
# ifdef HAVE_KRB5
2004-01-09 17:54:33 +03:00
case ENUM_ADS_ERROR_KRB5 :
2002-09-25 19:19:00 +04:00
return error_message ( status . err . rc ) ;
2001-12-31 17:31:13 +03:00
# endif
# ifdef HAVE_GSSAPI
2004-01-09 17:54:33 +03:00
case ENUM_ADS_ERROR_GSS :
2001-12-30 09:20:23 +03:00
{
2004-12-01 01:57:41 +03:00
uint32 msg_ctx ;
2002-01-14 09:34:53 +03:00
uint32 minor ;
2004-12-19 06:23:10 +03:00
gss_buffer_desc msg1 , msg2 ;
2004-12-01 01:57:41 +03:00
msg_ctx = 0 ;
2002-01-14 09:34:53 +03:00
2001-12-30 08:59:43 +03:00
msg1 . value = NULL ;
msg2 . value = NULL ;
2002-09-25 19:19:00 +04:00
gss_display_status ( & minor , status . err . rc , GSS_C_GSS_CODE ,
2001-12-30 08:59:43 +03:00
GSS_C_NULL_OID , & msg_ctx , & msg1 ) ;
gss_display_status ( & minor , status . minor_status , GSS_C_MECH_CODE ,
GSS_C_NULL_OID , & msg_ctx , & msg2 ) ;
asprintf ( & ret , " %s : %s " , ( char * ) msg1 . value , ( char * ) msg2 . value ) ;
gss_release_buffer ( & minor , & msg1 ) ;
gss_release_buffer ( & minor , & msg2 ) ;
return ret ;
2001-12-30 09:20:23 +03:00
}
2001-12-30 08:59:43 +03:00
# endif
2004-01-09 17:54:33 +03:00
case ENUM_ADS_ERROR_NT :
2004-01-08 11:19:18 +03:00
return get_friendly_nt_error_msg ( ads_ntstatus ( status ) ) ;
2001-12-30 08:59:43 +03:00
default :
return " Unknown ADS error type!? (not compiled in?) " ;
}
}