diff --git a/legacy/ecore/configure.in b/legacy/ecore/configure.in index ae489c7c42..6f5b3faee0 100644 --- a/legacy/ecore/configure.in +++ b/legacy/ecore/configure.in @@ -469,6 +469,23 @@ fi AC_SUBST(ecore_con_cflags) AC_SUBST(ecore_con_libs) +AC_ARG_ENABLE(openssl, + [ --enable-openssl enable openssl support (default: autodetect)], + [use_openssl=$enableval], use_openssl=yes) + +if test "x$use_openssl" = "xyes"; then + PKG_CHECK_MODULES(SSL, openssl, use_openssl=yes, use_openssl=no) +fi + +if test "x$use_openssl" = "xyes"; then + USE_OPENSSL=1 +else + USE_OPENSSL=0 +fi + +AC_SUBST(USE_OPENSSL) +AC_DEFINE_UNQUOTED(USE_OPENSSL, $USE_OPENSSL, [Use OpenSSL]) + have_ecore_ipc="no"; ecore_ipc_cflags=""; ecore_ipc_libs=""; @@ -617,6 +634,7 @@ src/lib/ecore_x/Makefile src/lib/ecore_fb/Makefile src/lib/ecore_evas/Ecore_Evas.h src/lib/ecore_evas/Makefile +src/lib/ecore_con/Ecore_Con.h src/lib/ecore_con/Makefile src/lib/ecore_ipc/Makefile src/lib/ecore_txt/Makefile @@ -633,7 +651,7 @@ echo echo "Optional Modules:" echo echo " Ecore_Job...............: $have_ecore_job" -echo " Ecore_Con...............: $have_ecore_con" +echo " Ecore_Con...............: $have_ecore_con (OpenSSL: $use_openssl)" echo " Ecore_Txt...............: $have_ecore_txt" echo " Ecore_X.................: $have_ecore_x" echo " Ecore_FB................: $have_ecore_fb" diff --git a/legacy/ecore/src/lib/ecore_con/.cvsignore b/legacy/ecore/src/lib/ecore_con/.cvsignore index 05d9f0fb54..c9eb5195a5 100644 --- a/legacy/ecore/src/lib/ecore_con/.cvsignore +++ b/legacy/ecore/src/lib/ecore_con/.cvsignore @@ -1,5 +1,6 @@ .deps .libs +Ecore_Con.h Makefile Makefile.in ecore_con.lo diff --git a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h.in similarity index 92% rename from legacy/ecore/src/lib/ecore_con/Ecore_Con.h rename to legacy/ecore/src/lib/ecore_con/Ecore_Con.h.in index 56b2a430f3..a6949911dc 100644 --- a/legacy/ecore/src/lib/ecore_con/Ecore_Con.h +++ b/legacy/ecore/src/lib/ecore_con/Ecore_Con.h.in @@ -1,6 +1,12 @@ #ifndef _ECORE_CON_H #define _ECORE_CON_H +#define HAVE_ECORE_CON_OPENSSL @USE_OPENSSL@ + +#if HAVE_ECORE_CON_OPENSSL +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -11,9 +17,12 @@ extern "C" { typedef enum _Ecore_Con_Type { - ECORE_CON_LOCAL_USER, + ECORE_CON_LOCAL_USER, ECORE_CON_LOCAL_SYSTEM, - ECORE_CON_REMOTE_SYSTEM, + ECORE_CON_REMOTE_SYSTEM +#if HAVE_ECORE_CON_OPENSSL + ,ECORE_CON_USE_SSL = 16 +#endif } Ecore_Con_Type; #endif diff --git a/legacy/ecore/src/lib/ecore_con/Makefile.am b/legacy/ecore/src/lib/ecore_con/Makefile.am index fb9fa6b8bf..28e23cf51e 100644 --- a/legacy/ecore/src/lib/ecore_con/Makefile.am +++ b/legacy/ecore/src/lib/ecore_con/Makefile.am @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in INCLUDES = \ --I$(top_srcdir)/src/lib/ecore +-I$(top_srcdir)/src/lib/ecore @SSL_CFLAGS@ libecore_con_la_LDFLAGS = -version-info 1:0:0 \ -L$(top_builddir)/src/lib/ecore/.libs @@ -17,7 +17,7 @@ ecore_con.c \ ecore_con_private.h libecore_con_la_LIBADD = \ -$(top_builddir)/src/lib/ecore/libecore.la +$(top_builddir)/src/lib/ecore/libecore.la @SSL_LIBS@ libecore_con_la_DEPENDENCIES = \ $(top_builddir)/src/lib/ecore/libecore.la @@ -25,6 +25,6 @@ $(top_builddir)/src/lib/ecore/libecore.la endif EXTRA_DIST = \ -Ecore_Con.h \ +Ecore_Con.h.in \ ecore_con.c \ ecore_con_private.h diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con.c b/legacy/ecore/src/lib/ecore_con/ecore_con.c index 604c5001f3..f9f28ada52 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con.c +++ b/legacy/ecore/src/lib/ecore_con/ecore_con.c @@ -1,4 +1,5 @@ #include "Ecore.h" +#include "config.h" #include "ecore_private.h" #include "ecore_con_private.h" #include "Ecore_Con.h" @@ -15,6 +16,10 @@ #include #include +#if USE_OPENSSL +#include +#endif + static void _ecore_con_server_free(Ecore_Con_Server *svr); static void _ecore_con_client_free(Ecore_Con_Client *cl); static int _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler); @@ -58,6 +63,11 @@ ecore_con_init(void) ECORE_CON_EVENT_SERVER_DEL = ecore_event_type_new(); ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new(); ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new(); + +#if USE_OPENSSL + SSL_library_init(); + SSL_load_error_strings(); +#endif } return init_count; } @@ -257,12 +267,13 @@ ecore_con_server_add(Ecore_Con_Type type, * FIXME: To be fixed. */ Ecore_Con_Server * -ecore_con_server_connect(Ecore_Con_Type type, +ecore_con_server_connect(Ecore_Con_Type compl_type, char *name, int port, const void *data) { Ecore_Con_Server *svr; + Ecore_Con_Type type = compl_type & ~ECORE_CON_USE_SSL; struct sockaddr_un socket_unix; struct sockaddr_in socket_addr; int curstate = 0; @@ -353,9 +364,22 @@ ecore_con_server_connect(Ecore_Con_Type type, ECORE_FD_READ, _ecore_con_cl_handler, svr, NULL, NULL); + if (!svr->fd_handler) goto error; } - + +#if USE_OPENSSL + if (compl_type & ECORE_CON_USE_SSL) + { + if (!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method()))) + goto error; + if (!(svr->ssl = SSL_new(svr->ssl_ctx))) + goto error; + + SSL_set_fd(svr->ssl, svr->fd); + } +#endif + svr->name = strdup(name); if (!svr->name) goto error; svr->type = type; @@ -371,6 +395,10 @@ ecore_con_server_connect(Ecore_Con_Type type, if (svr->path) free(svr->path); if (svr->fd >= 0) close(svr->fd); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); +#if USE_OPENSSL + if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx); + if (svr->ssl) SSL_free(svr->ssl); +#endif free(svr); return NULL; } @@ -592,6 +620,11 @@ _ecore_con_server_free(Ecore_Con_Server *svr) _ecore_con_client_free((Ecore_Con_Client *)svr->clients); if ((svr->created) && (svr->path)) unlink(svr->path); if (svr->fd >= 0) close(svr->fd); +#if USE_OPENSSL + if (svr->ssl) SSL_set_shutdown(svr->ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); + if (svr->ssl) SSL_free(svr->ssl); + if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx); +#endif if (svr->name) free(svr->name); if (svr->path) free(svr->path); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); @@ -674,8 +707,14 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) { char buf[65536]; int num; - - num = read(svr->fd, buf, 65536); +#if USE_OPENSSL + if (!svr->ssl) +#endif + num = read(svr->fd, buf, 65536); +#ifdef USE_OPENSSL + else + num = SSL_read(svr->ssl, buf, 65536); +#endif if (num < 1) { if (inbuf) @@ -726,7 +765,15 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) { int so_err; int size; - + +#if USE_OPENSSL + struct timespec t = {0, 250000000L}; + + if (svr->ssl) + while (SSL_connect(svr->ssl) == -1) + nanosleep(&t, NULL); +#endif + svr->connecting = 0; so_err = 0; size = sizeof(int); @@ -847,7 +894,16 @@ _ecore_con_server_flush(Ecore_Con_Server *svr) if (!svr->buf) return; num = svr->buf_size - svr->buf_offset; - count = write(svr->fd, svr->buf + svr->buf_offset, num); + +#if USE_OPENSSL + if (!svr->ssl) +#endif + count = write(svr->fd, svr->buf + svr->buf_offset, num); +#if USE_OPENSSL + else + count = SSL_write(svr->ssl, svr->buf + svr->buf_offset, num); +#endif + if (count < 1) { if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) || diff --git a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h index c5e15c513f..c12ec8b179 100644 --- a/legacy/ecore/src/lib/ecore_con/ecore_con_private.h +++ b/legacy/ecore/src/lib/ecore_con/ecore_con_private.h @@ -4,14 +4,21 @@ #define ECORE_MAGIC_CON_SERVER 0x77665544 #define ECORE_MAGIC_CON_CLIENT 0x77556677 +#if USE_OPENSSL +#include +#endif + typedef struct _Ecore_Con_Client Ecore_Con_Client; typedef struct _Ecore_Con_Server Ecore_Con_Server; typedef enum _Ecore_Con_Type { ECORE_CON_LOCAL_USER, - ECORE_CON_LOCAL_SYSTEM, - ECORE_CON_REMOTE_SYSTEM, + ECORE_CON_LOCAL_SYSTEM, + ECORE_CON_REMOTE_SYSTEM +#if USE_OPENSSL + ,ECORE_CON_USE_SSL = 16 +#endif } Ecore_Con_Type; struct _Ecore_Con_Client @@ -46,6 +53,10 @@ struct _Ecore_Con_Server char dead : 1; char created : 1; char connecting : 1; +#if USE_OPENSSL + SSL_CTX *ssl_ctx; + SSL *ssl; +#endif }; #endif