[Exim] [patch] $tls_certificate_verified

Top Page
Delete this message
Reply to this message
Author: Matt Bernstein
Date:  
To: exim-users
Subject: [Exim] [patch] $tls_certificate_verified
This patch allows this variable (I switched it from a BOOL to an int to
make it behave like $host_lookup_failed..I think--it's late).

$tls_certificate_verified: This variable contains ``1'' if the SMTP
connection is encrypted and the client provides a certificate which is
successfully verified. Otherwise the value of the variable is ``0''.

Haven't tested it the other way around (ie verifying server certs).

Example usage (AUTH EXTERNAL):

external:
driver = plaintext
public_name = EXTERNAL
server_condition = ${if eq{$tls_certificate_verified}{1}{yes}{no}}
server_set_id = ${if match{$tls_peerdn}{\N/CN=(.+)/\N}{$1}fail}

I really wanted the regex [^/]CN=(.+)[/$] but my brain is too scrambled to
escape it properly. Hints appreciated.. ..alternatively the $tls_peercn
that SRH posted a patch for..

My patch assumes you're in src/ (sorry).

--- acl.c~    Mon Jul 22 09:59:47 2002
+++ acl.c    Wed Sep 11 23:44:42 2002
@@ -436,7 +436,7 @@
 mandatory verification, the connection doesn't last this long.) */


if (strcmpic(ss, US"certificate") == 0)
- return tls_certificate_verified? OK : FAIL;
+ return (tls_certificate_verified == 1)? OK : FAIL;

/* We can test the result of optional HELO verification */

--- expand.c~    Mon Jul 22 09:59:48 2002
+++ expand.c    Wed Sep 11 23:43:08 2002
@@ -246,6 +246,7 @@
   { "spool_directory",     vtype_stringptr,   &spool_directory },
   { "thisaddress",         vtype_stringptr,   &filter_thisaddress },
 #ifdef SUPPORT_TLS
+  { "tls_certificate_verified",vtype_int,     &tls_certificate_verified },
   { "tls_cipher",          vtype_stringptr,   &tls_cipher },
   { "tls_peerdn",          vtype_stringptr,   &tls_peerdn },
 #endif
--- globals.c~    Mon Jul 22 09:59:48 2002
+++ globals.c    Wed Sep 11 23:46:18 2002
@@ -83,7 +83,7 @@
 them. */


 BOOL    tls_active             = -1;
-BOOL    tls_certificate_verified = FALSE;
+int     tls_certificate_verified = 0;
 uschar *tls_cipher             = NULL;


 #ifdef SUPPORT_TLS
--- globals.h~    Mon Jul 22 09:59:49 2002
+++ globals.h    Wed Sep 11 23:47:12 2002
@@ -48,7 +48,7 @@
 them. */


 extern int     tls_active;             /* fd/socket when in a TLS session */
-extern BOOL    tls_certificate_verified; /* Client certificate verified */
+extern int     tls_certificate_verified; /* Client certificate verified */
 extern uschar *tls_cipher;             /* Cipher used */


 #ifdef SUPPORT_TLS
--- tls.c~    Mon Jul 22 09:59:51 2002
+++ tls.c    Wed Sep 11 23:47:49 2002
@@ -196,7 +196,7 @@
   tls_peerdn = txt;
   }


-if (!verify_callback_called) tls_certificate_verified = TRUE;
+if (!verify_callback_called) tls_certificate_verified = 1;
verify_callback_called = TRUE;

return 1; /* accept */