Include the libgnutls.m4 file.
authorJoe Shaw <joe@ximian.com>
Fri, 9 Jan 2004 21:30:04 +0000 (21:30 +0000)
committerJoe Shaw <joeshaw@src.gnome.org>
Fri, 9 Jan 2004 21:30:04 +0000 (21:30 +0000)
2004-01-09  Joe Shaw  <joe@ximian.com>

* acinclude.m4: Include the libgnutls.m4 file.

* configure.in: Remove manual checking for libgnutls-config and
use the AM_PATH_LIBGNUTLS so we can pass in a minimum required
version, which is 0.9.7 for now.

* libsoup/Makefile.am: Some changes for the above change.

* libsoup/soup-gnutls.c: Check for HAVE_SSL, not
HAVE_GNUTLS_GNUTLS_H.
(verify_certificate): Uncomment the SSL certificate hostname
check.

* libsoup/soup-session.c (set_property): Be smart about flushing
our SSL credentials only when the CA file is set to something
different than it was before.

ChangeLog
acinclude.m4
configure.in
libsoup/Makefile.am
libsoup/soup-gnutls.c
libsoup/soup-session.c

index 29abe4b..d162b3c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2004-01-09  Joe Shaw  <joe@ximian.com>
+
+       * acinclude.m4: Include the libgnutls.m4 file.
+
+       * configure.in: Remove manual checking for libgnutls-config and
+       use the AM_PATH_LIBGNUTLS so we can pass in a minimum required
+       version, which is 0.9.7 for now.
+
+       * libsoup/Makefile.am: Some changes for the above change.
+
+       * libsoup/soup-gnutls.c: Check for HAVE_SSL, not
+       HAVE_GNUTLS_GNUTLS_H.
+       (verify_certificate): Uncomment the SSL certificate hostname
+       check.
+
+       * libsoup/soup-session.c (set_property): Be smart about flushing
+       our SSL credentials only when the CA file is set to something
+       different than it was before.
+
 2004-01-09  Harish K <kharish@novell.com>
         * libsoup/soup-soap-response.c (soup_soap_response_from_string): 
         added code to ignore Header element, if present, while creating 
index d77dc05..b4047a2 100644 (file)
@@ -104,3 +104,163 @@ ifelse([$1],[],,
   AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
   AM_CONDITIONAL(GTK_DOC_USE_LIBTOOL, test -n "$LIBTOOL")
 ])
+dnl Autoconf macros for libgnutls
+dnl $id$
+
+# Modified for LIBGNUTLS -- nmav
+# Configure paths for LIBGCRYPT
+# Shamelessly stolen from the one of XDELTA by Owen Taylor
+# Werner Koch   99-12-09
+
+dnl AM_PATH_LIBGNUTLS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgnutls, and define LIBGNUTLS_CFLAGS and LIBGNUTLS_LIBS
+dnl
+AC_DEFUN(AM_PATH_LIBGNUTLS,
+[dnl
+dnl Get the cflags and libraries from the libgnutls-config script
+dnl
+AC_ARG_WITH(libgnutls-prefix,
+          [  --with-libgnutls-prefix=PFX   Prefix where libgnutls is installed (optional)],
+          libgnutls_config_prefix="$withval", libgnutls_config_prefix="")
+
+  if test x$libgnutls_config_prefix != x ; then
+     if test x${LIBGNUTLS_CONFIG+set} != xset ; then
+        LIBGNUTLS_CONFIG=$libgnutls_config_prefix/bin/libgnutls-config
+     fi
+  fi
+
+  AC_PATH_PROG(LIBGNUTLS_CONFIG, libgnutls-config, no)
+  min_libgnutls_version=ifelse([$1], ,0.1.0,$1)
+  AC_MSG_CHECKING(for libgnutls - version >= $min_libgnutls_version)
+  no_libgnutls=""
+  if test "$LIBGNUTLS_CONFIG" = "no" ; then
+    no_libgnutls=yes
+  else
+    LIBGNUTLS_CFLAGS=`$LIBGNUTLS_CONFIG $libgnutls_config_args --cflags`
+    LIBGNUTLS_LIBS=`$LIBGNUTLS_CONFIG $libgnutls_config_args --libs`
+    libgnutls_config_version=`$LIBGNUTLS_CONFIG $libgnutls_config_args --version`
+
+
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $LIBGNUTLS_CFLAGS"
+      LIBS="$LIBS $LIBGNUTLS_LIBS"
+dnl
+dnl Now check if the installed libgnutls is sufficiently new. Also sanity
+dnl checks the results of libgnutls-config to some extent
+dnl
+      rm -f conf.libgnutlstest
+      AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gnutls/gnutls.h>
+
+int
+main ()
+{
+    system ("touch conf.libgnutlstest");
+
+    if( strcmp( gnutls_check_version(NULL), "$libgnutls_config_version" ) )
+    {
+      printf("\n*** 'libgnutls-config --version' returned %s, but LIBGNUTLS (%s)\n",
+             "$libgnutls_config_version", gnutls_check_version(NULL) );
+      printf("*** was found! If libgnutls-config was correct, then it is best\n");
+      printf("*** to remove the old version of LIBGNUTLS. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If libgnutls-config was wrong, set the environment variable LIBGNUTLS_CONFIG\n");
+      printf("*** to point to the correct copy of libgnutls-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    }
+    else if ( strcmp(gnutls_check_version(NULL), LIBGNUTLS_VERSION ) )
+    {
+      printf("\n*** LIBGNUTLS header file (version %s) does not match\n", LIBGNUTLS_VERSION);
+      printf("*** library (version %s)\n", gnutls_check_version(NULL) );
+    }
+    else
+    {
+      if ( gnutls_check_version( "$min_libgnutls_version" ) )
+      {
+        return 0;
+      }
+     else
+      {
+        printf("no\n*** An old version of LIBGNUTLS (%s) was found.\n",
+                gnutls_check_version(NULL) );
+        printf("*** You need a version of LIBGNUTLS newer than %s. The latest version of\n",
+               "$min_libgnutls_version" );
+        printf("*** LIBGNUTLS is always available from ftp://gnutls.hellug.gr/pub/gnutls.\n");
+        printf("*** \n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of LIBGNUTLS, but you can also set the LIBGNUTLS_CONFIG environment to point to the\n");
+        printf("*** correct copy of libgnutls-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_libgnutls=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+  fi
+
+  if test "x$no_libgnutls" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])
+  else
+     if test -f conf.libgnutlstest ; then
+        :
+     else
+        AC_MSG_RESULT(no)
+     fi
+     if test "$LIBGNUTLS_CONFIG" = "no" ; then
+       echo "*** The libgnutls-config script installed by LIBGNUTLS could not be found"
+       echo "*** If LIBGNUTLS was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the LIBGNUTLS_CONFIG environment variable to the"
+       echo "*** full path to libgnutls-config."
+     else
+       if test -f conf.libgnutlstest ; then
+        :
+       else
+          echo "*** Could not run libgnutls test program, checking why..."
+          CFLAGS="$CFLAGS $LIBGNUTLS_CFLAGS"
+          LIBS="$LIBS $LIBGNUTLS_LIBS"
+          AC_TRY_LINK([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gnutls/gnutls.h>
+],      [ return !!gnutls_check_version(NULL); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding LIBGNUTLS or finding the wrong"
+          echo "*** version of LIBGNUTLS. If it is not finding LIBGNUTLS, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+          echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means LIBGNUTLS was incorrectly installed"
+          echo "*** or that you have moved LIBGNUTLS since it was installed. In the latter case, you"
+          echo "*** may want to edit the libgnutls-config script: $LIBGNUTLS_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     LIBGNUTLS_CFLAGS=""
+     LIBGNUTLS_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  rm -f conf.libgnutlstest
+  AC_SUBST(LIBGNUTLS_CFLAGS)
+  AC_SUBST(LIBGNUTLS_LIBS)
+])
+
+dnl *-*wedit:notab*-*  Please keep this as the last line.
index 92f81e0..7924125 100644 (file)
@@ -194,16 +194,7 @@ AC_ARG_ENABLE(libgpg-error,
               enable_libgpg_error=yes, enable_libgpg_error=no)
 
 if test "$enable_ssl" != "no"; then
-       AC_PATH_PROG(LIBGNUTLS_CONFIG, libgnutls-config, no)
-       if test $LIBGNUTLS_CONFIG != "no"; then
-               GNUTLS_CFLAGS=`$LIBGNUTLS_CONFIG --cflags | sed -e 's:-I/usr/include::'`
-               GNUTLS_LIBS="`$LIBGNUTLS_CONFIG --libs | sed -e 's:-L/usr/lib *::'` $libgpg_error_libs"
-
-               save_CPPFLAGS="$CPPFLAGS"
-               CPPFLAGS="$CPPFLAGS $GNUTLS_CFLAGS"
-               AC_CHECK_HEADERS(gnutls/gnutls.h, have_ssl=yes; enable_ssl=yes, have_ssl=no)
-               CPPFLAGS="$save_CPPFLAGS"
-       fi
+       AM_PATH_LIBGNUTLS(0.9.7, have_ssl=yes, have_ssl=no)
 
        if test "$have_ssl" != "yes"; then
                if test "$enable_ssl" == "auto"; then
@@ -233,12 +224,12 @@ if test "$enable_ssl" != "no"; then
 
        if test "$enable_static_ssl" == "yes"; then
                gnutls_libdir=`$LIBGNUTLS_CONFIG --exec-prefix`/lib
-               GNUTLS_LIBS="$gnutls_libdir/libgnutls.a $gnutls_libdir/libgcrypt.a $libgpg_error_libs_static"
+               LIBGNUTLS_LIBS="$gnutls_libdir/libgnutls.a $gnutls_libdir/libgcrypt.a $libgpg_error_libs_static"
        fi
 fi
 
-AC_SUBST(GNUTLS_CFLAGS)
-AC_SUBST(GNUTLS_LIBS)
+AC_SUBST(LIBGNUTLS_CFLAGS)
+AC_SUBST(LIBGNUTLS_LIBS)
 
 dnl ***************
 dnl *** gtk-doc ***
index 342aee1..75515fb 100644 (file)
@@ -6,7 +6,7 @@ INCLUDES =                              \
        $(SOUP_DEBUG_FLAGS)             \
        $(GLIB_CFLAGS)                  \
        $(XML_CFLAGS)                   \
-       $(GNUTLS_CFLAGS)
+       $(LIBGNUTLS_CFLAGS)
 
 MARSHAL_GENERATED = soup-marshal.c soup-marshal.h
 
@@ -57,7 +57,7 @@ libsoup_2_2_la_LDFLAGS =      \
 libsoup_2_2_la_LIBADD =                \
        $(GLIB_LIBS)            \
        $(XML_LIBS)             \
-       $(GNUTLS_LIBS)
+       $(LIBGNUTLS_LIBS)
 
 libsoup_2_2_la_SOURCES =               \
        $(MARSHAL_GENERATED)            \
index 2561d99..c798f0f 100644 (file)
@@ -12,7 +12,7 @@
 #include <config.h>
 #endif
 
-#ifdef HAVE_GNUTLS_GNUTLS_H
+#ifdef HAVE_SSL
 
 #include <stdlib.h>
 #include <string.h>
@@ -85,14 +85,12 @@ verify_certificate (gnutls_session session, const char *hostname)
                        g_warning ("No certificate was found.");
                        return FALSE;
                }
-#if 0
                if (!gnutls_x509_check_certificates_hostname(
                            &cert_list[0], hostname))
                {
                        g_warning ("The certificate does not match hostname.");
                        return FALSE;
                }
-#endif
        }
    
        return TRUE;
@@ -469,4 +467,4 @@ soup_ssl_free_server_credentials (gpointer server_creds)
        g_free (cred);
 }
 
-#endif /* HAVE_GNUTLS_GNUTLS_H */
+#endif /* HAVE_SSL */
index 2906ca5..ab1ec7a 100644 (file)
@@ -270,6 +270,18 @@ safe_uri_equal (const SoupUri *a, const SoupUri *b)
        return soup_uri_equal (a, b);
 }
 
+static gboolean
+safe_str_equal (const char *a, const char *b)
+{
+       if (!a && !b)
+               return TRUE;
+
+       if ((a && !b) || (b && !a))
+               return FALSE;
+
+       return strcmp (a, b) == 0;
+}
+
 static void
 set_property (GObject *object, guint prop_id,
              const GValue *value, GParamSpec *pspec)
@@ -277,6 +289,8 @@ set_property (GObject *object, guint prop_id,
        SoupSession *session = SOUP_SESSION (object);
        gpointer pval;
        gboolean need_abort = FALSE;
+       gboolean ca_file_changed = FALSE;
+       const char *new_ca_file;
 
        switch (prop_id) {
        case PROP_PROXY_URI:
@@ -306,8 +320,23 @@ set_property (GObject *object, guint prop_id,
                session->priv->use_ntlm = g_value_get_boolean (value);
                break;
        case PROP_SSL_CA_FILE:
+               new_ca_file = g_value_get_string (value);
+
+               if (!safe_str_equal (session->priv->ssl_ca_file, new_ca_file))
+                       ca_file_changed = TRUE;
+
                g_free (session->priv->ssl_ca_file);
-               session->priv->ssl_ca_file = g_strdup (g_value_get_string (value));
+               session->priv->ssl_ca_file = g_strdup (new_ca_file);
+
+               if (ca_file_changed) {
+                       if (session->priv->ssl_creds) {
+                               soup_ssl_free_client_credentials (session->priv->ssl_creds);
+                               session->priv->ssl_creds = NULL;
+                       }
+
+                       cleanup_hosts (session);
+               }
+
                break;
        default:
                break;