2006-12-09 [colin] 2.6.1cvs13
authorColin Leroy <colin@colino.net>
Sat, 9 Dec 2006 22:02:32 +0000 (22:02 +0000)
committerColin Leroy <colin@colino.net>
Sat, 9 Dec 2006 22:02:32 +0000 (22:02 +0000)
* manual/advanced.xml
* src/prefs_common.c
* src/prefs_common.h
* src/common/ssl_certificate.c
Add a new hidden preference, 'unsafe_ssl_certs',
which allows to store multiple certificates per
server/port. This is disabled by default because
it's less secure (presenting a new certificate
instead of a changed one raises less alarms).
This will cause Claws to ask about an unknown
certificate for people who have used 2.6.1cvs8
or greater.

ChangeLog
PATCHSETS
configure.ac
manual/advanced.xml
src/common/ssl_certificate.c
src/prefs_common.c
src/prefs_common.h

index 9bd0c29..c071761 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2006-12-09 [colin]     2.6.1cvs13
+
+       * manual/advanced.xml
+       * src/prefs_common.c
+       * src/prefs_common.h
+       * src/common/ssl_certificate.c
+               Add a new hidden preference, 'unsafe_ssl_certs',
+               which allows to store multiple certificates per
+               server/port. This is disabled by default because
+               it's less secure (presenting a new certificate
+               instead of a changed one raises less alarms).
+               This will cause Claws to ask about an unknown
+               certificate for people who have used 2.6.1cvs8
+               or greater.
+
 2006-12-09 [colin]     2.6.1cvs12
 
        * src/action.c
index 507d5f8..c544ad3 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.6.10.12 -r 1.6.10.13 src/addrharvest.c;  cvs diff -u -r 1.8.2.15 -r 1.8.2.16 src/editldap.c;  cvs diff -u -r 1.1.4.22 -r 1.1.4.23 src/expldifdlg.c;  cvs diff -u -r 1.101.2.33 -r 1.101.2.34 src/news.c;  cvs diff -u -r 1.43.2.55 -r 1.43.2.56 src/toolbar.c;  cvs diff -u -r 1.36.2.92 -r 1.36.2.93 src/common/utils.c;  ) > 2.6.1cvs10.patchset
 ( cvs diff -u -r 1.382.2.340 -r 1.382.2.341 src/compose.c;  ) > 2.6.1cvs11.patchset
 ( cvs diff -u -r 1.12.2.39 -r 1.12.2.40 src/action.c;  ) > 2.6.1cvs12.patchset
+( cvs diff -u -r 1.1.2.35 -r 1.1.2.36 manual/advanced.xml;  cvs diff -u -r 1.204.2.111 -r 1.204.2.112 src/prefs_common.c;  cvs diff -u -r 1.103.2.69 -r 1.103.2.70 src/prefs_common.h;  cvs diff -u -r 1.4.2.14 -r 1.4.2.15 src/common/ssl_certificate.c;  ) > 2.6.1cvs13.patchset
index ecc54dc..e2d9a69 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=6
 MICRO_VERSION=1
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=12
+EXTRA_VERSION=13
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index af3e66d..e983534 100644 (file)
          </para>
        </listitem>
       </varlistentry>
+      <varlistentry>
+       <term><literal>unsafe_ssl_certs</literal></term>
+       <listitem>
+       <para>
+       Allows Claws to remember multiple SSL certificates for a given 
+       server/port. This is disabled by default.
+       </para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term><literal>use_stripes_everywhere</literal></term>
        <listitem>
index d715ad4..2663ee4 100644 (file)
 
 static GHashTable *warned_expired = NULL;
 
+gboolean prefs_common_unsafe_ssl_certs(void);
+
+static gchar *get_certificate_path(const gchar *host, const gchar *port, const gchar *fp)
+{
+       if (fp != NULL && prefs_common_unsafe_ssl_certs())
+               return g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
+                         "certs", G_DIR_SEPARATOR_S,
+                         host, ".", port, ".", fp, ".cert", NULL);
+       else 
+               return g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
+                         "certs", G_DIR_SEPARATOR_S,
+                         host, ".", port, ".cert", NULL);
+}
+
 static SSLCertificate *ssl_certificate_new_lookup(X509 *x509_cert, gchar *host, gushort port, gboolean lookup);
 
 /* from Courier */
@@ -162,9 +176,7 @@ static void ssl_certificate_save (SSLCertificate *cert)
        g_free(file);
 
        port = g_strdup_printf("%d", cert->port);
-       file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         cert->host, ".", port, ".", cert->fingerprint, ".cert", NULL);
+       file = get_certificate_path(cert->host, port, cert->fingerprint);
 
        g_free(port);
        fp = g_fopen(file, "wb");
@@ -278,9 +290,7 @@ void ssl_certificate_delete_from_disk(SSLCertificate *cert)
        gchar *buf;
        gchar *file;
        buf = g_strdup_printf("%d", cert->port);
-       file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         cert->host, ".", buf, ".", cert->fingerprint, ".cert", NULL);
+       file = get_certificate_path(cert->host, buf, cert->fingerprint);
        g_unlink (file);
        g_free(file);
        g_free(buf);
@@ -309,17 +319,13 @@ SSLCertificate *ssl_certificate_find_lookup (gchar *host, gushort port, const gc
        buf = g_strdup_printf("%d", port);
        
        if (fingerprint != NULL) {
-               file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         fqdn_host, ".", buf, ".", fingerprint, ".cert", NULL);
+               file = get_certificate_path(fqdn_host, buf, fingerprint);
                fp = g_fopen(file, "rb");
        }
        if (fp == NULL) {
                /* see if we have the old one */
                g_free(file);
-               file = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         fqdn_host, ".", buf, ".cert", NULL);
+               file = get_certificate_path(fqdn_host, buf, NULL);
                fp = g_fopen(file, "rb");
 
                if (fp)
@@ -340,13 +346,10 @@ SSLCertificate *ssl_certificate_find_lookup (gchar *host, gushort port, const gc
        g_free(file);
        
        if (must_rename) {
-               gchar *old = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         fqdn_host, ".", buf, ".cert", NULL);
-               gchar *new = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, 
-                         "certs", G_DIR_SEPARATOR_S,
-                         fqdn_host, ".", buf, ".", fingerprint, ".cert", NULL);
-               move_file(old, new, TRUE);
+               gchar *old = get_certificate_path(fqdn_host, buf, NULL);
+               gchar *new = get_certificate_path(fqdn_host, buf, fingerprint);
+               if (strcmp(old, new))
+                       move_file(old, new, TRUE);
                g_free(old);
                g_free(new);
        }
index a82e113..d8d2f53 100644 (file)
@@ -821,6 +821,8 @@ static PrefParam param[] = {
         NULL, NULL, NULL},
        {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
         NULL, NULL, NULL},
+       {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
+        NULL, NULL, NULL},
 
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
@@ -1101,3 +1103,9 @@ gchar *pref_get_pref_from_entry(GtkEntry *entry)
 
        return out?out:"";
 }
+
+/* ugly hack to be able to get this pref from ssl_certificate.c */
+gboolean prefs_common_unsafe_ssl_certs(void)
+{
+       return prefs_common.unsafe_ssl_certs;
+}
index ba818eb..c1e2ba5 100644 (file)
@@ -410,6 +410,7 @@ struct _PrefsCommon
        gint live_dangerously;
        gint never_send_retrcpt;
        gint hide_quotes;
+       gboolean unsafe_ssl_certs;
 };
 
 extern PrefsCommon prefs_common;