Certificate variables and field-extractor expansions. Bug 1358
[exim.git] / src / src / tls.c
index 1305e9c4f640f0b693eacd0bba1e747faad2eb7b..ad7fe609c26d06e9bcb47f437e31a73cfe08f3cb 100644 (file)
@@ -1,10 +1,8 @@
-/* $Cambridge: exim/src/src/tls.c,v 1.2 2005/01/04 10:00:42 ph10 Exp $ */
-
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2005 */
+/* Copyright (c) University of Cambridge 1995 - 2012 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* This module provides TLS (aka SSL) support for Exim. The code for OpenSSL is
@@ -32,16 +30,21 @@ static void dummy(int x) { dummy(x-1); }
 #else
 
 /* Static variables that are used for buffering data by both sets of
-functions and the common functions below. */
+functions and the common functions below.
 
+We're moving away from this; GnuTLS is already using a state, which
+can switch, so we can do TLS callouts during ACLs. */
 
+static const int ssl_xfer_buffer_size = 4096;
+#ifndef USE_GNUTLS
 static uschar *ssl_xfer_buffer = NULL;
-static int ssl_xfer_buffer_size = 4096;
 static int ssl_xfer_buffer_lwm = 0;
 static int ssl_xfer_buffer_hwm = 0;
 static int ssl_xfer_eof = 0;
 static int ssl_xfer_error = 0;
+#endif
 
+uschar *tls_channelbinding_b64 = NULL;
 
 
 /*************************************************
@@ -60,11 +63,11 @@ Returns:    TRUE if OK; result may still be NULL after forced failure
 */
 
 static BOOL
-expand_check(uschar *s, uschar *name, uschar **result)
+expand_check(const uschar *s, const uschar *name, uschar **result)
 {
 if (s == NULL) *result = NULL; else
   {
-  *result = expand_string(s);
+  *result = expand_string(US s); /* need to clean up const some more */
   if (*result == NULL && !expand_string_forcedfail)
     {
     log_write(0, LOG_MAIN|LOG_PANIC, "expansion of %s failed: %s", name,
@@ -82,8 +85,17 @@ return TRUE;
 
 #ifdef USE_GNUTLS
 #include "tls-gnu.c"
+#include "tlscert-gnu.c"
+
+#define ssl_xfer_buffer (state_server.xfer_buffer)
+#define ssl_xfer_buffer_lwm (state_server.xfer_buffer_lwm)
+#define ssl_xfer_buffer_hwm (state_server.xfer_buffer_hwm)
+#define ssl_xfer_eof (state_server.xfer_eof)
+#define ssl_xfer_error (state_server.xfer_error)
+
 #else
 #include "tls-openssl.c"
+#include "tlscert-openssl.c"
 #endif
 
 
@@ -94,6 +106,7 @@ return TRUE;
 
 /* Puts a character back in the input buffer. Only ever
 called once.
+Only used by the server-side TLS.
 
 Arguments:
   ch           the character
@@ -115,6 +128,7 @@ return ch;
 *************************************************/
 
 /* Tests for a previous EOF
+Only used by the server-side TLS.
 
 Arguments:     none
 Returns:       non-zero if the eof flag is set
@@ -134,6 +148,7 @@ return ssl_xfer_eof;
 
 /* Tests for a previous read error, and returns with errno
 restored to what it was when the error was detected.
+Only used by the server-side TLS.
 
 >>>>> Hmm. Errno not handled yet. Where do we get it from?  >>>>>
 
@@ -147,6 +162,37 @@ tls_ferror(void)
 return ssl_xfer_error;
 }
 
+
+/*************************************************
+*           TLS version of smtp_buffered         *
+*************************************************/
+
+/* Tests for unused chars in the TLS input buffer.
+Only used by the server-side TLS.
+
+Arguments:     none
+Returns:       TRUE/FALSE
+*/
+
+BOOL
+tls_smtp_buffered(void)
+{
+return ssl_xfer_buffer_lwm < ssl_xfer_buffer_hwm;
+}
+
+
 #endif  /* SUPPORT_TLS */
 
+void
+tls_modify_variables(tls_support * dest_tsp)
+{
+modify_variable(US"tls_bits",                 &dest_tsp->bits);
+modify_variable(US"tls_certificate_verified", &dest_tsp->certificate_verified);
+modify_variable(US"tls_cipher",               &dest_tsp->cipher);
+modify_variable(US"tls_peerdn",               &dest_tsp->peerdn);
+#if defined(SUPPORT_TLS) && !defined(USE_GNUTLS)
+modify_variable(US"tls_sni",                  &dest_tsp->sni);
+#endif
+}
+
 /* End of tls.c */