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 |