From: Sebastian B. <sb...@us...> - 2014-02-23 13:23:06
|
Update of /cvsroot/simplemail/simplemail In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv24285 Modified Files: tcp.c Log Message: The user can now decide if connection should be continued if cert check failed. Index: tcp.c =================================================================== RCS file: /cvsroot/simplemail/simplemail/tcp.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- tcp.c 23 Feb 2014 13:21:54 -0000 1.58 +++ tcp.c 23 Feb 2014 13:23:04 -0000 1.59 @@ -53,6 +53,7 @@ #include "smintl.h" #include "tcp.h" +#include "subthreads.h" #include "support.h" #define MIN(a,b) (((a)<(b))?(a):(b)) @@ -249,6 +250,7 @@ SSL *ssl = X509_STORE_CTX_get_ex_data(x509_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); int *failed = SSL_get_app_data(ssl); *failed = 1; + preverify_ok = 1; } return preverify_ok; } @@ -282,13 +284,37 @@ if ((rc = SSL_connect(conn->ssl)) >= 0) { X509 *server_cert; + + if (!failed) + { + SM_DEBUGF(5,("Connection is secure\n")); + return 1; + } + if ((server_cert = SSL_get_peer_certificate(conn->ssl))) { + int i, rc; + unsigned int sha1_size; + unsigned char sha1[EVP_MAX_MD_SIZE]; + char sha1_ascii[EVP_MAX_MD_SIZE*3+1]; + + X509_digest(server_cert, EVP_sha1(), sha1, &sha1_size); + + for (i=0; i<sha1_size; i++) + sm_snprintf(&sha1_ascii[i*3], 4, "%02X ", sha1[i]); + sha1_ascii[sha1_size*3] = 0; + + /* TODO: Use callbacks for proper decoupling */ + rc = thread_call_function_sync(thread_get_main(), sm_request, 4, NULL, _("Certificate verification error\n\nSHA1: %s"), _("Connect anyway|Abort"), sha1_ascii); + /* Add some checks here */ X509_free(server_cert); - SM_DEBUGF(5,("Connection is secure\n")); - return 1; + if (rc == 1) + { + SM_DEBUGF(5,("Connection is assumed to be secure\n")); + return 1; + } } } else { |