| /* | |
| * WLDAP32 - LDAP support for Wine | |
| * | |
| * Copyright 2005 Hans Leidekker | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library 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 | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| #include "config.h" | |
| #include "wine/port.h" | |
| #include <stdarg.h> | |
| #ifdef HAVE_LDAP_H | |
| #include <ldap.h> | |
| #endif | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winuser.h" | |
| #include "winnls.h" | |
| #include "winldap_private.h" | |
| #include "wldap32.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(wldap32); | |
| ULONG map_error( int error ) | |
| { | |
| switch (error) | |
| { | |
| #ifdef HAVE_LDAP_H | |
| case LDAP_SERVER_DOWN: return WLDAP32_LDAP_SERVER_DOWN; | |
| case LDAP_LOCAL_ERROR: return WLDAP32_LDAP_LOCAL_ERROR; | |
| case LDAP_DECODING_ERROR: return WLDAP32_LDAP_DECODING_ERROR; | |
| case LDAP_TIMEOUT: return WLDAP32_LDAP_TIMEOUT; | |
| case LDAP_AUTH_UNKNOWN: return WLDAP32_LDAP_AUTH_UNKNOWN; | |
| case LDAP_FILTER_ERROR: return WLDAP32_LDAP_FILTER_ERROR; | |
| case LDAP_USER_CANCELLED: return WLDAP32_LDAP_USER_CANCELLED; | |
| case LDAP_PARAM_ERROR: return WLDAP32_LDAP_PARAM_ERROR; | |
| case LDAP_NO_MEMORY: return WLDAP32_LDAP_NO_MEMORY; | |
| case LDAP_CONNECT_ERROR: return WLDAP32_LDAP_CONNECT_ERROR; | |
| case LDAP_NOT_SUPPORTED: return WLDAP32_LDAP_NOT_SUPPORTED; | |
| case LDAP_CONTROL_NOT_FOUND: return WLDAP32_LDAP_CONTROL_NOT_FOUND; | |
| case LDAP_NO_RESULTS_RETURNED: return WLDAP32_LDAP_NO_RESULTS_RETURNED; | |
| case LDAP_MORE_RESULTS_TO_RETURN: return WLDAP32_LDAP_MORE_RESULTS_TO_RETURN; | |
| case LDAP_CLIENT_LOOP: return WLDAP32_LDAP_CLIENT_LOOP; | |
| case LDAP_REFERRAL_LIMIT_EXCEEDED: return WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED; | |
| #endif | |
| default: return error; | |
| } | |
| } | |
| /*********************************************************************** | |
| * ldap_err2stringA (WLDAP32.@) | |
| * | |
| * See ldap_err2stringW. | |
| */ | |
| PCHAR CDECL ldap_err2stringA( ULONG err ) | |
| { | |
| static char buf[256] = ""; | |
| TRACE( "(0x%08x)\n", err ); | |
| if (err <= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED) | |
| LoadStringA( hwldap32, err, buf, 256 ); | |
| else | |
| LoadStringA( hwldap32, WLDAP32_LDAP_LOCAL_ERROR, buf, 256 ); | |
| return buf; | |
| } | |
| /*********************************************************************** | |
| * ldap_err2stringW (WLDAP32.@) | |
| * | |
| * Convert an error code into a string describing the error. | |
| * | |
| * PARAMS | |
| * err [I] Error code to convert. | |
| * | |
| * RETURNS | |
| * Success: Pointer to a string containing the error description. | |
| * Failure: NULL | |
| * | |
| * NOTES | |
| * The returned string is statically allocated, you must not | |
| * free this string. | |
| */ | |
| PWCHAR CDECL ldap_err2stringW( ULONG err ) | |
| { | |
| static WCHAR buf[256] = { 0 }; | |
| TRACE( "(0x%08x)\n", err ); | |
| if (err <= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED) | |
| LoadStringW( hwldap32, err, buf, 256 ); | |
| else | |
| LoadStringW( hwldap32, WLDAP32_LDAP_LOCAL_ERROR, buf, 256 ); | |
| return buf; | |
| } | |
| /*********************************************************************** | |
| * ldap_perror (WLDAP32.@) | |
| * | |
| * Print a given error string. | |
| * | |
| * PARAMS | |
| * ld [I] Pointer to an LDAP context. | |
| * msg [I] Error string. | |
| * | |
| * RETURNS | |
| * Nothing. | |
| * | |
| * NOTES | |
| * Like native, this function does nothing. | |
| */ | |
| void CDECL WLDAP32_ldap_perror( WLDAP32_LDAP *ld, const PCHAR msg ) | |
| { | |
| TRACE( "(%p, %s)\n", ld, debugstr_a(msg) ); | |
| } | |
| /*********************************************************************** | |
| * ldap_result2error (WLDAP32.@) | |
| * | |
| * Parse an LDAP message and return the error obtained from it. | |
| * | |
| * PARAMS | |
| * ld [I] Pointer to an LDAP context. | |
| * res [I] Pointer to an LDAPMessage structure. | |
| * free [I] Ask for the LDAPMessage structure to be freed. | |
| * | |
| * RETURNS | |
| * Success: LDAP_SUCCESS | |
| * Failure: An LDAP error code. | |
| * | |
| * NOTES | |
| * If not asked for, use ldap_msgfree to free the LDAPMessage. | |
| */ | |
| ULONG CDECL WLDAP32_ldap_result2error( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *res, ULONG free ) | |
| { | |
| ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; | |
| #ifdef HAVE_LDAP | |
| int error; | |
| TRACE( "(%p, %p, 0x%08x)\n", ld, res, free ); | |
| if (!ld || !res) return ~0u; | |
| ret = ldap_parse_result( ld, res, &error, NULL, NULL, NULL, NULL, free ); | |
| if (ret == LDAP_SUCCESS) | |
| ret = error; | |
| else | |
| ret = ~0u; | |
| #endif | |
| return ret; | |
| } | |
| /*********************************************************************** | |
| * LdapGetLastError (WLDAP32.@) | |
| * | |
| * Return the last error set by an LDAP function call. | |
| * | |
| * PARAMS | |
| * None. | |
| * | |
| * RETURNS | |
| * An LDAP error code. | |
| */ | |
| ULONG CDECL LdapGetLastError( void ) | |
| { | |
| TRACE( "\n" ); | |
| return GetLastError(); | |
| } | |
| static const ULONG WLDAP32_errormap[] = { | |
| /* LDAP_SUCCESS */ ERROR_SUCCESS, | |
| /* LDAP_OPERATIONS_ERROR */ ERROR_OPEN_FAILED, | |
| /* LDAP_PROTOCOL_ERROR */ ERROR_INVALID_LEVEL, | |
| /* LDAP_TIMELIMIT_EXCEEDED */ ERROR_TIMEOUT, | |
| /* LDAP_SIZELIMIT_EXCEEDED */ ERROR_MORE_DATA, | |
| /* LDAP_COMPARE_FALSE */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_COMPARE_TRUE */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_AUTH_METHOD_NOT_SUPPORTED */ ERROR_ACCESS_DENIED, | |
| /* LDAP_STRONG_AUTH_REQUIRED */ ERROR_ACCESS_DENIED, | |
| /* LDAP_REFERRAL_V2 */ ERROR_MORE_DATA, | |
| /* LDAP_REFERRAL */ ERROR_MORE_DATA, | |
| /* LDAP_ADMIN_LIMIT_EXCEEDED */ ERROR_NOT_ENOUGH_QUOTA, | |
| /* LDAP_UNAVAILABLE_CRIT_EXTENSION */ ERROR_CAN_NOT_COMPLETE, | |
| /* LDAP_CONFIDENTIALITY_REQUIRED */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_SASL_BIND_IN_PROGRESS */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x0f */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_NO_SUCH_ATTRIBUTE */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_UNDEFINED_TYPE */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_INAPPROPRIATE_MATCHING */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_CONSTRAINT_VIOLATION */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_ATTRIBUTE_OR_VALUE_EXISTS */ ERROR_ALREADY_EXISTS, | |
| /* LDAP_INVALID_SYNTAX */ ERROR_INVALID_NAME, | |
| /* 0x16 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x17 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x18 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x19 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1a */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1b */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1c */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1d */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1e */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x1f */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_NO_SUCH_OBJECT */ ERROR_FILE_NOT_FOUND, | |
| /* LDAP_ALIAS_PROBLEM */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_INVALID_DN_SYNTAX */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_IS_LEAF */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_ALIAS_DEREF_PROBLEM */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x25 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x26 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x27 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x28 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x29 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2a */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2b */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2c */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2d */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2e */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x2f */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_INAPPROPRIATE_AUTH */ ERROR_ACCESS_DENIED, | |
| /* LDAP_INVALID_CREDENTIALS */ ERROR_WRONG_PASSWORD, | |
| /* LDAP_INSUFFICIENT_RIGHTS */ ERROR_ACCESS_DENIED, | |
| /* LDAP_BUSY */ ERROR_BUSY, | |
| /* LDAP_UNAVAILABLE */ ERROR_DEV_NOT_EXIST, | |
| /* LDAP_UNWILLING_TO_PERFORM */ ERROR_CAN_NOT_COMPLETE, | |
| /* LDAP_LOOP_DETECT */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x37 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x38 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x39 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x3a */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x3b */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_SORT_CONTROL_MISSING */ 8261, | |
| /* LDAP_OFFSET_RANGE_ERROR */ 8262, | |
| /* 0x3e */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x3f */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_NAMING_VIOLATION */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_OBJECT_CLASS_VIOLATION */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_NOT_ALLOWED_ON_NONLEAF */ ERROR_CAN_NOT_COMPLETE, | |
| /* LDAP_NOT_ALLOWED_ON_RDN */ ERROR_ACCESS_DENIED, | |
| /* LDAP_ALREADY_EXISTS */ ERROR_ALREADY_EXISTS, | |
| /* LDAP_NO_OBJECT_CLASS_MODS */ ERROR_ACCESS_DENIED, | |
| /* LDAP_RESULTS_TOO_LARGE */ ERROR_INSUFFICIENT_BUFFER, | |
| /* LDAP_AFFECTS_MULTIPLE_DSAS */ ERROR_CAN_NOT_COMPLETE, | |
| /* 0x48 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x49 */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x4a */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x4b */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_VIRTUAL_LIST_VIEW_ERROR */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x4d */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x4e */ ERROR_DS_GENERIC_ERROR, | |
| /* 0x4f */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_OTHER */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_SERVER_DOWN */ ERROR_BAD_NET_RESP, | |
| /* LDAP_LOCAL_ERROR */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_ENCODING_ERROR */ ERROR_UNEXP_NET_ERR, | |
| /* LDAP_DECODING_ERROR */ ERROR_UNEXP_NET_ERR, | |
| /* LDAP_TIMEOUT */ ERROR_SERVICE_REQUEST_TIMEOUT, | |
| /* LDAP_AUTH_UNKNOWN */ ERROR_WRONG_PASSWORD, | |
| /* LDAP_FILTER_ERROR */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_USER_CANCELLED */ ERROR_CANCELLED, | |
| /* LDAP_PARAM_ERROR */ ERROR_INVALID_PARAMETER, | |
| /* LDAP_NO_MEMORY */ ERROR_NOT_ENOUGH_MEMORY, | |
| /* LDAP_CONNECT_ERROR */ ERROR_CONNECTION_REFUSED, | |
| /* LDAP_NOT_SUPPORTED */ ERROR_CAN_NOT_COMPLETE, | |
| /* LDAP_CONTROL_NOT_FOUND */ ERROR_NOT_FOUND, | |
| /* LDAP_NO_RESULTS_RETURNED */ ERROR_MORE_DATA, | |
| /* LDAP_MORE_RESULTS_TO_RETURN */ ERROR_MORE_DATA, | |
| /* LDAP_CLIENT_LOOP */ ERROR_DS_GENERIC_ERROR, | |
| /* LDAP_REFERRAL_LIMIT_EXCEEDED */ ERROR_DS_GENERIC_ERROR | |
| }; | |
| /*********************************************************************** | |
| * LdapMapErrorToWin32 (WLDAP32.@) | |
| * | |
| * Map an LDAP error code to a Win32 error code. | |
| * | |
| * PARAMS | |
| * err [I] An LDAP error code. | |
| * | |
| * RETURNS | |
| * A Win32 error code. | |
| */ | |
| ULONG CDECL LdapMapErrorToWin32( ULONG err ) | |
| { | |
| TRACE( "(0x%08x)\n", err ); | |
| if (err >= sizeof(WLDAP32_errormap)/sizeof(WLDAP32_errormap[0])) | |
| return ERROR_DS_GENERIC_ERROR; | |
| return WLDAP32_errormap[err]; | |
| } |