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 | 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 | 130 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 131 | - // hSession->ssl.host = 0; | |
| 132 | 131 | |
| 133 | 132 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); |
| 134 | 133 | lib3270_write_event_trace(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); |
| ... | ... | @@ -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 | 143 | int rc = 0; |
| 145 | 144 | |
| 146 | - hSession->ssl.required = (required ? 1 : 0); | |
| 147 | - | |
| 148 | 145 | LIB3270_NETWORK_STATE state; |
| 149 | 146 | memset(&state,0,sizeof(state)); |
| 150 | 147 | |
| ... | ... | @@ -156,10 +153,11 @@ |
| 156 | 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 | 161 | lib3270_popup(hSession,state.popup,0); |
| 164 | 162 | lib3270_disconnect(hSession); |
| 165 | 163 | return rc; |
| ... | ... | @@ -168,8 +166,6 @@ |
| 168 | 166 | |
| 169 | 167 | // Not required or success |
| 170 | 168 | |
| 171 | - non_blocking(hSession,True); | |
| 172 | - | |
| 173 | 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 | 307 | LIB3270_EXPORT void lib3270_set_poll_state(H3270 *session, void *id, int enabled) |
| 308 | 308 | { |
| 309 | 309 | if(id) |
| 310 | + { | |
| 311 | + debug("%s: Polling on %p is %s",__FUNCTION__,id,(enabled ? "enabled" : "disabled")) | |
| 310 | 312 | set_poll_state(session, id, enabled); |
| 313 | + } | |
| 311 | 314 | } |
| 312 | 315 | |
| 313 | 316 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd) | ... | ... |
src/core/linux/connect.c
| ... | ... | @@ -105,7 +105,7 @@ |
| 105 | 105 | hSession->xio.except = hSession->network.module->add_poll(hSession,LIB3270_IO_FLAG_EXCEPTION,net_exception,0); |
| 106 | 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 | 109 | return; |
| 110 | 110 | |
| 111 | 111 | lib3270_setup_session(hSession); | ... | ... |
src/core/telnet.c
| ... | ... | @@ -50,10 +50,6 @@ |
| 50 | 50 | #endif // !ANDROID |
| 51 | 51 | |
| 52 | 52 | #include <config.h> |
| 53 | -#if defined(HAVE_LIBSSL) | |
| 54 | - #include <openssl/ssl.h> | |
| 55 | - #include <openssl/err.h> | |
| 56 | -#endif | |
| 57 | 53 | |
| 58 | 54 | #include <internals.h> |
| 59 | 55 | #include <errno.h> |
| ... | ... | @@ -148,9 +144,7 @@ static void store3270in(H3270 *hSession, unsigned char c); |
| 148 | 144 | static void check_linemode(H3270 *hSession, Boolean init); |
| 149 | 145 | static int net_connected(H3270 *session); |
| 150 | 146 | |
| 151 | -#if defined(HAVE_LIBSSL) | |
| 152 | 147 | static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len); |
| 153 | -#endif // HAVE_LIBSSL | |
| 154 | 148 | |
| 155 | 149 | #if defined(X3270_TN3270E) /*[*/ |
| 156 | 150 | static int tn3270e_negotiate(H3270 *hSession); |
| ... | ... | @@ -397,33 +391,15 @@ static void setup_lus(H3270 *hSession) |
| 397 | 391 | |
| 398 | 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 | 401 | return -1; |
| 422 | 402 | } |
| 423 | -#else | |
| 424 | - trace_dsn(hSession,"Connected to %s.\n", hSession->host.current); | |
| 425 | - | |
| 426 | -#endif | |
| 427 | 403 | |
| 428 | 404 | lib3270_setup_session(hSession); |
| 429 | 405 | |
| ... | ... | @@ -449,9 +425,7 @@ LIB3270_EXPORT void lib3270_setup_session(H3270 *hSession) |
| 449 | 425 | hSession->response_required = TN3270E_RSF_NO_RESPONSE; |
| 450 | 426 | #endif |
| 451 | 427 | |
| 452 | -#if defined(HAVE_LIBSSL) | |
| 453 | 428 | hSession->need_tls_follows = 0; |
| 454 | -#endif | |
| 455 | 429 | hSession->telnet_state = TNS_DATA; |
| 456 | 430 | hSession->ibptr = hSession->ibuf; |
| 457 | 431 | |
| ... | ... | @@ -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 | 470 | static void connection_complete(H3270 *session) |
| 497 | 471 | { |
| 498 | 472 | if (non_blocking(session,False) < 0) |
| ... | ... | @@ -503,56 +477,11 @@ static void connection_complete(H3270 *session) |
| 503 | 477 | lib3270_set_connected_initial(session); |
| 504 | 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 | 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 | 485 | if(hSession->xio.write) |
| 557 | 486 | { |
| 558 | 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 | 562 | hSession->ansi_data = 0; |
| 634 | 563 | #endif |
| 635 | 564 | |
| 636 | -#if defined(HAVE_LIBSSL) | |
| 565 | +/* | |
| 637 | 566 | if (hSession->ssl.con != NULL) |
| 638 | 567 | nr = SSL_read(hSession->ssl.con, (char *) buffer, BUFSZ); |
| 639 | 568 | else |
| 640 | 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 | 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 | 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 | 581 | connection_complete(hSession); |
| 691 | 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 | 588 | if (HALF_CONNECTED) |
| 697 | 589 | { |
| 698 | 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 | 594 | popup_a_sockerr(hSession, _( "Socket read error" ) ); |
| 703 | 595 | } |
| ... | ... | @@ -1009,55 +901,52 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) |
| 1009 | 901 | #if defined(X3270_TN3270E) /*[*/ |
| 1010 | 902 | case TELOPT_TN3270E: |
| 1011 | 903 | #endif /*]*/ |
| 1012 | -#if defined(HAVE_LIBSSL) /*[*/ | |
| 1013 | 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 | 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 | 951 | hSession->telnet_state = TNS_DATA; |
| 1063 | 952 | break; |
| ... | ... | @@ -1137,12 +1026,10 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) |
| 1137 | 1026 | return -1; |
| 1138 | 1027 | } |
| 1139 | 1028 | #endif /*]*/ |
| 1140 | -#if defined(HAVE_LIBSSL) /*[*/ | |
| 1141 | 1029 | else if (hSession->need_tls_follows && hSession->myopts[TELOPT_STARTTLS] && hSession->sbbuf[0] == TELOPT_STARTTLS) |
| 1142 | 1030 | { |
| 1143 | 1031 | continue_tls(hSession,hSession->sbbuf, hSession->sbptr - hSession->sbbuf); |
| 1144 | 1032 | } |
| 1145 | -#endif /*]*/ | |
| 1146 | 1033 | |
| 1147 | 1034 | } else { |
| 1148 | 1035 | hSession->telnet_state = TNS_SB; |
| ... | ... | @@ -1152,16 +1039,13 @@ static int telnet_fsm(H3270 *hSession, unsigned char c) |
| 1152 | 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 | 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 | 1046 | hSession->need_tls_follows = 0; |
| 1163 | 1047 | |
| 1164 | - /* Make sure the option is FOLLOWS. */ | |
| 1048 | + // Make sure the option is FOLLOWS. | |
| 1165 | 1049 | if (len < 2 || sbbuf[1] != TLS_FOLLOWS) |
| 1166 | 1050 | { |
| 1167 | 1051 | /* Trace the junk. */ |
| ... | ... | @@ -1171,11 +1055,13 @@ static void continue_tls(H3270 *hSession, unsigned char *sbbuf, int len) |
| 1171 | 1055 | return; |
| 1172 | 1056 | } |
| 1173 | 1057 | |
| 1174 | - /* Trace what we got. */ | |
| 1058 | + // Trace what we got. | |
| 1175 | 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 | 1066 | #if defined(X3270_TN3270E) /*[*/ |
| 1181 | 1067 | /// @brief Send a TN3270E terminal type request. | ... | ... |
src/include/internals.h
| ... | ... | @@ -683,8 +683,8 @@ struct _h3270 |
| 683 | 683 | |
| 684 | 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 | 688 | LIB3270_SSL_STATE state; |
| 689 | 689 | } ssl; |
| 690 | 690 | |
| ... | ... | @@ -856,6 +856,6 @@ LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); |
| 856 | 856 | /// |
| 857 | 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 | 165 | } |
| 166 | 166 | |
| 167 | 167 | // |
| 168 | - // Connect to host. | |
| 168 | + // Enable SSL & Connect to host. | |
| 169 | 169 | // |
| 170 | + hSession->ssl.host = 1; | |
| 170 | 171 | context->sock = lib3270_network_connect(hSession, state); |
| 171 | 172 | |
| 172 | 173 | return (context->sock < 0 ? -1 : 0); |
| ... | ... | @@ -204,6 +205,7 @@ void lib3270_set_openssl_network_module(H3270 *hSession) { |
| 204 | 205 | hSession->network.module->finalize(hSession); |
| 205 | 206 | } |
| 206 | 207 | |
| 208 | + hSession->ssl.host = 1; | |
| 207 | 209 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); |
| 208 | 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 | 249 | |
| 250 | 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 | 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 | 292 | hSession->network.module->finalize(hSession); |
| 293 | 293 | } |
| 294 | 294 | |
| 295 | + hSession->ssl.host = 0; | |
| 295 | 296 | hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); |
| 296 | 297 | memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); |
| 297 | 298 | hSession->network.context->sock = -1; | ... | ... |
src/testprogram/testprogram.c