2 * Unix interface for libldap
4 * Copyright 2021 Hans Leidekker for CodeWeavers
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
34 #ifdef HAVE_SASL_SASL_H
35 # include <sasl/sasl.h>
39 #define WIN32_NO_STATUS
44 #include "wine/debug.h"
47 WINE_DEFAULT_DEBUG_CHANNEL(wldap32
);
49 C_ASSERT( sizeof(BerValueU
) == sizeof(BerValue
) );
50 C_ASSERT( sizeof(LDAPModU
) == sizeof(LDAPMod
) );
51 C_ASSERT( sizeof(LDAPControlU
) == sizeof(LDAPControl
) );
52 C_ASSERT( sizeof(LDAPSortKeyU
) == sizeof(LDAPSortKey
) );
53 C_ASSERT( sizeof(LDAPVLVInfoU
) == sizeof(LDAPVLVInfo
) );
54 C_ASSERT( sizeof(LDAPAPIInfoU
) == sizeof(LDAPAPIInfo
) );
55 C_ASSERT( sizeof(LDAPAPIFeatureInfoU
) == sizeof(LDAPAPIFeatureInfo
) );
57 static struct timeval
*convert_timeval(const struct timevalU
*tvu
, struct timeval
*tv
)
59 if (!tvu
) return NULL
;
60 tv
->tv_sec
= tvu
->tv_sec
;
61 tv
->tv_usec
= tvu
->tv_usec
;
65 #define WLDAP32_LBER_ERROR (~0l)
67 static LDAPMod
*nullmods
[] = { NULL
};
69 static NTSTATUS
wrap_ber_alloc_t( void *args
)
71 struct ber_alloc_t_params
*params
= args
;
72 *params
->ret
= ber_alloc_t( params
->options
);
73 return *params
->ret
? LDAP_SUCCESS
: WLDAP32_LBER_ERROR
;
76 static NTSTATUS
wrap_ber_bvecfree( void *args
)
79 return STATUS_SUCCESS
;
82 static NTSTATUS
wrap_ber_bvfree( void *args
)
85 return STATUS_SUCCESS
;
88 static NTSTATUS
wrap_ber_first_element( void *args
)
90 struct ber_first_element_params
*params
= args
;
94 if ((ret
= ber_first_element( params
->ber
, &len
, params
->last
)) == LBER_ERROR
)
95 return WLDAP32_LBER_ERROR
;
98 ERR( "ret too large\n" );
99 return WLDAP32_LBER_ERROR
;
103 ERR( "len too large\n" );
104 return WLDAP32_LBER_ERROR
;
107 *params
->ret_len
= len
;
111 static NTSTATUS
wrap_ber_flatten( void *args
)
113 struct ber_flatten_params
*params
= args
;
114 return ber_flatten( params
->ber
, (struct berval
**)params
->berval
);
117 static NTSTATUS
wrap_ber_free( void *args
)
119 struct ber_free_params
*params
= args
;
121 ber_free( params
->ber
, params
->freebuf
);
122 return STATUS_SUCCESS
;
125 static NTSTATUS
wrap_ber_init( void *args
)
127 struct ber_init_params
*params
= args
;
128 *params
->ret
= ber_init( (struct berval
*)params
->berval
);
129 return *params
->ret
? LDAP_SUCCESS
: WLDAP32_LBER_ERROR
;
132 static NTSTATUS
wrap_ber_next_element( void *args
)
134 struct ber_next_element_params
*params
= args
;
138 if ((ret
= ber_next_element( params
->ber
, &len
, params
->last
)) == LBER_ERROR
)
139 return WLDAP32_LBER_ERROR
;
142 ERR( "ret too large\n" );
143 return WLDAP32_LBER_ERROR
;
147 ERR( "len too large\n" );
148 return WLDAP32_LBER_ERROR
;
151 *params
->ret_len
= len
;
155 static NTSTATUS
wrap_ber_peek_tag( void *args
)
157 struct ber_peek_tag_params
*params
= args
;
161 if ((ret
= ber_peek_tag( params
->ber
, &len
)) == LBER_ERROR
) return WLDAP32_LBER_ERROR
;
164 ERR( "len too large\n" );
165 return WLDAP32_LBER_ERROR
;
168 *params
->ret_len
= len
;
172 static NTSTATUS
wrap_ber_skip_tag( void *args
)
174 struct ber_skip_tag_params
*params
= args
;
178 if ((ret
= ber_skip_tag( params
->ber
, &len
)) == LBER_ERROR
) return WLDAP32_LBER_ERROR
;
181 ERR( "len too large\n" );
182 return WLDAP32_LBER_ERROR
;
185 *params
->ret_len
= len
;
189 static NTSTATUS
wrap_ber_printf( void *args
)
191 struct ber_printf_params
*params
= args
;
193 assert( strlen(params
->fmt
) == 1 );
195 return ber_printf( params
->ber
, params
->fmt
, params
->arg1
, params
->arg2
);
198 static NTSTATUS
wrap_ber_scanf( void *args
)
200 struct ber_scanf_params
*params
= args
;
202 assert( strlen(params
->fmt
) == 1 );
204 return ber_scanf( params
->ber
, params
->fmt
, params
->arg1
, params
->arg2
);
207 static NTSTATUS
wrap_ldap_abandon_ext( void *args
)
209 struct ldap_abandon_ext_params
*params
= args
;
210 return ldap_abandon_ext( params
->ld
, params
->msgid
, (LDAPControl
**)params
->serverctrls
,
211 (LDAPControl
**)params
->clientctrls
);
214 static NTSTATUS
wrap_ldap_add_ext( void *args
)
216 struct ldap_add_ext_params
*params
= args
;
218 return ldap_add_ext( params
->ld
, params
->dn
? params
->dn
: "",
219 params
->attrs
? (LDAPMod
**)params
->attrs
: nullmods
,
220 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
,
221 params
->msg
? (int *)params
->msg
: &dummy
);
224 static NTSTATUS
wrap_ldap_add_ext_s( void *args
)
226 struct ldap_add_ext_s_params
*params
= args
;
227 return ldap_add_ext_s( params
->ld
, params
->dn
? params
->dn
: "",
228 params
->attrs
? (LDAPMod
**)params
->attrs
: nullmods
,
229 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
);
232 static NTSTATUS
wrap_ldap_compare_ext( void *args
)
234 struct ldap_compare_ext_params
*params
= args
;
236 return ldap_compare_ext( params
->ld
, params
->dn
? params
->dn
: "", params
->attrs
? params
->attrs
: "",
237 (struct berval
*)params
->value
, (LDAPControl
**)params
->serverctrls
,
238 (LDAPControl
**)params
->clientctrls
, params
->msg
? (int *)params
->msg
: &dummy
);
241 static NTSTATUS
wrap_ldap_compare_ext_s( void *args
)
243 struct ldap_compare_ext_s_params
*params
= args
;
244 return ldap_compare_ext_s( params
->ld
, params
->dn
? params
->dn
: "", params
->attrs
? params
->attrs
: "",
245 (struct berval
*)params
->value
, (LDAPControl
**)params
->serverctrls
,
246 (LDAPControl
**)params
->clientctrls
);
249 static NTSTATUS
wrap_ldap_control_free( void *args
)
251 ldap_control_free( args
);
252 return STATUS_SUCCESS
;
255 static NTSTATUS
wrap_ldap_controls_free( void *args
)
257 ldap_controls_free( args
);
258 return STATUS_SUCCESS
;
261 static NTSTATUS
wrap_ldap_count_entries( void *args
)
263 struct ldap_count_entries_params
*params
= args
;
264 return ldap_count_entries( params
->ld
, params
->chain
);
267 static NTSTATUS
wrap_ldap_count_references( void *args
)
269 struct ldap_count_references_params
*params
= args
;
270 return ldap_count_references( params
->ld
, params
->chain
);
273 static NTSTATUS
wrap_ldap_count_values_len( void *args
)
275 return ldap_count_values_len( args
);
278 static NTSTATUS
wrap_ldap_create_sort_control( void *args
)
280 struct ldap_create_sort_control_params
*params
= args
;
281 return ldap_create_sort_control( params
->ld
, (LDAPSortKey
**)params
->keylist
, params
->critical
,
282 (LDAPControl
**)params
->control
);
285 static NTSTATUS
wrap_ldap_create_vlv_control( void *args
)
287 struct ldap_create_vlv_control_params
*params
= args
;
288 return ldap_create_vlv_control( params
->ld
, (LDAPVLVInfo
*)params
->info
,
289 (LDAPControl
**)params
->control
);
292 static NTSTATUS
wrap_ldap_delete_ext( void *args
)
294 struct ldap_delete_ext_params
*params
= args
;
296 return ldap_delete_ext( params
->ld
, params
->dn
? params
->dn
: "", (LDAPControl
**)params
->serverctrls
,
297 (LDAPControl
**)params
->clientctrls
, params
->msg
? (int *)params
->msg
: &dummy
);
300 static NTSTATUS
wrap_ldap_delete_ext_s( void *args
)
302 struct ldap_delete_ext_s_params
*params
= args
;
303 return ldap_delete_ext_s( params
->ld
, params
->dn
? params
->dn
: "", (LDAPControl
**)params
->serverctrls
,
304 (LDAPControl
**)params
->clientctrls
);
307 static NTSTATUS
wrap_ldap_dn2ufn( void *args
)
309 struct ldap_dn2ufn_params
*params
= args
;
310 *params
->ret
= ldap_dn2ufn( params
->dn
);
311 return *params
->ret
? 0 : -1;
314 static NTSTATUS
wrap_ldap_explode_dn( void *args
)
316 struct ldap_explode_dn_params
*params
= args
;
317 *params
->ret
= ldap_explode_dn( params
->dn
, params
->notypes
);
318 return *params
->ret
? 0 : -1;
321 static NTSTATUS
wrap_ldap_extended_operation( void *args
)
323 struct ldap_extended_operation_params
*params
= args
;
325 return ldap_extended_operation( params
->ld
, params
->oid
? params
->oid
: "",
326 (struct berval
*)params
->data
, (LDAPControl
**)params
->serverctrls
,
327 (LDAPControl
**)params
->clientctrls
,
328 params
->msg
? (int *)params
->msg
: &dummy
);
331 static NTSTATUS
wrap_ldap_extended_operation_s( void *args
)
333 struct ldap_extended_operation_s_params
*params
= args
;
334 return ldap_extended_operation_s( params
->ld
, params
->oid
? params
->oid
: "",
335 (struct berval
*)params
->data
, (LDAPControl
**)params
->serverctrls
,
336 (LDAPControl
**)params
->clientctrls
, params
->retoid
,
337 (struct berval
**)params
->retdata
);
340 static NTSTATUS
wrap_ldap_get_dn( void *args
)
342 struct ldap_get_dn_params
*params
= args
;
343 *params
->ret
= ldap_get_dn( params
->ld
, params
->entry
);
344 return *params
->ret
? 0 : -1;
347 static NTSTATUS
wrap_ldap_first_attribute( void *args
)
349 struct ldap_first_attribute_params
*params
= args
;
350 *params
->ret
= ldap_first_attribute( params
->ld
, params
->entry
, (BerElement
**)params
->ber
);
351 return *params
->ret
? 0 : -1;
354 static NTSTATUS
wrap_ldap_first_entry( void *args
)
356 struct ldap_first_entry_params
*params
= args
;
357 *params
->ret
= ldap_first_entry( params
->ld
, params
->chain
);
358 return *params
->ret
? 0 : -1;
361 static NTSTATUS
wrap_ldap_first_reference( void *args
)
363 struct ldap_first_reference_params
*params
= args
;
364 *params
->ret
= ldap_first_reference( params
->ld
, params
->chain
);
365 return *params
->ret
? 0 : -1;
368 static NTSTATUS
wrap_ldap_get_option( void *args
)
370 struct ldap_get_option_params
*params
= args
;
371 return ldap_get_option( params
->ld
, params
->option
, params
->value
);
374 static NTSTATUS
wrap_ldap_get_values_len( void *args
)
376 struct ldap_get_values_len_params
*params
= args
;
377 *params
->ret
= (struct bervalU
**)ldap_get_values_len( params
->ld
, params
->entry
, params
->attr
);
378 return *params
->ret
? 0 : -1;
381 static NTSTATUS
wrap_ldap_initialize( void *args
)
383 struct ldap_initialize_params
*params
= args
;
384 return ldap_initialize( (LDAP
**)params
->ld
, params
->url
);
387 static NTSTATUS
wrap_ldap_memfree( void *args
)
389 ldap_memfree( args
);
390 return STATUS_SUCCESS
;
393 static NTSTATUS
wrap_ldap_memvfree( void *args
)
395 ldap_memvfree( args
);
396 return STATUS_SUCCESS
;
399 static NTSTATUS
wrap_ldap_modify_ext( void *args
)
401 struct ldap_modify_ext_params
*params
= args
;
403 return ldap_modify_ext( params
->ld
, params
->dn
? params
->dn
: "",
404 params
->mods
? (LDAPMod
**)params
->mods
: nullmods
,
405 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
,
406 params
->msg
? (int *)params
->msg
: &dummy
);
409 static NTSTATUS
wrap_ldap_modify_ext_s( void *args
)
411 struct ldap_modify_ext_s_params
*params
= args
;
412 return ldap_modify_ext_s( params
->ld
, params
->dn
? params
->dn
: "",
413 params
->mods
? (LDAPMod
**)params
->mods
: nullmods
,
414 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
);
417 static NTSTATUS
wrap_ldap_msgfree( void *args
)
419 return ldap_msgfree( args
);
422 static NTSTATUS
wrap_ldap_next_attribute( void *args
)
424 struct ldap_next_attribute_params
*params
= args
;
425 *params
->ret
= ldap_next_attribute( params
->ld
, params
->entry
, params
->ber
);
426 return *params
->ret
? 0 : -1;
429 static NTSTATUS
wrap_ldap_next_entry( void *args
)
431 struct ldap_next_entry_params
*params
= args
;
432 *params
->ret
= ldap_next_entry( params
->ld
, params
->entry
);
433 return *params
->ret
? 0 : -1;
436 static NTSTATUS
wrap_ldap_next_reference( void *args
)
438 struct ldap_next_reference_params
*params
= args
;
439 *params
->ret
= ldap_next_reference( params
->ld
, params
->entry
);
440 return *params
->ret
? 0 : -1;
443 static NTSTATUS
wrap_ldap_parse_extended_result( void *args
)
445 struct ldap_parse_extended_result_params
*params
= args
;
446 return ldap_parse_extended_result( params
->ld
, params
->result
, params
->retoid
,
447 (struct berval
**)params
->retdata
, params
->free
);
450 static NTSTATUS
wrap_ldap_parse_reference( void *args
)
452 struct ldap_parse_reference_params
*params
= args
;
453 return ldap_parse_reference( params
->ld
, params
->ref
, params
->referrals
,
454 (LDAPControl
***)params
->serverctrls
, params
->free
);
457 static NTSTATUS
wrap_ldap_parse_result( void *args
)
459 struct ldap_parse_result_params
*params
= args
;
460 return ldap_parse_result( params
->ld
, params
->res
, params
->errcode
, params
->matcheddn
, params
->errmsg
,
461 params
->referrals
, (LDAPControl
***)params
->serverctrls
, params
->free
);
464 static NTSTATUS
wrap_ldap_parse_sortresponse_control( void *args
)
466 struct ldap_parse_sortresponse_control_params
*params
= args
;
467 return ldap_parse_sortresponse_control( params
->ld
, (LDAPControl
*)params
->ctrl
,
468 params
->result
, params
->attr
);
471 static NTSTATUS
wrap_ldap_parse_vlvresponse_control( void *args
)
473 struct ldap_parse_vlvresponse_control_params
*params
= args
;
474 return ldap_parse_vlvresponse_control( params
->ld
, (LDAPControl
*)params
->ctrls
, params
->target_pos
,
475 params
->list_count
, (struct berval
**)params
->ctx
,
479 static NTSTATUS
wrap_ldap_rename( void *args
)
481 struct ldap_rename_params
*params
= args
;
482 return ldap_rename( params
->ld
, params
->dn
? params
->dn
: "", params
->newrdn
, params
->newparent
,
483 params
->delete, (LDAPControl
**)params
->clientctrls
,
484 (LDAPControl
**)params
->serverctrls
, (int *)params
->msg
);
487 static NTSTATUS
wrap_ldap_rename_s( void *args
)
489 struct ldap_rename_s_params
*params
= args
;
490 return ldap_rename_s( params
->ld
, params
->dn
? params
->dn
: "", params
->newrdn
, params
->newparent
,
491 params
->delete, (LDAPControl
**)params
->clientctrls
,
492 (LDAPControl
**)params
->serverctrls
);
495 static NTSTATUS
wrap_ldap_result( void *args
)
497 struct ldap_result_params
*params
= args
;
499 return ldap_result( params
->ld
, params
->msgid
, params
->all
,
500 convert_timeval(params
->timeout
, &tv
), (LDAPMessage
**)params
->result
);
503 static NTSTATUS
wrap_ldap_sasl_bind( void *args
)
505 struct ldap_sasl_bind_params
*params
= args
;
506 return ldap_sasl_bind( params
->ld
, params
->dn
, params
->mech
, (struct berval
*)params
->cred
,
507 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
,
511 static NTSTATUS
wrap_ldap_sasl_bind_s( void *args
)
513 struct ldap_sasl_bind_s_params
*params
= args
;
514 return ldap_sasl_bind_s( params
->ld
, params
->dn
, params
->mech
, (struct berval
*)params
->cred
,
515 (LDAPControl
**)params
->serverctrls
, (LDAPControl
**)params
->clientctrls
,
516 (struct berval
**)params
->servercred
);
519 static int wrap_sasl_interact( LDAP
*ld
, unsigned int flags
, void *defaults
, void *interact
)
521 #ifdef HAVE_SASL_SASL_H
522 struct sasl_interactive_bind_id
*id
= defaults
;
523 struct sasl_interact
*sasl
= interact
;
525 TRACE( "(%p, 0x%08x, %p, %p)\n", ld
, flags
, defaults
, interact
);
527 while (sasl
->id
!= SASL_CB_LIST_END
)
529 TRACE( "sasl->id = %04lx\n", sasl
->id
);
531 if (sasl
->id
== SASL_CB_GETREALM
)
533 sasl
->result
= id
->domain
;
534 sasl
->len
= id
->domain_len
;
536 else if (sasl
->id
== SASL_CB_USER
)
538 sasl
->result
= id
->user
;
539 sasl
->len
= id
->user_len
;
541 else if (sasl
->id
== SASL_CB_PASS
)
543 sasl
->result
= id
->password
;
544 sasl
->len
= id
->password_len
;
554 static NTSTATUS
wrap_ldap_sasl_interactive_bind_s( void *args
)
556 struct ldap_sasl_interactive_bind_s_params
*params
= args
;
557 return ldap_sasl_interactive_bind_s( params
->ld
, params
->dn
, params
->mech
,
558 (LDAPControl
**)params
->serverctrls
,
559 (LDAPControl
**)params
->clientctrls
, params
->flags
,
560 wrap_sasl_interact
, params
->defaults
);
563 static NTSTATUS
wrap_ldap_search_ext( void *args
)
565 struct ldap_search_ext_params
*params
= args
;
567 return ldap_search_ext( params
->ld
, params
->base
, params
->scope
, params
->filter
, params
->attrs
,
568 params
->attrsonly
, (LDAPControl
**)params
->serverctrls
,
569 (LDAPControl
**)params
->clientctrls
, convert_timeval(params
->timeout
, &tv
),
570 params
->sizelimit
, (int *)params
->msg
);
573 static NTSTATUS
wrap_ldap_search_ext_s( void *args
)
575 struct ldap_search_ext_s_params
*params
= args
;
577 return ldap_search_ext_s( params
->ld
, params
->base
, params
->scope
, params
->filter
, params
->attrs
,
578 params
->attrsonly
, (LDAPControl
**)params
->serverctrls
,
579 (LDAPControl
**)params
->clientctrls
, convert_timeval(params
->timeout
, &tv
),
580 params
->sizelimit
, (LDAPMessage
**)params
->result
);
583 static NTSTATUS
wrap_ldap_set_option( void *args
)
585 struct ldap_set_option_params
*params
= args
;
586 return ldap_set_option( params
->ld
, params
->option
, params
->value
);
589 static NTSTATUS
wrap_ldap_start_tls_s( void *args
)
591 struct ldap_start_tls_s_params
*params
= args
;
592 return ldap_start_tls_s( params
->ld
, (LDAPControl
**)params
->serverctrls
,
593 (LDAPControl
**)params
->clientctrls
);
596 static NTSTATUS
wrap_ldap_unbind_ext( void *args
)
598 struct ldap_unbind_ext_params
*params
= args
;
599 return ldap_unbind_ext( params
->ld
, (LDAPControl
**)params
->serverctrls
,
600 (LDAPControl
**)params
->clientctrls
);
603 static NTSTATUS
wrap_ldap_unbind_ext_s( void *args
)
605 struct ldap_unbind_ext_s_params
*params
= args
;
606 return ldap_unbind_ext_s( params
->ld
, (LDAPControl
**)params
->serverctrls
,
607 (LDAPControl
**)params
->clientctrls
);
610 static NTSTATUS
wrap_ldap_value_free_len( void *args
)
612 ldap_value_free_len( args
);
613 return STATUS_SUCCESS
;
616 unixlib_entry_t __wine_unix_call_funcs
[] =
621 wrap_ber_first_element
,
625 wrap_ber_next_element
,
630 wrap_ldap_abandon_ext
,
633 wrap_ldap_compare_ext
,
634 wrap_ldap_compare_ext_s
,
635 wrap_ldap_control_free
,
636 wrap_ldap_controls_free
,
637 wrap_ldap_count_entries
,
638 wrap_ldap_count_references
,
639 wrap_ldap_count_values_len
,
640 wrap_ldap_create_sort_control
,
641 wrap_ldap_create_vlv_control
,
642 wrap_ldap_delete_ext
,
643 wrap_ldap_delete_ext_s
,
645 wrap_ldap_explode_dn
,
646 wrap_ldap_extended_operation
,
647 wrap_ldap_extended_operation_s
,
648 wrap_ldap_first_attribute
,
649 wrap_ldap_first_entry
,
650 wrap_ldap_first_reference
,
652 wrap_ldap_get_option
,
653 wrap_ldap_get_values_len
,
654 wrap_ldap_initialize
,
657 wrap_ldap_modify_ext
,
658 wrap_ldap_modify_ext_s
,
660 wrap_ldap_next_attribute
,
661 wrap_ldap_next_entry
,
662 wrap_ldap_next_reference
,
663 wrap_ldap_parse_extended_result
,
664 wrap_ldap_parse_reference
,
665 wrap_ldap_parse_result
,
666 wrap_ldap_parse_sortresponse_control
,
667 wrap_ldap_parse_vlvresponse_control
,
672 wrap_ldap_sasl_bind_s
,
673 wrap_ldap_sasl_interactive_bind_s
,
674 wrap_ldap_search_ext
,
675 wrap_ldap_search_ext_s
,
676 wrap_ldap_set_option
,
677 wrap_ldap_start_tls_s
,
678 wrap_ldap_unbind_ext
,
679 wrap_ldap_unbind_ext_s
,
680 wrap_ldap_value_free_len
,
683 #endif /* HAVE_LDAP */