From 84143dc57d8532b65dcac3aa0e144e0bf81843d2 Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Sat, 3 Jan 2015 20:58:29 +0000 Subject: ldap: Fixed support for Unicode filter in Win32 search call --- lib/ldap.c | 58 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/ldap.c b/lib/ldap.c index 680e4d774..70b9a1cac 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -90,7 +90,12 @@ typedef struct { char **lud_attrs; #endif int lud_scope; +#if defined(CURL_LDAP_WIN) && \ + (defined(USE_WIN32_IDN) || defined(USE_WINDOWS_SSPI)) + TCHAR *lud_filter; +#else char *lud_filter; +#endif; char **lud_exts; size_t lud_attrs_dups; /* how many were dup'ed, this field is not in the "real" struct so can only be used in code @@ -681,12 +686,6 @@ static bool split_str(char *str, char ***out, size_t *count) */ static bool unescape_elements (void *data, LDAPURLDesc *ludp) { - if(ludp->lud_filter) { - ludp->lud_filter = curl_easy_unescape(data, ludp->lud_filter, 0, NULL); - if(!ludp->lud_filter) - return FALSE; - } - return (TRUE); } @@ -841,13 +840,12 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp) if(!p) goto success; - /* parse scope. skip "??" - */ + /* Parse the scope. skip "??" */ q = strchr(p, '?'); if(q) *q++ = '\0'; - if(*p && *p != '?') { + if(*p) { ludp->lud_scope = str2scope(p); if(ludp->lud_scope == -1) { rc = LDAP_INVALID_SYNTAX; @@ -861,20 +859,50 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp) if(!p) goto success; - /* parse filter - */ + /* Parse the filter */ q = strchr(p, '?'); if(q) *q++ = '\0'; - if(!*p) { + + if(*p) { + char *filter = p; + char *unescapped; + + LDAP_TRACE (("filter '%s'\n", filter)); + + /* Unescape the filter */ + unescapped = curl_easy_unescape(conn->data, filter, 0, NULL); + if(!unescapped) { + rc = LDAP_NO_MEMORY; + + goto quit; + } + +#if defined(CURL_LDAP_WIN) && \ + (defined(USE_WIN32_IDN) || defined(USE_WINDOWS_SSPI)) + /* Convert the unescapped string to a tchar */ + ludp->lud_filter = Curl_convert_UTF8_to_tchar(unescapped); + + /* Free the unescapped string as we are done with it */ + Curl_unicodefree(unescapped); + + if(!ludp->lud_filter) { + rc = LDAP_NO_MEMORY; + + goto quit; + } +#else + ludp->lud_filter = unescapped; +#endif + } + + p = q; + if(p && !*p) { rc = LDAP_INVALID_SYNTAX; goto quit; } - ludp->lud_filter = p; - LDAP_TRACE (("filter '%s'\n", ludp->lud_filter)); - success: if(!unescape_elements(conn->data, ludp)) rc = LDAP_NO_MEMORY; -- cgit v1.2.3