talons

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

commit f5b8cdb85f2a18f55fe19fd195c009d0f0c73860
parent 2157343a9aad5a7d071dd1d8dc60c5ec02b1e05e
Author: Oliver Lowe <o@olowe.co>
Date:   Fri, 29 Aug 2025 14:30:18 +1000

Just use TLS cert manager from the OS

Diffstat:
Msrc/Makefile.am | 2--
Msrc/account.c | 1-
Msrc/common/session.c | 2+-
Msrc/etpan/imap-thread.c | 4++--
Msrc/gtk/Makefile.am | 2--
Dsrc/gtk/sslcertwindow.c | 557-------------------------------------------------------------------------------
Dsrc/gtk/sslcertwindow.h | 37-------------------------------------
Msrc/mainwindow.c | 26++------------------------
Msrc/pop.c | 2+-
Msrc/prefs_account.c | 16+---------------
Msrc/prefs_account.h | 1-
Msrc/send_message.c | 2+-
Dsrc/ssl_manager.c | 470-------------------------------------------------------------------------------
Dsrc/ssl_manager.h | 30------------------------------
14 files changed, 8 insertions(+), 1144 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am @@ -117,7 +117,6 @@ claws_mail_SOURCES = \ send_message.c \ setup.c \ sourcewindow.c \ - ssl_manager.c \ statusbar.c \ stock_pixmap.c \ summary_search.c \ @@ -216,7 +215,6 @@ claws_mailinclude_HEADERS = \ send_message.h \ setup.h \ sourcewindow.h \ - ssl_manager.h \ statusbar.h \ stock_pixmap.h \ summary_search.h \ diff --git a/src/account.c b/src/account.c @@ -934,7 +934,6 @@ static void account_clone(GtkWidget *widget, gpointer data) ACP_FASSIGN(ssl_imap); ACP_FASSIGN(ssl_nntp); ACP_FASSIGN(ssl_smtp); - ACP_FASSIGN(ssl_certs_auto_accept); ACP_FASSIGN(use_nonblocking_ssl); ACP_FASSIGN(use_tls_sni); ACP_FASSIGN(in_ssl_client_cert_file); diff --git a/src/common/session.c b/src/common/session.c @@ -169,7 +169,7 @@ static gint session_connect_cb(SockInfo *sock, gpointer data) session->sock = sock; sock->account = session->account; sock->is_smtp = session->is_smtp; - sock->ssl_cert_auto_accept = session->ssl_cert_auto_accept; + sock->ssl_cert_auto_accept = TRUE; #ifdef USE_GNUTLS sock->gnutls_priority = session->gnutls_priority; diff --git a/src/etpan/imap-thread.c b/src/etpan/imap-thread.c @@ -588,7 +588,7 @@ int imap_threaded_connect_ssl(Folder * folder, const char * server, int port) param.account = folder->account; if (folder->account) - accept_if_valid = folder->account->ssl_certs_auto_accept; + accept_if_valid = TRUE; refresh_resolvers(); if (threaded_run(folder, &param, &result, connect_ssl_run)) @@ -1146,7 +1146,7 @@ int imap_threaded_starttls(Folder * folder, const gchar *host, int port) param.account = folder->account; if (folder->account) - accept_if_valid = folder->account->ssl_certs_auto_accept; + accept_if_valid = TRUE; if (threaded_run(folder, &param, &result, starttls_run)) return MAILIMAP_ERROR_INVAL; diff --git a/src/gtk/Makefile.am b/src/gtk/Makefile.am @@ -30,7 +30,6 @@ libclawsgtk_la_SOURCES = \ prefswindow.c \ progressdialog.c \ quicksearch.c \ - sslcertwindow.c \ claws-marshal.c clawsgtkincludedir = $(pkgincludedir)/gtk @@ -53,7 +52,6 @@ clawsgtkinclude_HEADERS = \ prefswindow.h \ progressdialog.h \ quicksearch.h \ - sslcertwindow.h \ claws-marshal.h \ gtkcmctree.h \ gtkcmclist.h \ diff --git a/src/gtk/sslcertwindow.c b/src/gtk/sslcertwindow.c @@ -1,557 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2022 the Claws Mail team and Colin Leroy - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS - -#include <gnutls/gnutls.h> -#include <gnutls/x509.h> -#include <gnutls/crypto.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <stdio.h> -#include <unistd.h> -#include <string.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <gtk/gtk.h> - -#include "prefs_common.h" -#include "defs.h" -#include "ssl_certificate.h" -#include "utils.h" -#include "alertpanel.h" -#include "hooks.h" - -static gboolean sslcertwindow_ask_new_cert(SSLCertificate *cert); -static gboolean sslcertwindow_ask_expired_cert(SSLCertificate *cert); -static gboolean sslcertwindow_ask_changed_cert(SSLCertificate *old_cert, SSLCertificate *new_cert); - -static GtkWidget *cert_presenter(SSLCertificate *cert) -{ - GtkWidget *vbox = NULL; - GtkWidget *hbox = NULL; - GtkWidget *frame_owner = NULL; - GtkWidget *frame_signer = NULL; - GtkWidget *frame_status = NULL; - GtkWidget *owner_table = NULL; - GtkWidget *signer_table = NULL; - GtkWidget *status_table = NULL; - GtkWidget *label = NULL; - - char *issuer_commonname, *issuer_location, *issuer_organization; - char *subject_commonname, *subject_location, *subject_organization; - char *sig_status, *exp_date; - char *sha1_fingerprint, *sha256_fingerprint, *fingerprint; - size_t n; - char buf[100]; - unsigned char md[128]; - char *tmp; - time_t exp_time_t; - struct tm lt; - guint ret; - - /* issuer */ - issuer_commonname = g_malloc(BUFFSIZE); - issuer_location = g_malloc(BUFFSIZE); - issuer_organization = g_malloc(BUFFSIZE); - subject_commonname = g_malloc(BUFFSIZE); - subject_location = g_malloc(BUFFSIZE); - subject_organization = g_malloc(BUFFSIZE); - - n = BUFFSIZE; - if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COMMON_NAME, 0, 0, issuer_commonname, &n)) - strncpy(issuer_commonname, _("<not in certificate>"), BUFFSIZE-1); - n = BUFFSIZE; - - if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, issuer_location, &n)) { - if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, issuer_location, &n)) { - strncpy(issuer_location, _("<not in certificate>"), BUFFSIZE-1); - } - } else { - tmp = g_malloc(BUFFSIZE); - if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, tmp, &n) == 0) { - strncat(issuer_location, ", ", BUFFSIZE-strlen(issuer_location)-1); - strncat(issuer_location, tmp, BUFFSIZE-strlen(issuer_location)-1); - } - g_free(tmp); - } - - n = BUFFSIZE; - if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, issuer_organization, &n)) - strncpy(issuer_organization, _("<not in certificate>"), BUFFSIZE-1); - - n = BUFFSIZE; - if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COMMON_NAME, 0, 0, subject_commonname, &n)) - strncpy(subject_commonname, _("<not in certificate>"), BUFFSIZE-1); - n = BUFFSIZE; - - if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, subject_location, &n)) { - if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, subject_location, &n)) { - strncpy(subject_location, _("<not in certificate>"), BUFFSIZE-1); - } - } else { - tmp = g_malloc(BUFFSIZE); - if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, tmp, &n) == 0) { - strncat(subject_location, ", ", BUFFSIZE-strlen(subject_location)-1); - strncat(subject_location, tmp, BUFFSIZE-strlen(subject_location)-1); - } - g_free(tmp); - } - - n = BUFFSIZE; - if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, - GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, subject_organization, &n)) - strncpy(subject_organization, _("<not in certificate>"), BUFFSIZE-1); - - exp_time_t = gnutls_x509_crt_get_expiration_time(cert->x509_cert); - - memset(buf, 0, sizeof(buf)); - if (exp_time_t > 0) { - fast_strftime(buf, sizeof(buf)-1, prefs_common.date_format, localtime_r(&exp_time_t, &lt)); - exp_date = (*buf) ? g_strdup(buf):g_strdup("?"); - } else - exp_date = g_strdup(""); - - /* fingerprints */ - n = 0; - memset(md, 0, sizeof(md)); - if ((ret = gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_SHA1, md, &n)) == GNUTLS_E_SHORT_MEMORY_BUFFER) { - if (n <= sizeof(md)) - ret = gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_SHA1, md, &n); - } - - if (ret != 0) { - g_warning("failed to obtain SHA1 fingerprint: %d", ret); - sha1_fingerprint = g_strdup("-"); - } else { - sha1_fingerprint = readable_fingerprint(md, (int)n); - } - - n = 0; - memset(md, 0, sizeof(md)); - if ((ret = gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_SHA256, md, &n)) == GNUTLS_E_SHORT_MEMORY_BUFFER) { - if (n <= sizeof(md)) - ret = gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_SHA256, md, &n); - } - - if (ret != 0) { - g_warning("failed to obtain SHA256 fingerprint: %d", ret); - sha256_fingerprint = g_strdup("-"); - } else { - sha256_fingerprint = readable_fingerprint(md, (int)n); - } - - - /* signature */ - sig_status = ssl_certificate_check_signer(cert, cert->status); - - if (sig_status==NULL) - sig_status = g_strdup_printf(_("Correct%s"),exp_time_t < time(NULL)? _(" (expired)"): ""); - else if (exp_time_t < time(NULL)) - sig_status = g_strconcat(sig_status,_(" (expired)"),NULL); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); - - frame_owner = gtk_frame_new(_("Owner")); - frame_signer = gtk_frame_new(_("Signer")); - frame_status = gtk_frame_new(_("Status")); - - owner_table = gtk_grid_new(); - signer_table = gtk_grid_new(); - status_table = gtk_grid_new(); - - label = gtk_label_new(_("Name: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 0, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(subject_commonname); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 1, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Organization: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 0, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(subject_organization); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 1, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Location: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 0, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(subject_location); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(owner_table), label, 1, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Name: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 0, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(issuer_commonname); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 1, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Organization: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 0, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(issuer_organization); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 1, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Location: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 0, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(issuer_location); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(signer_table), label, 1, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Fingerprint: \n")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(status_table), label, 0, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - fingerprint = g_strdup_printf("SHA1: %s\nSHA256: %s", - sha1_fingerprint, sha256_fingerprint); - label = gtk_label_new(fingerprint); - g_free(fingerprint); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(status_table), label, 1, 0, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(_("Signature status: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(status_table), label, 0, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(sig_status); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(status_table), label, 1, 1, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(exp_time_t < time(NULL)? _("Expired on: "): _("Expires on: ")); - gtk_label_set_xalign(GTK_LABEL(label), 1.0); - gtk_grid_attach(GTK_GRID(status_table), label, 0, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - label = gtk_label_new(exp_date); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_grid_attach(GTK_GRID(status_table), label, 1, 2, 1, 1); - gtk_widget_set_hexpand(label, TRUE); - gtk_widget_set_halign(label, GTK_ALIGN_FILL); - - gtk_container_add(GTK_CONTAINER(frame_owner), GTK_WIDGET(owner_table)); - gtk_container_add(GTK_CONTAINER(frame_signer), GTK_WIDGET(signer_table)); - gtk_container_add(GTK_CONTAINER(frame_status), GTK_WIDGET(status_table)); - - gtk_box_pack_end(GTK_BOX(hbox), frame_signer, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(hbox), frame_owner, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), frame_status, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); - - gtk_widget_show_all(vbox); - - g_free(issuer_commonname); - g_free(issuer_location); - g_free(issuer_organization); - g_free(subject_commonname); - g_free(subject_location); - g_free(subject_organization); - g_free(sha1_fingerprint); - g_free(sha256_fingerprint); - g_free(sig_status); - g_free(exp_date); - return vbox; -} - -static gboolean sslcert_ask_hook(gpointer source, gpointer data) -{ - SSLCertHookData *hookdata = (SSLCertHookData *)source; - - if (hookdata == NULL) { - return FALSE; - } - - if (prefs_common.skip_ssl_cert_check) { - hookdata->accept = TRUE; - return TRUE; - } - - if (hookdata->old_cert == NULL) { - if (hookdata->expired) - hookdata->accept = sslcertwindow_ask_expired_cert(hookdata->cert); - else - hookdata->accept = sslcertwindow_ask_new_cert(hookdata->cert); - } else { - hookdata->accept = sslcertwindow_ask_changed_cert(hookdata->old_cert, hookdata->cert); - } - - return TRUE; -} - -void sslcertwindow_register_hook(void) -{ - hooks_register_hook(SSLCERT_ASK_HOOKLIST, sslcert_ask_hook, NULL); -} - -void sslcertwindow_show_cert(SSLCertificate *cert) -{ - GtkWidget *cert_widget = cert_presenter(cert); - gchar *buf; - - buf = g_strdup_printf(_("TLS certificate for %s"), cert->host); - alertpanel_full(buf, NULL, "window-close-symbolic", _("_Close"), NULL, NULL, NULL, NULL, - ALERTFOCUS_FIRST, FALSE, cert_widget, ALERT_NOTICE); - g_free(buf); -} - -static gchar *sslcertwindow_get_invalid_str(SSLCertificate *cert) -{ - gchar *subject_cn = NULL; - gchar *str = NULL; - - if (ssl_certificate_check_subject_cn(cert)) - return g_strdup(""); - - subject_cn = ssl_certificate_get_subject_cn(cert); - - str = g_strdup_printf(_("Certificate is for %s, but connection is to %s.\n" - "You may be connecting to a rogue server.\n\n"), - subject_cn, cert->host); - g_free(subject_cn); - - return str; -} - -static gboolean sslcertwindow_ask_new_cert(SSLCertificate *cert) -{ - gchar *buf, *sig_status; - AlertValue val; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *button; - GtkWidget *cert_widget; - gchar *invalid_str = sslcertwindow_get_invalid_str(cert); - const gchar *title; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - buf = g_strdup_printf(_("Certificate for %s is unknown.\n%sDo you want to accept it?"), cert->host, invalid_str); - g_free(invalid_str); - - label = gtk_label_new(buf); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - g_free(buf); - - sig_status = ssl_certificate_check_signer(cert, cert->status); - if (sig_status==NULL) - sig_status = g_strdup(_("Correct")); - - buf = g_strdup_printf(_("Signature status: %s"), sig_status); - label = gtk_label_new(buf); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - g_free(buf); - g_free(sig_status); - - button = gtk_expander_new_with_mnemonic(_("_View certificate")); - gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); - cert_widget = cert_presenter(cert); - gtk_container_add(GTK_CONTAINER(button), cert_widget); - - if (!ssl_certificate_check_subject_cn(cert)) - title = _("TLS certificate is invalid"); - else - title = _("TLS certificate is unknown"); - - val = alertpanel_full(title, NULL, - NULL, _("_Cancel connection"), NULL, _("_Accept and save"), - NULL, NULL, ALERTFOCUS_FIRST, FALSE, vbox, ALERT_QUESTION); - - return (val == G_ALERTALTERNATE); -} - -static gboolean sslcertwindow_ask_expired_cert(SSLCertificate *cert) -{ - gchar *buf, *sig_status; - AlertValue val; - GtkWidget *vbox; - GtkWidget *label; - GtkWidget *button; - GtkWidget *cert_widget; - gchar *invalid_str = sslcertwindow_get_invalid_str(cert); - const gchar *title; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - buf = g_strdup_printf(_("Certificate for %s is expired.\n%sDo you want to continue?"), cert->host, invalid_str); - g_free(invalid_str); - - label = gtk_label_new(buf); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - g_free(buf); - - sig_status = ssl_certificate_check_signer(cert, cert->status); - - if (sig_status==NULL) - sig_status = g_strdup(_("Correct")); - - buf = g_strdup_printf(_("Signature status: %s"), sig_status); - label = gtk_label_new(buf); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - g_free(buf); - g_free(sig_status); - - button = gtk_expander_new_with_mnemonic(_("_View certificate")); - gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); - cert_widget = cert_presenter(cert); - gtk_container_add(GTK_CONTAINER(button), cert_widget); - - if (!ssl_certificate_check_subject_cn(cert)) - title = _("TLS certificate is invalid and expired"); - else - title = _("TLS certificate is expired"); - - val = alertpanel_full(title, NULL, - NULL, _("_Cancel connection"), NULL, _("_Accept"), - NULL, NULL, ALERTFOCUS_FIRST, FALSE, vbox, ALERT_QUESTION); - - return (val == G_ALERTALTERNATE); -} - -static gboolean sslcertwindow_ask_changed_cert(SSLCertificate *old_cert, SSLCertificate *new_cert) -{ - GtkWidget *old_cert_widget = cert_presenter(old_cert); - GtkWidget *new_cert_widget = cert_presenter(new_cert); - GtkWidget *vbox; - gchar *buf, *sig_status; - GtkWidget *vbox2; - GtkWidget *label; - GtkWidget *button; - AlertValue val; - gchar *invalid_str = sslcertwindow_get_invalid_str(new_cert); - const gchar *title; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - label = gtk_label_new(_("New certificate:")); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_end(GTK_BOX(vbox), new_cert_widget, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), label, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); - label = gtk_label_new(_("Known certificate:")); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_end(GTK_BOX(vbox), old_cert_widget, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(vbox), label, TRUE, TRUE, 0); - gtk_widget_show_all(vbox); - - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); - buf = g_strdup_printf(_("Certificate for %s has changed.\n%sDo you want to accept it?"), new_cert->host, invalid_str); - g_free(invalid_str); - - label = gtk_label_new(buf); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 0); - g_free(buf); - - sig_status = ssl_certificate_check_signer(new_cert, new_cert->status); - - if (sig_status==NULL) - sig_status = g_strdup(_("Correct")); - - buf = g_strdup_printf(_("Signature status: %s"), sig_status); - label = gtk_label_new(buf); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_xalign(GTK_LABEL(label), 0.0); - gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 0); - g_free(buf); - g_free(sig_status); - - button = gtk_expander_new_with_mnemonic(_("_View certificates")); - gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0); - gtk_container_add(GTK_CONTAINER(button), vbox); - - if (!ssl_certificate_check_subject_cn(new_cert)) - title = _("TLS certificate changed and is invalid"); - else - title = _("TLS certificate changed"); - val = alertpanel_full(title, NULL, - NULL, _("_Cancel connection"), NULL, _("_Accept and save"), - NULL, NULL, ALERTFOCUS_FIRST, FALSE, vbox2, ALERT_WARNING); - - return (val == G_ALERTALTERNATE); -} -#endif diff --git a/src/gtk/sslcertwindow.h b/src/gtk/sslcertwindow.h @@ -1,37 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net> - * and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifndef __SSL_CERTWINDOW_H__ -#define __SSL_CERTWINDOW_H__ - -#ifdef HAVE_CONFIG_H -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS -#include <glib.h> -#include <gtk/gtk.h> -#include "ssl_certificate.h" - -void sslcertwindow_show_cert(SSLCertificate *cert); -void sslcertwindow_register_hook(void); - -#endif /* USE_GNUTLS */ -#endif /* __SSL_CERTWINDOW_H__ */ diff --git a/src/mainwindow.c b/src/mainwindow.c @@ -66,8 +66,6 @@ #include "about.h" #include "manual.h" #include "version.h" -#include "ssl_manager.h" -#include "sslcertwindow.h" #include "prefs_gtk.h" #include "hooks.h" #include "progressindicator.h" @@ -319,10 +317,6 @@ static void prefs_actions_open_cb (GtkAction *action, static void prefs_account_open_cb (GtkAction *action, gpointer data); -#ifdef USE_GNUTLS -static void ssl_manager_open_cb (GtkAction *action, - gpointer data); -#endif static void new_account_cb (GtkAction *action, gpointer data); @@ -663,10 +657,6 @@ static GtkActionEntry mainwin_entries[] = {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) }, {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) }, -#ifdef USE_GNUTLS - /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */ - {"Tools/TLSCertificates", NULL, N_("TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) }, -#endif /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */ {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) }, @@ -1296,10 +1286,7 @@ MainWindow *main_window_create() MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM) -#ifdef USE_GNUTLS - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "TLSCertificates", "Tools/TLSCertificates", GTK_UI_MANAGER_MENUITEM) -#endif + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR) @@ -1568,9 +1555,7 @@ MainWindow *main_window_create() folderview_init(folderview); summary_init(summaryview); messageview_init(messageview); -#ifdef USE_GNUTLS - sslcertwindow_register_hook(); -#endif + mainwin->lock_count = 0; mainwin->menu_lock_count = 0; mainwin->cursor_count = 0; @@ -4171,13 +4156,6 @@ static void prefs_actions_open_cb(GtkAction *action, gpointer data) prefs_actions_open(mainwin); } -#ifdef USE_GNUTLS -static void ssl_manager_open_cb(GtkAction *action, gpointer data) -{ - MainWindow *mainwin = (MainWindow *)data; - ssl_manager_open(mainwin); -} -#endif static void prefs_account_open_cb(GtkAction *action, gpointer data) { MainWindow *mainwin = (MainWindow *)data; diff --git a/src/pop.c b/src/pop.c @@ -540,7 +540,7 @@ Session *pop3_session_new(PrefsAccount *account) SESSION(session)->recv_msg = pop3_session_recv_msg; SESSION(session)->recv_data_finished = pop3_session_recv_data_finished; SESSION(session)->send_data_finished = NULL; - SESSION(session)->ssl_cert_auto_accept = account->ssl_certs_auto_accept; + SESSION(session)->ssl_cert_auto_accept = TRUE; SESSION(session)->destroy = pop3_session_destroy; #ifdef USE_GNUTLS diff --git a/src/prefs_account.c b/src/prefs_account.c @@ -310,7 +310,6 @@ typedef struct SSLPage GtkWidget *entry_out_cert_file; GtkWidget *entry_out_cert_pass; - GtkWidget *ssl_certs_auto_accept_checkbtn; GtkWidget *use_nonblocking_ssl_checkbtn; } SSLPage; @@ -779,10 +778,6 @@ static PrefParam ssl_param[] = { prefs_account_enum_set_data_from_radiobtn, prefs_account_enum_set_radiobtn}, - {"ssl_certs_auto_accept", "1", &tmp_ac_prefs.ssl_certs_auto_accept, P_BOOL, - &ssl_page.ssl_certs_auto_accept_checkbtn, - prefs_set_data_from_toggle, prefs_set_toggle}, - {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL, &ssl_page.use_nonblocking_ssl_checkbtn, prefs_set_data_from_toggle, prefs_set_toggle}, @@ -826,9 +821,6 @@ static PrefParam ssl_param[] = { {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD, NULL, NULL, NULL}, - {"ssl_certs_auto_accept", "1", &tmp_ac_prefs.ssl_certs_auto_accept, P_BOOL, - NULL, NULL, NULL}, - {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL, NULL, NULL, NULL}, #endif /* USE_GNUTLS */ @@ -2666,7 +2658,6 @@ static void ssl_create_widget_func(PrefsPage * _page, GtkWidget *entry_out_cert_pass; GtkWidget *vbox7; - GtkWidget *ssl_certs_auto_accept_checkbtn; GtkWidget *use_nonblocking_ssl_checkbtn; GtkWidget *hbox; GtkWidget *hbox_spc; @@ -2823,11 +2814,7 @@ static void ssl_create_widget_func(PrefsPage * _page, gtk_widget_show (vbox7); gtk_box_pack_start (GTK_BOX (vbox1), vbox7, FALSE, FALSE, 0); - PACK_CHECK_BUTTON(vbox7, ssl_certs_auto_accept_checkbtn, - _("Automatically accept valid TLS certificates")); - - PACK_CHECK_BUTTON(vbox7, use_nonblocking_ssl_checkbtn, - _("Use non-blocking TLS")); + PACK_CHECK_BUTTON(vbox7, use_nonblocking_ssl_checkbtn, "Use non-blocking TLS"); hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_show (hbox); @@ -2868,7 +2855,6 @@ static void ssl_create_widget_func(PrefsPage * _page, page->entry_out_cert_file = entry_out_cert_file; page->entry_out_cert_pass = entry_out_cert_pass; - page->ssl_certs_auto_accept_checkbtn = ssl_certs_auto_accept_checkbtn; page->use_nonblocking_ssl_checkbtn = use_nonblocking_ssl_checkbtn; tmp_ac_prefs = *ac_prefs; diff --git a/src/prefs_account.h b/src/prefs_account.h @@ -90,7 +90,6 @@ struct _PrefsAccount gchar *in_ssl_client_cert_file; gchar *in_ssl_client_cert_pass; - gboolean ssl_certs_auto_accept; gboolean use_nonblocking_ssl; gboolean use_tls_sni; diff --git a/src/send_message.c b/src/send_message.c @@ -253,7 +253,7 @@ gint send_message_smtp_full(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp, g if (!ac_prefs->session) { /* we can't reuse a previously initialised session */ session = smtp_session_new(ac_prefs); - session->ssl_cert_auto_accept = ac_prefs->ssl_certs_auto_accept; + session->ssl_cert_auto_accept = TRUE; smtp_session = SMTP_SESSION(session); diff --git a/src/ssl_manager.c b/src/ssl_manager.c @@ -1,470 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Colin Leroy - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS -#include <gtk/gtk.h> -#include <glib.h> -#include <glib/gi18n.h> -#include <gdk/gdkkeysyms.h> -#include <sys/types.h> - -#include "ssl_manager.h" -#include "ssl_certificate.h" -#include "manage_window.h" -#include "utils.h" -#include "mainwindow.h" -#include "alertpanel.h" -#include "sslcertwindow.h" -#include "prefs_common.h" - -enum { - SSL_MANAGER_HOST, - SSL_MANAGER_PORT, - SSL_MANAGER_CERT, - SSL_MANAGER_STATUS, - SSL_MANAGER_EXPIRY, - SSL_MANAGER_FONT_WEIGHT, - N_SSL_MANAGER_COLUMNS -}; - - -static struct SSLManager -{ - GtkWidget *window; - GtkWidget *hbox1; - GtkWidget *vbox1; - GtkWidget *certlist; - GtkWidget *view_btn; - GtkWidget *delete_btn; - GtkWidget *close_btn; -} manager; - -static void ssl_manager_view_cb (GtkWidget *widget, gpointer data); -static void ssl_manager_delete_cb (GtkWidget *widget, gpointer data); -static void ssl_manager_close_cb (GtkWidget *widget, gpointer data); -static gboolean key_pressed (GtkWidget *widget, GdkEventKey *event, - gpointer data); -static void ssl_manager_load_certs (void); -static void ssl_manager_double_clicked(GtkTreeView *list_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer data); - -void ssl_manager_open(MainWindow *mainwin) -{ - if (!manager.window) - ssl_manager_create(); - - manage_window_set_transient(GTK_WINDOW(manager.window)); - gtk_widget_grab_focus(manager.close_btn); - - ssl_manager_load_certs(); - - gtk_widget_show(manager.window); - -} - -static GtkListStore* ssl_manager_create_data_store(void) -{ - return gtk_list_store_new(N_SSL_MANAGER_COLUMNS, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INT, - -1); -} - -static void ssl_manager_create_list_view_columns(GtkWidget *list_view) -{ - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - renderer = gtk_cell_renderer_text_new(); - g_object_set(renderer, "weight", PANGO_WEIGHT_NORMAL, - "weight-set", TRUE, NULL); - - column = gtk_tree_view_column_new_with_attributes - (_("Server"), - renderer, - "text", SSL_MANAGER_HOST, - "weight", SSL_MANAGER_FONT_WEIGHT, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); - - column = gtk_tree_view_column_new_with_attributes - (_("Port"), - renderer, - "text", SSL_MANAGER_PORT, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); - - column = gtk_tree_view_column_new_with_attributes - (_("Status"), - renderer, - "text", SSL_MANAGER_STATUS, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); - - column = gtk_tree_view_column_new_with_attributes - (_("Expiry"), - renderer, - "text", SSL_MANAGER_EXPIRY, - NULL); - gtk_tree_view_column_set_attributes - (column, renderer, - "text", SSL_MANAGER_EXPIRY, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); -} - -static GtkWidget *ssl_manager_list_view_create (void) -{ - GtkTreeView *list_view; - GtkTreeSelection *selector; - GtkTreeModel *model; - - model = GTK_TREE_MODEL(ssl_manager_create_data_store()); - list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); - - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), - 0, GTK_SORT_ASCENDING); - g_object_unref(model); - selector = gtk_tree_view_get_selection(list_view); - gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE); - - g_signal_connect(G_OBJECT(list_view), "row_activated", - G_CALLBACK(ssl_manager_double_clicked), - list_view); - - /* create the columns */ - ssl_manager_create_list_view_columns(GTK_WIDGET(list_view)); - - return GTK_WIDGET(list_view); -} - -/*! - *\brief Save Gtk object size to prefs dataset - */ -static void ssl_manager_size_allocate_cb(GtkWidget *widget, - GtkAllocation *allocation) -{ - cm_return_if_fail(allocation != NULL); - - gtk_window_get_size(GTK_WINDOW(widget), - &prefs_common.sslmanwin_width, &prefs_common.sslmanwin_height); -} - -void ssl_manager_create(void) -{ - GtkWidget *window; - GtkWidget *scroll; - GtkWidget *hbox1; - GtkWidget *vbox1; - GtkWidget *certlist; - GtkWidget *view_btn; - GtkWidget *delete_btn; - GtkWidget *close_btn; - static GdkGeometry geometry; - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "ssl_manager"); - gtk_window_set_title (GTK_WINDOW(window), - _("Saved TLS certificates")); - - gtk_container_set_border_width (GTK_CONTAINER (window), 8); - gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); - gtk_window_set_resizable(GTK_WINDOW (window), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(ssl_manager_close_cb), NULL); - g_signal_connect(G_OBJECT(window), "size_allocate", - G_CALLBACK(ssl_manager_size_allocate_cb), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", - G_CALLBACK(key_pressed), NULL); - MANAGE_WINDOW_SIGNALS_CONNECT (window); - - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - delete_btn = gtkut_stock_button("edit-delete", _("D_elete")); - - g_signal_connect(G_OBJECT(delete_btn), "clicked", - G_CALLBACK(ssl_manager_delete_cb), NULL); - - view_btn = gtkut_stock_button("dialog-information", _("_Information")); - g_signal_connect(G_OBJECT(view_btn), "clicked", - G_CALLBACK(ssl_manager_view_cb), NULL); - - close_btn = gtk_button_new_with_mnemonic(_("_Close")); - gtk_button_set_image(GTK_BUTTON(close_btn), - gtk_image_new_from_icon_name("window-close-symbolic", GTK_ICON_SIZE_BUTTON)); - g_signal_connect(G_OBJECT(close_btn), "clicked", - G_CALLBACK(ssl_manager_close_cb), NULL); - - certlist = ssl_manager_list_view_create(); - - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - - gtk_container_add(GTK_CONTAINER (scroll), certlist); - - gtk_box_pack_start(GTK_BOX(hbox1), scroll, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(hbox1), vbox1, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox1), view_btn, FALSE, FALSE, 4); - gtk_box_pack_start(GTK_BOX(vbox1), delete_btn, FALSE, FALSE, 4); - gtk_box_pack_end(GTK_BOX(vbox1), close_btn, FALSE, FALSE, 4); - - if (!geometry.min_height) { - geometry.min_width = 700; - geometry.min_height = 250; - } - - gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, - GDK_HINT_MIN_SIZE); - gtk_window_set_default_size(GTK_WINDOW(window), - prefs_common.sslmanwin_width, - prefs_common.sslmanwin_height); - - gtk_widget_show(certlist); - gtk_widget_show(scroll); - gtk_widget_show(hbox1); - gtk_widget_show(vbox1); - gtk_widget_show(close_btn); - gtk_widget_show(delete_btn); - gtk_widget_show(view_btn); - gtk_container_add(GTK_CONTAINER (window), hbox1); - - manager.window = window; - manager.hbox1 = hbox1; - manager.vbox1 = vbox1; - manager.certlist = certlist; - manager.view_btn = view_btn; - manager.delete_btn = delete_btn; - manager.close_btn = close_btn; - - gtk_widget_show(window); -} - -static void ssl_manager_list_view_insert_cert(GtkWidget *list_view, - GtkTreeIter *row_iter, - gchar *host, - gchar *port, - SSLCertificate *cert) -{ - char *sig_status, *exp_date; - char buf[100]; - time_t exp_time_t; - struct tm lt; - PangoWeight weight = PANGO_WEIGHT_NORMAL; - GtkTreeIter iter, *iterptr; - GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(list_view))); - - g_return_if_fail(cert != NULL); - - exp_time_t = gnutls_x509_crt_get_expiration_time(cert->x509_cert); - - memset(buf, 0, sizeof(buf)); - if (exp_time_t > 0) { - fast_strftime(buf, sizeof(buf)-1, prefs_common.date_format, localtime_r(&exp_time_t, &lt)); - exp_date = (*buf) ? g_strdup(buf):g_strdup("?"); - } else - exp_date = g_strdup(""); - - if (exp_time_t < time(NULL)) - weight = PANGO_WEIGHT_BOLD; - - sig_status = ssl_certificate_check_signer(cert, cert->status); - - if (sig_status == NULL) - sig_status = g_strdup_printf(_("Correct%s"),exp_time_t < time(NULL)? _(" (expired)"): ""); - else { - weight = PANGO_WEIGHT_BOLD; - if (exp_time_t < time(NULL)) - sig_status = g_strconcat(sig_status,_(" (expired)"),NULL); - } - - if (row_iter == NULL) { - /* append new */ - gtk_list_store_append(list_store, &iter); - iterptr = &iter; - } else - iterptr = row_iter; - - gtk_list_store_set(list_store, iterptr, - SSL_MANAGER_HOST, host, - SSL_MANAGER_PORT, port, - SSL_MANAGER_CERT, cert, - SSL_MANAGER_STATUS, sig_status, - SSL_MANAGER_EXPIRY, exp_date, - SSL_MANAGER_FONT_WEIGHT, weight, - -1); - - g_free(sig_status); - g_free(exp_date); -} - -static void ssl_manager_load_certs (void) -{ - GDir *dir; - const gchar *d; - GError *error = NULL; - gchar *path; - GtkListStore *store; - - store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(manager.certlist))); - - gtk_list_store_clear(store); - - path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - "certs", G_DIR_SEPARATOR_S, NULL); - - if((dir = g_dir_open(path, 0, &error)) == NULL) { - debug_print("couldn't open dir '%s': %s (%d)\n", path, - error->message, error->code); - g_error_free(error); - g_free(path); - return; - } - - while ((d = g_dir_read_name(dir)) != NULL) { - gchar *server = NULL, *port = NULL, *fp = NULL; - SSLCertificate *cert; - - if(strstr(d, ".cert") != d + (strlen(d) - strlen(".cert"))) - continue; - - if (get_serverportfp_from_filename(d, &server, &port, &fp)) { - - if (server != NULL && port != NULL) { - gint portnum = atoi(port); - if (portnum > 0 && portnum <= 65535) { - cert = ssl_certificate_find(server, portnum, fp); - ssl_manager_list_view_insert_cert(manager.certlist, NULL, - server, port, cert); - } - } - } - if (server) - g_free(server); - if (port) - g_free(port); - if (fp) - g_free(fp); - } - g_dir_close(dir); - g_free(path); -} - -static void ssl_manager_close(void) -{ - gtk_widget_hide(manager.window); -} - -static void ssl_manager_close_cb(GtkWidget *widget, - gpointer data) -{ - ssl_manager_close(); -} - -static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) -{ - if (event->keyval == GDK_KEY_Delete) - ssl_manager_delete_cb(manager.delete_btn, NULL); - - return FALSE; -} - -static void ssl_manager_double_clicked(GtkTreeView *list_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer data) -{ - SSLCertificate *cert; - GtkTreeIter iter; - GtkTreeModel *model = gtk_tree_view_get_model(list_view); - - if (!gtk_tree_model_get_iter(model, &iter, path)) - return; - - gtk_tree_model_get(model, &iter, - SSL_MANAGER_CERT, &cert, - -1); - - if (!cert) - return; - - sslcertwindow_show_cert(cert); - - return; -} - - - -static void ssl_manager_delete_cb(GtkWidget *widget, - gpointer data) -{ - SSLCertificate *cert; - int val; - GtkTreeIter iter; - GtkTreeModel *model; - - cert = gtkut_tree_view_get_selected_pointer( - GTK_TREE_VIEW(manager.certlist), SSL_MANAGER_CERT, - &model, NULL, &iter); - - if (!cert) - return; - - val = alertpanel_full(_("Delete certificate"), - _("Do you really want to delete this certificate?"), - NULL, _("_Cancel"), "edit-delete-symbolic", _("D_elete"), NULL, NULL, - ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING); - - - if (val != G_ALERTALTERNATE) - return; - - ssl_certificate_delete_from_disk(cert); - ssl_certificate_destroy(cert); - gtk_list_store_remove(GTK_LIST_STORE(model), &iter); -} - -static void ssl_manager_view_cb(GtkWidget *widget, - gpointer data) -{ - SSLCertificate *cert; - - cert = gtkut_tree_view_get_selected_pointer( - GTK_TREE_VIEW(manager.certlist), SSL_MANAGER_CERT, - NULL, NULL, NULL); - - if (!cert) - return; - - sslcertwindow_show_cert(cert); -} -#endif diff --git a/src/ssl_manager.h b/src/ssl_manager.h @@ -1,30 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net> - * and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#ifndef SSL_MANAGER_H -#define SSL_MANAGER_H -#ifdef USE_GNUTLS -#include "mainwindow.h" - -void ssl_manager_create (void); -void ssl_manager_open (MainWindow *mainwin); - -#endif -#endif