2 * WLDAP32 - LDAP support for Wine
4 * Copyright 2005 Hans Leidekker
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/port.h"
24 #include "wine/debug.h"
37 #include "winldap_private.h"
40 extern HINSTANCE hwldap32
;
42 WINE_DEFAULT_DEBUG_CHANNEL(wldap32
);
44 ULONG
map_error( int error
)
49 case LDAP_SERVER_DOWN
: return WLDAP32_LDAP_SERVER_DOWN
;
50 case LDAP_LOCAL_ERROR
: return WLDAP32_LDAP_LOCAL_ERROR
;
51 case LDAP_DECODING_ERROR
: return WLDAP32_LDAP_DECODING_ERROR
;
52 case LDAP_TIMEOUT
: return WLDAP32_LDAP_TIMEOUT
;
53 case LDAP_AUTH_UNKNOWN
: return WLDAP32_LDAP_AUTH_UNKNOWN
;
54 case LDAP_FILTER_ERROR
: return WLDAP32_LDAP_FILTER_ERROR
;
55 case LDAP_USER_CANCELLED
: return WLDAP32_LDAP_USER_CANCELLED
;
56 case LDAP_PARAM_ERROR
: return WLDAP32_LDAP_PARAM_ERROR
;
57 case LDAP_NO_MEMORY
: return WLDAP32_LDAP_NO_MEMORY
;
58 case LDAP_CONNECT_ERROR
: return WLDAP32_LDAP_CONNECT_ERROR
;
59 case LDAP_NOT_SUPPORTED
: return WLDAP32_LDAP_NOT_SUPPORTED
;
60 case LDAP_CONTROL_NOT_FOUND
: return WLDAP32_LDAP_CONTROL_NOT_FOUND
;
61 case LDAP_NO_RESULTS_RETURNED
: return WLDAP32_LDAP_NO_RESULTS_RETURNED
;
62 case LDAP_MORE_RESULTS_TO_RETURN
: return WLDAP32_LDAP_MORE_RESULTS_TO_RETURN
;
63 case LDAP_CLIENT_LOOP
: return WLDAP32_LDAP_CLIENT_LOOP
;
64 case LDAP_REFERRAL_LIMIT_EXCEEDED
: return WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED
;
66 default: return error
;
70 /***********************************************************************
71 * ldap_err2stringA (WLDAP32.@)
73 * See ldap_err2stringW.
75 PCHAR CDECL
ldap_err2stringA( ULONG err
)
77 static char buf
[256] = "";
79 TRACE( "(0x%08x)\n", err
);
81 if (err
<= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED
)
82 LoadStringA( hwldap32
, err
, buf
, 256 );
84 LoadStringA( hwldap32
, WLDAP32_LDAP_LOCAL_ERROR
, buf
, 256 );
89 /***********************************************************************
90 * ldap_err2stringW (WLDAP32.@)
92 * Convert an error code into a string describing the error.
95 * err [I] Error code to convert.
98 * Success: Pointer to a string containing the error description.
102 * The returned string is statically allocated, you must not
105 PWCHAR CDECL
ldap_err2stringW( ULONG err
)
107 static WCHAR buf
[256] = { 0 };
109 TRACE( "(0x%08x)\n", err
);
111 if (err
<= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED
)
112 LoadStringW( hwldap32
, err
, buf
, 256 );
114 LoadStringW( hwldap32
, WLDAP32_LDAP_LOCAL_ERROR
, buf
, 256 );
119 /***********************************************************************
120 * ldap_perror (WLDAP32.@)
122 * Print a given error string.
125 * ld [I] Pointer to an LDAP context.
126 * msg [I] Error string.
132 * Like native, this function does nothing.
134 void CDECL
WLDAP32_ldap_perror( WLDAP32_LDAP
*ld
, const PCHAR msg
)
136 TRACE( "(%p, %s)\n", ld
, debugstr_a(msg
) );
139 /***********************************************************************
140 * ldap_result2error (WLDAP32.@)
142 * Parse an LDAP message and return the error obtained from it.
145 * ld [I] Pointer to an LDAP context.
146 * res [I] Pointer to an LDAPMessage structure.
147 * free [I] Ask for the LDAPMessage structure to be freed.
150 * Success: LDAP_SUCCESS
151 * Failure: An LDAP error code.
154 * If not asked for, use ldap_msgfree to free the LDAPMessage.
156 ULONG CDECL
WLDAP32_ldap_result2error( WLDAP32_LDAP
*ld
, WLDAP32_LDAPMessage
*res
, ULONG free
)
158 ULONG ret
= WLDAP32_LDAP_NOT_SUPPORTED
;
162 TRACE( "(%p, %p, 0x%08x)\n", ld
, res
, free
);
164 if (!ld
|| !res
) return ~0u;
166 ret
= ldap_parse_result( ld
, res
, &error
, NULL
, NULL
, NULL
, NULL
, free
);
168 if (ret
== LDAP_SUCCESS
)
177 /***********************************************************************
178 * LdapGetLastError (WLDAP32.@)
180 * Return the last error set by an LDAP function call.
186 * An LDAP error code.
188 ULONG CDECL
LdapGetLastError( void )
191 return GetLastError();
194 static const ULONG WLDAP32_errormap
[] = {
195 /* LDAP_SUCCESS */ ERROR_SUCCESS
,
196 /* LDAP_OPERATIONS_ERROR */ ERROR_OPEN_FAILED
,
197 /* LDAP_PROTOCOL_ERROR */ ERROR_INVALID_LEVEL
,
198 /* LDAP_TIMELIMIT_EXCEEDED */ ERROR_TIMEOUT
,
199 /* LDAP_SIZELIMIT_EXCEEDED */ ERROR_MORE_DATA
,
200 /* LDAP_COMPARE_FALSE */ ERROR_DS_GENERIC_ERROR
,
201 /* LDAP_COMPARE_TRUE */ ERROR_DS_GENERIC_ERROR
,
202 /* LDAP_AUTH_METHOD_NOT_SUPPORTED */ ERROR_ACCESS_DENIED
,
203 /* LDAP_STRONG_AUTH_REQUIRED */ ERROR_ACCESS_DENIED
,
204 /* LDAP_REFERRAL_V2 */ ERROR_MORE_DATA
,
205 /* LDAP_REFERRAL */ ERROR_MORE_DATA
,
206 /* LDAP_ADMIN_LIMIT_EXCEEDED */ ERROR_NOT_ENOUGH_QUOTA
,
207 /* LDAP_UNAVAILABLE_CRIT_EXTENSION */ ERROR_CAN_NOT_COMPLETE
,
208 /* LDAP_CONFIDENTIALITY_REQUIRED */ ERROR_DS_GENERIC_ERROR
,
209 /* LDAP_SASL_BIND_IN_PROGRESS */ ERROR_DS_GENERIC_ERROR
,
210 /* 0x0f */ ERROR_DS_GENERIC_ERROR
,
211 /* LDAP_NO_SUCH_ATTRIBUTE */ ERROR_INVALID_PARAMETER
,
212 /* LDAP_UNDEFINED_TYPE */ ERROR_DS_GENERIC_ERROR
,
213 /* LDAP_INAPPROPRIATE_MATCHING */ ERROR_INVALID_PARAMETER
,
214 /* LDAP_CONSTRAINT_VIOLATION */ ERROR_INVALID_PARAMETER
,
215 /* LDAP_ATTRIBUTE_OR_VALUE_EXISTS */ ERROR_ALREADY_EXISTS
,
216 /* LDAP_INVALID_SYNTAX */ ERROR_INVALID_NAME
,
217 /* 0x16 */ ERROR_DS_GENERIC_ERROR
,
218 /* 0x17 */ ERROR_DS_GENERIC_ERROR
,
219 /* 0x18 */ ERROR_DS_GENERIC_ERROR
,
220 /* 0x19 */ ERROR_DS_GENERIC_ERROR
,
221 /* 0x1a */ ERROR_DS_GENERIC_ERROR
,
222 /* 0x1b */ ERROR_DS_GENERIC_ERROR
,
223 /* 0x1c */ ERROR_DS_GENERIC_ERROR
,
224 /* 0x1d */ ERROR_DS_GENERIC_ERROR
,
225 /* 0x1e */ ERROR_DS_GENERIC_ERROR
,
226 /* 0x1f */ ERROR_DS_GENERIC_ERROR
,
227 /* LDAP_NO_SUCH_OBJECT */ ERROR_FILE_NOT_FOUND
,
228 /* LDAP_ALIAS_PROBLEM */ ERROR_DS_GENERIC_ERROR
,
229 /* LDAP_INVALID_DN_SYNTAX */ ERROR_INVALID_PARAMETER
,
230 /* LDAP_IS_LEAF */ ERROR_DS_GENERIC_ERROR
,
231 /* LDAP_ALIAS_DEREF_PROBLEM */ ERROR_DS_GENERIC_ERROR
,
232 /* 0x25 */ ERROR_DS_GENERIC_ERROR
,
233 /* 0x26 */ ERROR_DS_GENERIC_ERROR
,
234 /* 0x27 */ ERROR_DS_GENERIC_ERROR
,
235 /* 0x28 */ ERROR_DS_GENERIC_ERROR
,
236 /* 0x29 */ ERROR_DS_GENERIC_ERROR
,
237 /* 0x2a */ ERROR_DS_GENERIC_ERROR
,
238 /* 0x2b */ ERROR_DS_GENERIC_ERROR
,
239 /* 0x2c */ ERROR_DS_GENERIC_ERROR
,
240 /* 0x2d */ ERROR_DS_GENERIC_ERROR
,
241 /* 0x2e */ ERROR_DS_GENERIC_ERROR
,
242 /* 0x2f */ ERROR_DS_GENERIC_ERROR
,
243 /* LDAP_INAPPROPRIATE_AUTH */ ERROR_ACCESS_DENIED
,
244 /* LDAP_INVALID_CREDENTIALS */ ERROR_WRONG_PASSWORD
,
245 /* LDAP_INSUFFICIENT_RIGHTS */ ERROR_ACCESS_DENIED
,
246 /* LDAP_BUSY */ ERROR_BUSY
,
247 /* LDAP_UNAVAILABLE */ ERROR_DEV_NOT_EXIST
,
248 /* LDAP_UNWILLING_TO_PERFORM */ ERROR_CAN_NOT_COMPLETE
,
249 /* LDAP_LOOP_DETECT */ ERROR_DS_GENERIC_ERROR
,
250 /* 0x37 */ ERROR_DS_GENERIC_ERROR
,
251 /* 0x38 */ ERROR_DS_GENERIC_ERROR
,
252 /* 0x39 */ ERROR_DS_GENERIC_ERROR
,
253 /* 0x3a */ ERROR_DS_GENERIC_ERROR
,
254 /* 0x3b */ ERROR_DS_GENERIC_ERROR
,
255 /* LDAP_SORT_CONTROL_MISSING */ 8261,
256 /* LDAP_OFFSET_RANGE_ERROR */ 8262,
257 /* 0x3e */ ERROR_DS_GENERIC_ERROR
,
258 /* 0x3f */ ERROR_DS_GENERIC_ERROR
,
259 /* LDAP_NAMING_VIOLATION */ ERROR_INVALID_PARAMETER
,
260 /* LDAP_OBJECT_CLASS_VIOLATION */ ERROR_INVALID_PARAMETER
,
261 /* LDAP_NOT_ALLOWED_ON_NONLEAF */ ERROR_CAN_NOT_COMPLETE
,
262 /* LDAP_NOT_ALLOWED_ON_RDN */ ERROR_ACCESS_DENIED
,
263 /* LDAP_ALREADY_EXISTS */ ERROR_ALREADY_EXISTS
,
264 /* LDAP_NO_OBJECT_CLASS_MODS */ ERROR_ACCESS_DENIED
,
265 /* LDAP_RESULTS_TOO_LARGE */ ERROR_INSUFFICIENT_BUFFER
,
266 /* LDAP_AFFECTS_MULTIPLE_DSAS */ ERROR_CAN_NOT_COMPLETE
,
267 /* 0x48 */ ERROR_DS_GENERIC_ERROR
,
268 /* 0x49 */ ERROR_DS_GENERIC_ERROR
,
269 /* 0x4a */ ERROR_DS_GENERIC_ERROR
,
270 /* 0x4b */ ERROR_DS_GENERIC_ERROR
,
271 /* LDAP_VIRTUAL_LIST_VIEW_ERROR */ ERROR_DS_GENERIC_ERROR
,
272 /* 0x4d */ ERROR_DS_GENERIC_ERROR
,
273 /* 0x4e */ ERROR_DS_GENERIC_ERROR
,
274 /* 0x4f */ ERROR_DS_GENERIC_ERROR
,
275 /* LDAP_OTHER */ ERROR_DS_GENERIC_ERROR
,
276 /* LDAP_SERVER_DOWN */ ERROR_BAD_NET_RESP
,
277 /* LDAP_LOCAL_ERROR */ ERROR_DS_GENERIC_ERROR
,
278 /* LDAP_ENCODING_ERROR */ ERROR_UNEXP_NET_ERR
,
279 /* LDAP_DECODING_ERROR */ ERROR_UNEXP_NET_ERR
,
280 /* LDAP_TIMEOUT */ ERROR_SERVICE_REQUEST_TIMEOUT
,
281 /* LDAP_AUTH_UNKNOWN */ ERROR_WRONG_PASSWORD
,
282 /* LDAP_FILTER_ERROR */ ERROR_INVALID_PARAMETER
,
283 /* LDAP_USER_CANCELLED */ ERROR_CANCELLED
,
284 /* LDAP_PARAM_ERROR */ ERROR_INVALID_PARAMETER
,
285 /* LDAP_NO_MEMORY */ ERROR_NOT_ENOUGH_MEMORY
,
286 /* LDAP_CONNECT_ERROR */ ERROR_CONNECTION_REFUSED
,
287 /* LDAP_NOT_SUPPORTED */ ERROR_CAN_NOT_COMPLETE
,
288 /* LDAP_CONTROL_NOT_FOUND */ ERROR_NOT_FOUND
,
289 /* LDAP_NO_RESULTS_RETURNED */ ERROR_MORE_DATA
,
290 /* LDAP_MORE_RESULTS_TO_RETURN */ ERROR_MORE_DATA
,
291 /* LDAP_CLIENT_LOOP */ ERROR_DS_GENERIC_ERROR
,
292 /* LDAP_REFERRAL_LIMIT_EXCEEDED */ ERROR_DS_GENERIC_ERROR
295 /***********************************************************************
296 * LdapMapErrorToWin32 (WLDAP32.@)
298 * Map an LDAP error code to a Win32 error code.
301 * err [I] An LDAP error code.
304 * A Win32 error code.
306 ULONG CDECL
LdapMapErrorToWin32( ULONG err
)
308 TRACE( "(0x%08x)\n", err
);
310 if (err
>= sizeof(WLDAP32_errormap
)/sizeof(WLDAP32_errormap
[0]))
311 return ERROR_DS_GENERIC_ERROR
;
312 return WLDAP32_errormap
[err
];