conn.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:39k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /* conn.c - implement Connection type
  2.  *
  3.  * This file implements the interface defined in conn.h.
  4.  *
  5.  * Richard Braakman
  6.  *
  7.  * SSL client implementation contributed by
  8.  * Jarkko Kovala <jarkko.kovala@iki.fi>
  9.  *
  10.  * SSL server implementation contributed by
  11.  * Stipe Tolj <tolj@wapme-systems.de> for Wapme Systems AG
  12.  */
  13. /* TODO: unlocked_close() on error */
  14. /* TODO: have I/O functions check if connection is open */
  15. /* TODO: have conn_open_tcp do a non-blocking connect() */
  16. #include <signal.h>
  17. #include <unistd.h>
  18. #include <errno.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <string.h>
  22. #include "gwlib/gwlib.h"
  23. #ifdef HAVE_LIBSSL
  24. #include <openssl/ssl.h>
  25. #include <openssl/err.h>
  26. SSL_CTX *global_ssl_context = NULL;
  27. SSL_CTX *global_server_ssl_context = NULL;
  28. X509 *ssl_public_cert;
  29. RSA *ssl_private_key;
  30. #endif /* HAVE_LIBSSL */
  31. typedef unsigned long (*CRYPTO_CALLBACK_PTR)(void);
  32. /*
  33.  * This used to be 4096.  It is now 0 so that callers don't have to
  34.  * deal with the complexities of buffering (i.e. deciding when to
  35.  * flush) unless they want to.
  36.  * FIXME: Figure out how to combine buffering sensibly with use of
  37.  * conn_register.
  38.  */
  39. #define DEFAULT_OUTPUT_BUFFERING 0
  40. #define SSL_CONN_TIMEOUT         30
  41. struct Connection
  42. {
  43.     /* We use separate locks for input and ouput fields, so that
  44.      * read and write activities don't have to get in each other's
  45.      * way.  If you need both, then acquire the outlock first. */
  46.     Mutex *inlock;
  47.     Mutex *outlock;
  48.     volatile sig_atomic_t claimed;
  49. #ifndef NO_GWASSERT
  50.     long claiming_thread;
  51. #endif
  52.     /* fd value is read-only and is not locked */
  53.     int fd;
  54.     /* Protected by outlock */
  55.     Octstr *outbuf;
  56.     long outbufpos;   /* start of unwritten data in outbuf */
  57.     /* Try to buffer writes until there are this many octets to send.
  58.      * Set it to 0 to get an unbuffered connection. */
  59.     unsigned int output_buffering;
  60.     /* Protected by inlock */
  61.     Octstr *inbuf;
  62.     long inbufpos;    /* start of unread data in inbuf */
  63.     int read_eof;     /* we encountered eof on read */
  64.     int read_error;   /* we encountered error on read */
  65.     /* Protected by both locks when updating, so you need only one
  66.      * of the locks when reading. */
  67.     FDSet *registered;
  68.     conn_callback_t *callback;
  69.     void *callback_data;
  70.     /* Protected by inlock */
  71.     int listening_pollin;
  72.     /* Protected by outlock */
  73.     int listening_pollout;
  74. #ifdef HAVE_LIBSSL
  75.     SSL *ssl;
  76.     X509 *peer_certificate;
  77.     Mutex *ssl_mutex;
  78. #endif /* HAVE_LIBSSL */
  79. };
  80. static void unlocked_register_pollin(Connection *conn, int onoff);
  81. static void unlocked_register_pollout(Connection *conn, int onoff);
  82. /* There are a number of functions that play with POLLIN and POLLOUT flags.
  83.  * The general rule is that we always want to poll for POLLIN except when
  84.  * we have detected eof (which may be reported as eternal POLLIN), and
  85.  * we want to poll for POLLOUT only if there's data waiting in the
  86.  * output buffer.  If output buffering is set, we may not want to poll for
  87.  * POLLOUT if there's not enough data waiting, which is why we have
  88.  * unlocked_try_write. */
  89. /* Macros to get more information for debugging purposes */
  90. #define unlock_in(conn) unlock_in_real(conn, __FILE__, __LINE__, __func__)
  91. #define unlock_out(conn) unlock_out_real(conn, __FILE__, __LINE__, __func__)
  92. /* Lock a Connection's read direction, if the Connection is unclaimed */
  93. static void lock_in(Connection *conn)
  94. {
  95.     gw_assert(conn != NULL);
  96.     if (conn->claimed)
  97.         gw_assert(gwthread_self() == conn->claiming_thread);
  98.     else
  99.         mutex_lock(conn->inlock);
  100. }
  101. /* Unlock a Connection's read direction, if the Connection is unclaimed */
  102. static void unlock_in_real(Connection *conn, char *file, int line, const char *func)
  103. {
  104.     int ret;
  105.     gw_assert(conn != NULL);
  106.     if (!conn->claimed) {
  107.         if ((ret = mutex_unlock(conn->inlock)) != 0) {
  108.             panic(0, "%s:%ld: %s: Mutex unlock failed. " 
  109.              "(Called from %s:%ld:%s.)", 
  110.          __FILE__, (long) __LINE__, __func__, 
  111.          file, (long) line, func);
  112.         }
  113.      }
  114. }
  115. /* Lock a Connection's write direction, if the Connection is unclaimed */
  116. static void lock_out(Connection *conn)
  117. {
  118.     gw_assert(conn != NULL);
  119.     if (conn->claimed)
  120.         gw_assert(gwthread_self() == conn->claiming_thread);
  121.     else
  122.         mutex_lock(conn->outlock);
  123. }
  124. /* Unlock a Connection's write direction, if the Connection is unclaimed */
  125. static void unlock_out_real(Connection *conn, char *file, int line, const char *func)
  126. {
  127.     int ret;
  128.     gw_assert(conn != NULL);
  129.     if (!conn->claimed) {
  130.         if ((ret = mutex_unlock(conn->outlock)) != 0) {
  131.             panic(0, "%s:%ld: %s: Mutex unlock failed. " 
  132.              "(Called from %s:%ld:%s.)", 
  133.          __FILE__, (long) __LINE__, __func__, 
  134.          file, (long) line, func);
  135.         }
  136.      }
  137. }
  138. /* Return the number of bytes in the Connection's output buffer */
  139. static long unlocked_outbuf_len(Connection *conn)
  140. {
  141.     return octstr_len(conn->outbuf) - conn->outbufpos;
  142. }
  143. /* Return the number of bytes in the Connection's input buffer */
  144. static long unlocked_inbuf_len(Connection *conn)
  145. {
  146.     return octstr_len(conn->inbuf) - conn->inbufpos;
  147. }
  148. /* Send as much data as can be sent without blocking.  Return the number
  149.  * of bytes written, or -1 in case of error. */
  150. static long unlocked_write(Connection *conn)
  151. {
  152.     long ret;
  153. #ifdef HAVE_LIBSSL
  154.     if (conn->ssl != NULL) {
  155.         mutex_lock(conn->ssl_mutex);
  156.         ret = SSL_write(conn->ssl, 
  157.                         octstr_get_cstr(conn->outbuf) + conn->outbufpos, 
  158.                         octstr_len(conn->outbuf) - conn->outbufpos);
  159.         if (ret < 0) {
  160.             int SSL_error = SSL_get_error(conn->ssl, ret); 
  161.             if (SSL_error == SSL_ERROR_WANT_READ) {
  162.                 SSL_read(conn->ssl, NULL, 0);
  163.                 mutex_unlock(conn->ssl_mutex);
  164.                 return 0;
  165.             } else if (SSL_error == SSL_ERROR_WANT_WRITE) {
  166.                 mutex_unlock(conn->ssl_mutex);
  167.                 return 0;
  168.             } else {
  169.                 error(0, "SSL write failed: OpenSSL error %d: %s", 
  170.                       SSL_error, ERR_error_string(SSL_error, NULL));
  171.                 mutex_unlock(conn->ssl_mutex);
  172.                 return -1;
  173.             }
  174.         }
  175.         mutex_unlock(conn->ssl_mutex);
  176.     } else
  177. #endif /* HAVE_LIBSSL */
  178.         ret = octstr_write_data(conn->outbuf, conn->fd, conn->outbufpos);
  179.     if (ret < 0)
  180.         return -1;
  181.     conn->outbufpos += ret;
  182.     /* Heuristic: Discard the already-written data if it's more than
  183.      * half of the total.  This should keep the buffer size small
  184.      * without wasting too many cycles on moving data around. */
  185.     if (conn->outbufpos > octstr_len(conn->outbuf) / 2) {
  186.         octstr_delete(conn->outbuf, 0, conn->outbufpos);
  187.         conn->outbufpos = 0;
  188.     }
  189.     if (conn->registered)
  190.         unlocked_register_pollout(conn, unlocked_outbuf_len(conn) > 0);
  191.     return ret;
  192. }
  193. /* Try to empty the output buffer without blocking.  Return 0 for success,
  194.  * 1 if there is still data left in the buffer, and -1 for errors. */
  195. static int unlocked_try_write(Connection *conn)
  196. {
  197.     long len;
  198.     len = unlocked_outbuf_len(conn);
  199.     if (len == 0)
  200.         return 0;
  201.     if (len < (long) conn->output_buffering)
  202.         return 1;
  203.     if (unlocked_write(conn) < 0)
  204.         return -1;
  205.     if (unlocked_outbuf_len(conn) > 0)
  206.         return 1;
  207.     return 0;
  208. }
  209. /* Read whatever data is currently available, up to an internal maximum. */
  210. static void unlocked_read(Connection *conn)
  211. {
  212.     unsigned char buf[4096];
  213.     long len;
  214.     if (conn->inbufpos > 0) {
  215.         octstr_delete(conn->inbuf, 0, conn->inbufpos);
  216.         conn->inbufpos = 0;
  217.     }
  218. #ifdef HAVE_LIBSSL
  219.     if (conn->ssl != NULL) {
  220.         mutex_lock(conn->ssl_mutex);
  221.         len = SSL_read(conn->ssl, buf, sizeof(buf));
  222.         if (len < 0) { 
  223.             int SSL_error = SSL_get_error(conn->ssl, len);
  224.             if (SSL_error == SSL_ERROR_WANT_WRITE) {
  225.                 len = SSL_write(conn->ssl, NULL, 0);
  226.                 mutex_unlock(conn->ssl_mutex);
  227.                 return;
  228.             } else if (SSL_error == SSL_ERROR_WANT_READ) {
  229.                 mutex_unlock(conn->ssl_mutex);
  230.                 return;
  231.             } else
  232.                 error(0, "SSL read failed: OpenSSL error %d: %s",
  233.                       SSL_error, ERR_error_string(SSL_error, NULL));
  234.         }
  235.         mutex_unlock(conn->ssl_mutex);
  236.     } else
  237. #endif /* HAVE_LIBSSL */
  238.         len = read(conn->fd, buf, sizeof(buf));
  239.     if (len < 0) {
  240.         if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
  241.             return;
  242.         error(errno, "Error reading from fd %d:", conn->fd);
  243.         conn->read_error = 1;
  244.         if (conn->registered)
  245.             unlocked_register_pollin(conn, 0);
  246.         return;
  247.     } else if (len == 0) {
  248.         conn->read_eof = 1;
  249.         if (conn->registered)
  250.             unlocked_register_pollin(conn, 0);
  251.     } else {
  252.         octstr_append_data(conn->inbuf, buf, len);
  253.     }
  254. }
  255. /* Cut "length" octets from the input buffer and return them as an Octstr */
  256. static Octstr *unlocked_get(Connection *conn, long length)
  257. {
  258.     Octstr *result = NULL;
  259.     gw_assert(unlocked_inbuf_len(conn) >= length);
  260.     result = octstr_copy(conn->inbuf, conn->inbufpos, length);
  261.     conn->inbufpos += length;
  262.     return result;
  263. }
  264. /* Tell the fdset whether we are interested in POLLIN events, but only
  265.  * if the status changed.  (Calling fdset_listen can be expensive if
  266.  * it requires synchronization with the polling thread.)
  267.  * We must already have the inlock.
  268.  */
  269. static void unlocked_register_pollin(Connection *conn, int onoff)
  270. {
  271.     gw_assert(conn->registered);
  272.     if (onoff == 1 && !conn->listening_pollin) {
  273.         /* Turn it on */
  274.         conn->listening_pollin = 1;
  275.         fdset_listen(conn->registered, conn->fd, POLLIN, POLLIN);
  276.     } else if (onoff == 0 && conn->listening_pollin) {
  277.         /* Turn it off */
  278.         conn->listening_pollin = 0;
  279.         fdset_listen(conn->registered, conn->fd, POLLIN, 0);
  280.     }
  281. }
  282. /* Tell the fdset whether we are interested in POLLOUT events, but only
  283.  * if the status changed.  (Calling fdset_listen can be expensive if
  284.  * it requires synchronization with the polling thread.)
  285.  * We must already have the outlock.
  286.  */
  287. static void unlocked_register_pollout(Connection *conn, int onoff)
  288. {
  289.     gw_assert(conn->registered);
  290.     if (onoff == 1 && !conn->listening_pollout) {
  291.         /* Turn it on */
  292.         conn->listening_pollout = 1;
  293.         fdset_listen(conn->registered, conn->fd, POLLOUT, POLLOUT);
  294.     } else if (onoff == 0 && conn->listening_pollout) {
  295.         /* Turn it off */
  296.         conn->listening_pollout = 0;
  297.         fdset_listen(conn->registered, conn->fd, POLLOUT, 0);
  298.     }
  299. }
  300. #ifdef HAVE_LIBSSL
  301. Connection *conn_open_ssl(Octstr *host, int port, Octstr *certkeyfile,
  302.   Octstr *our_host)
  303. {
  304.     Connection *ret;
  305.     int SSL_ret = 0;
  306.     int connected = 0;
  307.     time_t timeout;
  308.     /* open the TCP connection */
  309.     if (!(ret = conn_open_tcp(host, port, our_host))) {
  310.         return NULL;
  311.     }
  312.     ret->ssl = SSL_new(global_ssl_context);
  313.     ret->ssl_mutex = mutex_create();
  314.     
  315.     SSL_set_connect_state(ret->ssl);
  316.     if (certkeyfile != NULL) {
  317.         SSL_use_certificate_file(ret->ssl, octstr_get_cstr(certkeyfile),
  318.                                  SSL_FILETYPE_PEM);
  319.         SSL_use_PrivateKey_file(ret->ssl, octstr_get_cstr(certkeyfile), 
  320.                                 SSL_FILETYPE_PEM);
  321.         if (SSL_check_private_key(ret->ssl) != 1) {
  322.             error(0, "conn_open_ssl: private key isn't consistent with the "
  323.                      "certificate from file %s (or failed reading the file)",
  324.                   octstr_get_cstr(certkeyfile));
  325.             goto error;
  326.         }
  327.     }
  328.     
  329.     SSL_set_fd(ret->ssl, ret->fd);
  330.     /*
  331.      * The current thread's error queue must be empty before
  332.      * the TLS/SSL I/O operation is attempted, or SSL_get_error()
  333.      * will not work reliably.
  334.      */
  335.     ERR_clear_error();
  336.     /*
  337.      * make the socket is non-blocking while we do SSL_connect
  338.      */
  339.     if (socket_set_blocking(ret->fd, 0) < 0) {
  340.         goto error;
  341.     }
  342.     /* record current time */
  343.     timeout = time(NULL);
  344.     while(!connected && (timeout + SSL_CONN_TIMEOUT > time(NULL))) {
  345.         /* Attempt to connect as long as the timeout hasn't run down */
  346.         SSL_ret = SSL_connect(ret->ssl);
  347.         switch(SSL_get_error(ret->ssl,SSL_ret)) {
  348.             case SSL_ERROR_WANT_READ:
  349.             case SSL_ERROR_WANT_WRITE:
  350.                 /* non-blocking socket wants more time to read or write */
  351.                 gwthread_sleep(0.01F);
  352.                 continue;
  353.             default:
  354.                 /* we're connected to the server successfuly */
  355.                 connected++;
  356.         }
  357.     }
  358.     if (!connected) {
  359.         /* connection timed out - this probably means that something is terrible wrong */
  360.         int SSL_error = SSL_get_error (ret->ssl, SSL_ret);
  361.         error(0,"SSL connection timeout: OpenSSL error %d: %s",
  362.                 SSL_error, ERR_error_string(SSL_error, NULL));
  363.         goto error;
  364.     }
  365.     
  366.     /* 
  367.      * XXX - restore the non-blocking state
  368.      * we don't need this since we use non-blocking operations
  369.      * anyway before doing SSL_connect(), right?!
  370.      */
  371.     /*
  372.     if (socket_set_blocking(ret->fd, 0) < 0) {
  373.         goto error;
  374.     }
  375.     */
  376.     if (SSL_ret != 1) {
  377.         int SSL_error = SSL_get_error (ret->ssl, SSL_ret); 
  378.         error(0, "SSL connect failed: OpenSSL error %d: %s", 
  379.                   SSL_error, ERR_error_string(SSL_error, NULL));
  380.         goto error;
  381.     }
  382.     
  383.     return ret;
  384. error:
  385.     conn_destroy(ret);
  386.     return NULL;
  387. }
  388. #endif /* HAVE_LIBSSL */
  389. Connection *conn_open_tcp(Octstr *host, int port, Octstr *our_host)
  390. {
  391.     return conn_open_tcp_with_port(host, port, 0, our_host);
  392. }
  393. Connection *conn_open_tcp_with_port(Octstr *host, int port, int our_port,
  394. Octstr *our_host)
  395. {
  396.     int sockfd;
  397.     sockfd = tcpip_connect_to_server_with_port(octstr_get_cstr(host), port,
  398.        our_port, our_host == NULL ?
  399.        NULL : octstr_get_cstr(our_host));
  400.     if (sockfd < 0)
  401. return NULL;
  402.     return conn_wrap_fd(sockfd, 0);
  403. }
  404. Connection *conn_wrap_fd(int fd, int ssl)
  405. {
  406.     Connection *conn;
  407.     if (socket_set_blocking(fd, 0) < 0)
  408.         return NULL;
  409.     conn = gw_malloc(sizeof(*conn));
  410.     conn->inlock = mutex_create();
  411.     conn->outlock = mutex_create();
  412.     conn->claimed = 0;
  413.     conn->outbuf = octstr_create("");
  414.     conn->outbufpos = 0;
  415.     conn->inbuf = octstr_create("");
  416.     conn->inbufpos = 0;
  417.     conn->fd = fd;
  418.     conn->read_eof = 0;
  419.     conn->read_error = 0;
  420.     conn->output_buffering = DEFAULT_OUTPUT_BUFFERING;
  421.     conn->registered = NULL;
  422.     conn->callback = NULL;
  423.     conn->callback_data = NULL;
  424.     conn->listening_pollin = 0;
  425.     conn->listening_pollout = 0;
  426. #ifdef HAVE_LIBSSL
  427.     /*
  428.      * do all the SSL magic for this connection
  429.      */
  430.     if (ssl) {
  431.         int rc;
  432.         conn->ssl = SSL_new(global_server_ssl_context);
  433.         conn->peer_certificate = NULL;
  434.         SSL_set_fd(conn->ssl, conn->fd);
  435.         /* SSL_set_verify(conn->ssl, 0, NULL); */
  436.         BIO_set_nbio(SSL_get_rbio(conn->ssl), 0);
  437.         BIO_set_nbio(SSL_get_wbio(conn->ssl), 0);
  438.         conn->ssl_mutex = mutex_create();
  439.         /* 
  440.          * now enter the SSL handshake phase
  441.          */    
  442.      
  443.         /*
  444.          * For non-blocking BIO we may return from SSL_accept(). In this 
  445.          * case we check for SSL_get_error() = SSL_ERROR_WANT_[READ|WRITE]
  446.          * and loop the SSL_accept() until we have come through.
  447.          */
  448.         while (((rc = SSL_accept(conn->ssl)) <= 0) && 
  449.                ((SSL_get_error(conn->ssl, rc) == SSL_ERROR_WANT_READ) ||
  450.                (SSL_get_error(conn->ssl, rc) == SSL_ERROR_WANT_WRITE))) 
  451.             {}
  452.         
  453.         /*
  454.          * If SSL_accept() has failed then check which reason it may 
  455.          * have been and log the error.
  456.          */
  457.         if (rc <= 0) {
  458.              
  459.             if (SSL_get_error(conn->ssl, rc) == SSL_ERROR_ZERO_RETURN) {
  460.                 /*
  461.                  * The case where the connection was closed before any data
  462.                  * was transferred. That's not a real error and can occur
  463.                  * sporadically with some clients.
  464.                  */
  465.                 warning(0, "SSL: handshake stopped: connection was closed");
  466.                 warning(0, "SSL: OpenSSL: %.256s", ERR_error_string(ERR_get_error(), NULL));
  467.                 SSL_set_shutdown(conn->ssl, SSL_RECEIVED_SHUTDOWN);
  468.                 SSL_smart_shutdown(conn->ssl);
  469.              }
  470.              else if (ERR_GET_REASON(ERR_peek_error()) == SSL_R_HTTP_REQUEST) {
  471.                 /*
  472.                  * The case where OpenSSL has recognized a HTTP request:
  473.                  * This means the client speaks plain HTTP on our HTTPS
  474.                  * port. Hmmmm...  At least for this error we can be more friendly
  475.                  * and try to provide him with a HTML error page. We have only one
  476.                  * problem: OpenSSL has already read some bytes from the HTTP
  477.                  * request. So we have to skip the request line manually.
  478.                  */
  479.                 char ca[2];
  480.                 int rv;
  481.                 warning(0, "SSL: handshake failed: HTTP spoken on HTTPS port");
  482.                 warning(0, "SSL: OpenSSL: %.256s", ERR_error_string(ERR_get_error(), NULL));
  483.                     
  484.                 /* first: skip the remaining bytes of the request line */
  485.                 do {
  486.                     do {
  487.                         rv = read(conn->fd, ca, 1);
  488.                     } while (rv == -1 && errno == EINTR);
  489.                 } while (rv > 0 && ca[0] != '12' /*LF*/);
  490.                 /* second: kick away the SSL stuff */
  491.                 SSL_set_shutdown(conn->ssl, SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
  492.                 SSL_smart_shutdown(conn->ssl);
  493.                 /* tell the user how to access using the HTTPS scheme */
  494.                 //SSL_http_hint(conn, HTTP_BAD_REQUEST);
  495.              }   
  496.              else if (SSL_get_error(conn->ssl, rc) == SSL_ERROR_SYSCALL) {
  497.                 if (errno > 0)
  498.                     warning(0, "SSL: handshake interrupted by system (stop button pressed in browser?!)");
  499.                 else
  500.                     warning(0, "SSL: spurious handshake interrupt (one of OpenSSL confusions?!)");
  501.                 error(0, "SSL: OpenSSL: %.256s", ERR_error_string(ERR_get_error(), NULL));
  502.                 SSL_set_shutdown(conn->ssl, SSL_RECEIVED_SHUTDOWN);
  503.                 SSL_smart_shutdown(conn->ssl);
  504.              } 
  505.              else {
  506.                 /*
  507.                  * ok, anything else is a fatal error
  508.                  */
  509.                 warning(0, "SSL: handshake failed with fatal error");
  510.                 warning(0, "SSL: OpenSSL: %.256s", ERR_error_string(ERR_get_error(), NULL));
  511.                 
  512.                 SSL_set_shutdown(conn->ssl, SSL_RECEIVED_SHUTDOWN);
  513.                 SSL_smart_shutdown(conn->ssl);
  514.              }
  515.              warning(0, "SSL: disconnecting.");
  516.   
  517.              conn_destroy(conn);
  518.              return NULL;
  519.   
  520.         } /* SSL error */
  521.      
  522.     } else {
  523.         conn->ssl = NULL;
  524.         conn->peer_certificate = NULL;
  525.         conn->ssl_mutex = NULL;
  526.     }
  527. #endif /* HAVE_LIBSSL */
  528.     return conn;
  529. }
  530. void conn_destroy(Connection *conn)
  531. {
  532.     int ret;
  533.     if (conn == NULL)
  534.         return;
  535.     /* No locking done here.  conn_destroy should not be called
  536.      * if any thread might still be interested in the connection. */
  537.     if (conn->registered)
  538.         fdset_unregister(conn->registered, conn->fd);
  539.     if (conn->fd >= 0) {
  540.         /* Try to flush any remaining data, only in case this is
  541.          * not a SSL connection. Otherwise this crashes the bearerbox
  542.          * at least on the Cygwin platform
  543.          */
  544. #ifdef HAVE_LIBSSL
  545.         if (conn->ssl != NULL) {
  546.             mutex_lock(conn->ssl_mutex);
  547.             SSL_shutdown(conn->ssl);
  548.             SSL_free(conn->ssl);
  549.             if (conn->peer_certificate != NULL) 
  550.                 X509_free(conn->peer_certificate);
  551.             mutex_unlock(conn->ssl_mutex);
  552.             mutex_destroy(conn->ssl_mutex);
  553.     }
  554.         else
  555. #endif /* HAVE_LIBSSL */
  556.         unlocked_write(conn);
  557.         ret = close(conn->fd);
  558.         if (ret < 0)
  559.             error(errno, "conn_destroy: error on close");
  560.         conn->fd = -1;
  561.     }
  562.     octstr_destroy(conn->outbuf);
  563.     octstr_destroy(conn->inbuf);
  564.     mutex_destroy(conn->inlock);
  565.     mutex_destroy(conn->outlock);
  566.     gw_free(conn);
  567. }
  568. void conn_claim(Connection *conn)
  569. {
  570.     gw_assert(conn != NULL);
  571.     if (conn->claimed)
  572.         panic(0, "Connection is being claimed twice!");
  573.     conn->claimed = 1;
  574. #ifndef NO_GWASSERT
  575.     conn->claiming_thread = gwthread_self();
  576. #endif
  577. }
  578. long conn_outbuf_len(Connection *conn)
  579. {
  580.     long len;
  581.     lock_out(conn);
  582.     len = unlocked_outbuf_len(conn);
  583.     unlock_out(conn);
  584.     return len;
  585. }
  586. long conn_inbuf_len(Connection *conn)
  587. {
  588.     long len;
  589.     lock_in(conn);
  590.     len = unlocked_inbuf_len(conn);
  591.     unlock_in(conn);
  592.     return len;
  593. }
  594. int conn_eof(Connection *conn)
  595. {
  596.     int eof;
  597.     lock_in(conn);
  598.     eof = conn->read_eof;
  599.     unlock_in(conn);
  600.     return eof;
  601. }
  602. int conn_read_error(Connection *conn)
  603. {
  604.     int err;
  605.     lock_in(conn);
  606.     err = conn->read_error;
  607.     unlock_in(conn);
  608.     return err;
  609. }
  610. void conn_set_output_buffering(Connection *conn, unsigned int size)
  611. {
  612.     lock_out(conn);
  613.     conn->output_buffering = size;
  614.     /* If the buffer size is smaller, we may have to write immediately. */
  615.     unlocked_try_write(conn);
  616.     unlock_out(conn);
  617. }
  618. static void poll_callback(int fd, int revents, void *data)
  619. {
  620.     Connection *conn;
  621.     int do_callback = 0;
  622.     conn = data;
  623.     if (conn == NULL) {
  624.         error(0, "poll_callback called with NULL connection.");
  625.         return;
  626.     }
  627.     if (conn->fd != fd) {
  628.         error(0, "poll_callback called on wrong connection.");
  629.         return;
  630.     }
  631.     /* If unlocked_write manages to write all pending data, it will
  632.      * tell the fdset to stop listening for POLLOUT. */
  633.     if (revents & POLLOUT) {
  634.         lock_out(conn);
  635.         unlocked_write(conn);
  636. if (unlocked_outbuf_len(conn) == 0)
  637.     do_callback = 1;
  638.         unlock_out(conn);
  639.     }
  640.     /* If unlocked_read hits eof or error, it will tell the fdset to
  641.      * stop listening for POLLIN. */
  642.     if (revents & (POLLIN | POLLERR)) {
  643.         lock_in(conn);
  644.         unlocked_read(conn);
  645.         unlock_in(conn);
  646. do_callback = 1;
  647.     }
  648.     if (do_callback)
  649.         conn->callback(conn, conn->callback_data);
  650. }
  651. int conn_register(Connection *conn, FDSet *fdset,
  652.                   conn_callback_t callback, void *data)
  653. {
  654.     int events;
  655.     int result = 0;
  656.     gw_assert(conn != NULL);
  657.     if (conn->fd < 0)
  658.         return -1;
  659.     /* We need both locks if we want to update the registration
  660.      * information. */
  661.     lock_out(conn);
  662.     lock_in(conn);
  663.     if (conn->registered == fdset) {
  664.         /* Re-registering.  Change only the callback info. */
  665.         conn->callback = callback;
  666.         conn->callback_data = data;
  667.         result = 0;
  668.     } else if (conn->registered) {
  669.         /* Already registered to a different fdset. */
  670.         result = -1;
  671.     } else {
  672.         events = 0;
  673.         if (conn->read_eof == 0 && conn->read_error == 0)
  674.             events |= POLLIN;
  675.         if (unlocked_outbuf_len(conn) > 0)
  676.             events |= POLLOUT;
  677.         conn->registered = fdset;
  678.         conn->callback = callback;
  679.         conn->callback_data = data;
  680.         conn->listening_pollin = (events & POLLIN) != 0;
  681.         conn->listening_pollout = (events & POLLOUT) != 0;
  682.         fdset_register(fdset, conn->fd, events, poll_callback, conn);
  683.         result = 0;
  684.     }
  685.     unlock_out(conn);
  686.     unlock_in(conn);
  687.     return result;
  688. }
  689. void conn_unregister(Connection *conn)
  690. {
  691.     gw_assert(conn != NULL);
  692.     if (conn->fd < 0)
  693.         return;
  694.     /* We need both locks to update the registration information */
  695.     lock_out(conn);
  696.     lock_in(conn);
  697.     if (conn->registered) {
  698.         fdset_unregister(conn->registered, conn->fd);
  699.         conn->registered = NULL;
  700.         conn->callback = NULL;
  701.         conn->callback_data = NULL;
  702.         conn->listening_pollin = 0;
  703.         conn->listening_pollout = 0;
  704.     }
  705.     unlock_in(conn);
  706.     unlock_out(conn);
  707. }
  708. int conn_wait(Connection *conn, double seconds)
  709. {
  710.     int events;
  711.     int ret;
  712.     int fd;
  713.     lock_out(conn);
  714.     /* Try to write any data that might still be waiting to be sent */
  715.     ret = unlocked_write(conn);
  716.     if (ret < 0) {
  717.         unlock_out(conn);
  718.         return -1;
  719.     }
  720.     if (ret > 0) {
  721.         /* We did something useful.  No need to poll or wait now. */
  722.         unlock_out(conn);
  723.         return 0;
  724.     }
  725.     fd = conn->fd;
  726.     /* Normally, we block until there is more data available.  But
  727.      * if any data still needs to be sent, we block until we can
  728.      * send it (or there is more data available).  We always block
  729.      * for reading, unless we know there is no more data coming.
  730.      * (Because in that case, poll will keep reporting POLLIN to
  731.      * signal the end of the file).  If the caller explicitly wants
  732.      * to wait even though there is no data to write and we're at
  733.      * end of file, then poll for new data anyway because the caller
  734.      * apparently doesn't trust eof. */
  735.     events = 0;
  736.     if (unlocked_outbuf_len(conn) > 0)
  737.         events |= POLLOUT;
  738.     /* Don't keep the connection locked while we wait */
  739.     unlock_out(conn);
  740.     /* We need the in lock to query read_eof */
  741.     lock_in(conn);
  742.     if ((conn->read_eof == 0 && conn->read_error == 0) || events == 0)
  743.         events |= POLLIN;
  744.     unlock_in(conn);
  745.     ret = gwthread_pollfd(fd, events, seconds);
  746.     if (ret < 0) {
  747.         if (errno == EINTR)
  748.             return 0;
  749.         error(0, "conn_wait: poll failed on fd %d:", fd);
  750.         return -1;
  751.     }
  752.     if (ret == 0)
  753.         return 1;
  754.     if (ret & POLLNVAL) {
  755.         error(0, "conn_wait: fd %d not open.", fd);
  756.         return -1;
  757.     }
  758.     if (ret & (POLLERR | POLLHUP)) {
  759.         /* Call unlocked_read to report the specific error,
  760.          * and handle the results of the error.  We can't be
  761.          * certain that the error still exists, because we
  762.          * released the lock for a while. */
  763.         lock_in(conn);
  764.         unlocked_read(conn);
  765.         unlock_in(conn);
  766.         return -1;
  767.     }
  768.     /* If POLLOUT is on, then we must have wanted
  769.      * to write something. */
  770.     if (ret & POLLOUT) {
  771.         lock_out(conn);
  772.         unlocked_write(conn);
  773.         unlock_out(conn);
  774.     }
  775.     /* Since we normally select for reading, we must
  776.      * try to read here.  Otherwise, if the caller loops
  777.      * around conn_wait without making conn_read* calls
  778.      * in between, we will keep polling this same data. */
  779.     if (ret & POLLIN) {
  780.         lock_in(conn);
  781.         unlocked_read(conn);
  782.         unlock_in(conn);
  783.     }
  784.     return 0;
  785. }
  786. int conn_flush(Connection *conn)
  787. {
  788.     int ret;
  789.     int revents;
  790.     int fd;
  791.     lock_out(conn);
  792.     ret = unlocked_write(conn);
  793.     if (ret < 0) {
  794.         unlock_out(conn);
  795.         return -1;
  796.     }
  797.     while (unlocked_outbuf_len(conn) != 0) {
  798.         fd = conn->fd;
  799.         unlock_out(conn);
  800.         revents = gwthread_pollfd(fd, POLLOUT, -1.0);
  801.         /* Note: Make sure we have the "out" lock when
  802.          * going through the loop again, because the 
  803.          * loop condition needs it. */
  804.         if (revents < 0) {
  805.             if (errno == EINTR)
  806.                 return 1;
  807.             error(0, "conn_flush: poll failed on fd %d:", fd);
  808.             return -1;
  809.         }
  810.         if (revents == 0) {
  811.             /* We were woken up */
  812.             return 1;
  813.         }
  814.         if (revents & POLLNVAL) {
  815.             error(0, "conn_flush: fd %d not open.", fd);
  816.             return -1;
  817.         }
  818.         lock_out(conn);
  819.         if (revents & (POLLOUT | POLLERR | POLLHUP)) {
  820.             ret = unlocked_write(conn);
  821.             if (ret < 0) {
  822.                 unlock_out(conn);
  823.                 return -1;
  824.             }
  825.         }
  826.     }
  827.     unlock_out(conn);
  828.     return 0;
  829. }
  830. int conn_write(Connection *conn, Octstr *data)
  831. {
  832.     int ret;
  833.     lock_out(conn);
  834.     octstr_append(conn->outbuf, data);
  835.     ret = unlocked_try_write(conn);
  836.     unlock_out(conn);
  837.     return ret;
  838. }
  839. int conn_write_data(Connection *conn, unsigned char *data, long length)
  840. {
  841.     int ret;
  842.     lock_out(conn);
  843.     octstr_append_data(conn->outbuf, data, length);
  844.     ret = unlocked_try_write(conn);
  845.     unlock_out(conn);
  846.     return ret;
  847. }
  848. int conn_write_withlen(Connection *conn, Octstr *data)
  849. {
  850.     int ret;
  851.     unsigned char lengthbuf[4];
  852.     encode_network_long(lengthbuf, octstr_len(data));
  853.     lock_out(conn);
  854.     octstr_append_data(conn->outbuf, lengthbuf, 4);
  855.     octstr_append(conn->outbuf, data);
  856.     ret = unlocked_try_write(conn);
  857.     unlock_out(conn);
  858.     return ret;
  859. }
  860. Octstr *conn_read_everything(Connection *conn)
  861. {
  862.     Octstr *result = NULL;
  863.     lock_in(conn);
  864.     if (unlocked_inbuf_len(conn) == 0) {
  865.         unlocked_read(conn);
  866.         if (unlocked_inbuf_len(conn) == 0) {
  867.             unlock_in(conn);
  868.             return NULL;
  869.         }
  870.     }
  871.     result = unlocked_get(conn, unlocked_inbuf_len(conn));
  872.     gw_claim_area(result);
  873.     unlock_in(conn);
  874.     return result;
  875. }
  876. Octstr *conn_read_fixed(Connection *conn, long length)
  877. {
  878.     Octstr *result = NULL;
  879.     /* See if the data is already available.  If not, try a read(),
  880.      * then see if we have enough data after that.  If not, give up. */
  881.     lock_in(conn);
  882.     if (unlocked_inbuf_len(conn) < length) {
  883.         unlocked_read(conn);
  884.         if (unlocked_inbuf_len(conn) < length) {
  885.             unlock_in(conn);
  886.             return NULL;
  887.         }
  888.     }
  889.     result = unlocked_get(conn, length);
  890.     gw_claim_area(result);
  891.     unlock_in(conn);
  892.     return result;
  893. }
  894. Octstr *conn_read_line(Connection *conn)
  895. {
  896.     Octstr *result = NULL;
  897.     long pos;
  898.     lock_in(conn);
  899.     /* 10 is the code for linefeed.  We don't rely on n because that
  900.      * might be a different value on some (strange) systems, and
  901.      * we are reading from a network connection. */
  902.     pos = octstr_search_char(conn->inbuf, 10, conn->inbufpos);
  903.     if (pos < 0) {
  904.         unlocked_read(conn);
  905.         pos = octstr_search_char(conn->inbuf, 10, conn->inbufpos);
  906.         if (pos < 0) {
  907.             unlock_in(conn);
  908.             return NULL;
  909.         }
  910.     }
  911.     result = unlocked_get(conn, pos - conn->inbufpos);
  912.     gw_claim_area(result);
  913.     /* Skip the LF, which we left in the buffer */
  914.     conn->inbufpos++;
  915.     /* If the line was terminated with CR LF, we have to remove
  916.      * the CR from the result. */
  917.     if (octstr_len(result) > 0 &&
  918.         octstr_get_char(result, octstr_len(result) - 1) == 13)
  919.         octstr_delete(result, octstr_len(result) - 1, 1);
  920.     unlock_in(conn);
  921.     return result;
  922. }
  923. Octstr *conn_read_withlen(Connection *conn)
  924. {
  925.     Octstr *result = NULL;
  926.     unsigned char lengthbuf[4];
  927.     long length;
  928.     int try;
  929.     lock_in(conn);
  930.     for (try = 1; try <= 2; try++) {
  931.         if (try > 1)
  932.             unlocked_read(conn);
  933. retry:
  934.         /* First get the length. */
  935.         if (unlocked_inbuf_len(conn) < 4)
  936.             continue;
  937.         octstr_get_many_chars(lengthbuf, conn->inbuf, conn->inbufpos, 4);
  938.         length = decode_network_long(lengthbuf);
  939.         if (length < 0) {
  940.             warning(0, "conn_read_withlen: got negative length, skipping");
  941.             conn->inbufpos += 4;
  942.             goto retry;
  943.          }
  944.         /* Then get the data. */
  945.         if (unlocked_inbuf_len(conn) - 4 < length)
  946.             continue;
  947.         conn->inbufpos += 4;
  948.         result = unlocked_get(conn, length);
  949.         gw_claim_area(result);
  950.         break;
  951.     }
  952.     unlock_in(conn);
  953.     return result;
  954. }
  955. Octstr *conn_read_packet(Connection *conn, int startmark, int endmark)
  956. {
  957.     int startpos, endpos;
  958.     Octstr *result = NULL;
  959.     int try;
  960.     lock_in(conn);
  961.     for (try = 1; try <= 2; try++) {
  962.         if (try > 1)
  963.             unlocked_read(conn);
  964.         /* Find startmark, and discard everything up to it */
  965.         startpos = octstr_search_char(conn->inbuf, startmark, conn->inbufpos);
  966.         if (startpos < 0) {
  967.             conn->inbufpos = octstr_len(conn->inbuf);
  968.             continue;
  969.         } else {
  970.             conn->inbufpos = startpos;
  971.         }
  972.         /* Find first endmark after startmark */
  973.         endpos = octstr_search_char(conn->inbuf, endmark, conn->inbufpos);
  974.         if (endpos < 0)
  975.             continue;
  976.         result = unlocked_get(conn, endpos - startpos + 1);
  977.         gw_claim_area(result);
  978.         break;
  979.     }
  980.     unlock_in(conn);
  981.     return result;
  982. }
  983. #ifdef HAVE_LIBSSL
  984. X509 *conn_get_peer_certificate(Connection *conn) 
  985. {
  986.     mutex_lock(conn->ssl_mutex);
  987.     if (conn->peer_certificate == NULL && conn->ssl != NULL) 
  988.         conn->peer_certificate = SSL_get_peer_certificate(conn->ssl);
  989.     mutex_unlock(conn->ssl_mutex);
  990.     return(conn->peer_certificate);
  991. }
  992. RSA *tmp_rsa_callback(SSL *ssl, int export, int key_len) 
  993. {
  994.     static RSA *rsa = NULL; 
  995.     debug("gwlib.http", 0, "SSL: Generating new RSA key (export=%d, keylen=%d)", export, key_len);
  996.     if (export) {
  997.    rsa = RSA_generate_key(key_len, RSA_F4, NULL, NULL);
  998.     } else {
  999.    debug("gwlib.http", 0, "SSL: Export not set");
  1000.     }
  1001.     return rsa;
  1002. }
  1003. Mutex **ssl_static_locks = NULL;
  1004. Mutex **ssl_server_static_locks = NULL;
  1005. void openssl_locking_function(int mode, int n, const char *file, int line) 
  1006. {
  1007.     if (mode & CRYPTO_LOCK)
  1008.         mutex_lock(ssl_static_locks[n-1]);
  1009.     else
  1010.         mutex_unlock(ssl_static_locks[n-1]);
  1011. }
  1012. void openssl_server_locking_function(int mode, int n, const char *file, int line) 
  1013. {
  1014.     if (mode & CRYPTO_LOCK)
  1015.         mutex_lock(ssl_server_static_locks[n-1]);
  1016.     else
  1017.         mutex_unlock(ssl_server_static_locks[n-1]);
  1018. }
  1019. void conn_init_ssl(void)
  1020. {
  1021.     int c, maxlocks = CRYPTO_num_locks();
  1022.     gw_assert(ssl_static_locks == NULL);
  1023.     ssl_static_locks = gw_malloc(sizeof(Mutex *) * maxlocks);
  1024.     for (c=0;c<maxlocks;c++) 
  1025.         ssl_static_locks[c] = mutex_create();
  1026.     CRYPTO_set_locking_callback(openssl_locking_function);
  1027.     CRYPTO_set_id_callback((CRYPTO_CALLBACK_PTR)gwthread_self);
  1028.     SSL_library_init();
  1029.     SSL_load_error_strings();
  1030.     global_ssl_context = SSL_CTX_new(SSLv23_method());
  1031. }
  1032. void server_ssl_init(void) 
  1033. {
  1034.     int c, maxlocks = CRYPTO_num_locks();
  1035.     
  1036.     gw_assert(ssl_server_static_locks == NULL);
  1037.     ssl_server_static_locks = gw_malloc(sizeof(Mutex *) * maxlocks);
  1038.     for (c=0;c<maxlocks;c++) 
  1039.          ssl_server_static_locks[c] = mutex_create();
  1040.     CRYPTO_set_locking_callback(openssl_server_locking_function);
  1041.     CRYPTO_set_id_callback((CRYPTO_CALLBACK_PTR)gwthread_self);
  1042.     SSLeay_add_ssl_algorithms();
  1043.     SSL_load_error_strings();
  1044.     global_server_ssl_context = SSL_CTX_new(SSLv23_server_method());
  1045.     if (!SSL_CTX_set_default_verify_paths(global_server_ssl_context)) {
  1046.    panic(0, "can not set default path for server");
  1047.     }
  1048. }
  1049. void conn_shutdown_ssl(void)
  1050. {
  1051.     int c, maxlocks = CRYPTO_num_locks();
  1052.     if (global_ssl_context)
  1053.         SSL_CTX_free(global_ssl_context);
  1054.     for (c=0;c<maxlocks;c++) 
  1055.         mutex_destroy(ssl_static_locks[c]);
  1056.     gw_free(ssl_static_locks);
  1057. }
  1058. void server_shutdown_ssl(void)
  1059. {
  1060.     int c, maxlocks = CRYPTO_num_locks();
  1061.     SSL_CTX_free(global_server_ssl_context);
  1062.     for (c=0;c<maxlocks;c++) 
  1063.         mutex_destroy(ssl_server_static_locks[c]);
  1064.     gw_free(ssl_server_static_locks);
  1065. }
  1066. void use_global_client_certkey_file(Octstr *certkeyfile)
  1067.     SSL_CTX_use_certificate_file(global_ssl_context, 
  1068.                                  octstr_get_cstr(certkeyfile), 
  1069.                                  SSL_FILETYPE_PEM);
  1070.     SSL_CTX_use_PrivateKey_file(global_ssl_context,
  1071.                                 octstr_get_cstr(certkeyfile),
  1072.                                 SSL_FILETYPE_PEM);
  1073.     if (SSL_CTX_check_private_key(global_ssl_context) != 1)
  1074.         panic(0, "reading global client certificate file %s, the certificate "
  1075.       "isn't consistent with the private key (or failed reading the file)", 
  1076.               octstr_get_cstr(certkeyfile));
  1077.     info(0, "Using global SSL certificate and key from file %s",
  1078.          octstr_get_cstr(certkeyfile));
  1079. }
  1080. void use_global_server_certkey_file(Octstr *certfile, Octstr *keyfile) 
  1081. {
  1082.     SSL_CTX_use_certificate_file(global_server_ssl_context, 
  1083.                                   octstr_get_cstr(certfile), 
  1084.                                   SSL_FILETYPE_PEM);
  1085.     SSL_CTX_use_PrivateKey_file(global_server_ssl_context,
  1086.                                  octstr_get_cstr(keyfile),
  1087.                                  SSL_FILETYPE_PEM);
  1088.     if (SSL_CTX_check_private_key(global_server_ssl_context) != 1) {
  1089.         error(0, "SSL: %s", ERR_error_string(ERR_get_error(), NULL));
  1090.         panic(0, "reading global server certificate file %s, the certificate 
  1091.                   isn't consistent with the private key in file %s 
  1092.                   (or failed reading the file)", 
  1093.                   octstr_get_cstr(certfile), octstr_get_cstr(keyfile));
  1094.     }
  1095.     info(0, "Using global server SSL certificate from file %s", octstr_get_cstr(certfile));
  1096.     info(0, "Using global server SSL key from file %s", octstr_get_cstr(keyfile));
  1097. }
  1098. static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
  1099. {
  1100.     char    subject[256];
  1101.     char    issuer [256];
  1102.     char   *status;
  1103.     X509_NAME_oneline(X509_get_subject_name(ctx->current_cert), subject, sizeof(subject));
  1104.     X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert), issuer, sizeof (issuer));
  1105.     status = preverify_ok ? "Accepting" : "Rejecting";
  1106.     
  1107.     info(0, "%s certificate for "%s" signed by "%s"", status, subject, issuer);
  1108.     
  1109.     return preverify_ok;
  1110. }
  1111. void conn_config_ssl (CfgGroup *grp)
  1112. {
  1113.     Octstr *ssl_client_certkey_file = NULL;
  1114.     Octstr *ssl_server_cert_file    = NULL;
  1115.     Octstr *ssl_server_key_file     = NULL;
  1116.     Octstr *ssl_trusted_ca_file     = NULL;
  1117.     /*
  1118.      * check if SSL is desired for HTTP servers and then
  1119.      * load SSL client and SSL server public certificates 
  1120.      * and private keys
  1121.      */    
  1122.     ssl_client_certkey_file = cfg_get(grp, octstr_imm("ssl-client-certkey-file"));
  1123.     if (ssl_client_certkey_file != NULL) 
  1124.         use_global_client_certkey_file(ssl_client_certkey_file);
  1125.     
  1126.     ssl_server_cert_file = cfg_get(grp, octstr_imm("ssl-server-cert-file"));
  1127.     ssl_server_key_file = cfg_get(grp, octstr_imm("ssl-server-key-file"));
  1128.     
  1129.     if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL) {
  1130.         use_global_server_certkey_file(ssl_server_cert_file, 
  1131.        ssl_server_key_file);
  1132.     }
  1133.     ssl_trusted_ca_file = cfg_get(grp, octstr_imm("ssl-trusted-ca-file"));
  1134.     
  1135.     if (ssl_trusted_ca_file != NULL) {
  1136. if (!SSL_CTX_load_verify_locations(global_ssl_context,
  1137.    octstr_get_cstr(ssl_trusted_ca_file),
  1138.    NULL)) {
  1139.     panic(0, "Failed to load SSL CA file: %s", octstr_get_cstr(ssl_trusted_ca_file));
  1140. } else {
  1141.     info(0, "Using CA root certificates from file %s",
  1142.  octstr_get_cstr(ssl_trusted_ca_file));
  1143.     SSL_CTX_set_verify(global_ssl_context,
  1144.        SSL_VERIFY_PEER,
  1145.        verify_callback);
  1146. }
  1147.     } else {
  1148. SSL_CTX_set_verify(global_ssl_context,
  1149.    SSL_VERIFY_NONE,
  1150.    NULL);
  1151.     }
  1152.     
  1153.     octstr_destroy(ssl_client_certkey_file);
  1154.     octstr_destroy(ssl_server_cert_file);
  1155.     octstr_destroy(ssl_server_key_file);
  1156.     octstr_destroy(ssl_trusted_ca_file);
  1157. }
  1158. SSL *conn_get_ssl(Connection *conn)
  1159. {
  1160.     if (conn != NULL)
  1161.         return conn->ssl;
  1162.     else 
  1163.         return NULL;
  1164. }
  1165. #else
  1166. void conn_config_ssl (CfgGroup *grp)
  1167. {
  1168.     info(0, "SSL not supported, no SSL initialization done.");
  1169. }
  1170. #endif /* HAVE_LIBSSL */
  1171. int conn_get_id(Connection *conn) {
  1172.     if(conn == NULL)
  1173. return 0;
  1174.     else
  1175. return conn->fd;
  1176. }