Commit 2fa612683abb6e3d86448072683a5f2f60763d64
1 parent
889dfbb2
Exists in
master
and in
3 other branches
SSL support is now allways active; the network module takes care of it.
Showing
8 changed files
with
91 additions
and
202 deletions
Show diff stats
src/core/connect.c
| @@ -124,11 +124,10 @@ | @@ -124,11 +124,10 @@ | ||
| 124 | return errno == 0 ? -1 : errno; | 124 | return errno == 0 ? -1 : errno; |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | -// debug("%s: TLS/SSL is %s",__FUNCTION__,hSession->ssl.enabled ? "ENABLED" : "DISABLED") | ||
| 128 | -// trace_dsn(hSession,"TLS/SSL is %s\n", hSession->ssl.enabled ? "enabled" : "disabled" ); | 127 | + debug("%s: TLS/SSL is %s",__FUNCTION__,hSession->ssl.host ? "ENABLED" : "DISABLED") |
| 128 | + trace_dsn(hSession,"TLS/SSL is %s\n", hSession->ssl.host ? "enabled" : "disabled" ); | ||
| 129 | 129 | ||
| 130 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | 130 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 131 | - // hSession->ssl.host = 0; | ||
| 132 | 131 | ||
| 133 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | 132 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); |
| 134 | lib3270_write_event_trace(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); | 133 | lib3270_write_event_trace(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); |
| @@ -139,12 +138,10 @@ | @@ -139,12 +138,10 @@ | ||
| 139 | 138 | ||
| 140 | } | 139 | } |
| 141 | 140 | ||
| 142 | - int lib3270_start_tls(H3270 *hSession, Bool required) | 141 | + int lib3270_start_tls(H3270 *hSession) |
| 143 | { | 142 | { |
| 144 | int rc = 0; | 143 | int rc = 0; |
| 145 | 144 | ||
| 146 | - hSession->ssl.required = (required ? 1 : 0); | ||
| 147 | - | ||
| 148 | LIB3270_NETWORK_STATE state; | 145 | LIB3270_NETWORK_STATE state; |
| 149 | memset(&state,0,sizeof(state)); | 146 | memset(&state,0,sizeof(state)); |
| 150 | 147 | ||
| @@ -156,10 +153,11 @@ | @@ -156,10 +153,11 @@ | ||
| 156 | &state | 153 | &state |
| 157 | ); | 154 | ); |
| 158 | 155 | ||
| 159 | - if(required && rc) { | 156 | + non_blocking(hSession,True); |
| 160 | 157 | ||
| 161 | - // SSL is required and TLS/SSL has failed, abort. | 158 | + if(hSession->ssl.host && rc) { |
| 162 | 159 | ||
| 160 | + // SSL is required and TLS/SSL has failed, abort. | ||
| 163 | lib3270_popup(hSession,state.popup,0); | 161 | lib3270_popup(hSession,state.popup,0); |
| 164 | lib3270_disconnect(hSession); | 162 | lib3270_disconnect(hSession); |
| 165 | return rc; | 163 | return rc; |
| @@ -168,8 +166,6 @@ | @@ -168,8 +166,6 @@ | ||
| 168 | 166 | ||
| 169 | // Not required or success | 167 | // Not required or success |
| 170 | 168 | ||
| 171 | - non_blocking(hSession,True); | ||
| 172 | - | ||
| 173 | return 0; | 169 | return 0; |
| 174 | } | 170 | } |
| 175 | 171 |
src/core/iocalls.c
| @@ -307,7 +307,10 @@ LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) | @@ -307,7 +307,10 @@ LIB3270_EXPORT void lib3270_remove_poll(H3270 *session, void *id) | ||
| 307 | LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled) | 307 | LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled) |
| 308 | { | 308 | { |
| 309 | if(id) | 309 | if(id) |
| 310 | + { | ||
| 311 | + debug("%s: Polling on %p is %s",__FUNCTION__,id,(enabled ? "enabled" : "disabled")) | ||
| 310 | set_poll_state(session, id, enabled); | 312 | set_poll_state(session, id, enabled); |
| 313 | + } | ||
| 311 | } | 314 | } |
| 312 | 315 | ||
| 313 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) | 316 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) |
src/core/linux/connect.c
| @@ -105,7 +105,7 @@ | @@ -105,7 +105,7 @@ | ||
| 105 | hSession->xio.except = hSession->network.module->add_poll(hSession,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); | 105 | hSession->xio.except = hSession->network.module->add_poll(hSession,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); |
| 106 | hSession->xio.read = hSession->network.module->add_poll(hSession,LIB3270_IO_FLAG_READ,net_input,0); | 106 | hSession->xio.read = hSession->network.module->add_poll(hSession,LIB3270_IO_FLAG_READ,net_input,0); |
| 107 | 107 | ||
| 108 | - if(lib3270_start_tls(hSession,0)) | 108 | + if(lib3270_start_tls(hSession)) |
| 109 | return; | 109 | return; |
| 110 | 110 | ||
| 111 | lib3270_setup_session(hSession); | 111 | lib3270_setup_session(hSession); |
src/core/telnet.c
| @@ -50,10 +50,6 @@ | @@ -50,10 +50,6 @@ | ||
| 50 | #endif // !ANDROID | 50 | #endif // !ANDROID |
| 51 | 51 | ||
| 52 | #include <config.h> | 52 | #include <config.h> |
| 53 | -#if defined(HAVE_LIBSSL) | ||
| 54 | - #include <openssl/ssl.h> | ||
| 55 | - #include <openssl/err.h> | ||
| 56 | -#endif | ||
| 57 | 53 | ||
| 58 | #include <internals.h> | 54 | #include <internals.h> |
| 59 | #include <errno.h> | 55 | #include <errno.h> |
| @@ -148,9 +144,7 @@ static void store3270in(H3270 *hSession, unsigned char c); | @@ -148,9 +144,7 @@ static void store3270in(H3270 *hSession, unsigned char c); | ||
| 148 | static void check_linemode(H3270 *hSession, Boolean init); | 144 | static void check_linemode(H3270 *hSession, Boolean init); |
| 149 | static int net_connected(H3270 *session); | 145 | static int net_connected(H3270 *session); |
| 150 | 146 | ||
| 151 | -#if defined(HAVE_LIBSSL) | ||
| 152 | static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len); | 147 | static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len); |
| 153 | -#endif // HAVE_LIBSSL | ||
| 154 | 148 | ||
| 155 | #if defined(X3270_TN3270E) /*[*/ | 149 | #if defined(X3270_TN3270E) /*[*/ |
| 156 | static int tn3270e_negotiate(H3270 *hSession); | 150 | static int tn3270e_negotiate(H3270 *hSession); |
| @@ -397,33 +391,15 @@ static void setup_lus(H3270 *hSession) | @@ -397,33 +391,15 @@ static void setup_lus(H3270 *hSession) | ||
| 397 | 391 | ||
| 398 | static int net_connected(H3270 *hSession) | 392 | static int net_connected(H3270 *hSession) |
| 399 | { | 393 | { |
| 400 | - /* | ||
| 401 | - if(hSession->proxy_type > 0) | ||
| 402 | - { | ||
| 403 | - // Negotiate with the proxy. | ||
| 404 | - trace_dsn(hSession,"Connected to proxy server %s, port %u.\n",hSession->proxy_host, hSession->proxy_port); | ||
| 405 | 394 | ||
| 406 | - if (proxy_negotiate(hSession, hSession->proxy_type, hSession->sock, hSession->hostname,hSession->current_port) < 0) | ||
| 407 | - { | ||
| 408 | - host_disconnect(hSession,True); | ||
| 409 | - return -1; | ||
| 410 | - } | ||
| 411 | - } | ||
| 412 | - */ | 395 | + // Set up SSL. |
| 396 | + trace_dsn(hSession,"Connected to %s%s.\n", hSession->host.current,hSession->ssl.host ? " using SSL": ""); | ||
| 413 | 397 | ||
| 414 | -#if defined(HAVE_LIBSSL) | ||
| 415 | - /* Set up SSL. */ | ||
| 416 | - trace_dsn(hSession,"Connected to %s%s.\n", hSession->host.current,hSession->ssl.host? " using SSL": ""); | ||
| 417 | - | ||
| 418 | - if(hSession->ssl.con && hSession->ssl.state == LIB3270_SSL_UNDEFINED) | 398 | + if(hSession->ssl.host && hSession->ssl.state == LIB3270_SSL_UNDEFINED) |
| 419 | { | 399 | { |
| 420 | - if(ssl_negotiate(hSession)) | 400 | + if(lib3270_start_tls(hSession)) |
| 421 | return -1; | 401 | return -1; |
| 422 | } | 402 | } |
| 423 | -#else | ||
| 424 | - trace_dsn(hSession,"Connected to %s.\n", hSession->host.current); | ||
| 425 | - | ||
| 426 | -#endif | ||
| 427 | 403 | ||
| 428 | lib3270_setup_session(hSession); | 404 | lib3270_setup_session(hSession); |
| 429 | 405 | ||
| @@ -449,9 +425,7 @@ LIB3270_EXPORT void lib3270_setup_session(H3270 *hSession) | @@ -449,9 +425,7 @@ LIB3270_EXPORT void lib3270_setup_session(H3270 *hSession) | ||
| 449 | hSession->response_required = TN3270E_RSF_NO_RESPONSE; | 425 | hSession->response_required = TN3270E_RSF_NO_RESPONSE; |
| 450 | #endif | 426 | #endif |
| 451 | 427 | ||
| 452 | -#if defined(HAVE_LIBSSL) | ||
| 453 | hSession->need_tls_follows = 0; | 428 | hSession->need_tls_follows = 0; |
| 454 | -#endif | ||
| 455 | hSession->telnet_state = TNS_DATA; | 429 | hSession->telnet_state = TNS_DATA; |
| 456 | hSession->ibptr = hSession->ibuf; | 430 | hSession->ibptr = hSession->ibuf; |
| 457 | 431 | ||
| @@ -485,14 +459,14 @@ LIB3270_EXPORT void lib3270_setup_session(H3270 *hSession) | @@ -485,14 +459,14 @@ LIB3270_EXPORT void lib3270_setup_session(H3270 *hSession) | ||
| 485 | 459 | ||
| 486 | } | 460 | } |
| 487 | 461 | ||
| 488 | -/** | ||
| 489 | - * @brief Connection_complete. | ||
| 490 | - * | ||
| 491 | - * The connection appears to be complete (output is possible or input | ||
| 492 | - * appeared ready but recv() returned EWOULDBLOCK). Complete the | ||
| 493 | - * connection-completion processing. | ||
| 494 | - * | ||
| 495 | - */ | 462 | +/* |
| 463 | +/// | ||
| 464 | +/// @brief Connection_complete. | ||
| 465 | +/// | ||
| 466 | +/// The connection appears to be complete (output is possible or input | ||
| 467 | +/// appeared ready but recv() returned EWOULDBLOCK). Complete the | ||
| 468 | +/// connection-completion processing. | ||
| 469 | +/// | ||
| 496 | static void connection_complete(H3270 *session) | 470 | static void connection_complete(H3270 *session) |
| 497 | { | 471 | { |
| 498 | if (non_blocking(session,False) < 0) | 472 | if (non_blocking(session,False) < 0) |
| @@ -503,56 +477,11 @@ static void connection_complete(H3270 *session) | @@ -503,56 +477,11 @@ static void connection_complete(H3270 *session) | ||
| 503 | lib3270_set_connected_initial(session); | 477 | lib3270_set_connected_initial(session); |
| 504 | net_connected(session); | 478 | net_connected(session); |
| 505 | } | 479 | } |
| 506 | - | ||
| 507 | - | ||
| 508 | -/* | ||
| 509 | -LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession) | ||
| 510 | -{ | ||
| 511 | - LIB3270_NETWORK_STATE state; | ||
| 512 | - memset(&state,0,sizeof(state)); | ||
| 513 | - | ||
| 514 | -#if defined(HAVE_LIBSSL) | ||
| 515 | - if(hSession->ssl.con != NULL) | ||
| 516 | - { | ||
| 517 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
| 518 | - SSL_shutdown(hSession->ssl.con); | ||
| 519 | - SSL_free(hSession->ssl.con); | ||
| 520 | - hSession->ssl.con = NULL; | ||
| 521 | - } | ||
| 522 | -#endif | ||
| 523 | - | ||
| 524 | - if(hSession->xio.write) | ||
| 525 | - { | ||
| 526 | - lib3270_remove_poll(hSession, hSession->xio.write); | ||
| 527 | - hSession->xio.write = 0; | ||
| 528 | - } | ||
| 529 | - | ||
| 530 | - hSession->network.module->disconnect(hSession->network.context,hSession,&state); | ||
| 531 | - | ||
| 532 | -} | ||
| 533 | */ | 480 | */ |
| 534 | 481 | ||
| 535 | -/** | ||
| 536 | - * @brief Disconnect from host. | ||
| 537 | - */ | 482 | +/// @brief Disconnect from host. |
| 538 | void net_disconnect(H3270 *hSession) | 483 | void net_disconnect(H3270 *hSession) |
| 539 | { | 484 | { |
| 540 | - | ||
| 541 | - // Disconnect from host | ||
| 542 | -#if defined(HAVE_LIBSSL) | ||
| 543 | - if(hSession->ssl.con != NULL) | ||
| 544 | - { | ||
| 545 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
| 546 | - SSL_shutdown(hSession->ssl.con); | ||
| 547 | - SSL_free(hSession->ssl.con); | ||
| 548 | - hSession->ssl.con = NULL; | ||
| 549 | - } | ||
| 550 | - else | ||
| 551 | - { | ||
| 552 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 553 | - } | ||
| 554 | -#endif | ||
| 555 | - | ||
| 556 | if(hSession->xio.write) | 485 | if(hSession->xio.write) |
| 557 | { | 486 | { |
| 558 | lib3270_remove_poll(hSession, hSession->xio.write); | 487 | lib3270_remove_poll(hSession, hSession->xio.write); |
| @@ -633,71 +562,34 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED | @@ -633,71 +562,34 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED | ||
| 633 | hSession->ansi_data = 0; | 562 | hSession->ansi_data = 0; |
| 634 | #endif | 563 | #endif |
| 635 | 564 | ||
| 636 | -#if defined(HAVE_LIBSSL) | 565 | +/* |
| 637 | if (hSession->ssl.con != NULL) | 566 | if (hSession->ssl.con != NULL) |
| 638 | nr = SSL_read(hSession->ssl.con, (char *) buffer, BUFSZ); | 567 | nr = SSL_read(hSession->ssl.con, (char *) buffer, BUFSZ); |
| 639 | else | 568 | else |
| 640 | nr = hSession->network.module->recv(hSession, buffer, BUFSZ); | 569 | nr = hSession->network.module->recv(hSession, buffer, BUFSZ); |
| 641 | -#else | ||
| 642 | - nr = hSession->network.module->recv(hSession, buffer, BUFSZ); | ||
| 643 | -#endif // HAVE_LIBSSL | 570 | +*/ |
| 571 | + nr = hSession->network.module->recv(hSession, buffer, BUFSZ); | ||
| 644 | 572 | ||
| 645 | if (nr < 0) | 573 | if (nr < 0) |
| 646 | { | 574 | { |
| 647 | - if (socket_errno() == SE_EWOULDBLOCK) | ||
| 648 | - return; | ||
| 649 | - | ||
| 650 | -#if defined(HAVE_LIBSSL) /*[*/ | ||
| 651 | - if(hSession->ssl.con != NULL) | ||
| 652 | - { | ||
| 653 | - static const LIB3270_POPUP popup = { | ||
| 654 | - .type = LIB3270_NOTIFY_ERROR, | ||
| 655 | - .summary = N_( "SSL Read error" ) | ||
| 656 | - }; | ||
| 657 | - | ||
| 658 | - SSL_ERROR_MESSAGE message = { | ||
| 659 | - .code = ERR_get_error(), | ||
| 660 | - .popup = &popup | ||
| 661 | - }; | ||
| 662 | - | ||
| 663 | - popup_ssl_error(hSession,0,&message); | ||
| 664 | - | ||
| 665 | - /* | ||
| 666 | - unsigned long e; | ||
| 667 | - char err_buf[120]; | ||
| 668 | - | ||
| 669 | - e = ERR_get_error(); | ||
| 670 | - if (e != 0) | ||
| 671 | - { | ||
| 672 | - (void) ERR_error_string(e, err_buf); | ||
| 673 | - trace_dsn(hSession,"RCVD SSL_read error %ld (%s)\n", e,err_buf); | ||
| 674 | - hSession->cbk.message(hSession,LIB3270_NOTIFY_ERROR,_( "SSL Error" ),_( "SSL Read error" ),err_buf ); | ||
| 675 | - ssl_popup_message(hSession,msg); | ||
| 676 | - } | ||
| 677 | - else | ||
| 678 | - { | ||
| 679 | - trace_dsn(hSession,"RCVD SSL_read error %ld (%s)\n", e, "unknown"); | ||
| 680 | - } | ||
| 681 | - */ | ||
| 682 | - | ||
| 683 | - host_disconnect(hSession,True); | 575 | + if (nr == -EWOULDBLOCK) |
| 684 | return; | 576 | return; |
| 685 | - } | ||
| 686 | -#endif /*]*/ | ||
| 687 | 577 | ||
| 688 | - if (HALF_CONNECTED && socket_errno() == SE_EAGAIN) | 578 | + /* |
| 579 | + if (HALF_CONNECTED && nr == -EWOULDBLOCK) | ||
| 689 | { | 580 | { |
| 690 | connection_complete(hSession); | 581 | connection_complete(hSession); |
| 691 | return; | 582 | return; |
| 692 | } | 583 | } |
| 584 | + */ | ||
| 693 | 585 | ||
| 694 | - trace_dsn(hSession,"RCVD socket error %d\n", errno); | 586 | + trace_dsn(hSession,"RCVD socket error %d (%s)\n", -nr, strerror(-nr)); |
| 695 | 587 | ||
| 696 | if (HALF_CONNECTED) | 588 | if (HALF_CONNECTED) |
| 697 | { | 589 | { |
| 698 | popup_a_sockerr(hSession, "%s", hSession->host.current); | 590 | popup_a_sockerr(hSession, "%s", hSession->host.current); |
| 699 | } | 591 | } |
| 700 | - else if (socket_errno() != SE_ECONNRESET) | 592 | + else if (nr != -ECONNRESET) |
| 701 | { | 593 | { |
| 702 | popup_a_sockerr(hSession, _( "Socket read error" ) ); | 594 | popup_a_sockerr(hSession, _( "Socket read error" ) ); |
| 703 | } | 595 | } |
| @@ -1009,55 +901,52 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | @@ -1009,55 +901,52 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | ||
| 1009 | #if defined(X3270_TN3270E) /*[*/ | 901 | #if defined(X3270_TN3270E) /*[*/ |
| 1010 | case TELOPT_TN3270E: | 902 | case TELOPT_TN3270E: |
| 1011 | #endif /*]*/ | 903 | #endif /*]*/ |
| 1012 | -#if defined(HAVE_LIBSSL) /*[*/ | ||
| 1013 | case TELOPT_STARTTLS: | 904 | case TELOPT_STARTTLS: |
| 1014 | -#endif /*]*/ | ||
| 1015 | - if (c == TELOPT_TN3270E && hSession->non_tn3270e_host) | ||
| 1016 | - goto wont; | ||
| 1017 | - if (c == TELOPT_TM && !hSession->bsd_tm) | ||
| 1018 | - goto wont; | 905 | + if (c == TELOPT_TN3270E && hSession->non_tn3270e_host) |
| 906 | + goto wont; | ||
| 907 | + if (c == TELOPT_TM && !hSession->bsd_tm) | ||
| 908 | + goto wont; | ||
| 1019 | 909 | ||
| 1020 | - trace("hSession->myopts[c]=%d",hSession->myopts[c]); | ||
| 1021 | - if (!hSession->myopts[c]) | ||
| 1022 | - { | ||
| 1023 | - if (c != TELOPT_TM) | ||
| 1024 | - hSession->myopts[c] = 1; | ||
| 1025 | - will_opt[2] = c; | ||
| 1026 | - net_rawout(hSession, will_opt, sizeof(will_opt)); | ||
| 1027 | - trace_dsn(hSession,"SENT %s %s\n", cmd(WILL), opt(c)); | ||
| 1028 | - check_in3270(hSession); | ||
| 1029 | - check_linemode(hSession,False); | ||
| 1030 | - } | ||
| 1031 | - if (c == TELOPT_NAWS) | ||
| 1032 | - send_naws(hSession); | ||
| 1033 | -#if defined(HAVE_LIBSSL) /*[*/ | ||
| 1034 | - if (c == TELOPT_STARTTLS) { | ||
| 1035 | - static unsigned char follows_msg[] = { | ||
| 1036 | - IAC, SB, TELOPT_STARTTLS, | ||
| 1037 | - TLS_FOLLOWS, IAC, SE | ||
| 1038 | - }; | 910 | + trace("hSession->myopts[c]=%d",hSession->myopts[c]); |
| 911 | + if (!hSession->myopts[c]) | ||
| 912 | + { | ||
| 913 | + if (c != TELOPT_TM) | ||
| 914 | + hSession->myopts[c] = 1; | ||
| 915 | + will_opt[2] = c; | ||
| 916 | + net_rawout(hSession, will_opt, sizeof(will_opt)); | ||
| 917 | + trace_dsn(hSession,"SENT %s %s\n", cmd(WILL), opt(c)); | ||
| 918 | + check_in3270(hSession); | ||
| 919 | + check_linemode(hSession,False); | ||
| 920 | + } | ||
| 921 | + if (c == TELOPT_NAWS) | ||
| 922 | + send_naws(hSession); | ||
| 923 | + if (c == TELOPT_STARTTLS) { | ||
| 924 | + static unsigned char follows_msg[] = { | ||
| 925 | + IAC, SB, TELOPT_STARTTLS, | ||
| 926 | + TLS_FOLLOWS, IAC, SE | ||
| 927 | + }; | ||
| 928 | + | ||
| 929 | + // | ||
| 930 | + // Send IAC SB STARTTLS FOLLOWS IAC SE | ||
| 931 | + // to announce that what follows is TLS. | ||
| 932 | + // | ||
| 933 | + net_rawout(hSession, follows_msg, sizeof(follows_msg)); | ||
| 934 | + trace_dsn(hSession,"SENT %s %s FOLLOWS %s\n", | ||
| 935 | + cmd(SB), | ||
| 936 | + opt(TELOPT_STARTTLS), | ||
| 937 | + cmd(SE)); | ||
| 938 | + | ||
| 939 | + debug("%s: %s requires TLS/SSL",__FUNCTION__,opt(TELOPT_STARTTLS)); | ||
| 940 | + hSession->need_tls_follows = 1; | ||
| 941 | + } | ||
| 942 | + break; | ||
| 1039 | 943 | ||
| 1040 | - /* | ||
| 1041 | - * Send IAC SB STARTTLS FOLLOWS IAC SE | ||
| 1042 | - * to announce that what follows is TLS. | ||
| 1043 | - */ | ||
| 1044 | - net_rawout(hSession, follows_msg, sizeof(follows_msg)); | ||
| 1045 | - trace_dsn(hSession,"SENT %s %s FOLLOWS %s\n", | ||
| 1046 | - cmd(SB), | ||
| 1047 | - opt(TELOPT_STARTTLS), | ||
| 1048 | - cmd(SE)); | ||
| 1049 | - | ||
| 1050 | - debug("%s: %s requires TLS/SSL",__FUNCTION__,opt(TELOPT_STARTTLS)); | ||
| 1051 | - hSession->need_tls_follows = 1; | ||
| 1052 | - } | ||
| 1053 | -#endif /*]*/ | ||
| 1054 | - break; | ||
| 1055 | default: | 944 | default: |
| 1056 | - wont: | ||
| 1057 | - wont_opt[2] = c; | ||
| 1058 | - net_rawout(hSession, wont_opt, sizeof(wont_opt)); | ||
| 1059 | - trace_dsn(hSession,"SENT %s %s\n", cmd(WONT), opt(c)); | ||
| 1060 | - break; | 945 | + wont: |
| 946 | + wont_opt[2] = c; | ||
| 947 | + net_rawout(hSession, wont_opt, sizeof(wont_opt)); | ||
| 948 | + trace_dsn(hSession,"SENT %s %s\n", cmd(WONT), opt(c)); | ||
| 949 | + break; | ||
| 1061 | } | 950 | } |
| 1062 | hSession->telnet_state = TNS_DATA; | 951 | hSession->telnet_state = TNS_DATA; |
| 1063 | break; | 952 | break; |
| @@ -1137,12 +1026,10 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | @@ -1137,12 +1026,10 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | ||
| 1137 | return -1; | 1026 | return -1; |
| 1138 | } | 1027 | } |
| 1139 | #endif /*]*/ | 1028 | #endif /*]*/ |
| 1140 | -#if defined(HAVE_LIBSSL) /*[*/ | ||
| 1141 | else if (hSession->need_tls_follows && hSession->myopts[TELOPT_STARTTLS] && hSession->sbbuf[0] == TELOPT_STARTTLS) | 1029 | else if (hSession->need_tls_follows && hSession->myopts[TELOPT_STARTTLS] && hSession->sbbuf[0] == TELOPT_STARTTLS) |
| 1142 | { | 1030 | { |
| 1143 | continue_tls(hSession,hSession->sbbuf, hSession->sbptr - hSession->sbbuf); | 1031 | continue_tls(hSession,hSession->sbbuf, hSession->sbptr - hSession->sbbuf); |
| 1144 | } | 1032 | } |
| 1145 | -#endif /*]*/ | ||
| 1146 | 1033 | ||
| 1147 | } else { | 1034 | } else { |
| 1148 | hSession->telnet_state = TNS_SB; | 1035 | hSession->telnet_state = TNS_SB; |
| @@ -1152,16 +1039,13 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | @@ -1152,16 +1039,13 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) | ||
| 1152 | return 0; | 1039 | return 0; |
| 1153 | } | 1040 | } |
| 1154 | 1041 | ||
| 1155 | -#if defined(HAVE_LIBSSL) | ||
| 1156 | -/** | ||
| 1157 | - * Process a STARTTLS subnegotiation. | ||
| 1158 | - */ | 1042 | +/// @brief Process a STARTTLS subnegotiation. |
| 1159 | static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len) | 1043 | static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len) |
| 1160 | { | 1044 | { |
| 1161 | - /* Whatever happens, we're not expecting another SB STARTTLS. */ | 1045 | + // Whatever happens, we're not expecting another SB STARTTLS. |
| 1162 | hSession->need_tls_follows = 0; | 1046 | hSession->need_tls_follows = 0; |
| 1163 | 1047 | ||
| 1164 | - /* Make sure the option is FOLLOWS. */ | 1048 | + // Make sure the option is FOLLOWS. |
| 1165 | if (len < 2 || sbbuf[1] != TLS_FOLLOWS) | 1049 | if (len < 2 || sbbuf[1] != TLS_FOLLOWS) |
| 1166 | { | 1050 | { |
| 1167 | /* Trace the junk. */ | 1051 | /* Trace the junk. */ |
| @@ -1171,11 +1055,13 @@ static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len) | @@ -1171,11 +1055,13 @@ static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len) | ||
| 1171 | return; | 1055 | return; |
| 1172 | } | 1056 | } |
| 1173 | 1057 | ||
| 1174 | - /* Trace what we got. */ | 1058 | + // Trace what we got. |
| 1175 | trace_dsn(hSession,"%s FOLLOWS %s\n", opt(TELOPT_STARTTLS), cmd(SE)); | 1059 | trace_dsn(hSession,"%s FOLLOWS %s\n", opt(TELOPT_STARTTLS), cmd(SE)); |
| 1176 | - ssl_negotiate(hSession); | 1060 | + |
| 1061 | + hSession->ssl.host = 1; // Set host type as SSL. | ||
| 1062 | + lib3270_start_tls(hSession); | ||
| 1063 | + | ||
| 1177 | } | 1064 | } |
| 1178 | -#endif // HAVE_LIBSSL | ||
| 1179 | 1065 | ||
| 1180 | #if defined(X3270_TN3270E) /*[*/ | 1066 | #if defined(X3270_TN3270E) /*[*/ |
| 1181 | /// @brief Send a TN3270E terminal type request. | 1067 | /// @brief Send a TN3270E terminal type request. |
src/include/internals.h
| @@ -683,8 +683,8 @@ struct _h3270 | @@ -683,8 +683,8 @@ struct _h3270 | ||
| 683 | 683 | ||
| 684 | struct | 684 | struct |
| 685 | { | 685 | { |
| 686 | - int error; ///< @brief OpenSSL error. | ||
| 687 | - unsigned char required; ///< @brief Non zero if SSL is required. | 686 | + int host : 1; ///< @brief Non zero if host requires SSL. |
| 687 | + int error; ///< @brief OpenSSL error. | ||
| 688 | LIB3270_SSL_STATE state; | 688 | LIB3270_SSL_STATE state; |
| 689 | } ssl; | 689 | } ssl; |
| 690 | 690 | ||
| @@ -856,6 +856,6 @@ LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | @@ -856,6 +856,6 @@ LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | ||
| 856 | /// | 856 | /// |
| 857 | /// @retval ENOTSUP TLS/SSL is not supported by library. | 857 | /// @retval ENOTSUP TLS/SSL is not supported by library. |
| 858 | /// | 858 | /// |
| 859 | - LIB3270_INTERNAL int lib3270_start_tls(H3270 *hSession, Bool required); | 859 | + LIB3270_INTERNAL int lib3270_start_tls(H3270 *hSession); |
| 860 | 860 | ||
| 861 | 861 |
src/network_modules/openssl.c
| @@ -165,8 +165,9 @@ static int openssl_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state | @@ -165,8 +165,9 @@ static int openssl_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state | ||
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | // | 167 | // |
| 168 | - // Connect to host. | 168 | + // Enable SSL & Connect to host. |
| 169 | // | 169 | // |
| 170 | + hSession->ssl.host = 1; | ||
| 170 | context->sock = lib3270_network_connect(hSession, state); | 171 | context->sock = lib3270_network_connect(hSession, state); |
| 171 | 172 | ||
| 172 | return (context->sock < 0 ? -1 : 0); | 173 | return (context->sock < 0 ? -1 : 0); |
| @@ -204,6 +205,7 @@ void lib3270_set_openssl_network_module(H3270 *hSession) { | @@ -204,6 +205,7 @@ void lib3270_set_openssl_network_module(H3270 *hSession) { | ||
| 204 | hSession->network.module->finalize(hSession); | 205 | hSession->network.module->finalize(hSession); |
| 205 | } | 206 | } |
| 206 | 207 | ||
| 208 | + hSession->ssl.host = 1; | ||
| 207 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); | 209 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); |
| 208 | memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); | 210 | memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); |
| 209 | 211 |
src/network_modules/unsecure.c
| @@ -249,7 +249,7 @@ static int unsecure_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *stat | @@ -249,7 +249,7 @@ static int unsecure_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *stat | ||
| 249 | 249 | ||
| 250 | static int unsecure_network_start_tls(H3270 GNUC_UNUSED(*hSession), LIB3270_NETWORK_STATE *msg) { | 250 | static int unsecure_network_start_tls(H3270 GNUC_UNUSED(*hSession), LIB3270_NETWORK_STATE *msg) { |
| 251 | 251 | ||
| 252 | - if(hSession->ssl.required) { | 252 | + if(hSession->ssl.host) { |
| 253 | 253 | ||
| 254 | // TODO: Replace network module with the openssl version, initialize and execute start_tls on it. | 254 | // TODO: Replace network module with the openssl version, initialize and execute start_tls on it. |
| 255 | 255 | ||
| @@ -292,6 +292,7 @@ void lib3270_set_default_network_module(H3270 *hSession) { | @@ -292,6 +292,7 @@ void lib3270_set_default_network_module(H3270 *hSession) { | ||
| 292 | hSession->network.module->finalize(hSession); | 292 | hSession->network.module->finalize(hSession); |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | + hSession->ssl.host = 0; | ||
| 295 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); | 296 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); |
| 296 | memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); | 297 | memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); |
| 297 | hSession->network.context->sock = -1; | 298 | hSession->network.context->sock = -1; |
src/testprogram/testprogram.c
| @@ -116,6 +116,7 @@ int main(int argc, char *argv[]) | @@ -116,6 +116,7 @@ int main(int argc, char *argv[]) | ||
| 116 | case 't': | 116 | case 't': |
| 117 | trace_file = optarg; | 117 | trace_file = optarg; |
| 118 | lib3270_set_trace_handler(h,write_trace,NULL); | 118 | lib3270_set_trace_handler(h,write_trace,NULL); |
| 119 | + lib3270_set_toggle(h,LIB3270_TOGGLE_DS_TRACE,1); | ||
| 119 | break; | 120 | break; |
| 120 | } | 121 | } |
| 121 | 122 |