talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 4a8bc10ef58d41fbf91b25c1950429b52eb4b4e6
parent 1449de86cf1aa0e1ca59189279185845cc3ad775
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 10 Oct 2008 18:47:00 +0000

2008-10-10 [colin]	3.6.1cvs2

	* src/common/ssl.h
	* src/common/ssl_certificate.c
	* src/gtk/sslcertwindow.c
		Add offline certificate verification,
		thanks to Nikos Mavrogiannopoulos for the
		hints

Diffstat:
MChangeLog | 9+++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/common/ssl.h | 1+
Msrc/common/ssl_certificate.c | 66+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Msrc/gtk/sslcertwindow.c | 8++++----
6 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,12 @@ +2008-10-10 [colin] 3.6.1cvs2 + + * src/common/ssl.h + * src/common/ssl_certificate.c + * src/gtk/sslcertwindow.c + Add offline certificate verification, + thanks to Nikos Mavrogiannopoulos for the + hints + 2008-10-10 [colin] 3.6.1cvs1 * src/common/ssl_certificate.c diff --git a/PATCHSETS b/PATCHSETS @@ -3583,3 +3583,4 @@ ( cvs diff -u -r 1.1.2.2 -r 1.1.2.3 claws-mail.pc.in; ) > 3.6.0cvs24.patchset ( cvs diff -u -r 1.9.2.33 -r 1.9.2.34 src/common/ssl.c; ) > 3.6.0cvs25.patchset ( cvs diff -u -r 1.4.2.30 -r 1.4.2.31 src/common/ssl_certificate.c; cvs diff -u -r 1.9.2.24 -r 1.9.2.25 src/gtk/sslcertwindow.c; ) > 3.6.1cvs1.patchset +( cvs diff -u -r 1.2.2.10 -r 1.2.2.11 src/common/ssl.h; cvs diff -u -r 1.4.2.31 -r 1.4.2.32 src/common/ssl_certificate.c; cvs diff -u -r 1.9.2.25 -r 1.9.2.26 src/gtk/sslcertwindow.c; ) > 3.6.1cvs2.patchset diff --git a/configure.ac b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=6 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=1 +EXTRA_VERSION=2 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/common/ssl.h b/src/common/ssl.h @@ -72,6 +72,7 @@ struct _SSLClientCertHookData SSL_CTX *ssl_get_ctx(void); #endif +const gchar *claws_ssl_get_cert_file(void); #endif /* USE_OPENSSL */ #endif /* __SSL_H__ */ diff --git a/src/common/ssl_certificate.c b/src/common/ssl_certificate.c @@ -649,11 +649,71 @@ char *ssl_certificate_check_signer (X509 *cert) return NULL; } #else -char *ssl_certificate_check_signer (gnutls_x509_crt cert, guint status) +guint check_cert(gnutls_x509_crt cert) { - if (status == (guint)-1) - return g_strdup(_("Uncheckable")); + gnutls_x509_crt *ca_list; + unsigned int max = 512; + unsigned int flags = 0; + gnutls_datum tmp; + struct stat s; + int r, i; + unsigned int status; + FILE *fp; + + if (claws_ssl_get_cert_file()) + fp = fopen(claws_ssl_get_cert_file(), "r"); + else + return (guint)-1; + + if (fstat(fileno(fp), &s) < 0) { + perror("fstat"); + fclose(fp); + return (guint)-1; + } + + ca_list=(gnutls_x509_crt_t*)malloc(max*sizeof(gnutls_x509_crt_t)); + tmp.data = malloc(s.st_size); + memset(tmp.data, 0, s.st_size); + tmp.size = s.st_size; + if (fread (tmp.data, 1, s.st_size, fp) < s.st_size) { + perror("fread"); + free(tmp.data); + free(ca_list); + fclose(fp); + return (guint)-1; + } + + if ((r = gnutls_x509_crt_list_import(ca_list, &max, + &tmp, GNUTLS_X509_FMT_PEM, flags)) < 0) { + debug_print("cert import failed: %s\n", gnutls_strerror(r)); + free(tmp.data); + free(ca_list); + fclose(fp); + return (guint)-1; + } + free(tmp.data); + debug_print("got %d certs in ca_list! %p\n", max, &ca_list); + r = gnutls_x509_crt_verify(cert, ca_list, max, flags, &status); + fclose(fp); + for (i = 0; i < max; i++) + gnutls_x509_crt_deinit(ca_list[i]); + free(ca_list); + + if (r < 0) + return (guint)-1; + else + return status; + +} + +char *ssl_certificate_check_signer (gnutls_x509_crt cert, guint status) +{ + if (status == (guint)-1) { + status = check_cert(cert); + if (status == -1) + return g_strdup(_("Uncheckable")); + } if (status & GNUTLS_CERT_INVALID) { if (gnutls_x509_crt_check_issuer(cert, cert)) return g_strdup(_("Self-signed certificate")); diff --git a/src/gtk/sslcertwindow.c b/src/gtk/sslcertwindow.c @@ -229,7 +229,7 @@ static GtkWidget *cert_presenter(SSLCertificate *cert) #endif if (sig_status==NULL) - sig_status = g_strdup(_("correct")); + sig_status = g_strdup(_("Correct")); vbox = gtk_vbox_new(FALSE, 5); hbox = gtk_hbox_new(FALSE, 5); @@ -398,7 +398,7 @@ static gboolean sslcertwindow_ask_new_cert(SSLCertificate *cert) sig_status = ssl_certificate_check_signer(cert->x509_cert, cert->status); #endif if (sig_status==NULL) - sig_status = g_strdup(_("correct")); + sig_status = g_strdup(_("Correct")); buf = g_strdup_printf(_("Signature status: %s"), sig_status); label = gtk_label_new(buf); @@ -443,7 +443,7 @@ static gboolean sslcertwindow_ask_expired_cert(SSLCertificate *cert) #endif if (sig_status==NULL) - sig_status = g_strdup(_("correct")); + sig_status = g_strdup(_("Correct")); buf = g_strdup_printf(_("Signature status: %s"), sig_status); label = gtk_label_new(buf); @@ -502,7 +502,7 @@ static gboolean sslcertwindow_ask_changed_cert(SSLCertificate *old_cert, SSLCert #endif if (sig_status==NULL) - sig_status = g_strdup(_("correct")); + sig_status = g_strdup(_("Correct")); buf = g_strdup_printf(_("Signature status: %s"), sig_status); label = gtk_label_new(buf);