Commit f904a1f79449cc98b4af57ac9c7f5c6de0248803
1 parent
fa435363
Exists in
master
and in
3 other branches
Working on SSL API isolation.
Showing
10 changed files
with
416 additions
and
349 deletions
Show diff stats
lib3270.cbp
@@ -212,7 +212,7 @@ | @@ -212,7 +212,7 @@ | ||
212 | <Unit filename="src/lib3270/sf.c"> | 212 | <Unit filename="src/lib3270/sf.c"> |
213 | <Option compilerVar="CC" /> | 213 | <Option compilerVar="CC" /> |
214 | </Unit> | 214 | </Unit> |
215 | - <Unit filename="src/lib3270/ssl/init.c"> | 215 | + <Unit filename="src/lib3270/ssl/ctx_init.c"> |
216 | <Option compilerVar="CC" /> | 216 | <Option compilerVar="CC" /> |
217 | </Unit> | 217 | </Unit> |
218 | <Unit filename="src/lib3270/ssl/negotiate.c"> | 218 | <Unit filename="src/lib3270/ssl/negotiate.c"> |
@@ -250,6 +250,9 @@ | @@ -250,6 +250,9 @@ | ||
250 | </Unit> | 250 | </Unit> |
251 | <Unit filename="src/lib3270/windows/resources.rc" /> | 251 | <Unit filename="src/lib3270/windows/resources.rc" /> |
252 | <Unit filename="src/lib3270/windows/resources.rc.in" /> | 252 | <Unit filename="src/lib3270/windows/resources.rc.in" /> |
253 | + <Unit filename="src/lib3270/windows/util.c"> | ||
254 | + <Option compilerVar="CC" /> | ||
255 | + </Unit> | ||
253 | <Extensions> | 256 | <Extensions> |
254 | <code_completion /> | 257 | <code_completion /> |
255 | <envvars /> | 258 | <envvars /> |
src/include/lib3270.h
@@ -804,6 +804,7 @@ | @@ -804,6 +804,7 @@ | ||
804 | 804 | ||
805 | LIB3270_EXPORT void * lib3270_add_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); | 805 | LIB3270_EXPORT void * lib3270_add_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); |
806 | LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id); | 806 | LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id); |
807 | + LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled); | ||
807 | 808 | ||
808 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd); | 809 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd); |
809 | LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag); | 810 | LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag); |
@@ -823,6 +824,7 @@ | @@ -823,6 +824,7 @@ | ||
823 | 824 | ||
824 | void * (*add_poll)(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); | 825 | void * (*add_poll)(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); |
825 | void (*remove_poll)(H3270 *session, void *id); | 826 | void (*remove_poll)(H3270 *session, void *id); |
827 | + void (*set_poll_state)(H3270 *session, void *id, int enabled); | ||
826 | 828 | ||
827 | int (*Wait)(H3270 *hSession, int seconds); | 829 | int (*Wait)(H3270 *hSession, int seconds); |
828 | int (*event_dispatcher)(H3270 *session, int wait); | 830 | int (*event_dispatcher)(H3270 *session, int wait); |
src/lib3270/connect.c
@@ -84,10 +84,10 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -84,10 +84,10 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
84 | int err; | 84 | int err; |
85 | socklen_t len = sizeof(err); | 85 | socklen_t len = sizeof(err); |
86 | 86 | ||
87 | - if(hSession->ns_write_id) { | ||
88 | - trace("%s write=%p",__FUNCTION__,hSession->ns_write_id); | ||
89 | - lib3270_remove_poll(hSession, hSession->ns_write_id); | ||
90 | - hSession->ns_write_id = NULL; | 87 | + if(hSession->xio.write) { |
88 | + trace("%s write=%p",__FUNCTION__,hSession->xio.write); | ||
89 | + lib3270_remove_poll(hSession, hSession->xio.write); | ||
90 | + hSession->xio.write = NULL; | ||
91 | } | 91 | } |
92 | 92 | ||
93 | if(getsockopt(hSession->sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) | 93 | if(getsockopt(hSession->sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len) < 0) |
@@ -125,8 +125,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -125,8 +125,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
125 | return; | 125 | return; |
126 | } | 126 | } |
127 | 127 | ||
128 | - hSession->ns_exception_id = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | ||
129 | - hSession->ns_read_id = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_READ,net_input,0); | 128 | + hSession->xio.except = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); |
129 | + hSession->xio.read = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_READ,net_input,0); | ||
130 | 130 | ||
131 | #if defined(HAVE_LIBSSL) | 131 | #if defined(HAVE_LIBSSL) |
132 | if(hSession->ssl.con && hSession->ssl.state == LIB3270_SSL_UNDEFINED) | 132 | if(hSession->ssl.con && hSession->ssl.state == LIB3270_SSL_UNDEFINED) |
@@ -512,7 +512,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -512,7 +512,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
512 | hSession->cstate = LIB3270_PENDING; | 512 | hSession->cstate = LIB3270_PENDING; |
513 | lib3270_st_changed(hSession, LIB3270_STATE_HALF_CONNECT, True); | 513 | lib3270_st_changed(hSession, LIB3270_STATE_HALF_CONNECT, True); |
514 | 514 | ||
515 | - hSession->ns_write_id = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_WRITE,net_connected,0); | 515 | + hSession->xio.write = lib3270_add_poll_fd(hSession,hSession->sock,LIB3270_IO_FLAG_WRITE,net_connected,0); |
516 | // hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected); | 516 | // hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected); |
517 | 517 | ||
518 | trace("%s: Connection in progress",__FUNCTION__); | 518 | trace("%s: Connection in progress",__FUNCTION__); |
@@ -558,57 +558,3 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -558,57 +558,3 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
558 | 558 | ||
559 | } | 559 | } |
560 | 560 | ||
561 | -int non_blocking(H3270 *hSession, Boolean on) | ||
562 | -{ | ||
563 | -#ifdef WIN32 | ||
564 | - WSASetLastError(0); | ||
565 | - u_long iMode= on ? 1 : 0; | ||
566 | - | ||
567 | - if(ioctlsocket(hSession->sock,FIONBIO,&iMode)) | ||
568 | - { | ||
569 | - lib3270_popup_dialog( hSession, | ||
570 | - LIB3270_NOTIFY_ERROR, | ||
571 | - _( "Connection error" ), | ||
572 | - _( "ioctlsocket(FIONBIO) failed." ), | ||
573 | - "%s", lib3270_win32_strerror(GetLastError())); | ||
574 | - return -1; | ||
575 | - } | ||
576 | -#else | ||
577 | - | ||
578 | - int f; | ||
579 | - | ||
580 | - if ((f = fcntl(hSession->sock, F_GETFL, 0)) == -1) | ||
581 | - { | ||
582 | - lib3270_popup_dialog( hSession, | ||
583 | - LIB3270_NOTIFY_ERROR, | ||
584 | - _( "Socket error" ), | ||
585 | - _( "fcntl() error when getting socket state." ), | ||
586 | - _( "%s" ), strerror(errno) | ||
587 | - ); | ||
588 | - | ||
589 | - return -1; | ||
590 | - } | ||
591 | - | ||
592 | - if (on) | ||
593 | - f |= O_NDELAY; | ||
594 | - else | ||
595 | - f &= ~O_NDELAY; | ||
596 | - | ||
597 | - if (fcntl(hSession->sock, F_SETFL, f) < 0) | ||
598 | - { | ||
599 | - lib3270_popup_dialog( hSession, | ||
600 | - LIB3270_NOTIFY_ERROR, | ||
601 | - _( "Socket error" ), | ||
602 | - on ? _( "Can't set socket to blocking mode." ) : _( "Can't set socket to non blocking mode" ), | ||
603 | - _( "%s" ), strerror(errno) | ||
604 | - ); | ||
605 | - return -1; | ||
606 | - } | ||
607 | - | ||
608 | -#endif | ||
609 | - | ||
610 | - trace("Socket %d is %s",hSession->sock, on ? "non-blocking" : "blocking"); | ||
611 | - | ||
612 | - return 0; | ||
613 | -} | ||
614 | - |
src/lib3270/iocalls.c
@@ -36,6 +36,19 @@ | @@ -36,6 +36,19 @@ | ||
36 | #include "telnetc.h" | 36 | #include "telnetc.h" |
37 | #include "utilc.h" | 37 | #include "utilc.h" |
38 | 38 | ||
39 | +#if defined(_WIN32) | ||
40 | + #include <ws2tcpip.h> | ||
41 | +#else | ||
42 | + #include <sys/types.h> | ||
43 | + #include <sys/socket.h> | ||
44 | + #include <sys/ioctl.h> | ||
45 | + #include <netinet/in.h> | ||
46 | + #include <netdb.h> | ||
47 | + #include <unistd.h> | ||
48 | + #include <fcntl.h> | ||
49 | +#endif | ||
50 | + | ||
51 | + | ||
39 | #define MILLION 1000000L | 52 | #define MILLION 1000000L |
40 | // | 53 | // |
41 | //#if defined(_WIN32) | 54 | //#if defined(_WIN32) |
@@ -51,6 +64,8 @@ | @@ -51,6 +64,8 @@ | ||
51 | static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); | 64 | static void * internal_add_poll(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ); |
52 | static void internal_remove_poll(H3270 *session, void *id); | 65 | static void internal_remove_poll(H3270 *session, void *id); |
53 | 66 | ||
67 | + static void internal_set_poll_state(H3270 *session, void *id, int enabled); | ||
68 | + | ||
54 | static int internal_wait(H3270 *session, int seconds); | 69 | static int internal_wait(H3270 *session, int seconds); |
55 | 70 | ||
56 | static void internal_ring_bell(H3270 *session); | 71 | static void internal_ring_bell(H3270 *session); |
@@ -71,6 +86,9 @@ | @@ -71,6 +86,9 @@ | ||
71 | static void (*remove_poll)(H3270 *session, void *id) | 86 | static void (*remove_poll)(H3270 *session, void *id) |
72 | = internal_remove_poll; | 87 | = internal_remove_poll; |
73 | 88 | ||
89 | + static void (*set_poll_state)(H3270 *session, void *id, int enabled) | ||
90 | + = internal_set_poll_state; | ||
91 | + | ||
74 | static int (*wait)(H3270 *session, int seconds) | 92 | static int (*wait)(H3270 *session, int seconds) |
75 | = internal_wait; | 93 | = internal_wait; |
76 | 94 | ||
@@ -246,11 +264,37 @@ static void internal_remove_poll(H3270 *session, void *id) | @@ -246,11 +264,37 @@ static void internal_remove_poll(H3270 *session, void *id) | ||
246 | session->inputs_changed = 1; | 264 | session->inputs_changed = 1; |
247 | } | 265 | } |
248 | 266 | ||
249 | -LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) { | ||
250 | - debug("%s %p",__FUNCTION__,id); | 267 | + static void internal_set_poll_state(H3270 *session, void *id, int enabled) |
268 | + { | ||
269 | + input_t *ip; | ||
270 | + input_t *prev = (input_t *)NULL; | ||
271 | + | ||
272 | + for (ip = session->inputs; ip != (input_t *) NULL; ip = (input_t *) ip->next) | ||
273 | + { | ||
274 | + if (ip == (input_t *)id) | ||
275 | + { | ||
276 | + ip->enabled = enabled ? 1 : 0; | ||
277 | + break; | ||
278 | + } | ||
279 | + | ||
280 | + prev = ip; | ||
281 | + } | ||
282 | + | ||
283 | + } | ||
284 | + | ||
285 | + | ||
286 | +LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) | ||
287 | +{ | ||
288 | + debug("%s(%d,%p)",__FUNCTION__,session->sock,id); | ||
251 | remove_poll(session, id); | 289 | remove_poll(session, id); |
252 | } | 290 | } |
253 | 291 | ||
292 | +LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled) | ||
293 | +{ | ||
294 | + debug("%s(%d,%p,%d)",__FUNCTION__,session->sock,id,enabled); | ||
295 | + set_poll_state(session, id, enabled); | ||
296 | +} | ||
297 | + | ||
254 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) | 298 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) |
255 | { | 299 | { |
256 | 300 | ||
@@ -288,6 +332,7 @@ LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_F | @@ -288,6 +332,7 @@ LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_F | ||
288 | } | 332 | } |
289 | 333 | ||
290 | LIB3270_EXPORT void * lib3270_add_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ) { | 334 | LIB3270_EXPORT void * lib3270_add_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata ) { |
335 | + debug("%s(%d)",__FUNCTION__,session->sock); | ||
291 | return add_poll(session,fd,flag,call,userdata); | 336 | return add_poll(session,fd,flag,call,userdata); |
292 | } | 337 | } |
293 | 338 | ||
@@ -330,39 +375,39 @@ void RemoveTimeOut(H3270 *session, void * timer) | @@ -330,39 +375,39 @@ void RemoveTimeOut(H3270 *session, void * timer) | ||
330 | 375 | ||
331 | void x_except_on(H3270 *h) | 376 | void x_except_on(H3270 *h) |
332 | { | 377 | { |
333 | - int reading = (h->ns_read_id != NULL); | 378 | + int reading = (h->xio.read != NULL); |
334 | 379 | ||
335 | debug("%s",__FUNCTION__); | 380 | debug("%s",__FUNCTION__); |
336 | - if(h->ns_exception_id) | 381 | + if(h->xio.except) |
337 | return; | 382 | return; |
338 | 383 | ||
339 | if(reading) | 384 | if(reading) |
340 | - lib3270_remove_poll(h,h->ns_read_id); | 385 | + lib3270_remove_poll(h,h->xio.read); |
341 | 386 | ||
342 | - h->ns_exception_id = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | 387 | + h->xio.except = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); |
343 | 388 | ||
344 | if(reading) | 389 | if(reading) |
345 | - h->ns_read_id = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_READ,net_input,0); | 390 | + h->xio.read = lib3270_add_poll_fd(h,h->sock,LIB3270_IO_FLAG_READ,net_input,0); |
346 | debug("%s",__FUNCTION__); | 391 | debug("%s",__FUNCTION__); |
347 | 392 | ||
348 | } | 393 | } |
349 | 394 | ||
350 | void remove_input_calls(H3270 *session) | 395 | void remove_input_calls(H3270 *session) |
351 | { | 396 | { |
352 | - if(session->ns_read_id) | 397 | + if(session->xio.read) |
353 | { | 398 | { |
354 | - lib3270_remove_poll(session,session->ns_read_id); | ||
355 | - session->ns_read_id = NULL; | 399 | + lib3270_remove_poll(session,session->xio.read); |
400 | + session->xio.read = NULL; | ||
356 | } | 401 | } |
357 | - if(session->ns_exception_id) | 402 | + if(session->xio.except) |
358 | { | 403 | { |
359 | - lib3270_remove_poll(session,session->ns_exception_id); | ||
360 | - session->ns_exception_id = NULL; | 404 | + lib3270_remove_poll(session,session->xio.except); |
405 | + session->xio.except = NULL; | ||
361 | } | 406 | } |
362 | - if(session->ns_write_id) | 407 | + if(session->xio.write) |
363 | { | 408 | { |
364 | - lib3270_remove_poll(session,session->ns_write_id); | ||
365 | - session->ns_write_id = NULL; | 409 | + lib3270_remove_poll(session,session->xio.write); |
410 | + session->xio.write = NULL; | ||
366 | } | 411 | } |
367 | } | 412 | } |
368 | 413 | ||
@@ -478,6 +523,65 @@ LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, vo | @@ -478,6 +523,65 @@ LIB3270_EXPORT int lib3270_run_task(H3270 *hSession, int(*callback)(H3270 *h, vo | ||
478 | 523 | ||
479 | } | 524 | } |
480 | 525 | ||
526 | +int non_blocking(H3270 *hSession, Boolean on) | ||
527 | +{ | ||
528 | + | ||
529 | + if(hSession->sock < 0) | ||
530 | + return 0; | ||
531 | + | ||
532 | +#ifdef WIN32 | ||
533 | + | ||
534 | + WSASetLastError(0); | ||
535 | + u_long iMode= on ? 1 : 0; | ||
536 | + | ||
537 | + if(ioctlsocket(hSession->sock,FIONBIO,&iMode)) | ||
538 | + { | ||
539 | + lib3270_popup_dialog( hSession, | ||
540 | + LIB3270_NOTIFY_ERROR, | ||
541 | + _( "Connection error" ), | ||
542 | + _( "ioctlsocket(FIONBIO) failed." ), | ||
543 | + "%s", lib3270_win32_strerror(GetLastError())); | ||
544 | + return -1; | ||
545 | + } | ||
546 | + | ||
547 | +#else | ||
548 | + | ||
549 | + int f; | ||
550 | + | ||
551 | + if ((f = fcntl(hSession->sock, F_GETFL, 0)) == -1) | ||
552 | + { | ||
553 | + lib3270_popup_dialog( hSession, | ||
554 | + LIB3270_NOTIFY_ERROR, | ||
555 | + _( "Socket error" ), | ||
556 | + _( "fcntl() error when getting socket state." ), | ||
557 | + _( "%s" ), strerror(errno) | ||
558 | + ); | ||
559 | + | ||
560 | + return -1; | ||
561 | + } | ||
562 | + | ||
563 | + if (on) | ||
564 | + f |= O_NDELAY; | ||
565 | + else | ||
566 | + f &= ~O_NDELAY; | ||
567 | + | ||
568 | + if (fcntl(hSession->sock, F_SETFL, f) < 0) | ||
569 | + { | ||
570 | + lib3270_popup_dialog( hSession, | ||
571 | + LIB3270_NOTIFY_ERROR, | ||
572 | + _( "Socket error" ), | ||
573 | + on ? _( "Can't set socket to blocking mode." ) : _( "Can't set socket to non blocking mode" ), | ||
574 | + _( "%s" ), strerror(errno) | ||
575 | + ); | ||
576 | + return -1; | ||
577 | + } | ||
578 | + | ||
579 | +#endif | ||
580 | + | ||
581 | + trace("Socket %d is %s",hSession->sock, on ? "non-blocking" : "blocking"); | ||
582 | + | ||
583 | + return 0; | ||
584 | +} | ||
481 | 585 | ||
482 | 586 | ||
483 | 587 |
src/lib3270/private.h
@@ -599,9 +599,11 @@ struct _h3270 | @@ -599,9 +599,11 @@ struct _h3270 | ||
599 | unsigned char saved_bg; | 599 | unsigned char saved_bg; |
600 | 600 | ||
601 | // xio | 601 | // xio |
602 | - void * ns_read_id; | ||
603 | - void * ns_write_id; | ||
604 | - void * ns_exception_id; | 602 | + struct { |
603 | + void * read; | ||
604 | + void * write; | ||
605 | + void * except; | ||
606 | + } xio; | ||
605 | 607 | ||
606 | // SSL Data (Always defined to maintain the structure size) | 608 | // SSL Data (Always defined to maintain the structure size) |
607 | struct | 609 | struct |
@@ -0,0 +1,175 @@ | @@ -0,0 +1,175 @@ | ||
1 | +/* | ||
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | + * | ||
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | + * | ||
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | + * Free Software Foundation. | ||
11 | + * | ||
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | + * obter mais detalhes. | ||
16 | + * | ||
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | + * | ||
21 | + * Este programa está nomeado como ssl.c e possui - linhas de código. | ||
22 | + * | ||
23 | + * Contatos: | ||
24 | + * | ||
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | + * licinio@bb.com.br (Licínio Luis Branco) | ||
28 | + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
29 | + * | ||
30 | + * | ||
31 | + * References: | ||
32 | + * | ||
33 | + * http://www.openssl.org/docs/ssl/ | ||
34 | + * | ||
35 | + */ | ||
36 | + | ||
37 | +/** | ||
38 | + * @brief OpenSSL initialization. | ||
39 | + * | ||
40 | + */ | ||
41 | + | ||
42 | +#include <config.h> | ||
43 | +#if defined(HAVE_LIBSSL) | ||
44 | + | ||
45 | +#include <openssl/ssl.h> | ||
46 | +#include <openssl/err.h> | ||
47 | +#include <openssl/x509_vfy.h> | ||
48 | + | ||
49 | +#ifndef SSL_ST_OK | ||
50 | + #define SSL_ST_OK 3 | ||
51 | +#endif // !SSL_ST_OK | ||
52 | + | ||
53 | +#include "../private.h" | ||
54 | +#include <errno.h> | ||
55 | +#include <lib3270.h> | ||
56 | +#include <lib3270/internals.h> | ||
57 | +#include <lib3270/trace.h> | ||
58 | +#include "trace_dsc.h" | ||
59 | + | ||
60 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
61 | + | ||
62 | +/** | ||
63 | + * @brief Initialize openssl library. | ||
64 | + * | ||
65 | + * @return 0 if ok, non zero if fails. | ||
66 | + * | ||
67 | + */ | ||
68 | +int ssl_ctx_init(H3270 *hSession) | ||
69 | +{ | ||
70 | + debug("%s ssl_ctx=%p",__FUNCTION__,ssl_ctx); | ||
71 | + | ||
72 | + if(ssl_ctx != NULL) | ||
73 | + return 0; | ||
74 | + | ||
75 | + SSL_load_error_strings(); | ||
76 | + SSL_library_init(); | ||
77 | + | ||
78 | + ssl_ctx = SSL_CTX_new(SSLv23_method()); | ||
79 | + if(ssl_ctx == NULL) | ||
80 | + return -1; | ||
81 | + | ||
82 | + SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL); | ||
83 | + SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); | ||
84 | + SSL_CTX_set_default_verify_paths(ssl_ctx); | ||
85 | + | ||
86 | +#if defined(_WIN32) | ||
87 | + { | ||
88 | + HKEY hKey = 0; | ||
89 | + | ||
90 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\" PACKAGE_NAME,0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
91 | + { | ||
92 | + char data[4096]; | ||
93 | + unsigned long datalen = sizeof(data); // data field length(in), data returned length(out) | ||
94 | + unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
95 | + | ||
96 | + if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) data,&datalen) == ERROR_SUCCESS) | ||
97 | + { | ||
98 | + strncat(data,"\\certs",4095); | ||
99 | + | ||
100 | + trace("Loading certs from \"%s\"",data); | ||
101 | + if(!SSL_CTX_load_verify_locations(ssl_ctx,NULL,data)) | ||
102 | + { | ||
103 | + hSession->ssl.error = ERR_get_error(); | ||
104 | + | ||
105 | + lib3270_write_log( | ||
106 | + hSession, | ||
107 | + "ssl", | ||
108 | + "Cant set default locations for trusted CA certificates to %s\n%s", | ||
109 | + data, | ||
110 | + ERR_lib_error_string(hSession->ssl.error) | ||
111 | + ); | ||
112 | + | ||
113 | + } | ||
114 | + } | ||
115 | + RegCloseKey(hKey); | ||
116 | + } | ||
117 | + | ||
118 | + | ||
119 | + } | ||
120 | +#else | ||
121 | + static const char * ssldir[] = | ||
122 | + { | ||
123 | +#ifdef DATAROOTDIR | ||
124 | + DATAROOTDIR "/" PACKAGE_NAME "/certs", | ||
125 | +#endif // DATAROOTDIR | ||
126 | +#ifdef SYSCONFDIR | ||
127 | + SYSCONFDIR "/ssl/certs", | ||
128 | + SYSCONFDIR "/certs", | ||
129 | +#endif | ||
130 | + "/etc/ssl/certs" | ||
131 | + }; | ||
132 | + | ||
133 | + size_t f; | ||
134 | + | ||
135 | + for(f = 0;f < sizeof(ssldir) / sizeof(ssldir[0]);f++) | ||
136 | + { | ||
137 | + SSL_CTX_load_verify_locations(ssl_ctx,NULL,ssldir[f]); | ||
138 | + } | ||
139 | + | ||
140 | +#endif // _WIN32 | ||
141 | + | ||
142 | + // | ||
143 | + // Initialize CUSTOM CRL CHECK | ||
144 | + // | ||
145 | + | ||
146 | + | ||
147 | +/* | ||
148 | +#if defined(SSL_ENABLE_CRL_CHECK) | ||
149 | + // Set up CRL validation | ||
150 | + // https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
151 | + X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); | ||
152 | + | ||
153 | + // Enable CRL checking | ||
154 | + X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | ||
155 | + X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | ||
156 | + X509_STORE_set1_param(store, param); | ||
157 | + X509_VERIFY_PARAM_free(param); | ||
158 | + | ||
159 | + // X509_STORE_free(store); | ||
160 | + | ||
161 | + trace_dsn(hSession,"CRL CHECK is enabled.\n"); | ||
162 | + | ||
163 | +#else | ||
164 | + | ||
165 | + trace_dsn(hSession,"CRL CHECK is disabled.\n"); | ||
166 | + | ||
167 | +#endif // SSL_ENABLE_CRL_CHECK | ||
168 | +*/ | ||
169 | + | ||
170 | + ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); | ||
171 | + | ||
172 | + return 0; | ||
173 | +} | ||
174 | + | ||
175 | +#endif // HAVE_LIBSSL |
src/lib3270/ssl/init.c
@@ -1,177 +0,0 @@ | @@ -1,177 +0,0 @@ | ||
1 | -/* | ||
2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
5 | - * | ||
6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
7 | - * | ||
8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
10 | - * Free Software Foundation. | ||
11 | - * | ||
12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
15 | - * obter mais detalhes. | ||
16 | - * | ||
17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | - * | ||
21 | - * Este programa está nomeado como ssl.c e possui - linhas de código. | ||
22 | - * | ||
23 | - * Contatos: | ||
24 | - * | ||
25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
27 | - * licinio@bb.com.br (Licínio Luis Branco) | ||
28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | ||
29 | - * | ||
30 | - * | ||
31 | - * References: | ||
32 | - * | ||
33 | - * http://www.openssl.org/docs/ssl/ | ||
34 | - * | ||
35 | - */ | ||
36 | - | ||
37 | -/** | ||
38 | - * @brief OpenSSL initialization. | ||
39 | - * | ||
40 | - */ | ||
41 | - | ||
42 | -#include <config.h> | ||
43 | -#if defined(HAVE_LIBSSL) | ||
44 | - | ||
45 | -#include <openssl/ssl.h> | ||
46 | -#include <openssl/err.h> | ||
47 | -#include <openssl/x509_vfy.h> | ||
48 | - | ||
49 | -#ifndef SSL_ST_OK | ||
50 | - #define SSL_ST_OK 3 | ||
51 | -#endif // !SSL_ST_OK | ||
52 | - | ||
53 | -#include "../private.h" | ||
54 | -#include <errno.h> | ||
55 | -#include <lib3270.h> | ||
56 | -#include <lib3270/internals.h> | ||
57 | -#include <lib3270/trace.h> | ||
58 | -#include "trace_dsc.h" | ||
59 | - | ||
60 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
61 | - | ||
62 | -/** | ||
63 | - * @brief Initialize openssl library. | ||
64 | - * | ||
65 | - * @return 0 if ok, non zero if fails. | ||
66 | - * | ||
67 | - */ | ||
68 | -int ssl_ctx_init(H3270 *hSession) | ||
69 | -{ | ||
70 | - debug("%s ssl_ctx=%p",__FUNCTION__,ssl_ctx); | ||
71 | - | ||
72 | - if(ssl_ctx != NULL) | ||
73 | - return 0; | ||
74 | - | ||
75 | - SSL_load_error_strings(); | ||
76 | - SSL_library_init(); | ||
77 | - | ||
78 | - ssl_ctx = SSL_CTX_new(SSLv23_method()); | ||
79 | - if(ssl_ctx == NULL) | ||
80 | - return -1; | ||
81 | - | ||
82 | - SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL); | ||
83 | - SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); | ||
84 | - SSL_CTX_set_default_verify_paths(ssl_ctx); | ||
85 | - | ||
86 | -#if defined(_WIN32) | ||
87 | - { | ||
88 | - HKEY hKey = 0; | ||
89 | - | ||
90 | - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\" PACKAGE_NAME,0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
91 | - { | ||
92 | - char data[4096]; | ||
93 | - unsigned long datalen = sizeof(data); // data field length(in), data returned length(out) | ||
94 | - unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
95 | - | ||
96 | - if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) data,&datalen) == ERROR_SUCCESS) | ||
97 | - { | ||
98 | - strncat(data,"\\certs",4095); | ||
99 | - | ||
100 | - trace("Loading certs from \"%s\"",data); | ||
101 | - if(!SSL_CTX_load_verify_locations(ssl_ctx,NULL,data)) | ||
102 | - { | ||
103 | - char buffer[4096]; | ||
104 | - int ssl_error = ERR_get_error(); | ||
105 | - | ||
106 | - snprintf(buffer,4095,_("Cant set default locations for trusted CA certificates to\n%s"),data); | ||
107 | - | ||
108 | - lib3270_popup_dialog( | ||
109 | - hSession, | ||
110 | - LIB3270_NOTIFY_ERROR, | ||
111 | - N_( "Security error" ), | ||
112 | - buffer, | ||
113 | - N_( "%s" ),ERR_lib_error_string(ssl_error) | ||
114 | - ); | ||
115 | - } | ||
116 | - } | ||
117 | - RegCloseKey(hKey); | ||
118 | - } | ||
119 | - | ||
120 | - | ||
121 | - } | ||
122 | -#else | ||
123 | - static const char * ssldir[] = | ||
124 | - { | ||
125 | -#ifdef DATAROOTDIR | ||
126 | - DATAROOTDIR "/" PACKAGE_NAME "/certs", | ||
127 | -#endif // DATAROOTDIR | ||
128 | -#ifdef SYSCONFDIR | ||
129 | - SYSCONFDIR "/ssl/certs", | ||
130 | - SYSCONFDIR "/certs", | ||
131 | -#endif | ||
132 | - "/etc/ssl/certs" | ||
133 | - }; | ||
134 | - | ||
135 | - size_t f; | ||
136 | - | ||
137 | - for(f = 0;f < sizeof(ssldir) / sizeof(ssldir[0]);f++) | ||
138 | - { | ||
139 | - SSL_CTX_load_verify_locations(ssl_ctx,NULL,ssldir[f]); | ||
140 | - } | ||
141 | - | ||
142 | -#endif // _WIN32 | ||
143 | - | ||
144 | - // | ||
145 | - // Initialize CUSTOM CRL CHECK | ||
146 | - // | ||
147 | - | ||
148 | - | ||
149 | -/* | ||
150 | -#if defined(SSL_ENABLE_CRL_CHECK) | ||
151 | - // Set up CRL validation | ||
152 | - // https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
153 | - X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); | ||
154 | - | ||
155 | - // Enable CRL checking | ||
156 | - X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | ||
157 | - X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | ||
158 | - X509_STORE_set1_param(store, param); | ||
159 | - X509_VERIFY_PARAM_free(param); | ||
160 | - | ||
161 | - // X509_STORE_free(store); | ||
162 | - | ||
163 | - trace_dsn(hSession,"CRL CHECK is enabled.\n"); | ||
164 | - | ||
165 | -#else | ||
166 | - | ||
167 | - trace_dsn(hSession,"CRL CHECK is disabled.\n"); | ||
168 | - | ||
169 | -#endif // SSL_ENABLE_CRL_CHECK | ||
170 | -*/ | ||
171 | - | ||
172 | - ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); | ||
173 | - | ||
174 | - return 0; | ||
175 | -} | ||
176 | - | ||
177 | -#endif // HAVE_LIBSSL |
src/lib3270/ssl/negotiate.c
@@ -70,6 +70,15 @@ | @@ -70,6 +70,15 @@ | ||
70 | */ | 70 | */ |
71 | SSL_CTX * ssl_ctx = NULL; | 71 | SSL_CTX * ssl_ctx = NULL; |
72 | 72 | ||
73 | +struct ssl_error_message | ||
74 | +{ | ||
75 | + int error; | ||
76 | + const char * title; | ||
77 | + const char * text; | ||
78 | + const char * description; | ||
79 | +}; | ||
80 | + | ||
81 | + | ||
73 | /** | 82 | /** |
74 | * @brief Initialize openssl session. | 83 | * @brief Initialize openssl session. |
75 | * | 84 | * |
@@ -78,7 +87,8 @@ | @@ -78,7 +87,8 @@ | ||
78 | * @return 0 if ok, non zero if fails. | 87 | * @return 0 if ok, non zero if fails. |
79 | * | 88 | * |
80 | */ | 89 | */ |
81 | -int ssl_init(H3270 *hSession) | 90 | + |
91 | +static int background_ssl_init(H3270 *hSession, void *message) | ||
82 | { | 92 | { |
83 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | 93 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
84 | hSession->ssl.error = 0; | 94 | hSession->ssl.error = 0; |
@@ -86,21 +96,13 @@ int ssl_init(H3270 *hSession) | @@ -86,21 +96,13 @@ int ssl_init(H3270 *hSession) | ||
86 | 96 | ||
87 | if(ssl_ctx_init(hSession)) { | 97 | if(ssl_ctx_init(hSession)) { |
88 | 98 | ||
89 | - hSession->ssl.error = ERR_get_error(); | ||
90 | - | ||
91 | - /* | ||
92 | - lib3270_popup_dialog( | ||
93 | - hSession, | ||
94 | - LIB3270_NOTIFY_ERROR, | ||
95 | - N_( "Security error" ), | ||
96 | - N_( "SSL initialization has failed" ), | ||
97 | - "%s",ERR_reason_error_string(hSession->ssl.error) | ||
98 | - ); | ||
99 | - */ | 99 | + ((struct ssl_error_message *) message)->error = hSession->ssl.error = ERR_get_error(); |
100 | + ((struct ssl_error_message *) message)->title = N_( "Security error" ); | ||
101 | + ((struct ssl_error_message *) message)->text = N_( "SSL context initialization has failed" ); | ||
100 | 102 | ||
101 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | 103 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
102 | - | ||
103 | hSession->ssl.host = False; | 104 | hSession->ssl.host = False; |
105 | + | ||
104 | return -1; | 106 | return -1; |
105 | } | 107 | } |
106 | 108 | ||
@@ -110,43 +112,28 @@ int ssl_init(H3270 *hSession) | @@ -110,43 +112,28 @@ int ssl_init(H3270 *hSession) | ||
110 | hSession->ssl.con = SSL_new(ssl_ctx); | 112 | hSession->ssl.con = SSL_new(ssl_ctx); |
111 | if(hSession->ssl.con == NULL) | 113 | if(hSession->ssl.con == NULL) |
112 | { | 114 | { |
113 | - hSession->ssl.error = ERR_get_error(); | ||
114 | - | ||
115 | - /* | ||
116 | - lib3270_popup_dialog( | ||
117 | - hSession, | ||
118 | - LIB3270_NOTIFY_ERROR, | ||
119 | - N_( "Security error" ), | ||
120 | - N_( "Cant create a new SSL structure for current connection." ), | ||
121 | - N_( "%s" ),ERR_lib_error_string(hSession->ssl.error) | ||
122 | - ); | ||
123 | - */ | ||
124 | - | 115 | + ((struct ssl_error_message *) message)->error = hSession->ssl.error = ERR_get_error(); |
116 | + ((struct ssl_error_message *) message)->title = N_( "Security error" ); | ||
117 | + ((struct ssl_error_message *) message)->text = N_( "Cant create a new SSL structure for current connection." ); | ||
125 | return -1; | 118 | return -1; |
126 | } | 119 | } |
127 | 120 | ||
128 | SSL_set_ex_data(hSession->ssl.con,ssl_3270_ex_index,(char *) hSession); | 121 | SSL_set_ex_data(hSession->ssl.con,ssl_3270_ex_index,(char *) hSession); |
129 | - | ||
130 | // SSL_set_verify(session->ssl_con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | 122 | // SSL_set_verify(session->ssl_con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); |
131 | SSL_set_verify(hSession->ssl.con, 0, NULL); | 123 | SSL_set_verify(hSession->ssl.con, 0, NULL); |
132 | 124 | ||
133 | return 0; | 125 | return 0; |
134 | } | 126 | } |
135 | 127 | ||
136 | -int ssl_negotiate(H3270 *hSession) | 128 | +static int background_ssl_negotiation(H3270 *hSession, void *message) |
137 | { | 129 | { |
138 | int rv; | 130 | int rv; |
139 | 131 | ||
140 | trace("%s",__FUNCTION__); | 132 | trace("%s",__FUNCTION__); |
141 | 133 | ||
142 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | ||
143 | - non_blocking(hSession,False); | ||
144 | - | ||
145 | /* Initialize the SSL library. */ | 134 | /* Initialize the SSL library. */ |
146 | - if(ssl_init(hSession)) | 135 | + if(background_ssl_init(hSession,message)) |
147 | { | 136 | { |
148 | - /* Failed. */ | ||
149 | - lib3270_disconnect(hSession); | ||
150 | return -1; | 137 | return -1; |
151 | } | 138 | } |
152 | 139 | ||
@@ -155,15 +142,10 @@ int ssl_negotiate(H3270 *hSession) | @@ -155,15 +142,10 @@ int ssl_negotiate(H3270 *hSession) | ||
155 | { | 142 | { |
156 | trace_dsn(hSession,"%s","SSL_set_fd failed!\n"); | 143 | trace_dsn(hSession,"%s","SSL_set_fd failed!\n"); |
157 | 144 | ||
158 | - lib3270_popup_dialog( | ||
159 | - hSession, | ||
160 | - LIB3270_NOTIFY_ERROR, | ||
161 | - N_( "Security error" ), | ||
162 | - N_( "SSL negotiation failed" ), | ||
163 | - "%s",_( "Cant set the file descriptor for the input/output facility for the TLS/SSL (encrypted) side of ssl." ) | ||
164 | - ); | 145 | + ((struct ssl_error_message *) message)->title = N_( "Security error" ); |
146 | + ((struct ssl_error_message *) message)->text = N_( "SSL negotiation failed" ); | ||
147 | + ((struct ssl_error_message *) message)->description = N_( "Cant set the file descriptor for the input/output facility for the TLS/SSL (encrypted) side of ssl." ); | ||
165 | 148 | ||
166 | - lib3270_disconnect(hSession); | ||
167 | return -1; | 149 | return -1; |
168 | } | 150 | } |
169 | 151 | ||
@@ -173,29 +155,24 @@ int ssl_negotiate(H3270 *hSession) | @@ -173,29 +155,24 @@ int ssl_negotiate(H3270 *hSession) | ||
173 | 155 | ||
174 | if (rv != 1) | 156 | if (rv != 1) |
175 | { | 157 | { |
176 | - int ssl_error = SSL_get_error(hSession->ssl.con,rv); | ||
177 | const char * msg = ""; | 158 | const char * msg = ""; |
178 | 159 | ||
179 | - if(ssl_error == SSL_ERROR_SYSCALL && hSession->ssl.error) | ||
180 | - ssl_error = hSession->ssl.error; | 160 | + ((struct ssl_error_message *) message)->error = SSL_get_error(hSession->ssl.con,rv); |
161 | + if(((struct ssl_error_message *) message)->error == SSL_ERROR_SYSCALL && hSession->ssl.error) | ||
162 | + ((struct ssl_error_message *) message)->error = hSession->ssl.error; | ||
181 | 163 | ||
182 | - msg = ERR_lib_error_string(ssl_error); | 164 | + msg = ERR_lib_error_string(((struct ssl_error_message *) message)->error); |
183 | 165 | ||
184 | trace_dsn(hSession,"SSL_connect failed: %s %s\n",msg,ERR_reason_error_string(hSession->ssl.error)); | 166 | trace_dsn(hSession,"SSL_connect failed: %s %s\n",msg,ERR_reason_error_string(hSession->ssl.error)); |
185 | 167 | ||
186 | - lib3270_popup_dialog( | ||
187 | - hSession, | ||
188 | - LIB3270_NOTIFY_ERROR, | ||
189 | - N_( "Security error" ), | ||
190 | - N_( "SSL Connect failed" ), | ||
191 | - "%s",msg ? msg : "" | ||
192 | - ); | ||
193 | - | 168 | + ((struct ssl_error_message *) message)->title = N_( "Security error" ); |
169 | + ((struct ssl_error_message *) message)->text = N_( "SSL Connect failed" ); | ||
194 | lib3270_disconnect(hSession); | 170 | lib3270_disconnect(hSession); |
195 | return -1; | 171 | return -1; |
172 | + | ||
196 | } | 173 | } |
197 | 174 | ||
198 | - /* Success. */ | 175 | + // Success. |
199 | X509 * peer = NULL; | 176 | X509 * peer = NULL; |
200 | rv = SSL_get_verify_result(hSession->ssl.con); | 177 | rv = SSL_get_verify_result(hSession->ssl.con); |
201 | 178 | ||
@@ -208,13 +185,11 @@ int ssl_negotiate(H3270 *hSession) | @@ -208,13 +185,11 @@ int ssl_negotiate(H3270 *hSession) | ||
208 | 185 | ||
209 | case X509_V_ERR_UNABLE_TO_GET_CRL: | 186 | case X509_V_ERR_UNABLE_TO_GET_CRL: |
210 | trace_dsn(hSession,"%s","The CRL of a certificate could not be found.\n" ); | 187 | trace_dsn(hSession,"%s","The CRL of a certificate could not be found.\n" ); |
211 | - lib3270_disconnect(hSession); | ||
212 | - lib3270_popup_dialog( hSession, | ||
213 | - LIB3270_NOTIFY_ERROR, | ||
214 | - _( "SSL error" ), | ||
215 | - _( "Unable to get certificate CRL." ), | ||
216 | - _( "The Certificate revocation list (CRL) of a certificate could not be found." ) | ||
217 | - ); | 188 | + |
189 | + ((struct ssl_error_message *) message)->title = _( "SSL error" ); | ||
190 | + ((struct ssl_error_message *) message)->text = _( "Unable to get certificate CRL." ); | ||
191 | + ((struct ssl_error_message *) message)->description = _( "The Certificate revocation list (CRL) of a certificate could not be found." ); | ||
192 | + | ||
218 | return -1; | 193 | return -1; |
219 | 194 | ||
220 | case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: | 195 | case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: |
@@ -224,14 +199,9 @@ int ssl_negotiate(H3270 *hSession) | @@ -224,14 +199,9 @@ int ssl_negotiate(H3270 *hSession) | ||
224 | #ifdef SSL_ALLOW_SELF_SIGNED_CERT | 199 | #ifdef SSL_ALLOW_SELF_SIGNED_CERT |
225 | break; | 200 | break; |
226 | #else | 201 | #else |
227 | - lib3270_disconnect(hSession); | ||
228 | - lib3270_popup_dialog( hSession, | ||
229 | - LIB3270_NOTIFY_ERROR, | ||
230 | - _( "SSL error" ), | ||
231 | - _( "The SSL certificate for this host is not trusted." ), | ||
232 | - _( "The security certificate presented by this host was not issued by a trusted certificate authority." ) | ||
233 | - ); | ||
234 | - | 202 | + ((struct ssl_error_message *) message)->title = _( "SSL error" ); |
203 | + ((struct ssl_error_message *) message)->text = _( "The SSL certificate for this host is not trusted." ); | ||
204 | + ((struct ssl_error_message *) message)->description = _( "The security certificate presented by this host was not issued by a trusted certificate authority." ); | ||
235 | return -1; | 205 | return -1; |
236 | #endif // SSL_ALLOW_SELF_SIGNED_CERT | 206 | #endif // SSL_ALLOW_SELF_SIGNED_CERT |
237 | 207 | ||
@@ -286,11 +256,65 @@ int ssl_negotiate(H3270 *hSession) | @@ -286,11 +256,65 @@ int ssl_negotiate(H3270 *hSession) | ||
286 | 256 | ||
287 | /* Tell the world that we are (still) connected, now in secure mode. */ | 257 | /* Tell the world that we are (still) connected, now in secure mode. */ |
288 | lib3270_set_connected_initial(hSession); | 258 | lib3270_set_connected_initial(hSession); |
289 | - non_blocking(hSession,True); | ||
290 | 259 | ||
291 | return 0; | 260 | return 0; |
292 | } | 261 | } |
293 | 262 | ||
263 | +int ssl_negotiate(H3270 *hSession) | ||
264 | +{ | ||
265 | + int rc; | ||
266 | + struct ssl_error_message msg; | ||
267 | + | ||
268 | + memset(&msg,0,sizeof(msg)); | ||
269 | + | ||
270 | + set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | ||
271 | + non_blocking(hSession,False); | ||
272 | + | ||
273 | + rc = lib3270_run_task(hSession, background_ssl_negotiation, &msg); | ||
274 | + if(rc) | ||
275 | + { | ||
276 | + // SSL Negotiation has failed. | ||
277 | + if(msg.description) | ||
278 | + lib3270_popup_dialog(hSession, LIB3270_NOTIFY_ERROR, msg.title, msg.text, "%s", msg.description); | ||
279 | + else | ||
280 | + lib3270_popup_dialog(hSession, LIB3270_NOTIFY_ERROR, msg.title, msg.text, "%s", ERR_reason_error_string(msg.error)); | ||
281 | + | ||
282 | + lib3270_disconnect(hSession); | ||
283 | + | ||
284 | + } | ||
285 | + | ||
286 | + non_blocking(hSession,True); | ||
287 | + | ||
288 | + return rc; | ||
289 | +} | ||
290 | + | ||
291 | +int ssl_init(H3270 *hSession) { | ||
292 | + | ||
293 | + int rc; | ||
294 | + struct ssl_error_message msg; | ||
295 | + | ||
296 | + memset(&msg,0,sizeof(msg)); | ||
297 | + | ||
298 | + non_blocking(hSession,False); | ||
299 | + | ||
300 | + rc = lib3270_run_task(hSession, background_ssl_init, &msg); | ||
301 | + if(rc) | ||
302 | + { | ||
303 | + // SSL init has failed. | ||
304 | + if(msg.description) | ||
305 | + lib3270_popup_dialog(hSession, LIB3270_NOTIFY_ERROR, msg.title, msg.text, "%s", msg.description); | ||
306 | + else | ||
307 | + lib3270_popup_dialog(hSession, LIB3270_NOTIFY_ERROR, msg.title, msg.text, "%s", ERR_reason_error_string(msg.error)); | ||
308 | + | ||
309 | + lib3270_disconnect(hSession); | ||
310 | + } | ||
311 | + | ||
312 | + non_blocking(hSession,True); | ||
313 | + | ||
314 | + return rc; | ||
315 | + | ||
316 | +} | ||
317 | + | ||
294 | /* Callback for tracing protocol negotiation. */ | 318 | /* Callback for tracing protocol negotiation. */ |
295 | void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | 319 | void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) |
296 | { | 320 | { |
@@ -352,7 +376,7 @@ void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | @@ -352,7 +376,7 @@ void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | ||
352 | ); | 376 | ); |
353 | 377 | ||
354 | } | 378 | } |
355 | - | 379 | + break; |
356 | 380 | ||
357 | default: | 381 | default: |
358 | trace_dsn(hSession,"SSL Current state is \"%s\"\n",SSL_state_string_long(s)); | 382 | trace_dsn(hSession,"SSL Current state is \"%s\"\n",SSL_state_string_long(s)); |
src/lib3270/telnet.c
@@ -908,10 +908,10 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession) | @@ -908,10 +908,10 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession) | ||
908 | } | 908 | } |
909 | #endif | 909 | #endif |
910 | 910 | ||
911 | - if(hSession->ns_write_id) | 911 | + if(hSession->xio.write) |
912 | { | 912 | { |
913 | - lib3270_remove_poll(hSession, hSession->ns_write_id); | ||
914 | - hSession->ns_write_id = 0; | 913 | + lib3270_remove_poll(hSession, hSession->xio.write); |
914 | + hSession->xio.write = 0; | ||
915 | } | 915 | } |
916 | 916 | ||
917 | if(hSession->sock >= 0) | 917 | if(hSession->sock >= 0) |
@@ -1964,10 +1964,10 @@ void net_exception(H3270 *session, int fd unused, LIB3270_IO_FLAG flag unused, v | @@ -1964,10 +1964,10 @@ void net_exception(H3270 *session, int fd unused, LIB3270_IO_FLAG flag unused, v | ||
1964 | { | 1964 | { |
1965 | session->syncing = 1; | 1965 | session->syncing = 1; |
1966 | 1966 | ||
1967 | - if(session->ns_exception_id) | 1967 | + if(session->xio.except) |
1968 | { | 1968 | { |
1969 | - lib3270_remove_poll(session, session->ns_exception_id); | ||
1970 | - session->ns_exception_id = NULL; | 1969 | + lib3270_remove_poll(session, session->xio.except); |
1970 | + session->xio.except = NULL; | ||
1971 | } | 1971 | } |
1972 | } | 1972 | } |
1973 | } | 1973 | } |
src/lib3270/util.c
@@ -35,21 +35,9 @@ | @@ -35,21 +35,9 @@ | ||
35 | #define _GNU_SOURCE | 35 | #define _GNU_SOURCE |
36 | 36 | ||
37 | #include "private.h" | 37 | #include "private.h" |
38 | -// #include <pwd.h> | ||
39 | - | ||
40 | -//#ifdef HAVE_ICONV | ||
41 | -// #include <iconv.h> | ||
42 | -//#endif // HAVE_ICONV | ||
43 | - | ||
44 | -//#include <stdarg.h> | ||
45 | -// #include "resources.h" | ||
46 | - | ||
47 | #include "utilc.h" | 38 | #include "utilc.h" |
48 | -//#include "popupsc.h" | ||
49 | -//#include "api.h" | ||
50 | - | ||
51 | -//#include <lib3270/session.h> | ||
52 | -//#include <lib3270/selection.h> | 39 | +#include "popupsc.h" |
40 | +#include <lib3270/selection.h> | ||
53 | 41 | ||
54 | #define my_isspace(c) isspace((unsigned char)c) | 42 | #define my_isspace(c) isspace((unsigned char)c) |
55 | 43 |