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 | 212 | <Unit filename="src/lib3270/sf.c"> |
| 213 | 213 | <Option compilerVar="CC" /> |
| 214 | 214 | </Unit> |
| 215 | - <Unit filename="src/lib3270/ssl/init.c"> | |
| 215 | + <Unit filename="src/lib3270/ssl/ctx_init.c"> | |
| 216 | 216 | <Option compilerVar="CC" /> |
| 217 | 217 | </Unit> |
| 218 | 218 | <Unit filename="src/lib3270/ssl/negotiate.c"> |
| ... | ... | @@ -250,6 +250,9 @@ |
| 250 | 250 | </Unit> |
| 251 | 251 | <Unit filename="src/lib3270/windows/resources.rc" /> |
| 252 | 252 | <Unit filename="src/lib3270/windows/resources.rc.in" /> |
| 253 | + <Unit filename="src/lib3270/windows/util.c"> | |
| 254 | + <Option compilerVar="CC" /> | |
| 255 | + </Unit> | |
| 253 | 256 | <Extensions> |
| 254 | 257 | <code_completion /> |
| 255 | 258 | <envvars /> | ... | ... |
src/include/lib3270.h
| ... | ... | @@ -804,6 +804,7 @@ |
| 804 | 804 | |
| 805 | 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 | 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 | 809 | LIB3270_EXPORT void lib3270_remove_poll_fd(H3270 *session, int fd); |
| 809 | 810 | LIB3270_EXPORT void lib3270_update_poll_fd(H3270 *session, int fd, LIB3270_IO_FLAG flag); |
| ... | ... | @@ -823,6 +824,7 @@ |
| 823 | 824 | |
| 824 | 825 | void * (*add_poll)(H3270 *session, int fd, LIB3270_IO_FLAG flag, void(*proc)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata); |
| 825 | 826 | void (*remove_poll)(H3270 *session, void *id); |
| 827 | + void (*set_poll_state)(H3270 *session, void *id, int enabled); | |
| 826 | 828 | |
| 827 | 829 | int (*Wait)(H3270 *hSession, int seconds); |
| 828 | 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 | 84 | int err; |
| 85 | 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 | 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 | 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 | 131 | #if defined(HAVE_LIBSSL) |
| 132 | 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 | 512 | hSession->cstate = LIB3270_PENDING; |
| 513 | 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 | 516 | // hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected); |
| 517 | 517 | |
| 518 | 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 | 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 | 36 | #include "telnetc.h" |
| 37 | 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 | 52 | #define MILLION 1000000L |
| 40 | 53 | // |
| 41 | 54 | //#if defined(_WIN32) |
| ... | ... | @@ -51,6 +64,8 @@ |
| 51 | 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 | 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 | 69 | static int internal_wait(H3270 *session, int seconds); |
| 55 | 70 | |
| 56 | 71 | static void internal_ring_bell(H3270 *session); |
| ... | ... | @@ -71,6 +86,9 @@ |
| 71 | 86 | static void (*remove_poll)(H3270 *session, void *id) |
| 72 | 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 | 92 | static int (*wait)(H3270 *session, int seconds) |
| 75 | 93 | = internal_wait; |
| 76 | 94 | |
| ... | ... | @@ -246,11 +264,37 @@ static void internal_remove_poll(H3270 *session, void *id) |
| 246 | 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 | 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 | 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 | 332 | } |
| 289 | 333 | |
| 290 | 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 | 336 | return add_poll(session,fd,flag,call,userdata); |
| 292 | 337 | } |
| 293 | 338 | |
| ... | ... | @@ -330,39 +375,39 @@ void RemoveTimeOut(H3270 *session, void * timer) |
| 330 | 375 | |
| 331 | 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 | 380 | debug("%s",__FUNCTION__); |
| 336 | - if(h->ns_exception_id) | |
| 381 | + if(h->xio.except) | |
| 337 | 382 | return; |
| 338 | 383 | |
| 339 | 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 | 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 | 391 | debug("%s",__FUNCTION__); |
| 347 | 392 | |
| 348 | 393 | } |
| 349 | 394 | |
| 350 | 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 | 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 | 599 | unsigned char saved_bg; |
| 600 | 600 | |
| 601 | 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 | 608 | // SSL Data (Always defined to maintain the structure size) |
| 607 | 609 | struct | ... | ... |
| ... | ... | @@ -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 | -/* | |
| 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 | 70 | */ |
| 71 | 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 | 83 | * @brief Initialize openssl session. |
| 75 | 84 | * |
| ... | ... | @@ -78,7 +87,8 @@ |
| 78 | 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 | 93 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 84 | 94 | hSession->ssl.error = 0; |
| ... | ... | @@ -86,21 +96,13 @@ int ssl_init(H3270 *hSession) |
| 86 | 96 | |
| 87 | 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 | 103 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 102 | - | |
| 103 | 104 | hSession->ssl.host = False; |
| 105 | + | |
| 104 | 106 | return -1; |
| 105 | 107 | } |
| 106 | 108 | |
| ... | ... | @@ -110,43 +112,28 @@ int ssl_init(H3270 *hSession) |
| 110 | 112 | hSession->ssl.con = SSL_new(ssl_ctx); |
| 111 | 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 | 118 | return -1; |
| 126 | 119 | } |
| 127 | 120 | |
| 128 | 121 | SSL_set_ex_data(hSession->ssl.con,ssl_3270_ex_index,(char *) hSession); |
| 129 | - | |
| 130 | 122 | // SSL_set_verify(session->ssl_con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); |
| 131 | 123 | SSL_set_verify(hSession->ssl.con, 0, NULL); |
| 132 | 124 | |
| 133 | 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 | 130 | int rv; |
| 139 | 131 | |
| 140 | 132 | trace("%s",__FUNCTION__); |
| 141 | 133 | |
| 142 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | |
| 143 | - non_blocking(hSession,False); | |
| 144 | - | |
| 145 | 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 | 137 | return -1; |
| 151 | 138 | } |
| 152 | 139 | |
| ... | ... | @@ -155,15 +142,10 @@ int ssl_negotiate(H3270 *hSession) |
| 155 | 142 | { |
| 156 | 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 | 149 | return -1; |
| 168 | 150 | } |
| 169 | 151 | |
| ... | ... | @@ -173,29 +155,24 @@ int ssl_negotiate(H3270 *hSession) |
| 173 | 155 | |
| 174 | 156 | if (rv != 1) |
| 175 | 157 | { |
| 176 | - int ssl_error = SSL_get_error(hSession->ssl.con,rv); | |
| 177 | 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 | 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 | 170 | lib3270_disconnect(hSession); |
| 195 | 171 | return -1; |
| 172 | + | |
| 196 | 173 | } |
| 197 | 174 | |
| 198 | - /* Success. */ | |
| 175 | + // Success. | |
| 199 | 176 | X509 * peer = NULL; |
| 200 | 177 | rv = SSL_get_verify_result(hSession->ssl.con); |
| 201 | 178 | |
| ... | ... | @@ -208,13 +185,11 @@ int ssl_negotiate(H3270 *hSession) |
| 208 | 185 | |
| 209 | 186 | case X509_V_ERR_UNABLE_TO_GET_CRL: |
| 210 | 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 | 193 | return -1; |
| 219 | 194 | |
| 220 | 195 | case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: |
| ... | ... | @@ -224,14 +199,9 @@ int ssl_negotiate(H3270 *hSession) |
| 224 | 199 | #ifdef SSL_ALLOW_SELF_SIGNED_CERT |
| 225 | 200 | break; |
| 226 | 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 | 205 | return -1; |
| 236 | 206 | #endif // SSL_ALLOW_SELF_SIGNED_CERT |
| 237 | 207 | |
| ... | ... | @@ -286,11 +256,65 @@ int ssl_negotiate(H3270 *hSession) |
| 286 | 256 | |
| 287 | 257 | /* Tell the world that we are (still) connected, now in secure mode. */ |
| 288 | 258 | lib3270_set_connected_initial(hSession); |
| 289 | - non_blocking(hSession,True); | |
| 290 | 259 | |
| 291 | 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 | 318 | /* Callback for tracing protocol negotiation. */ |
| 295 | 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 | 376 | ); |
| 353 | 377 | |
| 354 | 378 | } |
| 355 | - | |
| 379 | + break; | |
| 356 | 380 | |
| 357 | 381 | default: |
| 358 | 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 | 908 | } |
| 909 | 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 | 917 | if(hSession->sock >= 0) |
| ... | ... | @@ -1964,10 +1964,10 @@ void net_exception(H3270 *session, int fd unused, LIB3270_IO_FLAG flag unused, v |
| 1964 | 1964 | { |
| 1965 | 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 | 35 | #define _GNU_SOURCE |
| 36 | 36 | |
| 37 | 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 | 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 | 42 | #define my_isspace(c) isspace((unsigned char)c) |
| 55 | 43 | ... | ... |