Added basic ssl-client support to Ecore_Con
authortsauerbeck <tsauerbeck>
Wed, 31 Mar 2004 16:47:45 +0000 (16:47 +0000)
committertsauerbeck <tsauerbeck@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 31 Mar 2004 16:47:45 +0000 (16:47 +0000)
SVN revision: 9535

legacy/ecore/configure.in
legacy/ecore/src/lib/ecore_con/.cvsignore
legacy/ecore/src/lib/ecore_con/Ecore_Con.h.in [moved from legacy/ecore/src/lib/ecore_con/Ecore_Con.h with 92% similarity]
legacy/ecore/src/lib/ecore_con/Makefile.am
legacy/ecore/src/lib/ecore_con/ecore_con.c
legacy/ecore/src/lib/ecore_con/ecore_con_private.h

index ae489c7..6f5b3fa 100644 (file)
@@ -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"
index 05d9f0f..c9eb519 100644 (file)
@@ -1,5 +1,6 @@
 .deps
 .libs
+Ecore_Con.h
 Makefile
 Makefile.in
 ecore_con.lo
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 56b2a43..a694991 100644 (file)
@@ -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 <openssl/ssl.h>
+#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
index fb9fa6b..28e23cf 100644 (file)
@@ -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
index 604c500..f9f28ad 100644 (file)
@@ -1,4 +1,5 @@
 #include "Ecore.h"
+#include "config.h"
 #include "ecore_private.h"
 #include "ecore_con_private.h"
 #include "Ecore_Con.h"
 #include <fcntl.h>
 #include <netdb.h>
 
+#if USE_OPENSSL
+#include <time.h>
+#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) ||
index c5e15c5..c12ec8b 100644 (file)
@@ -4,14 +4,21 @@
 #define ECORE_MAGIC_CON_SERVER             0x77665544
 #define ECORE_MAGIC_CON_CLIENT             0x77556677
 
+#if USE_OPENSSL
+#include <openssl/ssl.h>
+#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