Commit ff4333306a320544a765e3910584dd8ea4fde0dd
1 parent
b455df4f
Exists in
master
and in
3 other branches
Implementing WinLDAP support.
Showing
4 changed files
with
139 additions
and
22 deletions
Show diff stats
configure.ac
@@ -79,7 +79,7 @@ case "$host" in | @@ -79,7 +79,7 @@ case "$host" in | ||
79 | *-mingw32|*-pc-msys) | 79 | *-mingw32|*-pc-msys) |
80 | app_cv_osname="windows" | 80 | app_cv_osname="windows" |
81 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" | 81 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" |
82 | - LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32 -lwldap32" | 82 | + LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32" |
83 | LDFLAGS="$LDFLAGS -pthread" | 83 | LDFLAGS="$LDFLAGS -pthread" |
84 | DLL_LDFLAGS="-shared -Wl,--output-def,\$(@D)/\$(LIBNAME).def" | 84 | DLL_LDFLAGS="-shared -Wl,--output-def,\$(@D)/\$(LIBNAME).def" |
85 | DLLEXT=".dll" | 85 | DLLEXT=".dll" |
@@ -521,24 +521,36 @@ AC_ARG_ENABLE([ldap], | @@ -521,24 +521,36 @@ AC_ARG_ENABLE([ldap], | ||
521 | 521 | ||
522 | 522 | ||
523 | if test "x${have_ldap}" != xno ; then | 523 | if test "x${have_ldap}" != xno ; then |
524 | - AC_CHECK_HEADERS( | ||
525 | - [ldap.h], | ||
526 | - [have_ldap=yes], | ||
527 | - [if test "x$have_ldap" = xyes ; then | ||
528 | - AC_MSG_ERROR([LDAP headers not found.]) | ||
529 | - fi]) | ||
530 | 524 | ||
531 | - if test "x$have_ldap" = xyes ; then | 525 | + case "$host" in |
526 | + *-mingw32|*-pc-msys) | ||
527 | + LDAP_LIBS="-lwldap32" | ||
528 | + AC_DEFINE(HAVE_LDAP,1,[LDAP is available]) | ||
529 | + ;; | ||
530 | + | ||
531 | + *) | ||
532 | + | ||
533 | + AC_CHECK_HEADERS( | ||
534 | + [ldap.h], | ||
535 | + [have_ldap=yes], | ||
536 | + [if test "x$have_ldap" = xyes ; then | ||
537 | + AC_MSG_ERROR([LDAP headers not found.]) | ||
538 | + fi]) | ||
539 | + | ||
540 | + if test "x$have_ldap" = xyes ; then | ||
532 | 541 | ||
533 | - LDAP_LIBS="-lldap -llber" | ||
534 | - AC_DEFINE(HAVE_LDAP,1,[LDAP is available]) | ||
535 | - M4_DEFINES="$M4_DEFINES -DHAVE_LDAP" | 542 | + LDAP_LIBS="-lldap -llber" |
543 | + AC_DEFINE(HAVE_LDAP,1,[LDAP is available]) | ||
544 | + M4_DEFINES="$M4_DEFINES -DHAVE_LDAP" | ||
536 | 545 | ||
537 | - else | 546 | + else |
538 | 547 | ||
539 | - have_ldap=no | 548 | + have_ldap=no |
540 | 549 | ||
541 | - fi | 550 | + fi |
551 | + | ||
552 | + | ||
553 | + esac | ||
542 | 554 | ||
543 | else | 555 | else |
544 | LDAP_LIBS= | 556 | LDAP_LIBS= |
src/ssl/windows/getcrl.c
@@ -98,13 +98,13 @@ LIB3270_INTERNAL X509_CRL * lib3270_get_crl(H3270 *hSession, SSL_ERROR_MESSAGE * | @@ -98,13 +98,13 @@ LIB3270_INTERNAL X509_CRL * lib3270_get_crl(H3270 *hSession, SSL_ERROR_MESSAGE * | ||
98 | 98 | ||
99 | 99 | ||
100 | } | 100 | } |
101 | -#ifdef DEBUG | 101 | +#ifdef HAVE_LDAP |
102 | else if(strncasecmp(consturl,"ldap://",7) == 0 && strlen(consturl) > 8) | 102 | else if(strncasecmp(consturl,"ldap://",7) == 0 && strlen(consturl) > 8) |
103 | { | 103 | { |
104 | - return get_crl_using_winldap(hSession, message, consturl); | 104 | + return get_crl_using_ldap(hSession, message, consturl); |
105 | 105 | ||
106 | } | 106 | } |
107 | -#endif // DEBUG | 107 | +#endif // HAVE_LDAP |
108 | else | 108 | else |
109 | { | 109 | { |
110 | #ifdef HAVE_LIBCURL | 110 | #ifdef HAVE_LIBCURL |
src/ssl/windows/ldap.c
@@ -27,6 +27,7 @@ | @@ -27,6 +27,7 @@ | ||
27 | * | 27 | * |
28 | * References: | 28 | * References: |
29 | * | 29 | * |
30 | + * https://docs.microsoft.com/en-us/windows/win32/api/winldap/ | ||
30 | * https://github.com/curl/curl/blob/curl-7_62_0/lib/ldap.c | 31 | * https://github.com/curl/curl/blob/curl-7_62_0/lib/ldap.c |
31 | * http://forums.codeguru.com/showthread.php?313123-Elementary-problems-using-winldap | 32 | * http://forums.codeguru.com/showthread.php?313123-Elementary-problems-using-winldap |
32 | * https://stackoverflow.com/questions/21501002/how-to-use-ldap-sasl-bind-in-winldap | 33 | * https://stackoverflow.com/questions/21501002/how-to-use-ldap-sasl-bind-in-winldap |
@@ -35,7 +36,7 @@ | @@ -35,7 +36,7 @@ | ||
35 | 36 | ||
36 | #include <config.h> | 37 | #include <config.h> |
37 | 38 | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | 39 | +#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LDAP) |
39 | 40 | ||
40 | #include "private.h" | 41 | #include "private.h" |
41 | #include <winldap.h> | 42 | #include <winldap.h> |
@@ -59,7 +60,32 @@ static inline void lib3270_autoptr_cleanup_LDAP(LDAP **ptr) | @@ -59,7 +60,32 @@ static inline void lib3270_autoptr_cleanup_LDAP(LDAP **ptr) | ||
59 | 60 | ||
60 | } | 61 | } |
61 | 62 | ||
62 | -X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | 63 | +static inline void lib3270_autoptr_cleanup_LDAPMessage(LDAPMessage **message) |
64 | +{ | ||
65 | + debug("%s(%p)",__FUNCTION__,*message); | ||
66 | + if(message) | ||
67 | + ldap_msgfree(*message); | ||
68 | + *message = NULL; | ||
69 | +} | ||
70 | + | ||
71 | +static inline void lib3270_autoptr_cleanup_LDAPPTR(char **ptr) | ||
72 | +{ | ||
73 | + debug("%s(%p)",__FUNCTION__,*ptr); | ||
74 | + if(*ptr) | ||
75 | + ldap_memfree(*ptr); | ||
76 | + *ptr = NULL; | ||
77 | +} | ||
78 | + | ||
79 | +static inline void lib3270_autoptr_cleanup_BerElement(BerElement **ber) | ||
80 | +{ | ||
81 | + debug("%s(%p)",__FUNCTION__,*ber); | ||
82 | + if(*ber) | ||
83 | + ber_free(*ber, 0); | ||
84 | + *ber = NULL; | ||
85 | +} | ||
86 | + | ||
87 | + | ||
88 | +X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
63 | { | 89 | { |
64 | debug("********************************************************* %s",__FUNCTION__); | 90 | debug("********************************************************* %s",__FUNCTION__); |
65 | 91 | ||
@@ -146,7 +172,7 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | @@ -146,7 +172,7 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | ||
146 | return NULL; | 172 | return NULL; |
147 | } | 173 | } |
148 | 174 | ||
149 | - rc = ldap_simple_bind(ld, "", ""); | 175 | + rc = ldap_simple_bind_s(ld, NULL, NULL); |
150 | if(rc != LDAP_SUCCESS) | 176 | if(rc != LDAP_SUCCESS) |
151 | { | 177 | { |
152 | message->error = hSession->ssl.error = 0; | 178 | message->error = hSession->ssl.error = 0; |
@@ -161,6 +187,81 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | @@ -161,6 +187,81 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | ||
161 | return NULL; | 187 | return NULL; |
162 | } | 188 | } |
163 | 189 | ||
190 | + lib3270_autoptr(LDAPMessage) results = NULL; | ||
191 | + rc = ldap_search_ext_s( | ||
192 | + ld, // Specifies the LDAP pointer returned by a previous call to ldap_init(), ldap_ssl_init(), or ldap_open(). | ||
193 | + base, // Specifies the DN of the entry at which to start the search. | ||
194 | + LDAP_SCOPE_BASE, // Specifies the scope of the search. | ||
195 | + NULL, // Specifies a string representation of the filter to apply in the search. | ||
196 | + (char **) &attrs, // Specifies a null-terminated array of character string attribute types to return from entries that match filter. | ||
197 | + 0, // Should be set to 1 to request attribute types only. Set to 0 to request both attributes types and attribute values. | ||
198 | + NULL, | ||
199 | + NULL, | ||
200 | + NULL, | ||
201 | + 0, | ||
202 | + &results | ||
203 | + ); | ||
204 | + | ||
205 | + | ||
206 | + if(rc != LDAP_SUCCESS) | ||
207 | + { | ||
208 | + message->error = hSession->ssl.error = 0; | ||
209 | + message->title = _( "Security error" ); | ||
210 | + message->text = _( "Can't search LDAP server" ); | ||
211 | + message->description = ldap_err2string(rc); | ||
212 | + lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
213 | + return NULL; | ||
214 | + } | ||
215 | + | ||
216 | + lib3270_autoptr(BerElement) ber = NULL; | ||
217 | + char __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_LDAPPTR))) *attr = ldap_first_attribute(ld, results, &ber); | ||
218 | + if(!attr) | ||
219 | + { | ||
220 | + message->error = hSession->ssl.error = 0; | ||
221 | + message->title = _( "Security error" ); | ||
222 | + message->text = _( "Can't get LDAP attribute" ); | ||
223 | + message->description = _("Search did not produce any attributes."); | ||
224 | + lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
225 | + errno = ENOENT; | ||
226 | + return NULL; | ||
227 | + } | ||
228 | + | ||
229 | + struct berval ** value = ldap_get_values_len(ld, results, attr); | ||
230 | + if(!value) | ||
231 | + { | ||
232 | + message->error = hSession->ssl.error = 0; | ||
233 | + message->title = _( "Security error" ); | ||
234 | + message->text = _( "Can't get LDAP attribute" ); | ||
235 | + message->description = _("Search did not produce any values."); | ||
236 | + lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
237 | + errno = ENOENT; | ||
238 | + return NULL; | ||
239 | + } | ||
240 | + | ||
241 | + if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
242 | + { | ||
243 | + lib3270_trace_data( | ||
244 | + hSession, | ||
245 | + "CRL Data received from LDAP server", | ||
246 | + (const char *) value[0]->bv_val, | ||
247 | + value[0]->bv_len | ||
248 | + ); | ||
249 | + } | ||
250 | + | ||
251 | + // Precisa salvar uma cópia porque d2i_X509_CRL modifica o ponteiro. | ||
252 | + const unsigned char *crl_data = (const unsigned char *) value[0]->bv_val; | ||
253 | + | ||
254 | + if(!d2i_X509_CRL(&x509_crl, &crl_data, value[0]->bv_len)) | ||
255 | + { | ||
256 | + message->error = hSession->ssl.error = ERR_get_error(); | ||
257 | + message->title = _( "Security error" ); | ||
258 | + message->text = _( "Can't decode certificate revocation list" ); | ||
259 | + lib3270_write_log(hSession,"ssl","%s: %s",url, message->text); | ||
260 | + ldap_value_free_len(value); | ||
261 | + return NULL; | ||
262 | + } | ||
263 | + | ||
264 | + ldap_value_free_len(value); | ||
164 | 265 | ||
165 | debug("********************************************************* %s",__FUNCTION__); | 266 | debug("********************************************************* %s",__FUNCTION__); |
166 | 267 | ||
@@ -168,4 +269,4 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | @@ -168,4 +269,4 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c | ||
168 | 269 | ||
169 | } | 270 | } |
170 | 271 | ||
171 | -#endif // defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | 272 | +#endif // defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LDAP) |
src/ssl/windows/private.h
@@ -57,7 +57,11 @@ | @@ -57,7 +57,11 @@ | ||
57 | 57 | ||
58 | #endif // HAVE_LIBCURL | 58 | #endif // HAVE_LIBCURL |
59 | 59 | ||
60 | - LIB3270_INTERNAL X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | 60 | + #ifdef HAVE_LDAP |
61 | 61 | ||
62 | + /// @brief Use winldap to get CRL. | ||
63 | + LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
64 | + | ||
65 | + #endif // HAVE_LDAP | ||
62 | 66 | ||
63 | #endif // !LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED | 67 | #endif // !LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED |