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 | 79 | *-mingw32|*-pc-msys) |
80 | 80 | app_cv_osname="windows" |
81 | 81 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" |
82 | - LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32 -lwldap32" | |
82 | + LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32" | |
83 | 83 | LDFLAGS="$LDFLAGS -pthread" |
84 | 84 | DLL_LDFLAGS="-shared -Wl,--output-def,\$(@D)/\$(LIBNAME).def" |
85 | 85 | DLLEXT=".dll" |
... | ... | @@ -521,24 +521,36 @@ AC_ARG_ENABLE([ldap], |
521 | 521 | |
522 | 522 | |
523 | 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 | 555 | else |
544 | 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 | 98 | |
99 | 99 | |
100 | 100 | } |
101 | -#ifdef DEBUG | |
101 | +#ifdef HAVE_LDAP | |
102 | 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 | 108 | else |
109 | 109 | { |
110 | 110 | #ifdef HAVE_LIBCURL | ... | ... |
src/ssl/windows/ldap.c
... | ... | @@ -27,6 +27,7 @@ |
27 | 27 | * |
28 | 28 | * References: |
29 | 29 | * |
30 | + * https://docs.microsoft.com/en-us/windows/win32/api/winldap/ | |
30 | 31 | * https://github.com/curl/curl/blob/curl-7_62_0/lib/ldap.c |
31 | 32 | * http://forums.codeguru.com/showthread.php?313123-Elementary-problems-using-winldap |
32 | 33 | * https://stackoverflow.com/questions/21501002/how-to-use-ldap-sasl-bind-in-winldap |
... | ... | @@ -35,7 +36,7 @@ |
35 | 36 | |
36 | 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 | 41 | #include "private.h" |
41 | 42 | #include <winldap.h> |
... | ... | @@ -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 | 90 | debug("********************************************************* %s",__FUNCTION__); |
65 | 91 | |
... | ... | @@ -146,7 +172,7 @@ X509_CRL * get_crl_using_winldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, c |
146 | 172 | return NULL; |
147 | 173 | } |
148 | 174 | |
149 | - rc = ldap_simple_bind(ld, "", ""); | |
175 | + rc = ldap_simple_bind_s(ld, NULL, NULL); | |
150 | 176 | if(rc != LDAP_SUCCESS) |
151 | 177 | { |
152 | 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 | 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 | 266 | debug("********************************************************* %s",__FUNCTION__); |
166 | 267 | |
... | ... | @@ -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 | 57 | |
58 | 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 | 67 | #endif // !LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED | ... | ... |