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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "wine/port.h"
24 #include "wine/debug.h"
35 #define LDAP_SUCCESS 0x00
36 #define LDAP_NOT_SUPPORTED 0x5c
39 #include "winldap_private.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
44 /***********************************************************************
45 * ldap_bindA (WLDAP32.@)
49 ULONG ldap_bindA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR cred, ULONG method )
51 ULONG ret = LDAP_NOT_SUPPORTED;
53 WCHAR *dnW = NULL, *credW = NULL;
55 ret = WLDAP32_LDAP_NO_MEMORY;
57 TRACE( "(%p, %s, %p, 0x%08lx)\n", ld, debugstr_a(dn), cred, method );
66 credW = strAtoW( cred );
67 if (!credW) goto exit;
70 ret = ldap_bindW( ld, dnW, credW, method );
80 /***********************************************************************
81 * ldap_bindW (WLDAP32.@)
83 * Authenticate with an LDAP server (asynchronous operation).
86 * ld [I] Pointer to an LDAP context.
87 * dn [I] DN of entry to bind as.
88 * cred [I] Credentials (e.g. password string).
89 * method [I] Authentication method.
92 * Success: Message ID of the bind operation.
93 * Failure: An LDAP error code.
96 * Only LDAP_AUTH_SIMPLE is supported (just like native).
98 ULONG ldap_bindW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR cred, ULONG method )
100 ULONG ret = LDAP_NOT_SUPPORTED;
102 char *dnU = NULL, *credU = NULL;
103 struct berval pwd = { 0, NULL };
106 ret = WLDAP32_LDAP_NO_MEMORY;
108 TRACE( "(%p, %s, %p, 0x%08lx)\n", ld, debugstr_w(dn), cred, method );
110 if (!ld) return ~0UL;
111 if (method != LDAP_AUTH_SIMPLE) return WLDAP32_LDAP_PARAM_ERROR;
118 credU = strWtoU( cred );
119 if (!credU) goto exit;
121 pwd.bv_len = strlen( credU );
125 ret = ldap_sasl_bind( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, &msg );
127 if (ret == LDAP_SUCCESS)
140 /***********************************************************************
141 * ldap_bind_sA (WLDAP32.@)
145 ULONG ldap_bind_sA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR cred, ULONG method )
147 ULONG ret = LDAP_NOT_SUPPORTED;
149 WCHAR *dnW = NULL, *credW = NULL;
151 ret = WLDAP32_LDAP_NO_MEMORY;
153 TRACE( "(%p, %s, %p, 0x%08lx)\n", ld, debugstr_a(dn), cred, method );
155 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
162 credW = strAtoW( cred );
163 if (!credW) goto exit;
166 ret = ldap_bind_sW( ld, dnW, credW, method );
176 /***********************************************************************
177 * ldap_bind_sW (WLDAP32.@)
179 * Authenticate with an LDAP server (synchronous operation).
182 * ld [I] Pointer to an LDAP context.
183 * dn [I] DN of entry to bind as.
184 * cred [I] Credentials (e.g. password string).
185 * method [I] Authentication method.
188 * Success: LDAP_SUCCESS
189 * Failure: An LDAP error code.
191 ULONG ldap_bind_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR cred, ULONG method )
193 ULONG ret = LDAP_NOT_SUPPORTED;
195 char *dnU = NULL, *credU = NULL;
196 struct berval pwd = { 0, NULL };
198 ret = WLDAP32_LDAP_NO_MEMORY;
200 TRACE( "(%p, %s, %p, 0x%08lx)\n", ld, debugstr_w(dn), cred, method );
202 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
203 if (method != LDAP_AUTH_SIMPLE) return WLDAP32_LDAP_PARAM_ERROR;
210 credU = strWtoU( cred );
211 if (!credU) goto exit;
213 pwd.bv_len = strlen( credU );
217 ret = ldap_sasl_bind_s( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, NULL );
227 /***********************************************************************
228 * ldap_sasl_bindA (WLDAP32.@)
230 * See ldap_sasl_bindW.
232 ULONG ldap_sasl_bindA( WLDAP32_LDAP *ld, const PCHAR dn,
233 const PCHAR mechanism, const BERVAL *cred, PLDAPControlA *serverctrls,
234 PLDAPControlA *clientctrls, int *message )
236 ULONG ret = LDAP_NOT_SUPPORTED;
238 WCHAR *dnW, *mechanismW = NULL;
239 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
241 ret = WLDAP32_LDAP_NO_MEMORY;
243 TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_a(dn),
244 debugstr_a(mechanism), cred, serverctrls, clientctrls, message );
246 if (!ld || !dn || !mechanism || !cred || !message)
247 return WLDAP32_LDAP_PARAM_ERROR;
252 mechanismW = strAtoW( mechanism );
253 if (!mechanismW) goto exit;
256 serverctrlsW = controlarrayAtoW( serverctrls );
257 if (!serverctrlsW) goto exit;
260 clientctrlsW = controlarrayAtoW( clientctrls );
261 if (!clientctrlsW) goto exit;
264 ret = ldap_sasl_bindW( ld, dnW, mechanismW, cred, serverctrlsW, clientctrlsW, message );
268 strfreeW( mechanismW );
269 controlarrayfreeW( serverctrlsW );
270 controlarrayfreeW( clientctrlsW );
276 /***********************************************************************
277 * ldap_sasl_bindW (WLDAP32.@)
279 * Authenticate with an LDAP server using SASL (asynchronous operation).
282 * ld [I] Pointer to an LDAP context.
283 * dn [I] DN of entry to bind as.
284 * mechanism [I] Authentication method.
285 * cred [I] Credentials.
286 * serverctrls [I] Array of LDAP server controls.
287 * clientctrls [I] Array of LDAP client controls.
288 * message [O] Message ID of the bind operation.
291 * Success: LDAP_SUCCESS
292 * Failure: An LDAP error code.
295 * The serverctrls and clientctrls parameters are optional and should
296 * be set to NULL if not used.
298 ULONG ldap_sasl_bindW( WLDAP32_LDAP *ld, const PWCHAR dn,
299 const PWCHAR mechanism, const BERVAL *cred, PLDAPControlW *serverctrls,
300 PLDAPControlW *clientctrls, int *message )
302 ULONG ret = LDAP_NOT_SUPPORTED;
304 char *dnU, *mechanismU = NULL;
305 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
307 ret = WLDAP32_LDAP_NO_MEMORY;
309 TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn),
310 debugstr_w(mechanism), cred, serverctrls, clientctrls, message );
312 if (!ld || !dn || !mechanism || !cred || !message)
313 return WLDAP32_LDAP_PARAM_ERROR;
318 mechanismU = strWtoU( mechanism );
319 if (!mechanismU) goto exit;
322 serverctrlsU = controlarrayWtoU( serverctrls );
323 if (!serverctrlsU) goto exit;
326 clientctrlsU = controlarrayWtoU( clientctrls );
327 if (!clientctrlsU) goto exit;
330 ret = ldap_sasl_bind( ld, dnU, mechanismU, (struct berval *)cred,
331 serverctrlsU, clientctrlsU, message );
335 strfreeU( mechanismU );
336 controlarrayfreeU( serverctrlsU );
337 controlarrayfreeU( clientctrlsU );
343 /***********************************************************************
344 * ldap_sasl_bind_sA (WLDAP32.@)
346 * See ldap_sasl_bind_sW.
348 ULONG ldap_sasl_bind_sA( WLDAP32_LDAP *ld, const PCHAR dn,
349 const PCHAR mechanism, const BERVAL *cred, PLDAPControlA *serverctrls,
350 PLDAPControlA *clientctrls, PBERVAL *serverdata )
352 ULONG ret = LDAP_NOT_SUPPORTED;
354 WCHAR *dnW, *mechanismW = NULL;
355 LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
357 ret = WLDAP32_LDAP_NO_MEMORY;
359 TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_a(dn),
360 debugstr_a(mechanism), cred, serverctrls, clientctrls, serverdata );
362 if (!ld || !dn || !mechanism || !cred || !serverdata)
363 return WLDAP32_LDAP_PARAM_ERROR;
368 mechanismW = strAtoW( mechanism );
369 if (!mechanismW) goto exit;
372 serverctrlsW = controlarrayAtoW( serverctrls );
373 if (!serverctrlsW) goto exit;
376 clientctrlsW = controlarrayAtoW( clientctrls );
377 if (!clientctrlsW) goto exit;
380 ret = ldap_sasl_bind_sW( ld, dnW, mechanismW, cred, serverctrlsW, clientctrlsW, serverdata );
384 strfreeW( mechanismW );
385 controlarrayfreeW( serverctrlsW );
386 controlarrayfreeW( clientctrlsW );
392 /***********************************************************************
393 * ldap_sasl_bind_sW (WLDAP32.@)
395 * Authenticate with an LDAP server using SASL (synchronous operation).
398 * ld [I] Pointer to an LDAP context.
399 * dn [I] DN of entry to bind as.
400 * mechanism [I] Authentication method.
401 * cred [I] Credentials.
402 * serverctrls [I] Array of LDAP server controls.
403 * clientctrls [I] Array of LDAP client controls.
404 * serverdata [O] Authentication response from the server.
407 * Success: LDAP_SUCCESS
408 * Failure: An LDAP error code.
411 * The serverctrls and clientctrls parameters are optional and should
412 * be set to NULL if not used.
414 ULONG ldap_sasl_bind_sW( WLDAP32_LDAP *ld, const PWCHAR dn,
415 const PWCHAR mechanism, const BERVAL *cred, PLDAPControlW *serverctrls,
416 PLDAPControlW *clientctrls, PBERVAL *serverdata )
418 ULONG ret = LDAP_NOT_SUPPORTED;
420 char *dnU, *mechanismU = NULL;
421 LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
423 ret = WLDAP32_LDAP_NO_MEMORY;
425 TRACE( "(%p, %s, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn),
426 debugstr_w(mechanism), cred, serverctrls, clientctrls, serverdata );
428 if (!ld || !dn || !mechanism || !cred || !serverdata)
429 return WLDAP32_LDAP_PARAM_ERROR;
434 mechanismU = strWtoU( mechanism );
435 if (!mechanismU) goto exit;
438 serverctrlsU = controlarrayWtoU( serverctrls );
439 if (!serverctrlsU) goto exit;
442 clientctrlsU = controlarrayWtoU( clientctrls );
443 if (!clientctrlsU) goto exit;
446 ret = ldap_sasl_bind_s( ld, dnU, mechanismU, (struct berval *)cred,
447 serverctrlsU, clientctrlsU, (struct berval **)serverdata );
451 strfreeU( mechanismU );
452 controlarrayfreeU( serverctrlsU );
453 controlarrayfreeU( clientctrlsU );
459 /***********************************************************************
460 * ldap_simple_bindA (WLDAP32.@)
462 * See ldap_simple_bindW.
464 ULONG ldap_simple_bindA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR passwd )
466 ULONG ret = LDAP_NOT_SUPPORTED;
468 WCHAR *dnW = NULL, *passwdW = NULL;
470 ret = WLDAP32_LDAP_NO_MEMORY;
472 TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), passwd );
474 if (!ld) return ~0UL;
481 passwdW = strAtoW( passwd );
482 if (!passwdW) goto exit;
485 ret = ldap_simple_bindW( ld, dnW, passwdW );
495 /***********************************************************************
496 * ldap_simple_bindW (WLDAP32.@)
498 * Authenticate with an LDAP server (asynchronous operation).
501 * ld [I] Pointer to an LDAP context.
502 * dn [I] DN of entry to bind as.
503 * passwd [I] Password string.
506 * Success: Message ID of the bind operation.
507 * Failure: An LDAP error code.
510 * Set dn and passwd to NULL to bind as an anonymous user.
512 ULONG ldap_simple_bindW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR passwd )
514 ULONG ret = LDAP_NOT_SUPPORTED;
516 char *dnU = NULL, *passwdU = NULL;
517 struct berval pwd = { 0, NULL };
520 ret = WLDAP32_LDAP_NO_MEMORY;
522 TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), passwd );
524 if (!ld) return ~0UL;
531 passwdU = strWtoU( passwd );
532 if (!passwdU) goto exit;
534 pwd.bv_len = strlen( passwdU );
535 pwd.bv_val = passwdU;
538 ret = ldap_sasl_bind( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, &msg );
540 if (ret == LDAP_SUCCESS)
553 /***********************************************************************
554 * ldap_simple_bind_sA (WLDAP32.@)
556 * See ldap_simple_bind_sW.
558 ULONG ldap_simple_bind_sA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR passwd )
560 ULONG ret = LDAP_NOT_SUPPORTED;
562 WCHAR *dnW = NULL, *passwdW = NULL;
564 ret = WLDAP32_LDAP_NO_MEMORY;
566 TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), passwd );
568 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
575 passwdW = strAtoW( passwd );
576 if (!passwdW) goto exit;
579 ret = ldap_simple_bind_sW( ld, dnW, passwdW );
589 /***********************************************************************
590 * ldap_simple_bind_sW (WLDAP32.@)
592 * Authenticate with an LDAP server (synchronous operation).
595 * ld [I] Pointer to an LDAP context.
596 * dn [I] DN of entry to bind as.
597 * passwd [I] Password string.
600 * Success: LDAP_SUCCESS
601 * Failure: An LDAP error code.
604 * Set dn and passwd to NULL to bind as an anonymous user.
606 ULONG ldap_simple_bind_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR passwd )
608 ULONG ret = LDAP_NOT_SUPPORTED;
610 char *dnU = NULL, *passwdU = NULL;
611 struct berval pwd = { 0, NULL };
613 ret = WLDAP32_LDAP_NO_MEMORY;
615 TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), passwd );
617 if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
624 passwdU = strWtoU( passwd );
625 if (!passwdU) goto exit;
627 pwd.bv_len = strlen( passwdU );
628 pwd.bv_val = passwdU;
631 ret = ldap_sasl_bind_s( ld, dnU, LDAP_SASL_SIMPLE, &pwd, NULL, NULL, NULL );
641 /***********************************************************************
642 * ldap_unbind (WLDAP32.@)
644 * Close LDAP connection and free resources (asynchronous operation).
647 * ld [I] Pointer to an LDAP context.
650 * Success: LDAP_SUCCESS
651 * Failure: An LDAP error code.
653 ULONG WLDAP32_ldap_unbind( WLDAP32_LDAP *ld )
655 ULONG ret = LDAP_NOT_SUPPORTED;
658 TRACE( "(%p)\n", ld );
661 ret = ldap_unbind_ext( ld, NULL, NULL );
663 ret = WLDAP32_LDAP_PARAM_ERROR;
669 /***********************************************************************
670 * ldap_unbind_s (WLDAP32.@)
672 * Close LDAP connection and free resources (synchronous operation).
675 * ld [I] Pointer to an LDAP context.
678 * Success: LDAP_SUCCESS
679 * Failure: An LDAP error code.
681 ULONG WLDAP32_ldap_unbind_s( WLDAP32_LDAP *ld )
683 ULONG ret = LDAP_NOT_SUPPORTED;
686 TRACE( "(%p)\n", ld );
689 ret = ldap_unbind_ext_s( ld, NULL, NULL );
691 ret = WLDAP32_LDAP_PARAM_ERROR;