diff --git a/configure b/configure index 1fc3fa7a585..d2f86cf6f3a 100755 --- a/configure +++ b/configure @@ -12902,11 +12902,19 @@ LIBS="$LIBS $LDAPLIBS $LIBPTHREAD" + + + + for ac_func in \ ldap_count_references \ ldap_first_reference \ ldap_next_reference \ - ldap_parse_reference + ldap_parse_reference \ + ldap_parse_sort_control \ + ldap_parse_sortresponse_control \ + ldap_parse_vlv_control \ + ldap_parse_vlvresponse_control do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 diff --git a/configure.ac b/configure.ac index aa900921083..3d62f455127 100644 --- a/configure.ac +++ b/configure.ac @@ -864,7 +864,11 @@ then ldap_count_references \ ldap_first_reference \ ldap_next_reference \ - ldap_parse_reference, + ldap_parse_reference \ + ldap_parse_sort_control \ + ldap_parse_sortresponse_control \ + ldap_parse_vlv_control \ + ldap_parse_vlvresponse_control, [$LDAPLIBS $LIBPTHREAD]) fi WINE_NOTICE_IF([test "x$LDAPLIBS" = "x"],[libldap (OpenLDAP) development files not found. diff --git a/dlls/wldap32/parse.c b/dlls/wldap32/parse.c index e47adf2e849..81c30b36b9e 100644 --- a/dlls/wldap32/parse.c +++ b/dlls/wldap32/parse.c @@ -325,7 +325,13 @@ ULONG CDECL ldap_parse_sort_controlW( WLDAP32_LDAP *ld, PLDAPControlW *control, #ifdef HAVE_LDAP char *attrU = NULL; LDAPControl **controlU = NULL; +#ifdef HAVE_LDAP_PARSE_SORT_CONTROL unsigned long res; +#elif defined(HAVE_LDAP_PARSE_SORTRESPONSE_CONTROL) + ber_int_t res; + LDAPControl *sortcontrol = NULL; + unsigned int i; +#endif TRACE( "(%p, %p, %p, %p)\n", ld, control, result, attr ); @@ -336,10 +342,29 @@ ULONG CDECL ldap_parse_sort_controlW( WLDAP32_LDAP *ld, PLDAPControlW *control, if (!controlU) return WLDAP32_LDAP_NO_MEMORY; } - ret = ldap_parse_sort_control( ld, controlU, &res, &attrU ); - - *result = res; - *attr = strUtoW( attrU ); +#ifdef HAVE_LDAP_PARSE_SORT_CONTROL + if (!(ret = ldap_parse_sort_control( ld, controlU, &res, &attrU ))) + { + *result = res; + *attr = strUtoW( attrU ); + } +#elif defined(HAVE_LDAP_PARSE_SORTRESPONSE_CONTROL) + for (i = 0; controlU[i]; i++) + { + if (!strcmp( LDAP_SERVER_RESP_SORT_OID, controlU[i]->ldctl_oid )) + sortcontrol = controlU[i]; + } + if (!sortcontrol) + { + controlarrayfreeU( controlU ); + return WLDAP32_LDAP_CONTROL_NOT_FOUND; + } + if (!(ret = ldap_parse_sortresponse_control( ld, sortcontrol, &res, &attrU ))) + { + *result = res; + *attr = strUtoW( attrU ); + } +#endif controlarrayfreeU( controlU ); #endif @@ -405,7 +430,13 @@ INT CDECL ldap_parse_vlv_controlW( WLDAP32_LDAP *ld, PLDAPControlW *control, int ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP LDAPControl **controlU = NULL; +#ifdef HAVE_LDAP_PARSE_VLV_CONTROL unsigned long pos, count; +#elif defined(HAVE_LDAP_PARSE_VLVRESPONSE_CONTROL) + ber_int_t pos, count; + LDAPControl *vlvcontrol = NULL; + unsigned int i; +#endif TRACE( "(%p, %p, %p, %p, %p, %p)\n", ld, control, targetpos, listcount, context, errcode ); @@ -417,11 +448,31 @@ INT CDECL ldap_parse_vlv_controlW( WLDAP32_LDAP *ld, PLDAPControlW *control, if (!controlU) return WLDAP32_LDAP_NO_MEMORY; } - ret = ldap_parse_vlv_control( ld, controlU, &pos, &count, - (struct berval **)context, errcode ); - - *targetpos = pos; - *listcount = count; +#ifdef HAVE_LDAP_PARSE_VLV_CONTROL + if (!(ret = ldap_parse_vlv_control( ld, controlU, &pos, &count, + (struct berval **)context, errcode ))) + { + *targetpos = pos; + *listcount = count; + } +#elif defined(HAVE_LDAP_PARSE_VLVRESPONSE_CONTROL) + for (i = 0; controlU[i]; i++) + { + if (!strcmp( LDAP_CONTROL_VLVRESPONSE, controlU[i]->ldctl_oid )) + vlvcontrol = controlU[i]; + } + if (!vlvcontrol) + { + controlarrayfreeU( controlU ); + return WLDAP32_LDAP_CONTROL_NOT_FOUND; + } + if (!(ret = ldap_parse_vlvresponse_control( ld, vlvcontrol, &pos, &count, + (struct berval **)context, errcode ))) + { + *targetpos = pos; + *listcount = count; + } +#endif controlarrayfreeU( controlU ); #endif diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h index 4936a581e3f..e494e20bb0a 100644 --- a/dlls/wldap32/winldap_private.h +++ b/dlls/wldap32/winldap_private.h @@ -190,6 +190,14 @@ typedef struct WLDAP32_berval #define LDAP_PAGED_RESULT_OID_STRING_W (const WCHAR []){'1','.','2','.', \ '8','4','0','.','1','1','3','5','5','6','.','1','.','4','.','3','1','9',0} +#define LDAP_SERVER_RESP_SORT_OID "1.2.840.113556.1.4.474" +#define LDAP_SERVER_RESP_SORT_OID_W (const WCHAR []){'1','.','2','.', \ + '8','4','0','.','1','1','3','5','5','6','.','1','.','4','.','4','7','4',0} + +#define LDAP_CONTROL_VLVRESPONSE "2.16.840.1.113730.3.4.10" +#define LDAP_CONTROL_VLVRESPONSE_W (const WCHAR []){'2','.','1','6','.', \ + '8','4','0','.','1','.','1','1','3','7','3','0','.','3','.','4','.','1','0',0} + typedef struct ldapcontrolA { PCHAR ldctl_oid; diff --git a/include/config.h.in b/include/config.h.in index c352c42d43e..75e5d64555a 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -288,6 +288,18 @@ /* Define to 1 if you have the `ldap_parse_reference' function. */ #undef HAVE_LDAP_PARSE_REFERENCE +/* Define to 1 if you have the `ldap_parse_sortresponse_control' function. */ +#undef HAVE_LDAP_PARSE_SORTRESPONSE_CONTROL + +/* Define to 1 if you have the `ldap_parse_sort_control' function. */ +#undef HAVE_LDAP_PARSE_SORT_CONTROL + +/* Define to 1 if you have the `ldap_parse_vlvresponse_control' function. */ +#undef HAVE_LDAP_PARSE_VLVRESPONSE_CONTROL + +/* Define to 1 if you have the `ldap_parse_vlv_control' function. */ +#undef HAVE_LDAP_PARSE_VLV_CONTROL + /* Define if you have libaudioIO */ #undef HAVE_LIBAUDIOIO