lib/ldap.c | 37 +++++++++++++++++++++++++++++++++++--
1 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/lib/ldap.c b/lib/ldap.c
index 07ec5b0..054b2b4 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -55,7 +55,15 @@
#if (defined(HAVE_LDAP_SSL) && defined(HAVE_LDAP_SSL_H))
# include <ldap_ssl.h>
#endif /* HAVE_LDAP_SSL && HAVE_LDAP_SSL_H */
-#endif
+
+/* <RHBZ#655134>
+ * ldap_pvt.h is not included in the openldap-devel RPM */
+#ifndef _LDAP_PVT_H
+extern int ldap_init_fd(ber_socket_t fd, int proto, char *uri, LDAP **ldp);
+#endif /* _LDAP_PVT_H */
+#define LDAP_PROTO_TCP 1
+/* </RHBZ#655134> */
+#endif /* CURL_LDAP_WIN */
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -209,6 +217,19 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
#endif
ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
+/* <RHBZ#655134> */
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
+ /* for LDAP over HTTP proxy */
+ CURLcode result;
+ result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
+ conn->host.name, conn->remote_port);
+ if(CURLE_OK != result) {
+ status = CURLE_COULDNT_CONNECT;
+ goto quit;
+ }
+ }
+/* </RHBZ#655134> */
+
if(ldap_ssl) {
#ifdef HAVE_LDAP_SSL
#ifdef CURL_LDAP_WIN
@@ -299,7 +320,13 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
status = CURLE_SSL_CERTPROBLEM;
goto quit;
}
- server = ldap_init(conn->host.name, (int)conn->port);
+/* <RHBZ#655134> */
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
+ ldap_init_fd(conn->sock[FIRSTSOCKET], LDAP_PROTO_TCP, NULL, &server);
+ } else {
+ server = ldap_init(conn->host.name, (int)conn->port);
+ }
+/* </RHBZ#655134> */
if(server == NULL) {
failf(data, "LDAP local: Cannot connect to %s:%hu",
conn->host.name, conn->port);
@@ -334,7 +361,13 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
#endif
#endif /* CURL_LDAP_USE_SSL */
} else {
+/* <RHBZ#655134> */
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
+ ldap_init_fd(conn->sock[FIRSTSOCKET], LDAP_PROTO_TCP, NULL, &server);
+ } else {
server = ldap_init(conn->host.name, (int)conn->port);
+ }
+/* </RHBZ#655134> */
if(server == NULL) {
failf(data, "LDAP local: Cannot connect to %s:%hu",
conn->host.name, conn->port);