Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:dbornkessel:gnome
libsoup-2.2
libsoup-2.2.100-r924.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libsoup-2.2.100-r924.patch of Package libsoup-2.2
diff -ruNp libsoup-2.2.100/aclocal.m4 libsoup-2.2.100/aclocal.m4 --- libsoup-2.2.100/aclocal.m4 2007-02-12 10:34:08.000000000 -0500 +++ libsoup-2.2.100/aclocal.m4 2007-05-01 15:49:07.000000000 -0400 @@ -11,6 +11,331 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +# Configure paths for GLIB +# Owen Taylor 1997-2001 + +dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or +dnl gthread is specified in MODULES, pass to pkg-config +dnl +AC_DEFUN([AM_PATH_GLIB_2_0], +[dnl +dnl Get the cflags and libraries from pkg-config +dnl +AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + pkg_config_args=glib-2.0 + for module in . $4 + do + case "$module" in + gmodule) + pkg_config_args="$pkg_config_args gmodule-2.0" + ;; + gmodule-no-export) + pkg_config_args="$pkg_config_args gmodule-no-export-2.0" + ;; + gobject) + pkg_config_args="$pkg_config_args gobject-2.0" + ;; + gthread) + pkg_config_args="$pkg_config_args gthread-2.0" + ;; + esac + done + + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + + no_glib="" + + if test x$PKG_CONFIG != xno ; then + if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then + : + else + echo *** pkg-config too old; version 0.7 or better required. + no_glib=yes + PKG_CONFIG=no + fi + else + no_glib=yes + fi + + min_glib_version=ifelse([$1], ,2.0.0,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + + if test x$PKG_CONFIG != xno ; then + ## don't try to run the test against uninstalled libtool libs + if $PKG_CONFIG --uninstalled $pkg_config_args; then + echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" + enable_glibtest=no + fi + + if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then + : + else + no_glib=yes + fi + fi + + if test x"$no_glib" = x ; then + GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` + GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` + GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` + + GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` + GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` + glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of pkg-config to some extent) +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include <glib.h> +#include <stdio.h> +#include <stdlib.h> + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If pkg-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLib. 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 pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); + printf("*** to point to the correct configuration files\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\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 pkg-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); + printf("*** correct copy of pkg-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_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$PKG_CONFIG" = "no" ; then + echo "*** A new enough version of pkg-config was not found." + echo "*** See http://www.freedesktop.org/software/pkgconfig/" + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include <glib.h> +#include <stdio.h> +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, 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 "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB is incorrectly installed."]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + GLIB_GENMARSHAL="" + GOBJECT_QUERY="" + GLIB_MKENUMS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + AC_SUBST(GLIB_GENMARSHAL) + AC_SUBST(GOBJECT_QUERY) + AC_SUBST(GLIB_MKENUMS) + rm -f conf.glibtest +]) + +dnl Autoconf macros for libgcrypt +dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc. +dnl +dnl This file is free software; as a special exception the author gives +dnl unlimited permission to copy and/or distribute it, with or without +dnl modifications, as long as this notice is preserved. +dnl +dnl This file is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the +dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +dnl AM_PATH_LIBGCRYPT([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS. +dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed +dnl with the API version to also check the API compatibility. Example: +dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed +dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using +dnl this features allows to prevent build against newer versions of libgcrypt +dnl with a changed API. +dnl +AC_DEFUN([AM_PATH_LIBGCRYPT], +[ AC_ARG_WITH(libgcrypt-prefix, + AC_HELP_STRING([--with-libgcrypt-prefix=PFX], + [prefix where LIBGCRYPT is installed (optional)]), + libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="") + if test x$libgcrypt_config_prefix != x ; then + if test x${LIBGCRYPT_CONFIG+set} != xset ; then + LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config + fi + fi + + AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config, no) + tmp=ifelse([$1], ,1:1.2.0,$1) + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_libgcrypt_api=0 + min_libgcrypt_version="$tmp" + fi + + AC_MSG_CHECKING(for LIBGCRYPT - version >= $min_libgcrypt_version) + ok=no + if test "$LIBGCRYPT_CONFIG" != "no" ; then + req_major=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` + req_minor=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'` + req_micro=`echo $min_libgcrypt_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` + libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version` + major=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` + minor=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` + micro=`echo $libgcrypt_config_version | \ + sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + if test $ok = yes; then + # If we have a recent libgcrypt, we should also check that the + # API is compatible + if test "$req_libgcrypt_api" -gt 0 ; then + tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + AC_MSG_CHECKING([LIBGCRYPT API version]) + if test "$req_libgcrypt_api" -eq "$tmp" ; then + AC_MSG_RESULT(okay) + else + ok=no + AC_MSG_RESULT([does not match (want=$req_libgcrypt_api got=$tmp)]) + fi + fi + fi + fi + if test $ok = yes; then + LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` + LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` + ifelse([$2], , :, [$2]) + else + LIBGCRYPT_CFLAGS="" + LIBGCRYPT_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(LIBGCRYPT_CFLAGS) + AC_SUBST(LIBGCRYPT_LIBS) +]) + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 48 AC_PROG_LIBTOOL @@ -7446,220 +7771,4 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR -# Configure paths for GLIB -# Owen Taylor 1997-2001 - -dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) -dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or -dnl gthread is specified in MODULES, pass to pkg-config -dnl -AC_DEFUN([AM_PATH_GLIB_2_0], -[dnl -dnl Get the cflags and libraries from pkg-config -dnl -AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program], - , enable_glibtest=yes) - - pkg_config_args=glib-2.0 - for module in . $4 - do - case "$module" in - gmodule) - pkg_config_args="$pkg_config_args gmodule-2.0" - ;; - gmodule-no-export) - pkg_config_args="$pkg_config_args gmodule-no-export-2.0" - ;; - gobject) - pkg_config_args="$pkg_config_args gobject-2.0" - ;; - gthread) - pkg_config_args="$pkg_config_args gthread-2.0" - ;; - esac - done - - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - - no_glib="" - - if test x$PKG_CONFIG != xno ; then - if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then - : - else - echo *** pkg-config too old; version 0.7 or better required. - no_glib=yes - PKG_CONFIG=no - fi - else - no_glib=yes - fi - - min_glib_version=ifelse([$1], ,2.0.0,$1) - AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) - - if test x$PKG_CONFIG != xno ; then - ## don't try to run the test against uninstalled libtool libs - if $PKG_CONFIG --uninstalled $pkg_config_args; then - echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" - enable_glibtest=no - fi - - if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then - : - else - no_glib=yes - fi - fi - - if test x"$no_glib" = x ; then - GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` - GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` - GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` - - GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` - GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` - glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_glibtest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GLIB_CFLAGS" - LIBS="$GLIB_LIBS $LIBS" -dnl -dnl Now check if the installed GLIB is sufficiently new. (Also sanity -dnl checks the results of pkg-config to some extent) -dnl - rm -f conf.glibtest - AC_TRY_RUN([ -#include <glib.h> -#include <stdio.h> -#include <stdlib.h> - -int -main () -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.glibtest"); - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = g_strdup("$min_glib_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_glib_version"); - exit(1); - } - - if ((glib_major_version != $glib_config_major_version) || - (glib_minor_version != $glib_config_minor_version) || - (glib_micro_version != $glib_config_micro_version)) - { - printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", - $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, - glib_major_version, glib_minor_version, glib_micro_version); - printf ("*** was found! If pkg-config was correct, then it is best\n"); - printf ("*** to remove the old version of GLib. 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 pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); - printf("*** to point to the correct configuration files\n"); - } - else if ((glib_major_version != GLIB_MAJOR_VERSION) || - (glib_minor_version != GLIB_MINOR_VERSION) || - (glib_micro_version != GLIB_MICRO_VERSION)) - { - printf("*** GLIB header files (version %d.%d.%d) do not match\n", - GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); - printf("*** library (version %d.%d.%d)\n", - glib_major_version, glib_minor_version, glib_micro_version); - } - else - { - if ((glib_major_version > major) || - ((glib_major_version == major) && (glib_minor_version > minor)) || - ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", - glib_major_version, glib_minor_version, glib_micro_version); - printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", - major, minor, micro); - printf("*** GLIB is always available from ftp://ftp.gtk.org.\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 pkg-config shell script is\n"); - printf("*** being found. The easiest way to fix this is to remove the old version\n"); - printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); - printf("*** correct copy of pkg-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_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_glib" = x ; then - AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$PKG_CONFIG" = "no" ; then - echo "*** A new enough version of pkg-config was not found." - echo "*** See http://www.freedesktop.org/software/pkgconfig/" - else - if test -f conf.glibtest ; then - : - else - echo "*** Could not run GLIB test program, checking why..." - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GLIB_CFLAGS" - LIBS="$LIBS $GLIB_LIBS" - AC_TRY_LINK([ -#include <glib.h> -#include <stdio.h> -], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding GLIB or finding the wrong" - echo "*** version of GLIB. If it is not finding GLIB, 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 "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means GLIB is incorrectly installed."]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - GLIB_CFLAGS="" - GLIB_LIBS="" - GLIB_GENMARSHAL="" - GOBJECT_QUERY="" - GLIB_MKENUMS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(GLIB_CFLAGS) - AC_SUBST(GLIB_LIBS) - AC_SUBST(GLIB_GENMARSHAL) - AC_SUBST(GOBJECT_QUERY) - AC_SUBST(GLIB_MKENUMS) - rm -f conf.glibtest -]) - m4_include([acinclude.m4]) diff -ruNp libsoup-2.2.100/ChangeLog libsoup-2.2.100/ChangeLog --- libsoup-2.2.100/ChangeLog 2007-02-12 10:19:13.000000000 -0500 +++ libsoup-2.2.100/ChangeLog 2007-05-01 16:00:48.000000000 -0400 @@ -1,3 +1,142 @@ +2007-04-16 Dan Winship <danw@novell.com> + + * libsoup/soup-ssl.h: Make a real SoupSSLCredentials type rather + than just using gpointer + + * libsoup/soup-server.c (SoupServerPrivate): use it + + * libsoup/soup-session.c (SoupSessionPrivate): use it + + * libsoup/soup-gnutls.c: Use it, and consistently use "creds" + rather than "cred" as the abbreviation for "credentials". + + * docs/reference/libsoup-sections.txt: + * docs/reference/tmpl/soup-misc.sgml: + * docs/reference/tmpl/soup-ssl.sgml: update + +2007-03-29 Dan Winship <danw@novell.com> + + * libsoup/soup-session-sync.c (queue_message): Implement this by + sending the message (synchronously) in another thread and then + queueing the callback back in the main thread. + + * libsoup/soup-session.c (soup_session_queue_message): update docs + to be more explicit about what thread the callback occurs in + +2007-03-17 Dan Winship <danw@novell.com> + + * libsoup/soup-message.c (soup_message_set_auth) + (soup_message_get_auth, soup_message_set_proxy_auth) + (soup_message_get_proxy_auth): get/set auth/proxy_auth info for a + message. + + * libsoup/soup-session.c (add_auth): Use soup_message_set_auth and + soup_message_set_proxy_auth. + (update_auth_internal): Call soup_message_get_auth or + soup_message_get_proxy_auth to determine the message's prior auth, + rather than calling lookup_auth() again, since it isn't guaranteed + to return the same thing now as it did when the message was + originally sent. Fixes erroneous 401s when queuing multiple + messages at once to an as-yet-unauthenticated-to server. #271540 + + * libsoup/soup-session-async.c (queue_message): don't run the + queue right away, do it at idle time. Otherwise in some cases + (especially errors), the message callbacks could be invoked before + queue_message returns. + + * tests/auth-test.c: add a regression test for #271540. + +2007-03-17 Dan Winship <danw@novell.com> + + * configure.in: require glib 2.12. check for timegm(). + + * libsoup/soup-date.c (soup_mktime_utc): Use timegm if available. + (soup_date_iso8601_parse): use g_time_val_from_iso8601. #337010, + patch from Emmanuele Bassi. + + * libsoup/soup-types.h: remove local copy of + G_GNUC_NULL_TERMINATED since we now depend on a new-enough copy of + glib. + + * libsoup/soup-misc.c (soup_base64_encode_close) + (soup_base64_encode_step, soup_base64_encode) + (soup_base64_decode_step): Make these just be wrappers around the + glib base64 methods. (For now; eventually they'll just go away.) + + * libsoup/soup-auth-basic.c (authenticate): + * libsoup/soup-auth-digest.c (authenticate): + * libsoup/soup-connection-ntlm.c (soup_ntlm_parse_challenge) + (soup_ntlm_response): + * libsoup/soup-server-auth.c (soup_server_auth_new): + * libsoup/soup-soap-message.c (soup_soap_message_write_base64): + * libsoup/soup-xmlrpc-message.c + (soup_xmlrpc_message_write_base64): + * libsoup/soup-xmlrpc-response.c (soup_xmlrpc_value_get_base64): + Use glib base64 methods + +2007-03-16 Dan Winship <danw@novell.com> + + * libsoup/soup-message.c (soup_message_get_response_encoding): + update the handling of CONNECT: it has no response body by + default, but does have a body if its headers say so. + + * tests/proxy-test.c: test libsoup's behavior when talking to + proxies. + + * tests/httpd.conf.in: Load mod_proxy and mod_ssl, and add + sections configuring them, for proxy-test + + * configure.in: update the apache-module-dir-finding code to deal + with the fact that some modules (eg, mod_ssl) might only be in the + mpm-specific module dir, while others (eg, mod_php5) might only be + in the generic module dir. + +2007-03-12 Dan Winship <danw@novell.com> + + * tests/Makefile.am (INCLUDES): add $(LIBGNUTLS_CFLAGS) for + ssl-test. #417617, patch from Elijah Newren. + +2007-03-12 Dan Winship <danw@novell.com> + + * libsoup/soup-session-sync.c (wait_for_connection): if + soup_connection_connect_sync() returns SOUP_STATUS_TRY_AGAIN, then + try again. (Duh.) Fixes SSL-via-proxy-when-using-synchronous-I/O- + where-the-proxy-closes-the-connection-when-returning-407. (Reported + by Varadhan.) + + * tests/get.c: Rewrite to use soup_session_send_message rather + than soup_session_queue_message, and add a "-s" flag to use + SoupSessionSync rather than SoupSessionAsync (so we can test bugs + in the sync code paths). + +2007-03-08 Dan Winship <danw@novell.com> + + * libsoup/soup-gnutls.c (do_handshake): don't return + G_IO_STATUS_AGAIN if we're doing blocking I/O; just keep retrying + until the handshake is complete. + (soup_gnutls_read, soup_gnutls_write): if we get + GNUTLS_E_REHANDSHAKE, call do_handshake() immediately rather than + returning G_IO_STATUS_AGAIN; if the socket is blocking then + G_IO_STATUS_AGAIN is wrong, and if the socket is non-blocking, we + might already need to return SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE + or SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ. + + #415402, based on a patch from Jacob Berkman. + + * tests/ssl-test.c: basic ssl test. In particular, tests that + rehandshake requests are handled correctly during both synchronous + and asynchronous I/O. Might eventually test other stuff too... + + * configure.in: + * tests/Makefile.am: updates for ssl-test + +2007-02-19 Dan Winship <danw@novell.com> + + * configure.in: Get gcrypt libs/cflags. + + * libsoup/Makefile.am (INCLUDES, libsoup_2_2_la_LIBADD): add + gcrypt flags. Patch from "Cygwin Ports Maintainer", #384498 + 2007-02-12 Dan Winship <danw@novell.com> * configure.in: 2.2.100 diff -ruNp libsoup-2.2.100/config.h.in libsoup-2.2.100/config.h.in --- libsoup-2.2.100/config.h.in 2007-02-12 10:34:10.000000000 -0500 +++ libsoup-2.2.100/config.h.in 2007-05-01 15:49:23.000000000 -0400 @@ -33,6 +33,10 @@ /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R +/* Define to 1 if you have the `gnutls_certificate_client_set_sign_function' + function. */ +#undef HAVE_GNUTLS_CERTIFICATE_CLIENT_SET_SIGN_FUNCTION + /* Define to 1 if you have the `inet_aton' function. */ #undef HAVE_INET_ATON @@ -78,6 +82,9 @@ /* Define to 1 if you have the <sys/types.h> header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the `timegm' function. */ +#undef HAVE_TIMEGM + /* Define to 1 if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H diff -ruNp libsoup-2.2.100/configure libsoup-2.2.100/configure --- libsoup-2.2.100/configure 2007-02-12 10:34:10.000000000 -0500 +++ libsoup-2.2.100/configure 2007-05-01 15:49:12.000000000 -0400 @@ -876,7 +876,12 @@ OS_WIN32_TRUE OS_WIN32_FALSE LIBGNUTLS_CFLAGS LIBGNUTLS_LIBS +LIBGCRYPT_CONFIG +LIBGCRYPT_CFLAGS +LIBGCRYPT_LIBS SSL_REQUIREMENT +HAVE_SSL_TRUE +HAVE_SSL_FALSE HTML_DIR ENABLE_GTK_DOC_TRUE ENABLE_GTK_DOC_FALSE @@ -884,6 +889,8 @@ GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_USE_LIBTOOL_FALSE APACHE_HTTPD APACHE_MODULE_DIR +APACHE_SSL_MODULE_DIR +APACHE_PHP_MODULE_DIR HAVE_APACHE_TRUE HAVE_APACHE_FALSE IF_HAVE_PHP @@ -1512,6 +1519,8 @@ Optional Packages: --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] + --with-libgcrypt-prefix=PFX + prefix where LIBGCRYPT is installed (optional) --with-html-dir=PATH path to installed docs --with-apache-httpd Path to apache httpd (for tests) --with-apache-module-dir Apache modules dir (for tests) @@ -5910,7 +5919,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5913 "configure"' > conftest.$ac_ext + echo '#line 5922 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -8709,11 +8718,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8712: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8721: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8716: \$? = $ac_status" >&5 + echo "$as_me:8725: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -8977,11 +8986,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:8980: $lt_compile\"" >&5) + (eval echo "\"\$as_me:8989: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:8984: \$? = $ac_status" >&5 + echo "$as_me:8993: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -9081,11 +9090,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:9084: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9093: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:9088: \$? = $ac_status" >&5 + echo "$as_me:9097: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11533,7 +11542,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 11536 "configure" +#line 11545 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11633,7 +11642,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<EOF -#line 11636 "configure" +#line 11645 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14001,11 +14010,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14004: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14013: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:14008: \$? = $ac_status" >&5 + echo "$as_me:14017: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -14105,11 +14114,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:14108: $lt_compile\"" >&5) + (eval echo "\"\$as_me:14117: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:14112: \$? = $ac_status" >&5 + echo "$as_me:14121: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15675,11 +15684,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15678: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15687: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15682: \$? = $ac_status" >&5 + echo "$as_me:15691: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15779,11 +15788,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15782: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15791: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15786: \$? = $ac_status" >&5 + echo "$as_me:15795: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18009,11 +18018,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18012: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18021: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:18016: \$? = $ac_status" >&5 + echo "$as_me:18025: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -18277,11 +18286,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18280: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18289: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:18284: \$? = $ac_status" >&5 + echo "$as_me:18293: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -18381,11 +18390,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:18384: $lt_compile\"" >&5) + (eval echo "\"\$as_me:18393: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:18388: \$? = $ac_status" >&5 + echo "$as_me:18397: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21569,7 +21578,7 @@ fi no_glib=yes fi - min_glib_version=2.6.0 + min_glib_version=2.12.0 { echo "$as_me:$LINENO: checking for GLIB - version >= $min_glib_version" >&5 echo $ECHO_N "checking for GLIB - version >= $min_glib_version... $ECHO_C" >&6; } @@ -22210,6 +22219,116 @@ fi done +for ac_func in timegm +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + { echo "$as_me:$LINENO: checking for socket" >&5 echo $ECHO_N "checking for socket... $ECHO_C" >&6; } @@ -22819,7 +22938,141 @@ else LIBGNUTLS_LIBS=$pkg_cv_LIBGNUTLS_LIBS { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } - have_ssl=yes + +# Check whether --with-libgcrypt-prefix was given. +if test "${with_libgcrypt_prefix+set}" = set; then + withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval" +else + libgcrypt_config_prefix="" +fi + + if test x$libgcrypt_config_prefix != x ; then + if test x${LIBGCRYPT_CONFIG+set} != xset ; then + LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config + fi + fi + + # Extract the first word of "libgcrypt-config", so it can be a program name with args. +set dummy libgcrypt-config; ac_word=$2 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } +if test "${ac_cv_path_LIBGCRYPT_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $LIBGCRYPT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LIBGCRYPT_CONFIG" && ac_cv_path_LIBGCRYPT_CONFIG="no" + ;; +esac +fi +LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG +if test -n "$LIBGCRYPT_CONFIG"; then + { echo "$as_me:$LINENO: result: $LIBGCRYPT_CONFIG" >&5 +echo "${ECHO_T}$LIBGCRYPT_CONFIG" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } +fi + + + tmp=1:1.2.0 + if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then + req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` + min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'` + else + req_libgcrypt_api=0 + min_libgcrypt_version="$tmp" + fi + + { echo "$as_me:$LINENO: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5 +echo $ECHO_N "checking for LIBGCRYPT - version >= $min_libgcrypt_version... $ECHO_C" >&6; } + ok=no + if test "$LIBGCRYPT_CONFIG" != "no" ; then + req_major=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + req_minor=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + req_micro=`echo $min_libgcrypt_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version` + major=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'` + minor=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'` + micro=`echo $libgcrypt_config_version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'` + if test "$major" -gt "$req_major"; then + ok=yes + else + if test "$major" -eq "$req_major"; then + if test "$minor" -gt "$req_minor"; then + ok=yes + else + if test "$minor" -eq "$req_minor"; then + if test "$micro" -ge "$req_micro"; then + ok=yes + fi + fi + fi + fi + fi + fi + if test $ok = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } + else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + fi + if test $ok = yes; then + # If we have a recent libgcrypt, we should also check that the + # API is compatible + if test "$req_libgcrypt_api" -gt 0 ; then + tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0` + if test "$tmp" -gt 0 ; then + { echo "$as_me:$LINENO: checking LIBGCRYPT API version" >&5 +echo $ECHO_N "checking LIBGCRYPT API version... $ECHO_C" >&6; } + if test "$req_libgcrypt_api" -eq "$tmp" ; then + { echo "$as_me:$LINENO: result: okay" >&5 +echo "${ECHO_T}okay" >&6; } + else + ok=no + { echo "$as_me:$LINENO: result: does not match (want=$req_libgcrypt_api got=$tmp)" >&5 +echo "${ECHO_T}does not match (want=$req_libgcrypt_api got=$tmp)" >&6; } + fi + fi + fi + fi + if test $ok = yes; then + LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` + LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` + have_ssl=yes + else + LIBGCRYPT_CFLAGS="" + LIBGCRYPT_LIBS="" + have_ssl=no + fi + + + fi if test "$have_ssl" = "yes"; then @@ -22828,6 +23081,120 @@ cat >>confdefs.h <<\_ACEOF _ACEOF SSL_REQUIREMENT="gnutls" + + old_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $LIBGNUTLS_LIBS $LIBGCRYPT_LIBS" + +for ac_func in gnutls_certificate_client_set_sign_function +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval echo '${'$as_ac_var'}'` + { echo "$as_me:$LINENO: result: $ac_res" >&5 +echo "${ECHO_T}$ac_res" >&6; } +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + LDFLAGS="$old_LDFLAGS" else if test "$enable_ssl" = "auto"; then { echo "$as_me:$LINENO: WARNING: Disabling SSL support" >&5 @@ -22847,6 +23214,17 @@ fi +if test $enable_ssl != no; then + HAVE_SSL_TRUE= + HAVE_SSL_FALSE='#' +else + HAVE_SSL_TRUE='#' + HAVE_SSL_FALSE= +fi + + + + # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then withval=$with_html_dir; @@ -23061,11 +23439,17 @@ if test "${with_apache_module_dir+set}" withval=$with_apache_module_dir; APACHE_MODULE_DIR="$withval" else apache_prefix=`dirname \`dirname $APACHE_HTTPD\`` + mpm=`$APACHE_HTTPD -V | sed -ne 's/^Server MPM: */-/p' | tr 'A-Z' 'a-z'` # This only works with bash, but should fail harmlessly in sh - for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{/modules,}; do + for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{$mpm,}{/modules,}; do if test -f $dir/mod_auth_digest.so; then APACHE_MODULE_DIR="$dir" - break + fi + if test -f $dir/mod_ssl.so; then + APACHE_SSL_MODULE_DIR="$dir" + fi + if test -f $dir/mod_php5.so; then + APACHE_PHP_MODULE_DIR="$dir" fi done fi @@ -23073,6 +23457,8 @@ fi { echo "$as_me:$LINENO: result: $APACHE_MODULE_DIR" >&5 echo "${ECHO_T}$APACHE_MODULE_DIR" >&6; } + + fi if test "$APACHE_HTTPD" != "no" -a -n "$APACHE_MODULE_DIR"; then @@ -23099,7 +23485,7 @@ fi if test "$have_apache" = 1; then { echo "$as_me:$LINENO: checking for mod_php5" >&5 echo $ECHO_N "checking for mod_php5... $ECHO_C" >&6; } - if test -f $APACHE_MODULE_DIR/mod_php5.so; then + if test -f $APACHE_PHP_MODULE_DIR/mod_php5.so; then have_php=yes IF_HAVE_PHP="" else @@ -23276,6 +23662,13 @@ echo "$as_me: error: conditional \"OS_WI Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${HAVE_SSL_TRUE}" && test -z "${HAVE_SSL_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"HAVE_SSL\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"HAVE_SSL\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -23994,7 +24387,12 @@ OS_WIN32_TRUE!$OS_WIN32_TRUE$ac_delim OS_WIN32_FALSE!$OS_WIN32_FALSE$ac_delim LIBGNUTLS_CFLAGS!$LIBGNUTLS_CFLAGS$ac_delim LIBGNUTLS_LIBS!$LIBGNUTLS_LIBS$ac_delim +LIBGCRYPT_CONFIG!$LIBGCRYPT_CONFIG$ac_delim +LIBGCRYPT_CFLAGS!$LIBGCRYPT_CFLAGS$ac_delim +LIBGCRYPT_LIBS!$LIBGCRYPT_LIBS$ac_delim SSL_REQUIREMENT!$SSL_REQUIREMENT$ac_delim +HAVE_SSL_TRUE!$HAVE_SSL_TRUE$ac_delim +HAVE_SSL_FALSE!$HAVE_SSL_FALSE$ac_delim HTML_DIR!$HTML_DIR$ac_delim ENABLE_GTK_DOC_TRUE!$ENABLE_GTK_DOC_TRUE$ac_delim ENABLE_GTK_DOC_FALSE!$ENABLE_GTK_DOC_FALSE$ac_delim @@ -24002,6 +24400,8 @@ GTK_DOC_USE_LIBTOOL_TRUE!$GTK_DOC_USE_LI GTK_DOC_USE_LIBTOOL_FALSE!$GTK_DOC_USE_LIBTOOL_FALSE$ac_delim APACHE_HTTPD!$APACHE_HTTPD$ac_delim APACHE_MODULE_DIR!$APACHE_MODULE_DIR$ac_delim +APACHE_SSL_MODULE_DIR!$APACHE_SSL_MODULE_DIR$ac_delim +APACHE_PHP_MODULE_DIR!$APACHE_PHP_MODULE_DIR$ac_delim HAVE_APACHE_TRUE!$HAVE_APACHE_TRUE$ac_delim HAVE_APACHE_FALSE!$HAVE_APACHE_FALSE$ac_delim IF_HAVE_PHP!$IF_HAVE_PHP$ac_delim @@ -24011,7 +24411,7 @@ LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 42; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 49; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 diff -ruNp libsoup-2.2.100/configure.in libsoup-2.2.100/configure.in --- libsoup-2.2.100/configure.in 2007-02-12 10:18:49.000000000 -0500 +++ libsoup-2.2.100/configure.in 2007-05-01 16:00:48.000000000 -0400 @@ -73,7 +73,7 @@ dnl *********************** dnl *** Checks for glib *** dnl *********************** -AM_PATH_GLIB_2_0(2.6.0,,,gobject gthread) +AM_PATH_GLIB_2_0(2.12.0,,,gobject gthread) PKG_CHECK_MODULES(XML, libxml-2.0) AC_SUBST(XML_CFLAGS) @@ -106,6 +106,7 @@ dnl ******************* dnl *** Misc checks *** dnl ******************* AC_CHECK_FUNCS(gmtime_r) +AC_CHECK_FUNCS(timegm) dnl ********************************* dnl *** Networking library checks *** @@ -134,7 +135,8 @@ AC_ARG_ENABLE(ssl, enable_ssl=auto) if test "$enable_ssl" != "no"; then - PKG_CHECK_MODULES(LIBGNUTLS, gnutls, have_ssl=yes, have_ssl=no) + PKG_CHECK_MODULES(LIBGNUTLS, gnutls, + [AM_PATH_LIBGCRYPT([], have_ssl=yes, have_ssl=no)], have_ssl=no) if test "$have_ssl" = "yes"; then AC_DEFINE(HAVE_SSL, 1, [Defined if you have SSL support]) SSL_REQUIREMENT="gnutls" @@ -152,6 +154,9 @@ AC_SUBST(LIBGNUTLS_CFLAGS) AC_SUBST(LIBGNUTLS_LIBS) AC_SUBST(SSL_REQUIREMENT) +dnl This is not supposed to be conditional, but... +AM_CONDITIONAL(HAVE_SSL, test $enable_ssl != no) + dnl *************** dnl *** gtk-doc *** dnl *************** @@ -207,15 +212,23 @@ if test "$APACHE_HTTPD" != "no"; then [ --with-apache-module-dir Apache modules dir (for tests)], APACHE_MODULE_DIR="$withval", [apache_prefix=`dirname \`dirname $APACHE_HTTPD\`` + mpm=`$APACHE_HTTPD -V | sed -ne 's/^Server MPM: */-/p' | tr 'A-Z' 'a-z'` # This only works with bash, but should fail harmlessly in sh - for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{/modules,}; do + for dir in $apache_prefix/lib{64,}/{apache,http}{2,}{$mpm,}{/modules,}; do if test -f $dir/mod_auth_digest.so; then APACHE_MODULE_DIR="$dir" - break + fi + if test -f $dir/mod_ssl.so; then + APACHE_SSL_MODULE_DIR="$dir" + fi + if test -f $dir/mod_php5.so; then + APACHE_PHP_MODULE_DIR="$dir" fi done]) AC_MSG_RESULT($APACHE_MODULE_DIR) AC_SUBST(APACHE_MODULE_DIR) + AC_SUBST(APACHE_SSL_MODULE_DIR) + AC_SUBST(APACHE_PHP_MODULE_DIR) fi if test "$APACHE_HTTPD" != "no" -a -n "$APACHE_MODULE_DIR"; then @@ -228,7 +241,7 @@ AM_CONDITIONAL(HAVE_APACHE, test $have_a if test "$have_apache" = 1; then AC_MSG_CHECKING([for mod_php5]) - if test -f $APACHE_MODULE_DIR/mod_php5.so; then + if test -f $APACHE_PHP_MODULE_DIR/mod_php5.so; then have_php=yes IF_HAVE_PHP="" else diff -ruNp libsoup-2.2.100/libsoup/Makefile.am libsoup-2.2.100/libsoup/Makefile.am --- libsoup-2.2.100/libsoup/Makefile.am 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/Makefile.am 2007-04-09 17:03:24.000000000 -0400 @@ -10,6 +10,7 @@ INCLUDES = \ $(SOUP_DEBUG_FLAGS) \ $(GLIB_CFLAGS) \ $(XML_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) \ $(LIBGNUTLS_CFLAGS) MARSHAL_GENERATED = soup-marshal.c soup-marshal.h @@ -67,6 +68,7 @@ libsoup_2_2_la_LIBADD = \ $(XML_LIBS) \ $(LIBGNUTLS_LIBS_STATIC) \ $(LIBGNUTLS_LIBS) \ + $(LIBGCRYPT_LIBS) \ $(LIBWS2_32) libsoup_2_2_la_SOURCES = \ diff -ruNp libsoup-2.2.100/libsoup/Makefile.in libsoup-2.2.100/libsoup/Makefile.in --- libsoup-2.2.100/libsoup/Makefile.in 2007-02-12 10:34:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/Makefile.in 2007-05-01 15:49:10.000000000 -0400 @@ -61,7 +61,7 @@ LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libsoup_2_2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_1 = soup-marshal.lo am_libsoup_2_2_la_OBJECTS = $(am__objects_1) soup-address.lo \ soup-auth.lo soup-auth-basic.lo soup-auth-digest.lo \ @@ -102,6 +102,8 @@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ APACHE_HTTPD = @APACHE_HTTPD@ APACHE_MODULE_DIR = @APACHE_MODULE_DIR@ +APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@ +APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ @@ -141,6 +143,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@ HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@ HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@ +HAVE_SSL_FALSE = @HAVE_SSL_FALSE@ +HAVE_SSL_TRUE = @HAVE_SSL_TRUE@ HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@ HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@ HTML_DIR = @HTML_DIR@ @@ -150,6 +154,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ @@ -240,6 +247,7 @@ INCLUDES = \ $(SOUP_DEBUG_FLAGS) \ $(GLIB_CFLAGS) \ $(XML_CFLAGS) \ + $(LIBGCRYPT_CFLAGS) \ $(LIBGNUTLS_CFLAGS) MARSHAL_GENERATED = soup-marshal.c soup-marshal.h @@ -282,6 +290,7 @@ libsoup_2_2_la_LIBADD = \ $(XML_LIBS) \ $(LIBGNUTLS_LIBS_STATIC) \ $(LIBGNUTLS_LIBS) \ + $(LIBGCRYPT_LIBS) \ $(LIBWS2_32) libsoup_2_2_la_SOURCES = \ diff -ruNp libsoup-2.2.100/libsoup/soup-auth-basic.c libsoup-2.2.100/libsoup/soup-auth-basic.c --- libsoup-2.2.100/libsoup/soup-auth-basic.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-auth-basic.c 2007-04-09 17:03:24.000000000 -0400 @@ -118,7 +118,7 @@ authenticate (SoupAuth *auth, const char user_pass = g_strdup_printf ("%s:%s", username, password); len = strlen (user_pass); - priv->token = soup_base64_encode (user_pass, len); + priv->token = g_base64_encode ((guchar *)user_pass, len); memset (user_pass, 0, len); g_free (user_pass); diff -ruNp libsoup-2.2.100/libsoup/soup-auth-digest.c libsoup-2.2.100/libsoup/soup-auth-digest.c --- libsoup-2.2.100/libsoup/soup-auth-digest.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-auth-digest.c 2007-04-09 17:03:24.000000000 -0400 @@ -1,4 +1,4 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-digest-offset: 8 -*- */ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * soup-auth-digest.c: HTTP Digest Authentication * @@ -258,7 +258,7 @@ authenticate (SoupAuth *auth, const char auth, (unsigned long) getpid (), (unsigned long) time (0)); - priv->cnonce = soup_base64_encode (bgen, strlen (bgen)); + priv->cnonce = g_base64_encode ((guchar *)bgen, strlen (bgen)); g_free (bgen); priv->user = g_strdup (username); diff -ruNp libsoup-2.2.100/libsoup/soup-connection-ntlm.c libsoup-2.2.100/libsoup/soup-connection-ntlm.c --- libsoup-2.2.100/libsoup/soup-connection-ntlm.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-connection-ntlm.c 2007-04-09 17:03:24.000000000 -0400 @@ -328,25 +328,14 @@ soup_ntlm_parse_challenge (const char *c char **nonce, char **default_domain) { - int clen, decodelen; + gsize clen; NTLMString domain; guchar *chall; - int state; - unsigned int save; if (strncmp (challenge, "NTLM ", 5) != 0) return FALSE; - decodelen = strlen (challenge) - 5; - chall = g_malloc (decodelen); - - state = save = 0; - clen = soup_base64_decode_step ((const guchar *) challenge + 5, - decodelen, - chall, - &state, - &save); - + chall = g_base64_decode (challenge + 5, &clen); if (clen < NTLM_CHALLENGE_DOMAIN_STRING_OFFSET || clen < NTLM_CHALLENGE_NONCE_OFFSET + NTLM_CHALLENGE_NONCE_LENGTH) { g_free (chall); @@ -385,7 +374,7 @@ soup_ntlm_response (const char *nonce, int hlen, dlen, ulen, offset; guchar hash[21], lm_resp[24], nt_resp[24]; NTLMResponse resp; - guchar *out, *p; + char *out, *p; int state, save; nt_hash (password, hash); @@ -411,51 +400,27 @@ soup_ntlm_response (const char *nonce, ntlm_set_string (&resp.nt_resp, &offset, sizeof (nt_resp)); out = g_malloc (((offset + 3) * 4) / 3 + 6); - strncpy ((char *)out, "NTLM ", 5); + strncpy (out, "NTLM ", 5); p = out + 5; state = save = 0; - p += soup_base64_encode_step ((guchar *) &resp, - sizeof (resp), - FALSE, - p, - &state, - &save); - p += soup_base64_encode_step ((const guchar *) domain, - dlen, - FALSE, - p, - &state, - &save); - p += soup_base64_encode_step ((const guchar *) user, - ulen, - FALSE, - p, - &state, - &save); - p += soup_base64_encode_step ((const guchar *) host, - hlen, - FALSE, - p, - &state, - &save); - p += soup_base64_encode_step (lm_resp, - sizeof (lm_resp), - FALSE, - p, - &state, - &save); - - p += soup_base64_encode_close (nt_resp, - sizeof (nt_resp), - FALSE, - p, - &state, - &save); + p += g_base64_encode_step ((const guchar *) &resp, sizeof (resp), + FALSE, p, &state, &save); + p += g_base64_encode_step ((const guchar *) domain, dlen, + FALSE, p, &state, &save); + p += g_base64_encode_step ((const guchar *) user, ulen, + FALSE, p, &state, &save); + p += g_base64_encode_step ((const guchar *) host, hlen, + FALSE, p, &state, &save); + p += g_base64_encode_step (lm_resp, sizeof (lm_resp), + FALSE, p, &state, &save); + p += g_base64_encode_step (nt_resp, sizeof (nt_resp), + FALSE, p, &state, &save); + p += g_base64_encode_close (FALSE, p, &state, &save); *p = '\0'; - return (char *)out; + return out; } /* DES utils */ diff -ruNp libsoup-2.2.100/libsoup/soup-date.c libsoup-2.2.100/libsoup/soup-date.c --- libsoup-2.2.100/libsoup/soup-date.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-date.c 2007-04-09 17:03:24.000000000 -0400 @@ -26,10 +26,6 @@ static const char *days[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; -static const int days_before[] = { - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 -}; - static int parse_month (const char *month) { @@ -54,12 +50,18 @@ parse_month (const char *month) time_t soup_mktime_utc (struct tm *tm) { +#if HAVE_TIMEGM + return timegm (tm); +#else time_t tt; + static const int days_before[] = { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 + }; /* We check the month because (a) if we don't, the * days_before[] part below may access random memory, and (b) * soup_date_parse() doesn't check the return value of - * parse_month(). The caller is responsible for ensure the + * parse_month(). The caller is responsible for ensuring the * sanity of everything else. */ if (tm->tm_mon < 0 || tm->tm_mon > 11) @@ -71,7 +73,9 @@ soup_mktime_utc (struct tm *tm) if (tm->tm_year % 4 == 0 && tm->tm_mon < 2) tt--; tt = ((((tt * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec; + return tt; +#endif } /** @@ -185,6 +189,7 @@ char * soup_date_generate (time_t when) { struct tm tm; + soup_gmtime (&when, &tm); /* RFC1123 format, eg, "Sun, 06 Nov 1994 08:49:37 GMT" */ @@ -206,59 +211,10 @@ soup_date_generate (time_t when) time_t soup_date_iso8601_parse (const char *timestamp) { - struct tm tm; - long val; - time_t tt; - - val = strtoul (timestamp, (char **)×tamp, 10); - if (*timestamp == '-') { - // YYYY-MM-DD - tm.tm_year = val - 1900; - timestamp++; - tm.tm_mon = strtoul (timestamp, (char **)×tamp, 10) - 1; - if (*timestamp++ != '-') - return -1; - tm.tm_mday = strtoul (timestamp, (char **)×tamp, 10); - } else { - // YYYYMMDD - tm.tm_mday = val % 100; - tm.tm_mon = (val % 10000) / 100 - 1; - tm.tm_year = val / 10000 - 1900; - } - - if (*timestamp++ != 'T') - return -1; - - val = strtoul (timestamp, (char **)×tamp, 10); - if (*timestamp == ':') { - // hh:mm:ss - tm.tm_hour = val; - timestamp++; - tm.tm_min = strtoul (timestamp, (char **)×tamp, 10); - if (*timestamp++ != ':') - return -1; - tm.tm_sec = strtoul (timestamp, (char **)×tamp, 10); - } else { - // hhmmss - tm.tm_sec = val % 100; - tm.tm_min = (val % 10000) / 100; - tm.tm_hour = val / 10000; - } + GTimeVal timeval; - tt = soup_mktime_utc (&tm); + if (!g_time_val_from_iso8601 (timestamp, &timeval)) + return (time_t) -1; - if (*timestamp == '.') - strtoul (timestamp + 1, (char **)×tamp, 10); - - if (*timestamp == '+' || *timestamp == '-') { - int sign = (*timestamp == '+') ? -1 : 1; - val = strtoul (timestamp + 1, (char **)×tamp, 10); - if (*timestamp == ':') - val = 60 * val + strtoul (timestamp + 1, NULL, 10); - else - val = 60 * (val / 100) + (val % 100); - tt += sign * val; - } - - return tt; + return (time_t) timeval.tv_sec; } diff -ruNp libsoup-2.2.100/libsoup/soup-gnutls.c libsoup-2.2.100/libsoup/soup-gnutls.c --- libsoup-2.2.100/libsoup/soup-gnutls.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-gnutls.c 2007-05-01 16:00:48.000000000 -0400 @@ -2,10 +2,7 @@ /* * soup-gnutls.c * - * Authors: - * Ian Peters <itp@ximian.com> - * - * Copyright (C) 2003, Ximian, Inc. + * Copyright (C) 2003-2006, Novell, Inc. */ #ifdef HAVE_CONFIG_H @@ -15,6 +12,7 @@ #ifdef HAVE_SSL #include <errno.h> +#include <fcntl.h> #include <pthread.h> #include <stdlib.h> #include <string.h> @@ -32,17 +30,17 @@ gboolean soup_ssl_supported = TRUE; #define DH_BITS 1024 -typedef struct { - gnutls_certificate_credentials cred; +struct SoupSSLCredentials { + gnutls_certificate_credentials creds; gboolean have_ca_file; -} SoupGNUTLSCred; +}; typedef struct { GIOChannel channel; int fd; GIOChannel *real_sock; gnutls_session session; - SoupGNUTLSCred *cred; + SoupSSLCredentials *creds; char *hostname; gboolean established; SoupSSLType type; @@ -129,21 +127,26 @@ verify_certificate (gnutls_session sessi return TRUE; } +#define SOUP_GNUTLS_CHANNEL_NONBLOCKING(chan) (fcntl ((chan)->fd, F_GETFL, 0) & O_NONBLOCK) + static GIOStatus do_handshake (SoupGNUTLSChannel *chan, GError **err) { int result; +again: result = gnutls_handshake (chan->session); - if (result == GNUTLS_E_AGAIN || - result == GNUTLS_E_INTERRUPTED) { - g_set_error (err, SOUP_SSL_ERROR, - (gnutls_record_get_direction (chan->session) ? - SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE : - SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ), - "Handshaking..."); - return G_IO_STATUS_AGAIN; + if (result == GNUTLS_E_AGAIN || result == GNUTLS_E_INTERRUPTED) { + if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan)) { + g_set_error (err, SOUP_SSL_ERROR, + (gnutls_record_get_direction (chan->session) ? + SOUP_SSL_ERROR_HANDSHAKE_NEEDS_WRITE : + SOUP_SSL_ERROR_HANDSHAKE_NEEDS_READ), + "Handshaking..."); + return G_IO_STATUS_AGAIN; + } else + goto again; } if (result < 0) { @@ -153,7 +156,7 @@ do_handshake (SoupGNUTLSChannel *chan, G return G_IO_STATUS_ERROR; } - if (chan->type == SOUP_SSL_TYPE_CLIENT && chan->cred->have_ca_file && + if (chan->type == SOUP_SSL_TYPE_CLIENT && chan->creds->have_ca_file && !verify_certificate (chan->session, chan->hostname, err)) return G_IO_STATUS_ERROR; @@ -172,6 +175,7 @@ soup_gnutls_read (GIOChannel *channel, *bytes_read = 0; +again: if (!chan->established) { result = do_handshake (chan, err); @@ -186,13 +190,17 @@ soup_gnutls_read (GIOChannel *channel, if (result == GNUTLS_E_REHANDSHAKE) { chan->established = FALSE; - return G_IO_STATUS_AGAIN; + goto again; } - if (result < 0) { - if ((result == GNUTLS_E_INTERRUPTED) || - (result == GNUTLS_E_AGAIN)) + if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) { + if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan)) return G_IO_STATUS_AGAIN; + else + goto again; + } + + if (result < 0) { g_set_error (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, "Received corrupted data"); @@ -216,6 +224,7 @@ soup_gnutls_write (GIOChannel *channel *bytes_written = 0; +again: if (!chan->established) { result = do_handshake (chan, err); @@ -228,15 +237,22 @@ soup_gnutls_write (GIOChannel *channel result = gnutls_record_send (chan->session, buf, count); + /* I'm pretty sure this can't actually happen in response to a + * write, but... + */ if (result == GNUTLS_E_REHANDSHAKE) { chan->established = FALSE; - return G_IO_STATUS_AGAIN; + goto again; } - if (result < 0) { - if ((result == GNUTLS_E_INTERRUPTED) || - (result == GNUTLS_E_AGAIN)) + if (result == GNUTLS_E_INTERRUPTED || result == GNUTLS_E_AGAIN) { + if (SOUP_GNUTLS_CHANNEL_NONBLOCKING (chan)) return G_IO_STATUS_AGAIN; + else + goto again; + } + + if (result < 0) { g_set_error (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, "Received corrupted data"); @@ -352,7 +368,7 @@ THROW_CREATE_ERROR: * @sock: a #GIOChannel wrapping a TCP socket. * @type: whether this is a client or server socket * @remote_host: the hostname of the remote machine - * @credentials: a client or server credentials structure + * @creds: a client or server credentials structure * * This attempts to wrap a new #GIOChannel around @sock that * will SSL-encrypt/decrypt all traffic through it. @@ -362,17 +378,16 @@ THROW_CREATE_ERROR: **/ GIOChannel * soup_ssl_wrap_iochannel (GIOChannel *sock, SoupSSLType type, - const char *remote_host, gpointer credentials) + const char *remote_host, SoupSSLCredentials *creds) { SoupGNUTLSChannel *chan = NULL; GIOChannel *gchan = NULL; gnutls_session session = NULL; - SoupGNUTLSCred *cred = credentials; int sockfd; int ret; g_return_val_if_fail (sock != NULL, NULL); - g_return_val_if_fail (credentials != NULL, NULL); + g_return_val_if_fail (creds != NULL, NULL); sockfd = g_io_channel_unix_get_fd (sock); if (!sockfd) { @@ -389,7 +404,7 @@ soup_ssl_wrap_iochannel (GIOChannel *soc goto THROW_CREATE_ERROR; if (gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, - cred->cred) != 0) + creds->creds) != 0) goto THROW_CREATE_ERROR; if (type == SOUP_SSL_TYPE_SERVER) @@ -401,7 +416,7 @@ soup_ssl_wrap_iochannel (GIOChannel *soc chan->fd = sockfd; chan->real_sock = sock; chan->session = session; - chan->cred = cred; + chan->creds = creds; chan->hostname = g_strdup (remote_host); chan->type = type; g_io_channel_ref (sock); @@ -451,22 +466,22 @@ soup_gnutls_init (void) * Return value: the client credentials, which must be freed with * soup_ssl_free_client_credentials(). **/ -gpointer +SoupSSLCredentials * soup_ssl_get_client_credentials (const char *ca_file) { - SoupGNUTLSCred *cred; + SoupSSLCredentials *creds; int status; if (!soup_gnutls_inited) soup_gnutls_init (); - cred = g_new0 (SoupGNUTLSCred, 1); - gnutls_certificate_allocate_credentials (&cred->cred); + creds = g_new0 (SoupSSLCredentials, 1); + gnutls_certificate_allocate_credentials (&creds->creds); if (ca_file) { - cred->have_ca_file = TRUE; + creds->have_ca_file = TRUE; status = gnutls_certificate_set_x509_trust_file ( - cred->cred, ca_file, GNUTLS_X509_FMT_PEM); + creds->creds, ca_file, GNUTLS_X509_FMT_PEM); if (status < 0) { g_warning ("Failed to set SSL trust file (%s).", ca_file); @@ -478,7 +493,7 @@ soup_ssl_get_client_credentials (const c } } - return cred; + return creds; } /** @@ -486,15 +501,13 @@ soup_ssl_get_client_credentials (const c * @creds: a client credentials structure returned by * soup_ssl_get_client_credentials(). * - * Frees @client_creds. + * Frees @creds. **/ void -soup_ssl_free_client_credentials (gpointer creds) +soup_ssl_free_client_credentials (SoupSSLCredentials *creds) { - SoupGNUTLSCred *cred = creds; - - gnutls_certificate_free_credentials (cred->cred); - g_free (cred); + gnutls_certificate_free_credentials (creds->creds); + g_free (creds); } /** @@ -510,10 +523,10 @@ soup_ssl_free_client_credentials (gpoint * Return value: the server credentials, which must be freed with * soup_ssl_free_server_credentials(). **/ -gpointer +SoupSSLCredentials * soup_ssl_get_server_credentials (const char *cert_file, const char *key_file) { - SoupGNUTLSCred *cred; + SoupSSLCredentials *creds; if (!soup_gnutls_inited) soup_gnutls_init (); @@ -522,20 +535,20 @@ soup_ssl_get_server_credentials (const c return NULL; } - cred = g_new0 (SoupGNUTLSCred, 1); - gnutls_certificate_allocate_credentials (&cred->cred); + creds = g_new0 (SoupSSLCredentials, 1); + gnutls_certificate_allocate_credentials (&creds->creds); - if (gnutls_certificate_set_x509_key_file (cred->cred, + if (gnutls_certificate_set_x509_key_file (creds->creds, cert_file, key_file, GNUTLS_X509_FMT_PEM) != 0) { g_warning ("Failed to set SSL certificate and key files " "(%s, %s).", cert_file, key_file); - soup_ssl_free_server_credentials (cred); + soup_ssl_free_server_credentials (creds); return NULL; } - gnutls_certificate_set_dh_params (cred->cred, dh_params); - return cred; + gnutls_certificate_set_dh_params (creds->creds, dh_params); + return creds; } /** @@ -543,15 +556,13 @@ soup_ssl_get_server_credentials (const c * @creds: a server credentials structure returned by * soup_ssl_get_server_credentials(). * - * Frees @server_creds. + * Frees @creds. **/ void -soup_ssl_free_server_credentials (gpointer creds) +soup_ssl_free_server_credentials (SoupSSLCredentials *creds) { - SoupGNUTLSCred *cred = creds; - - gnutls_certificate_free_credentials (cred->cred); - g_free (cred); + gnutls_certificate_free_credentials (creds->creds); + g_free (creds); } #endif /* HAVE_SSL */ diff -ruNp libsoup-2.2.100/libsoup/soup-message.c libsoup-2.2.100/libsoup/soup-message.c --- libsoup-2.2.100/libsoup/soup-message.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-message.c 2007-04-09 17:03:24.000000000 -0400 @@ -70,6 +70,11 @@ finalize (GObject *object) if (priv->uri) soup_uri_free (priv->uri); + if (priv->auth) + g_object_unref (priv->auth); + if (priv->proxy_auth) + g_object_unref (priv->proxy_auth); + if (msg->request.owner == SOUP_BUFFER_SYSTEM_OWNED) g_free (msg->request.body); if (msg->response.owner == SOUP_BUFFER_SYSTEM_OWNED) @@ -725,6 +730,110 @@ soup_message_foreach_header (GHashTable } /** + * soup_message_set_auth: + * @msg: a #SoupMessage + * @auth: a #SoupAuth, or %NULL + * + * Sets @msg to authenticate to its destination using @auth, which + * must have already been fully authenticated. If @auth is %NULL, @msg + * will not authenticate to its destination. + **/ +void +soup_message_set_auth (SoupMessage *msg, SoupAuth *auth) +{ + SoupMessagePrivate *priv; + char *token; + + g_return_if_fail (SOUP_IS_MESSAGE (msg)); + g_return_if_fail (auth == NULL || SOUP_IS_AUTH (auth)); + g_return_if_fail (auth == NULL || soup_auth_is_authenticated (auth)); + + priv = SOUP_MESSAGE_GET_PRIVATE (msg); + + if (priv->auth) + g_object_unref (priv->auth); + soup_message_remove_header (msg->request_headers, "Authorization"); + priv->auth = auth; + if (!priv->auth) + return; + + g_object_ref (priv->auth); + token = soup_auth_get_authorization (auth, msg); + soup_message_add_header (msg->request_headers, "Authorization", token); + g_free (token); +} + +/** + * soup_message_get_auth: + * @msg: a #SoupMessage + * + * Gets the #SoupAuth used by @msg for authentication. + * + * Return value: the #SoupAuth used by @msg for authentication, or + * %NULL if @msg is unauthenticated. + **/ +SoupAuth * +soup_message_get_auth (SoupMessage *msg) +{ + g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL); + + return SOUP_MESSAGE_GET_PRIVATE (msg)->auth; +} + +/** + * soup_message_set_proxy_auth: + * @msg: a #SoupMessage + * @auth: a #SoupAuth, or %NULL + * + * Sets @msg to authenticate to its proxy using @auth, which must have + * already been fully authenticated. If @auth is %NULL, @msg will not + * authenticate to its proxy. + **/ +void +soup_message_set_proxy_auth (SoupMessage *msg, SoupAuth *auth) +{ + SoupMessagePrivate *priv; + char *token; + + g_return_if_fail (SOUP_IS_MESSAGE (msg)); + g_return_if_fail (auth == NULL || SOUP_IS_AUTH (auth)); + g_return_if_fail (auth == NULL || soup_auth_is_authenticated (auth)); + + priv = SOUP_MESSAGE_GET_PRIVATE (msg); + + if (priv->proxy_auth) + g_object_unref (priv->proxy_auth); + soup_message_remove_header (msg->request_headers, + "Proxy-Authorization"); + priv->proxy_auth = auth; + if (!priv->proxy_auth) + return; + + g_object_ref (priv->proxy_auth); + token = soup_auth_get_authorization (auth, msg); + soup_message_add_header (msg->request_headers, + "Proxy-Authorization", token); + g_free (token); +} + +/** + * soup_message_get_proxy_auth: + * @msg: a #SoupMessage + * + * Gets the #SoupAuth used by @msg for authentication to its proxy.. + * + * Return value: the #SoupAuth used by @msg for authentication to its + * proxy, or %NULL if @msg isn't authenticated to its proxy. + **/ +SoupAuth * +soup_message_get_proxy_auth (SoupMessage *msg) +{ + g_return_val_if_fail (SOUP_IS_MESSAGE (msg), NULL); + + return SOUP_MESSAGE_GET_PRIVATE (msg)->proxy_auth; +} + +/** * soup_message_cleanup_response: * @req: a #SoupMessage * @@ -984,9 +1093,7 @@ soup_message_get_response_encoding (Soup { SoupMethodId method = soup_method_get_id (msg->method); - /* FIXME: should CONNECT really be here? Where does it say that? */ if (method == SOUP_METHOD_ID_HEAD || - method == SOUP_METHOD_ID_CONNECT || msg->status_code == SOUP_STATUS_NO_CONTENT || msg->status_code == SOUP_STATUS_NOT_MODIFIED || SOUP_STATUS_IS_INFORMATIONAL (msg->status_code)) @@ -1022,7 +1129,9 @@ soup_message_get_response_encoding (Soup *content_length = lval; return SOUP_TRANSFER_CONTENT_LENGTH; } - } else + } else if (method == SOUP_METHOD_ID_CONNECT) + return SOUP_TRANSFER_NONE; + else return SOUP_TRANSFER_EOF; } } diff -ruNp libsoup-2.2.100/libsoup/soup-message-private.h libsoup-2.2.100/libsoup/soup-message-private.h --- libsoup-2.2.100/libsoup/soup-message-private.h 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-message-private.h 2007-04-09 17:03:24.000000000 -0400 @@ -6,7 +6,8 @@ #ifndef SOUP_MESSAGE_PRIVATE_H #define SOUP_MESSAGE_PRIVATE_H 1 -#include <libsoup/soup-message.h> +#include "soup-message.h" +#include "soup-auth.h" typedef struct { gpointer io_data; @@ -20,6 +21,8 @@ typedef struct { SoupHttpVersion http_version; SoupUri *uri; + + SoupAuth *auth, *proxy_auth; } SoupMessagePrivate; #define SOUP_MESSAGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_MESSAGE, SoupMessagePrivate)) @@ -57,4 +60,12 @@ void soup_message_io_server (SoupMessag SoupMessageParseHeadersFn parse_headers_cb, gpointer user_data); +/* Auth handling */ +void soup_message_set_auth (SoupMessage *msg, + SoupAuth *auth); +SoupAuth *soup_message_get_auth (SoupMessage *msg); +void soup_message_set_proxy_auth (SoupMessage *msg, + SoupAuth *auth); +SoupAuth *soup_message_get_proxy_auth (SoupMessage *msg); + #endif /* SOUP_MESSAGE_PRIVATE_H */ diff -ruNp libsoup-2.2.100/libsoup/soup-misc.c libsoup-2.2.100/libsoup/soup-misc.c --- libsoup-2.2.100/libsoup/soup-misc.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-misc.c 2007-04-09 17:03:24.000000000 -0400 @@ -50,16 +50,6 @@ soup_str_case_equal (gconstpointer v1, return g_ascii_strcasecmp (string1, string2) == 0; } -/* Base64 utils (straight from camel-mime-utils.c) */ -#define d(x) - -static const char *base64_alphabet = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/* - * call this when finished encoding everything, to - * flush off the last little bit - */ int soup_base64_encode_close (const guchar *in, int inlen, @@ -68,53 +58,19 @@ soup_base64_encode_close (const guchar int *state, int *save) { - int c1, c2; - unsigned char *outptr = out; - - if (inlen > 0) - outptr += soup_base64_encode_step (in, - inlen, - break_lines, - outptr, - state, - save); - - c1 = ((unsigned char *) save) [1]; - c2 = ((unsigned char *) save) [2]; - - d(printf("mode = %d\nc1 = %c\nc2 = %c\n", - (int)((char *) save) [0], - (int)((char *) save) [1], - (int)((char *) save) [2])); - - switch (((char *) save) [0]) { - case 2: - outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ]; - g_assert (outptr [2] != 0); - goto skip; - case 1: - outptr[2] = '='; - skip: - outptr [0] = base64_alphabet [ c1 >> 2 ]; - outptr [1] = base64_alphabet [ c2 >> 4 | ( (c1&0x3) << 4 )]; - outptr [3] = '='; - outptr += 4; - break; + if (inlen > 0) { + out += soup_base64_encode_step (in, + inlen, + break_lines, + out, + state, + save); } - if (break_lines) - *outptr++ = '\n'; - - *save = 0; - *state = 0; - return outptr-out; + return (int)g_base64_encode_close (break_lines, (char *) out, + state, save); } -/* - * performs an 'encode step', only encodes blocks of 3 characters to the - * output at a time, saves left-over state in state and save (initialise to - * 0 on first invocation). - */ int soup_base64_encode_step (const guchar *in, int len, @@ -123,142 +79,16 @@ soup_base64_encode_step (const guchar * int *state, int *save) { - register guchar *outptr; - register const guchar *inptr; - - if (len <= 0) - return 0; - - inptr = in; - outptr = out; - - d (printf ("we have %d chars, and %d saved chars\n", - len, - ((char *) save) [0])); - - if (len + ((char *) save) [0] > 2) { - const guchar *inend = in+len-2; - register int c1, c2, c3; - register int already; - - already = *state; - - switch (((char *) save) [0]) { - case 1: c1 = ((unsigned char *) save) [1]; goto skip1; - case 2: c1 = ((unsigned char *) save) [1]; - c2 = ((unsigned char *) save) [2]; goto skip2; - } - - /* - * yes, we jump into the loop, no i'm not going to change it, - * it's beautiful! - */ - while (inptr < inend) { - c1 = *inptr++; - skip1: - c2 = *inptr++; - skip2: - c3 = *inptr++; - *outptr++ = base64_alphabet [ c1 >> 2 ]; - *outptr++ = base64_alphabet [ c2 >> 4 | - ((c1&0x3) << 4) ]; - *outptr++ = base64_alphabet [ ((c2 &0x0f) << 2) | - (c3 >> 6) ]; - *outptr++ = base64_alphabet [ c3 & 0x3f ]; - /* this is a bit ugly ... */ - if (break_lines && (++already)>=19) { - *outptr++='\n'; - already = 0; - } - } - - ((char *)save)[0] = 0; - len = 2-(inptr-inend); - *state = already; - } - - d(printf("state = %d, len = %d\n", - (int)((char *)save)[0], - len)); - - if (len>0) { - register char *saveout; - - /* points to the slot for the next char to save */ - saveout = & (((char *)save)[1]) + ((char *)save)[0]; - - /* len can only be 0 1 or 2 */ - switch(len) { - case 2: *saveout++ = *inptr++; - case 1: *saveout++ = *inptr++; - } - ((char *)save)[0]+=len; - } - - d(printf("mode = %d\nc1 = %c\nc2 = %c\n", - (int)((char *)save)[0], - (int)((char *)save)[1], - (int)((char *)save)[2])); - - return outptr-out; + return (int)g_base64_encode_step (in, len, break_lines, + (char *)out, state, save); } -/** - * soup_base64_encode: - * @text: the binary data to encode. - * @len: the length of @text. - * - * Encode a sequence of binary data into it's Base-64 stringified - * representation. - * - * Return value: The Base-64 encoded string representing @text. - */ char * soup_base64_encode (const char *text, int len) { - unsigned char *out; - int state = 0, outlen, save = 0; - - out = g_malloc (len * 4 / 3 + 5); - outlen = soup_base64_encode_close ((const guchar *)text, - len, - FALSE, - out, - &state, - &save); - out[outlen] = '\0'; - return (char *) out; -} - -static unsigned char camel_mime_base64_rank[256] = { - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, - 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, - 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -}; + return g_base64_encode ((const guchar *)text, len); +} -/** - * base64_decode_step: decode a chunk of base64 encoded data - * @in: input stream - * @len: max length of data to decode - * @out: output stream - * @state: holds the number of bits that are stored in @save - * @save: leftover bits that have not yet been decoded - * - * Decodes a chunk of base64 encoded data - **/ int soup_base64_decode_step (const guchar *in, int len, @@ -266,68 +96,20 @@ soup_base64_decode_step (const guchar * int *state, guint *save) { - register const guchar *inptr; - register guchar *outptr; - const guchar *inend; - guchar c; - register unsigned int v; - int i; - - inend = in+len; - outptr = out; - - /* convert 4 base64 bytes to 3 normal bytes */ - v=*save; - i=*state; - inptr = in; - while (inptr < inend) { - c = camel_mime_base64_rank [*inptr++]; - if (c != 0xff) { - v = (v<<6) | c; - i++; - if (i==4) { - *outptr++ = v>>16; - *outptr++ = v>>8; - *outptr++ = v; - i=0; - } - } - } - - *save = v; - *state = i; - - /* quick scan back for '=' on the end somewhere */ - /* fortunately we can drop 1 output char for each trailing = (upto 2) */ - i=2; - while (inptr > in && i) { - inptr--; - if (camel_mime_base64_rank [*inptr] != 0xff) { - if (*inptr == '=') - outptr--; - i--; - } - } - - /* if i!= 0 then there is a truncation error! */ - return outptr - out; + return (int) g_base64_decode_step ((const char *)in, len, + out, state, save); } char * soup_base64_decode (const char *text, int *out_len) { - guchar *ret; - int inlen, state = 0; - unsigned int save = 0; - - inlen = strlen (text); - ret = g_malloc0 (inlen); - - *out_len = soup_base64_decode_step ((const guchar *)text, inlen, - ret, &state, &save); + char *ret; + gsize out_len_tmp; - return (char *)ret; + ret = (char *) g_base64_decode (text, &out_len_tmp); + *out_len = out_len_tmp; + return ret; } typedef struct { diff -ruNp libsoup-2.2.100/libsoup/soup-misc.h libsoup-2.2.100/libsoup/soup-misc.h --- libsoup-2.2.100/libsoup/soup-misc.h 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-misc.h 2007-04-09 17:03:24.000000000 -0400 @@ -9,7 +9,8 @@ #include <glib-object.h> #include <libxml/tree.h> -/* Base64 encoding/decoding */ +#ifndef LIBSOUP_DISABLE_DEPRECATED +/* Base64 encoding/decoding. DEPRECATED: use <glib/base64.h> */ char *soup_base64_encode (const char *text, int len); @@ -36,6 +37,7 @@ int soup_base64_decode_st guchar *out, int *state, guint *save); +#endif /* LIBSOUP_DISABLE_DEPRECATED */ /* Non-default-GMainContext operations */ GSource *soup_add_io_watch (GMainContext *async_context, diff -ruNp libsoup-2.2.100/libsoup/soup-server-auth.c libsoup-2.2.100/libsoup/soup-server-auth.c --- libsoup-2.2.100/libsoup/soup-server-auth.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-server-auth.c 2007-04-09 17:03:24.000000000 -0400 @@ -352,23 +352,24 @@ soup_server_auth_new (SoupServerAuthCont switch (type) { case SOUP_AUTH_TYPE_BASIC: { - gchar *userpass, *colon; - gint len; + guchar *userpass, *colon; + gsize len; - userpass = soup_base64_decode (header, &len); + userpass = g_base64_decode (header, &len); if (!userpass) break; - colon = strchr (userpass, ':'); + colon = memchr (userpass, ':', len); if (!colon) { g_free (userpass); break; } ret->basic.type = SOUP_AUTH_TYPE_BASIC; - ret->basic.user = g_strndup (userpass, + ret->basic.user = g_strndup ((char *)userpass, colon - userpass); - ret->basic.passwd = g_strdup (colon + 1); + ret->basic.passwd = g_strndup ((char *)colon + 1, + len - (colon + 1 - userpass)); g_free (userpass); diff -ruNp libsoup-2.2.100/libsoup/soup-server.c libsoup-2.2.100/libsoup/soup-server.c --- libsoup-2.2.100/libsoup/soup-server.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-server.c 2007-05-01 14:29:21.000000000 -0400 @@ -33,7 +33,7 @@ typedef struct { guint port; char *ssl_cert_file, *ssl_key_file; - gpointer ssl_creds; + SoupSSLCredentials *ssl_creds; GMainLoop *loop; diff -ruNp libsoup-2.2.100/libsoup/soup-session-async.c libsoup-2.2.100/libsoup/soup-session-async.c --- libsoup-2.2.100/libsoup/soup-session-async.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-session-async.c 2007-04-09 17:03:24.000000000 -0400 @@ -184,6 +184,19 @@ final_finished (SoupMessage *req, gpoint run_queue (sa, FALSE); } +static gboolean +idle_run_queue (gpointer user_data) +{ + SoupSessionAsync *sa = user_data; + + g_object_add_weak_pointer (G_OBJECT (sa), (gpointer)&sa); + g_object_unref (sa); + + if (sa) + run_queue (sa, TRUE); + return FALSE; +} + static void queue_message (SoupSession *session, SoupMessage *req, SoupMessageCallbackFn callback, gpointer user_data) @@ -202,7 +215,8 @@ queue_message (SoupSession *session, Sou SOUP_SESSION_CLASS (soup_session_async_parent_class)->queue_message (session, req, callback, user_data); - run_queue (sa, TRUE); + g_object_ref (sa); + g_idle_add (idle_run_queue, sa); } static guint diff -ruNp libsoup-2.2.100/libsoup/soup-session.c libsoup-2.2.100/libsoup/soup-session.c --- libsoup-2.2.100/libsoup/soup-session.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-session.c 2007-05-01 16:00:48.000000000 -0400 @@ -19,6 +19,7 @@ #include "soup-connection-ntlm.h" #include "soup-marshal.h" #include "soup-message-filter.h" +#include "soup-message-private.h" #include "soup-message-queue.h" #include "soup-ssl.h" #include "soup-uri.h" @@ -39,7 +40,7 @@ typedef struct { gboolean use_ntlm; char *ssl_ca_file; - gpointer ssl_creds; + SoupSSLCredentials *ssl_creds; GSList *filters; @@ -744,8 +745,7 @@ authenticate_auth (SoupSession *session, static gboolean update_auth_internal (SoupSession *session, SoupMessage *msg, - const GSList *headers, gboolean proxy, - gboolean got_unauthorized) + const GSList *headers, gboolean proxy) { SoupSessionHost *host; SoupAuth *new_auth, *prior_auth, *old_auth; @@ -772,20 +772,11 @@ update_auth_internal (SoupSession *sessi return FALSE; /* See if this auth is the same auth we used last time */ - prior_auth = lookup_auth (session, msg, proxy); + prior_auth = proxy ? soup_message_get_proxy_auth (msg) : soup_message_get_auth (msg); if (prior_auth && G_OBJECT_TYPE (prior_auth) == G_OBJECT_TYPE (new_auth) && !strcmp (soup_auth_get_realm (prior_auth), soup_auth_get_realm (new_auth))) { - if (!got_unauthorized) { - /* The user is just trying to preauthenticate - * using information we already have, so - * there's nothing more that needs to be done. - */ - g_object_unref (new_auth); - return TRUE; - } - /* The server didn't like the username/password we * provided before. Invalidate it and note this fact. */ @@ -891,7 +882,7 @@ authorize_handler (SoupMessage *msg, gpo if (!headers) return; - if (update_auth_internal (session, msg, headers, proxy, TRUE)) + if (update_auth_internal (session, msg, headers, proxy)) soup_session_requeue_message (session, msg); } @@ -926,23 +917,18 @@ redirect_handler (SoupMessage *msg, gpoi static void add_auth (SoupSession *session, SoupMessage *msg, gboolean proxy) { - const char *header = proxy ? "Proxy-Authorization" : "Authorization"; SoupAuth *auth; - char *token; auth = lookup_auth (session, msg, proxy); - if (!auth) - return; - if (!soup_auth_is_authenticated (auth) && - !authenticate_auth (session, auth, msg, FALSE, proxy)) - return; - - token = soup_auth_get_authorization (auth, msg); - if (token) { - soup_message_remove_header (msg->request_headers, header); - soup_message_add_header (msg->request_headers, header, token); - g_free (token); + if (auth && !soup_auth_is_authenticated (auth)) { + if (!authenticate_auth (session, auth, msg, FALSE, proxy)) + auth = NULL; } + + if (proxy) + soup_message_set_proxy_auth (msg, auth); + else + soup_message_set_auth (msg, auth); } static void @@ -1273,8 +1259,9 @@ queue_message (SoupSession *session, Sou * any resources related to the time it was last sent are freed. * * Upon message completion, the callback specified in @callback will - * be invoked. If after returning from this callback the message has - * not been requeued, @msg will be unreffed. + * be invoked (in the thread associated with @session's async + * context). If after returning from this callback the message has not + * been requeued, @msg will be unreffed. */ void soup_session_queue_message (SoupSession *session, SoupMessage *msg, diff -ruNp libsoup-2.2.100/libsoup/soup-session-sync.c libsoup-2.2.100/libsoup/soup-session-sync.c --- libsoup-2.2.100/libsoup/soup-session-sync.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-session-sync.c 2007-04-09 17:07:39.000000000 -0400 @@ -11,6 +11,7 @@ #include "soup-session-sync.h" #include "soup-connection.h" +#include "soup-misc.h" typedef struct { GMutex *lock; @@ -98,13 +99,63 @@ soup_session_sync_new_with_options (cons return session; } +typedef struct { + SoupSession *session; + SoupMessage *msg; + SoupMessageCallbackFn callback; + gpointer user_data; +} SoupSessionSyncAsyncData; + +static void +async_data_free (SoupSessionSyncAsyncData *sad) +{ + g_object_unref (sad->session); + g_object_unref (sad->msg); + g_free (sad); +} + +static gboolean +queue_message_callback (gpointer data) +{ + SoupSessionSyncAsyncData *sad = data; + + sad->callback (sad->msg, sad->user_data); + async_data_free (sad); + return FALSE; +} + +static gpointer +queue_message_thread (gpointer data) +{ + SoupSessionSyncAsyncData *sad = data; + + soup_session_send_message (sad->session, sad->msg); + if (sad->callback) { + GMainContext *async_context; + + g_object_get (sad->session, + SOUP_SESSION_ASYNC_CONTEXT, &async_context, + NULL); + soup_add_idle (async_context, queue_message_callback, sad); + } else + async_data_free (sad); + + return NULL; +} static void queue_message (SoupSession *session, SoupMessage *msg, SoupMessageCallbackFn callback, gpointer user_data) { - /* FIXME */ - g_warning ("soup_session_queue_message called on synchronous session"); + SoupSessionSyncAsyncData *sad; + + sad = g_new (SoupSessionSyncAsyncData, 1); + sad->session = g_object_ref (session); + sad->msg = g_object_ref (msg); + sad->callback = callback; + sad->user_data = user_data; + + g_thread_create (queue_message_thread, sad, FALSE, NULL); } static SoupConnection * @@ -130,7 +181,9 @@ wait_for_connection (SoupSession *sessio * not return the no-longer-valid connection. */ - if (!SOUP_STATUS_IS_SUCCESSFUL (status)) + if (status == SOUP_STATUS_TRY_AGAIN) + goto try_again; + else if (!SOUP_STATUS_IS_SUCCESSFUL (status)) conn = NULL; else if (msg->status == SOUP_MESSAGE_STATUS_FINISHED) { /* Message was cancelled while we were diff -ruNp libsoup-2.2.100/libsoup/soup-soap-message.c libsoup-2.2.100/libsoup/soup-soap-message.c --- libsoup-2.2.100/libsoup/soup-soap-message.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-soap-message.c 2007-04-09 17:03:24.000000000 -0400 @@ -513,7 +513,7 @@ soup_soap_message_write_double (SoupSoap void soup_soap_message_write_base64 (SoupSoapMessage *msg, const char *string, int len) { - gchar *str = soup_base64_encode (string, len); + gchar *str = g_base64_encode ((const guchar *)string, len); soup_soap_message_write_string (msg, str); g_free (str); } diff -ruNp libsoup-2.2.100/libsoup/soup-ssl.h libsoup-2.2.100/libsoup/soup-ssl.h --- libsoup-2.2.100/libsoup/soup-ssl.h 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-ssl.h 2007-05-01 16:00:48.000000000 -0400 @@ -20,16 +20,19 @@ typedef enum { SOUP_SSL_TYPE_SERVER } SoupSSLType; -gpointer soup_ssl_get_client_credentials (const char *ca_file); -void soup_ssl_free_client_credentials (gpointer creds); -gpointer soup_ssl_get_server_credentials (const char *cert_file, - const char *key_file); -void soup_ssl_free_server_credentials (gpointer creds); - -GIOChannel *soup_ssl_wrap_iochannel (GIOChannel *sock, - SoupSSLType type, - const char *remote_host, - gpointer credentials); +typedef struct SoupSSLCredentials SoupSSLCredentials; + +SoupSSLCredentials *soup_ssl_get_client_credentials (const char *ca_file); +void soup_ssl_free_client_credentials (SoupSSLCredentials *creds); + +SoupSSLCredentials *soup_ssl_get_server_credentials (const char *cert_file, + const char *key_file); +void soup_ssl_free_server_credentials (SoupSSLCredentials *creds); + +GIOChannel *soup_ssl_wrap_iochannel (GIOChannel *sock, + SoupSSLType type, + const char *remote_host, + SoupSSLCredentials *creds); #define SOUP_SSL_ERROR soup_ssl_error_quark() diff -ruNp libsoup-2.2.100/libsoup/soup-types.h libsoup-2.2.100/libsoup/soup-types.h --- libsoup-2.2.100/libsoup/soup-types.h 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-types.h 2007-04-12 16:40:44.000000000 -0400 @@ -49,13 +49,4 @@ GType type_name##_get_type(void)\ return type; \ } -/* Compat for glib 2.6.x */ -#ifndef G_GNUC_NULL_TERMINATED -# if __GNUC__ >= 4 -# define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) -# else -# define G_GNUC_NULL_TERMINATED -# endif -#endif - #endif diff -ruNp libsoup-2.2.100/libsoup/soup-xmlrpc-message.c libsoup-2.2.100/libsoup/soup-xmlrpc-message.c --- libsoup-2.2.100/libsoup/soup-xmlrpc-message.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-xmlrpc-message.c 2007-04-09 17:03:24.000000000 -0400 @@ -226,7 +226,7 @@ soup_xmlrpc_message_write_base64 (SoupXm g_return_if_fail (SOUP_IS_XMLRPC_MESSAGE (msg)); priv = SOUP_XMLRPC_MESSAGE_GET_PRIVATE (msg); - str = soup_base64_encode (buf, len); + str = g_base64_encode (buf, len); priv->last_node = xmlNewChild (priv->last_node, NULL, (const xmlChar *)"value", NULL); xmlNewTextChild (priv->last_node, NULL, (const xmlChar *)"base64", (xmlChar *)str); diff -ruNp libsoup-2.2.100/libsoup/soup-xmlrpc-response.c libsoup-2.2.100/libsoup/soup-xmlrpc-response.c --- libsoup-2.2.100/libsoup/soup-xmlrpc-response.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/libsoup/soup-xmlrpc-response.c 2007-04-09 17:03:24.000000000 -0400 @@ -361,8 +361,8 @@ soup_xmlrpc_value_get_base64 (SoupXmlrpc { xmlNode *xml; xmlChar *content; - char *decoded; - int len; + guchar *decoded; + gsize len; xml = (xmlNode *) value; if (strcmp ((const char *)xml->name, "value")) @@ -372,11 +372,11 @@ soup_xmlrpc_value_get_base64 (SoupXmlrpc return FALSE; content = xmlNodeGetContent (xml); - decoded = soup_base64_decode ((const char *)content, &len); + decoded = g_base64_decode ((const char *)content, &len); xmlFree (content); *data = g_byte_array_new (); - g_byte_array_append (*data, (guchar *)decoded, len); + g_byte_array_append (*data, decoded, len); g_free (decoded); return TRUE; diff -ruNp libsoup-2.2.100/Makefile.in libsoup-2.2.100/Makefile.in --- libsoup-2.2.100/Makefile.in 2007-02-12 10:34:12.000000000 -0500 +++ libsoup-2.2.100/Makefile.in 2007-05-01 15:49:11.000000000 -0400 @@ -80,6 +80,8 @@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ APACHE_HTTPD = @APACHE_HTTPD@ APACHE_MODULE_DIR = @APACHE_MODULE_DIR@ +APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@ +APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ @@ -119,6 +121,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@ HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@ HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@ +HAVE_SSL_FALSE = @HAVE_SSL_FALSE@ +HAVE_SSL_TRUE = @HAVE_SSL_TRUE@ HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@ HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@ HTML_DIR = @HTML_DIR@ @@ -128,6 +132,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ diff -ruNp libsoup-2.2.100/tests/auth-test.c libsoup-2.2.100/tests/auth-test.c --- libsoup-2.2.100/tests/auth-test.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/tests/auth-test.c 2007-04-09 17:03:24.000000000 -0400 @@ -14,6 +14,7 @@ #include "apache-wrapper.h" #endif +GMainLoop *loop; int errors = 0; typedef struct { @@ -243,12 +244,69 @@ reauthenticate (SoupSession *session, So } } +static void +bug271540_sent (SoupMessage *msg, gpointer data) +{ + int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#")); + gboolean *authenticated = data; + int auth = identify_auth (msg); + + if (!*authenticated && auth) { + printf (" using auth on message %d before authenticating!!??\n", n); + errors++; + } else if (*authenticated && !auth) { + printf (" sent unauthenticated message %d after authenticating!\n", n); + errors++; + } +} + +static void +bug271540_authenticate (SoupSession *session, SoupMessage *msg, + const char *auth_type, const char *auth_realm, + char **username, char **password, gpointer data) +{ + int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#")); + gboolean *authenticated = data; + + if (strcmp (auth_type, "Basic") != 0 || + strcmp (auth_realm, "realm1") != 0) + return; + + if (!*authenticated) { + printf (" authenticating message %d\n", n); + *username = g_strdup ("user1"); + *password = g_strdup ("realm1"); + *authenticated = TRUE; + } else { + printf (" asked to authenticate message %d after authenticating!\n", n); + errors++; + } +} + +static void +bug271540_finished (SoupMessage *msg, gpointer data) +{ + int *left = data; + int n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (msg), "#")); + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { + printf (" got status '%d %s' on message %d!\n", + msg->status_code, msg->reason_phrase, n); + errors++; + } + + (*left)--; + if (!*left) + g_main_loop_quit (loop); +} + int main (int argc, char **argv) { SoupSession *session; SoupMessage *msg; char *base_uri, *uri, *expected; + gboolean authenticated; #ifdef HAVE_APACHE gboolean using_apache = FALSE; #endif @@ -325,6 +383,30 @@ main (int argc, char **argv) g_object_unref (msg); } + g_object_unref (session); + + /* And now for a regression test */ + + printf ("Regression test for bug 271540:\n"); + session = soup_session_async_new (); + + authenticated = FALSE; + g_signal_connect (session, "authenticate", + G_CALLBACK (bug271540_authenticate), &authenticated); + + uri = g_strconcat (base_uri, "Basic/realm1/", NULL); + for (i = 0; i < 10; i++) { + msg = soup_message_new (SOUP_METHOD_GET, uri); + g_object_set_data (G_OBJECT (msg), "#", GINT_TO_POINTER (i + 1)); + g_signal_connect (msg, "wrote_headers", + G_CALLBACK (bug271540_sent), &authenticated); + + soup_session_queue_message (session, msg, + bug271540_finished, &i); + } + + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); g_object_unref (session); diff -ruNp libsoup-2.2.100/tests/get.c libsoup-2.2.100/tests/get.c --- libsoup-2.2.100/tests/get.c 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/tests/get.c 2007-04-09 17:03:24.000000000 -0400 @@ -26,6 +26,7 @@ const char *method = SOUP_METHOD_GET; char *base; SoupUri *base_uri; int pending; +GHashTable *fetched_urls; static GPtrArray * find_hrefs (const SoupUri *base, const char *body, int length) @@ -98,8 +99,6 @@ mkdirs (const char *path) } } -static void get_url (const char *url); - static void print_header (gpointer name, gpointer value, gpointer data) { @@ -107,18 +106,57 @@ print_header (gpointer name, gpointer va } static void -got_url (SoupMessage *msg, gpointer uri) +get_url (const char *url) { - char *name; + char *url_to_get, *slash, *name; + SoupMessage *msg; int fd, i; + SoupUri *uri; GPtrArray *hrefs; const char *header; + if (strncmp (url, base, strlen (base)) != 0) + return; + if (strchr (url, '?') && strcmp (url, base) != 0) + return; + + slash = strrchr (url, '/'); + if (slash && !slash[1]) + url_to_get = g_strdup_printf ("%sindex.html", url); + else + url_to_get = g_strdup (url); + + if (g_hash_table_lookup (fetched_urls, url_to_get)) + return; + g_hash_table_insert (fetched_urls, url_to_get, url_to_get); + + if (recurse) { + /* See if we're already downloading it, and create the + * file if not. + */ + + name = url_to_get + strlen (base); + if (*name == '/') + name++; + if (access (name, F_OK) == 0) + return; + + mkdirs (name); + fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644); + close (fd); + } + + msg = soup_message_new (method, url_to_get); + soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT); + + soup_session_send_message (session, msg); + name = soup_message_get_uri (msg)->path; if (strncmp (base_uri->path, name, strlen (base_uri->path)) != 0) { fprintf (stderr, " Error: not under %s\n", base_uri->path); - goto DONE; + return; } + if (debug) { char *path = soup_uri_to_string (soup_message_get_uri (msg), TRUE); printf ("%s %s HTTP/1.%d\n\n", method, path, @@ -136,18 +174,19 @@ got_url (SoupMessage *msg, gpointer uri) name++; if (SOUP_STATUS_IS_REDIRECTION (msg->status_code)) { - unlink (name); + if (recurse) + unlink (name); header = soup_message_get_header (msg->response_headers, "Location"); if (header) { if (!debug) printf (" -> %s\n", header); get_url (header); } - goto DONE; + return; } if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) - goto DONE; + return; if (recurse) fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644); @@ -155,66 +194,21 @@ got_url (SoupMessage *msg, gpointer uri) fd = STDOUT_FILENO; write (fd, msg->response.body, msg->response.length); if (!recurse) - goto DONE; + return; close (fd); header = soup_message_get_header (msg->response_headers, "Content-Type"); if (header && g_ascii_strncasecmp (header, "text/html", 9) != 0) - goto DONE; + return; + uri = soup_uri_new (url); hrefs = find_hrefs (uri, msg->response.body, msg->response.length); + soup_uri_free (uri); for (i = 0; i < hrefs->len; i++) { get_url (hrefs->pdata[i]); g_free (hrefs->pdata[i]); } g_ptr_array_free (hrefs, TRUE); - - DONE: - soup_uri_free (uri); - if (!--pending) - g_main_quit (loop); -} - -static void -get_url (const char *url) -{ - char *url_to_get, *slash, *name; - SoupMessage *msg; - int fd; - - if (strncmp (url, base, strlen (base)) != 0) - return; - - slash = strrchr (url, '/'); - if (slash && !slash[1]) - url_to_get = g_strdup_printf ("%sindex.html", url); - else - url_to_get = g_strdup (url); - - if (recurse) { - /* See if we're already downloading it, and create the - * file if not. - */ - - name = url_to_get + strlen (base); - if (*name == '/') - name++; - if (access (name, F_OK) == 0) { - g_free (url_to_get); - return; - } - - mkdirs (name); - fd = open (name, O_WRONLY | O_CREAT | O_TRUNC, 0644); - close (fd); - } - - msg = soup_message_new (method, url_to_get); - soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT); - - pending++; - soup_session_queue_message (session, msg, got_url, soup_uri_new (url)); - g_free (url_to_get); } static void @@ -229,12 +223,13 @@ main (int argc, char **argv) { const char *cafile = NULL; SoupUri *proxy = NULL; + gboolean synchronous = FALSE; int opt; g_type_init (); g_thread_init (NULL); - while ((opt = getopt (argc, argv, "c:dhp:r")) != -1) { + while ((opt = getopt (argc, argv, "c:dhp:rs")) != -1) { switch (opt) { case 'c': cafile = optarg; @@ -262,6 +257,10 @@ main (int argc, char **argv) recurse = TRUE; break; + case 's': + synchronous = TRUE; + break; + case '?': usage (); break; @@ -279,10 +278,19 @@ main (int argc, char **argv) exit (1); } - session = soup_session_async_new_with_options ( - SOUP_SESSION_SSL_CA_FILE, cafile, - SOUP_SESSION_PROXY_URI, proxy, - NULL); + fetched_urls = g_hash_table_new (g_str_hash, g_str_equal); + + if (synchronous) { + session = soup_session_sync_new_with_options ( + SOUP_SESSION_SSL_CA_FILE, cafile, + SOUP_SESSION_PROXY_URI, proxy, + NULL); + } else { + session = soup_session_async_new_with_options ( + SOUP_SESSION_SSL_CA_FILE, cafile, + SOUP_SESSION_PROXY_URI, proxy, + NULL); + } if (recurse) { char *outdir; @@ -297,11 +305,13 @@ main (int argc, char **argv) g_free (outdir); } + if (!synchronous) + loop = g_main_loop_new (NULL, TRUE); + get_url (base); - loop = g_main_loop_new (NULL, TRUE); - g_main_run (loop); - g_main_loop_unref (loop); + if (!synchronous) + g_main_loop_unref (loop); soup_uri_free (base_uri); diff -ruNp libsoup-2.2.100/tests/httpd.conf.in libsoup-2.2.100/tests/httpd.conf.in --- libsoup-2.2.100/tests/httpd.conf.in 2007-01-02 13:25:11.000000000 -0500 +++ libsoup-2.2.100/tests/httpd.conf.in 2007-04-09 17:03:24.000000000 -0400 @@ -6,21 +6,161 @@ Listen 127.0.0.1:47524 PidFile @builddir@/httpd.pid DocumentRoot @srcdir@ +# The tests shut down apache with "graceful-stop", because that makes +# it close its listening socket right away. But it seems to sometimes +# result in apache never fully exiting. This fixes that. +GracefulShutdownTimeout 1 + # Change this to "./error.log" if it's failing and you don't know why ErrorLog /dev/null -LoadModule alias_module @APACHE_MODULE_DIR@/mod_alias.so -LoadModule auth_basic_module @APACHE_MODULE_DIR@/mod_auth_basic.so -LoadModule auth_digest_module @APACHE_MODULE_DIR@/mod_auth_digest.so -LoadModule authn_file_module @APACHE_MODULE_DIR@/mod_authn_file.so -LoadModule authz_user_module @APACHE_MODULE_DIR@/mod_authz_user.so -LoadModule dir_module @APACHE_MODULE_DIR@/mod_dir.so -LoadModule mime_module @APACHE_MODULE_DIR@/mod_mime.so -@IF_HAVE_PHP@LoadModule php5_module @APACHE_MODULE_DIR@/mod_php5.so +LoadModule alias_module @APACHE_MODULE_DIR@/mod_alias.so +LoadModule auth_basic_module @APACHE_MODULE_DIR@/mod_auth_basic.so +LoadModule auth_digest_module @APACHE_MODULE_DIR@/mod_auth_digest.so +LoadModule authn_file_module @APACHE_MODULE_DIR@/mod_authn_file.so +LoadModule authz_host_module @APACHE_MODULE_DIR@/mod_authz_host.so +LoadModule authz_user_module @APACHE_MODULE_DIR@/mod_authz_user.so +LoadModule dir_module @APACHE_MODULE_DIR@/mod_dir.so +LoadModule mime_module @APACHE_MODULE_DIR@/mod_mime.so +@IF_HAVE_PHP@LoadModule php5_module @APACHE_PHP_MODULE_DIR@/mod_php5.so +LoadModule proxy_module @APACHE_MODULE_DIR@/mod_proxy.so +LoadModule proxy_http_module @APACHE_MODULE_DIR@/mod_proxy_http.so +LoadModule proxy_connect_module @APACHE_MODULE_DIR@/mod_proxy_connect.so +LoadModule ssl_module @APACHE_SSL_MODULE_DIR@/mod_ssl.so DirectoryIndex httpd.pid AddType application/x-httpd-php .php + +# Proxy #1: unauthenticated +Listen 127.0.0.1:47526 +<VirtualHost 127.0.0.1:47526> + ProxyRequests On + AllowCONNECT 47525 + + # Deny proxying by default + <Proxy *> + Order Deny,Allow + Deny from all + </Proxy> + + # Allow local http connections + <Proxy http://127.0.0.1:47524*> + Order Allow,Deny + Allow from all + </Proxy> + + # Allow CONNECT to local https port + <Proxy 127.0.0.1:47525> + Order Allow,Deny + Allow from all + </Proxy> + + # Deny non-proxy requests + <Directory /> + Order Deny,Allow + Deny from all + </Directory> +</VirtualHost> + +# Proxy #2: authenticated +Listen 127.0.0.1:47527 +<VirtualHost 127.0.0.1:47527> + ProxyRequests On + AllowCONNECT 47525 + + # Deny proxying by default + <Proxy *> + Order Deny,Allow + Deny from all + </Proxy> + + # Allow local http connections with authentication + <Proxy http://127.0.0.1:47524*> + Order Allow,Deny + Allow from all + + AuthType Basic + AuthName realm1 + AuthUserFile ./htpasswd + Require valid-user + </Proxy> + + # Allow CONNECT to local https port with authentication + <Proxy 127.0.0.1:47525> + Order Allow,Deny + Allow from all + + AuthType Basic + AuthName realm1 + AuthUserFile ./htpasswd + Require valid-user + </Proxy> + + # Fail non-proxy requests + <Directory /> + Order Deny,Allow + Deny from all + </Directory> +</VirtualHost> + +# Proxy #3: unauthenticatable-to +Listen 127.0.0.1:47528 +<VirtualHost 127.0.0.1:47528> + ProxyRequests On + AllowCONNECT 47525 + + # Deny proxying by default + <Proxy *> + Order Deny,Allow + Deny from all + </Proxy> + + # Allow local http connections with authentication + <Proxy http://127.0.0.1:47524*> + Order Allow,Deny + Allow from all + + AuthType Basic + AuthName realm1 + AuthUserFile ./htpasswd + Require user no-such-user + </Proxy> + + # Allow CONNECT to local https port with authentication + <Proxy 127.0.0.1:47525> + Order Allow,Deny + Allow from all + + AuthType Basic + AuthName realm1 + AuthUserFile ./htpasswd + Require user no-such-user + </Proxy> + + # Fail non-proxy requests + <Directory /> + Order Deny,Allow + Deny from all + </Directory> +</VirtualHost> + + +# SSL setup +<IfModule mod_ssl.c> + Listen 127.0.0.1:47525 + + <VirtualHost 127.0.0.1:47525> + SSLEngine on + + SSLCertificateFile test-cert.pem + SSLCertificateKeyFile test-key.pem + + </VirtualHost> +</IfModule> + + +# Basic auth tests Alias /Basic/realm1/realm2/realm1 @builddir@ Alias /Basic/realm1/realm2 @builddir@ Alias /Basic/realm1/subdir @builddir@ @@ -28,6 +168,7 @@ Alias /Basic/realm1/not @builddir@ Alias /Basic/realm1 @builddir@ Alias /Basic/realm2 @builddir@ Alias /Basic/realm3 @builddir@ +Alias /Basic @builddir@ <Location /Basic/realm1> AuthType Basic @@ -71,7 +212,7 @@ Alias /Basic/realm3 @builddir@ Require user user3 </Location> - +# Digest auth tests Alias /Digest/realm1/realm2/realm1 @builddir@ Alias /Digest/realm1/realm2 @builddir@ Alias /Digest/realm1/subdir @builddir@ @@ -79,6 +220,7 @@ Alias /Digest/realm1/not @builddir@ Alias /Digest/realm1 @builddir@ Alias /Digest/realm2 @builddir@ Alias /Digest/realm3 @builddir@ +Alias /Digest @builddir@ <Location /Digest/realm1> AuthType Digest @@ -127,4 +269,3 @@ Alias /Digest/realm3 @builddir@ AuthDigestDomain /Digest/realm3 Require valid-user </Location> - diff -ruNp libsoup-2.2.100/tests/Makefile.am libsoup-2.2.100/tests/Makefile.am --- libsoup-2.2.100/tests/Makefile.am 2007-01-05 14:41:31.000000000 -0500 +++ libsoup-2.2.100/tests/Makefile.am 2007-04-09 17:03:24.000000000 -0400 @@ -1,12 +1,12 @@ INCLUDES = \ -I$(top_srcdir) \ $(XML_CFLAGS) \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) \ + $(LIBGNUTLS_CFLAGS) LIBS = $(top_builddir)/libsoup/libsoup-$(SOUP_API_VERSION).la noinst_PROGRAMS = \ - auth-test \ date \ dict \ dns \ @@ -17,6 +17,8 @@ noinst_PROGRAMS = \ simple-httpd \ simple-proxy \ uri-parsing \ + $(APACHE_TESTS) \ + $(SSL_TESTS) \ $(XMLRPC_TESTS) auth_test_SOURCES = auth-test.c apache-wrapper.c apache-wrapper.h @@ -26,20 +28,25 @@ dns_SOURCES = dns.c get_SOURCES = get.c getbug_SOURCES = getbug.c header_parsing_SOURCES = header-parsing.c +proxy_test_SOURCES = proxy-test.c apache-wrapper.c apache-wrapper.h revserver_SOURCES = revserver.c simple_httpd_SOURCES = simple-httpd.c simple_proxy_SOURCES = simple-proxy.c +ssl_test_SOURCES = ssl-test.c uri_parsing_SOURCES = uri-parsing.c xmlrpc_test_SOURCES = xmlrpc-test.c apache-wrapper.c apache-wrapper.h if HAVE_APACHE -APACHE_TESTS = auth-test +APACHE_TESTS = auth-test proxy-test +endif +if HAVE_SSL +SSL_TESTS = ssl-test endif if HAVE_XMLRPC_EPI_PHP XMLRPC_TESTS = xmlrpc-test endif -TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(XMLRPC_TESTS) +TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(SSL_TESTS) $(XMLRPC_TESTS) EXTRA_DIST = \ libsoup.supp \ diff -ruNp libsoup-2.2.100/tests/Makefile.in libsoup-2.2.100/tests/Makefile.in --- libsoup-2.2.100/tests/Makefile.in 2007-02-12 10:34:12.000000000 -0500 +++ libsoup-2.2.100/tests/Makefile.in 2007-05-01 15:49:10.000000000 -0400 @@ -36,11 +36,11 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -noinst_PROGRAMS = auth-test$(EXEEXT) date$(EXEEXT) dict$(EXEEXT) \ - dns$(EXEEXT) get$(EXEEXT) getbug$(EXEEXT) \ - header-parsing$(EXEEXT) revserver$(EXEEXT) \ - simple-httpd$(EXEEXT) simple-proxy$(EXEEXT) \ - uri-parsing$(EXEEXT) $(am__EXEEXT_1) +noinst_PROGRAMS = date$(EXEEXT) dict$(EXEEXT) dns$(EXEEXT) \ + get$(EXEEXT) getbug$(EXEEXT) header-parsing$(EXEEXT) \ + revserver$(EXEEXT) simple-httpd$(EXEEXT) simple-proxy$(EXEEXT) \ + uri-parsing$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \ + $(am__EXEEXT_3) subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/httpd.conf.in @@ -52,7 +52,10 @@ am__configure_deps = $(am__aclocal_m4_de mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = httpd.conf -@HAVE_XMLRPC_EPI_PHP_TRUE@am__EXEEXT_1 = xmlrpc-test$(EXEEXT) +@HAVE_APACHE_TRUE@am__EXEEXT_1 = auth-test$(EXEEXT) \ +@HAVE_APACHE_TRUE@ proxy-test$(EXEEXT) +@HAVE_SSL_TRUE@am__EXEEXT_2 = ssl-test$(EXEEXT) +@HAVE_XMLRPC_EPI_PHP_TRUE@am__EXEEXT_3 = xmlrpc-test$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_auth_test_OBJECTS = auth-test.$(OBJEXT) apache-wrapper.$(OBJEXT) auth_test_OBJECTS = $(am_auth_test_OBJECTS) @@ -75,6 +78,9 @@ getbug_LDADD = $(LDADD) am_header_parsing_OBJECTS = header-parsing.$(OBJEXT) header_parsing_OBJECTS = $(am_header_parsing_OBJECTS) header_parsing_LDADD = $(LDADD) +am_proxy_test_OBJECTS = proxy-test.$(OBJEXT) apache-wrapper.$(OBJEXT) +proxy_test_OBJECTS = $(am_proxy_test_OBJECTS) +proxy_test_LDADD = $(LDADD) am_revserver_OBJECTS = revserver.$(OBJEXT) revserver_OBJECTS = $(am_revserver_OBJECTS) revserver_LDADD = $(LDADD) @@ -84,6 +90,9 @@ simple_httpd_LDADD = $(LDADD) am_simple_proxy_OBJECTS = simple-proxy.$(OBJEXT) simple_proxy_OBJECTS = $(am_simple_proxy_OBJECTS) simple_proxy_LDADD = $(LDADD) +am_ssl_test_OBJECTS = ssl-test.$(OBJEXT) +ssl_test_OBJECTS = $(am_ssl_test_OBJECTS) +ssl_test_LDADD = $(LDADD) am_uri_parsing_OBJECTS = uri-parsing.$(OBJEXT) uri_parsing_OBJECTS = $(am_uri_parsing_OBJECTS) uri_parsing_LDADD = $(LDADD) @@ -104,13 +113,15 @@ LINK = $(LIBTOOL) --tag=CC --mode=link $ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(auth_test_SOURCES) $(date_SOURCES) $(dict_SOURCES) \ $(dns_SOURCES) $(get_SOURCES) $(getbug_SOURCES) \ - $(header_parsing_SOURCES) $(revserver_SOURCES) \ - $(simple_httpd_SOURCES) $(simple_proxy_SOURCES) \ + $(header_parsing_SOURCES) $(proxy_test_SOURCES) \ + $(revserver_SOURCES) $(simple_httpd_SOURCES) \ + $(simple_proxy_SOURCES) $(ssl_test_SOURCES) \ $(uri_parsing_SOURCES) $(xmlrpc_test_SOURCES) DIST_SOURCES = $(auth_test_SOURCES) $(date_SOURCES) $(dict_SOURCES) \ $(dns_SOURCES) $(get_SOURCES) $(getbug_SOURCES) \ - $(header_parsing_SOURCES) $(revserver_SOURCES) \ - $(simple_httpd_SOURCES) $(simple_proxy_SOURCES) \ + $(header_parsing_SOURCES) $(proxy_test_SOURCES) \ + $(revserver_SOURCES) $(simple_httpd_SOURCES) \ + $(simple_proxy_SOURCES) $(ssl_test_SOURCES) \ $(uri_parsing_SOURCES) $(xmlrpc_test_SOURCES) ETAGS = etags CTAGS = ctags @@ -122,6 +133,8 @@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ APACHE_HTTPD = @APACHE_HTTPD@ APACHE_MODULE_DIR = @APACHE_MODULE_DIR@ +APACHE_PHP_MODULE_DIR = @APACHE_PHP_MODULE_DIR@ +APACHE_SSL_MODULE_DIR = @APACHE_SSL_MODULE_DIR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ @@ -161,6 +174,8 @@ GTK_DOC_USE_LIBTOOL_FALSE = @GTK_DOC_USE GTK_DOC_USE_LIBTOOL_TRUE = @GTK_DOC_USE_LIBTOOL_TRUE@ HAVE_APACHE_FALSE = @HAVE_APACHE_FALSE@ HAVE_APACHE_TRUE = @HAVE_APACHE_TRUE@ +HAVE_SSL_FALSE = @HAVE_SSL_FALSE@ +HAVE_SSL_TRUE = @HAVE_SSL_TRUE@ HAVE_XMLRPC_EPI_PHP_FALSE = @HAVE_XMLRPC_EPI_PHP_FALSE@ HAVE_XMLRPC_EPI_PHP_TRUE = @HAVE_XMLRPC_EPI_PHP_TRUE@ HTML_DIR = @HTML_DIR@ @@ -170,6 +185,9 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ +LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ +LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@ +LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ @@ -256,7 +274,8 @@ target_alias = @target_alias@ INCLUDES = \ -I$(top_srcdir) \ $(XML_CFLAGS) \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) \ + $(LIBGNUTLS_CFLAGS) auth_test_SOURCES = auth-test.c apache-wrapper.c apache-wrapper.h date_SOURCES = date.c @@ -265,14 +284,17 @@ dns_SOURCES = dns.c get_SOURCES = get.c getbug_SOURCES = getbug.c header_parsing_SOURCES = header-parsing.c +proxy_test_SOURCES = proxy-test.c apache-wrapper.c apache-wrapper.h revserver_SOURCES = revserver.c simple_httpd_SOURCES = simple-httpd.c simple_proxy_SOURCES = simple-proxy.c +ssl_test_SOURCES = ssl-test.c uri_parsing_SOURCES = uri-parsing.c xmlrpc_test_SOURCES = xmlrpc-test.c apache-wrapper.c apache-wrapper.h -@HAVE_APACHE_TRUE@APACHE_TESTS = auth-test +@HAVE_APACHE_TRUE@APACHE_TESTS = auth-test proxy-test +@HAVE_SSL_TRUE@SSL_TESTS = ssl-test @HAVE_XMLRPC_EPI_PHP_TRUE@XMLRPC_TESTS = xmlrpc-test -TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(XMLRPC_TESTS) +TESTS = date header-parsing uri-parsing $(APACHE_TESTS) $(SSL_TESTS) $(XMLRPC_TESTS) EXTRA_DIST = \ libsoup.supp \ test-cert.pem \ @@ -345,6 +367,9 @@ getbug$(EXEEXT): $(getbug_OBJECTS) $(get header-parsing$(EXEEXT): $(header_parsing_OBJECTS) $(header_parsing_DEPENDENCIES) @rm -f header-parsing$(EXEEXT) $(LINK) $(header_parsing_LDFLAGS) $(header_parsing_OBJECTS) $(header_parsing_LDADD) $(LIBS) +proxy-test$(EXEEXT): $(proxy_test_OBJECTS) $(proxy_test_DEPENDENCIES) + @rm -f proxy-test$(EXEEXT) + $(LINK) $(proxy_test_LDFLAGS) $(proxy_test_OBJECTS) $(proxy_test_LDADD) $(LIBS) revserver$(EXEEXT): $(revserver_OBJECTS) $(revserver_DEPENDENCIES) @rm -f revserver$(EXEEXT) $(LINK) $(revserver_LDFLAGS) $(revserver_OBJECTS) $(revserver_LDADD) $(LIBS) @@ -354,6 +379,9 @@ simple-httpd$(EXEEXT): $(simple_httpd_OB simple-proxy$(EXEEXT): $(simple_proxy_OBJECTS) $(simple_proxy_DEPENDENCIES) @rm -f simple-proxy$(EXEEXT) $(LINK) $(simple_proxy_LDFLAGS) $(simple_proxy_OBJECTS) $(simple_proxy_LDADD) $(LIBS) +ssl-test$(EXEEXT): $(ssl_test_OBJECTS) $(ssl_test_DEPENDENCIES) + @rm -f ssl-test$(EXEEXT) + $(LINK) $(ssl_test_LDFLAGS) $(ssl_test_OBJECTS) $(ssl_test_LDADD) $(LIBS) uri-parsing$(EXEEXT): $(uri_parsing_OBJECTS) $(uri_parsing_DEPENDENCIES) @rm -f uri-parsing$(EXEEXT) $(LINK) $(uri_parsing_LDFLAGS) $(uri_parsing_OBJECTS) $(uri_parsing_LDADD) $(LIBS) @@ -375,9 +403,11 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getbug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header-parsing.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proxy-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-httpd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-proxy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssl-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uri-parsing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlrpc-test.Po@am__quote@ diff -ruNp libsoup-2.2.100/tests/proxy-test.c libsoup-2.2.100/tests/proxy-test.c --- libsoup-2.2.100/tests/proxy-test.c 1969-12-31 19:00:00.000000000 -0500 +++ libsoup-2.2.100/tests/proxy-test.c 2007-04-09 17:03:24.000000000 -0400 @@ -0,0 +1,148 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "libsoup/soup.h" +#include "apache-wrapper.h" + +int errors = 0; + +typedef struct { + const char *explanation; + const char *url; + const guint final_status; +} SoupProxyTest; + +SoupProxyTest tests[] = { + { "GET -> 200", "", SOUP_STATUS_OK }, + { "GET -> 404", "/not-found", SOUP_STATUS_NOT_FOUND }, + { "GET -> 401 -> 200", "/Basic/realm1/", SOUP_STATUS_OK }, + { "GET -> 401 -> 401", "/Basic/realm2/", SOUP_STATUS_UNAUTHORIZED }, + { "GET -> 403", "http://no-proxy.example.com/", SOUP_STATUS_FORBIDDEN }, +}; +int ntests = sizeof (tests) / sizeof (tests[0]); + +#define HTTP_SERVER "http://127.0.0.1:47524" +#define HTTPS_SERVER "https://127.0.0.1:47525" + +enum { + SIMPLE_PROXY, + AUTH_PROXY, + UNAUTH_PROXY +}; +static const char *proxies[] = { + "http://127.0.0.1:47526", + "http://127.0.0.1:47527", + "http://127.0.0.1:47528" +}; +static const char *proxy_names[] = { + "simple proxy", + "authenticated proxy", + "unauthenticatable-to proxy" +}; + +static void +authenticate (SoupSession *session, SoupMessage *msg, + const char *auth_type, const char *auth_realm, + char **username, char **password, gpointer data) +{ + *username = g_strdup ("user1"); + *password = g_strdup ("realm1"); +} + +static void +test_url (const char *url, int proxy, guint expected, gboolean sync) +{ + SoupSession *session; + SoupUri *proxy_uri; + SoupMessage *msg; + + printf (" GET %s via %s\n", url, proxy_names[proxy]); + if (proxy == UNAUTH_PROXY && expected != SOUP_STATUS_FORBIDDEN) + expected = SOUP_STATUS_PROXY_UNAUTHORIZED; + + /* We create a new session for each request to ensure that + * connections/auth aren't cached between tests. + */ + proxy_uri = soup_uri_new (proxies[proxy]); + session = g_object_new (sync ? SOUP_TYPE_SESSION_SYNC : SOUP_TYPE_SESSION_ASYNC, + SOUP_SESSION_PROXY_URI, proxy_uri, + NULL); + soup_uri_free (proxy_uri); + g_signal_connect (session, "authenticate", + G_CALLBACK (authenticate), NULL); + + msg = soup_message_new (SOUP_METHOD_GET, url); + if (!msg) { + fprintf (stderr, "proxy-test: Could not parse URI\n"); + exit (1); + } + + soup_session_send_message (session, msg); + + printf (" %d %s\n", msg->status_code, msg->reason_phrase); + if (msg->status_code != expected) { + printf (" EXPECTED %d!\n", expected); + errors++; + } + + g_object_unref (msg); + soup_session_abort (session); + g_object_unref (session); +} + +static void +run_test (int i, gboolean sync) +{ + char *http_url, *https_url; + + printf ("Test %d: %s (%s)\n", i + 1, tests[i].explanation, + sync ? "sync" : "async"); + + if (!strncmp (tests[i].url, "http", 4)) { + http_url = g_strdup (tests[i].url); + https_url = g_strdup_printf ("https%s", tests[i].url + 4); + } else { + http_url = g_strconcat (HTTP_SERVER, tests[i].url, NULL); + https_url = g_strconcat (HTTPS_SERVER, tests[i].url, NULL); + } + test_url (http_url, SIMPLE_PROXY, tests[i].final_status, sync); + test_url (https_url, SIMPLE_PROXY, tests[i].final_status, sync); + test_url (http_url, AUTH_PROXY, tests[i].final_status, sync); + test_url (https_url, AUTH_PROXY, tests[i].final_status, sync); + test_url (http_url, UNAUTH_PROXY, tests[i].final_status, sync); + test_url (https_url, UNAUTH_PROXY, tests[i].final_status, sync); + + g_free (http_url); + g_free (https_url); + + printf ("\n"); +} + +int +main (int argc, char **argv) +{ + int i; + + g_type_init (); + g_thread_init (NULL); + + if (!apache_init ()) { + fprintf (stderr, "Could not start apache\n"); + return 1; + } + + for (i = 0; i < ntests; i++) { + run_test (i, FALSE); + run_test (i, TRUE); + } + + apache_cleanup (); + + printf ("proxy-test: %d errors\n", errors); + return errors; +} diff -ruNp libsoup-2.2.100/tests/ssl-test.c libsoup-2.2.100/tests/ssl-test.c --- libsoup-2.2.100/tests/ssl-test.c 1969-12-31 19:00:00.000000000 -0500 +++ libsoup-2.2.100/tests/ssl-test.c 2007-05-01 15:44:30.000000000 -0400 @@ -0,0 +1,323 @@ +#include <gnutls/gnutls.h> +#include <glib.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <netinet/in.h> +#include <sys/socket.h> + +#include "libsoup/soup-socket.h" +#include "libsoup/soup-ssl.h" + +#define BUFSIZE 1024 +#define DH_BITS 1024 + +GMainLoop *loop; +gnutls_dh_params_t dh_params; + +/* SERVER */ + +/* Read @bufsize bytes into @buf from @session. */ +static void +server_read (gnutls_session_t session, char *buf, int bufsize) +{ + int total, nread; + + total = 0; + while (total < bufsize) { + nread = gnutls_record_recv (session, buf + total, + bufsize - total); + if (nread <= 0) + g_error ("server read failed at position %d", total); + total += nread; + } +} + +/* Write @bufsize bytes from @buf to @session, forcing 3 rehandshakes + * along the way. (We do an odd number of rehandshakes to make sure + * they occur at weird times relative to the client's read buffer + * size.) + */ +static void +server_write (gnutls_session_t session, char *buf, int bufsize) +{ + int total, nwrote; + int next_rehandshake = bufsize / 3; + + total = 0; + while (total < bufsize) { + if (total >= next_rehandshake) { + if (gnutls_rehandshake (session) < 0) + g_error ("client refused rehandshake at position %d", total); + if (gnutls_handshake (session) < 0) + g_error ("server rehandshake failed at position %d", total); + next_rehandshake = MIN (bufsize, next_rehandshake + bufsize / 3); + } + + nwrote = gnutls_record_send (session, buf + total, + next_rehandshake - total); + if (nwrote <= 0) + g_error ("server write failed at position %d: %d", total, nwrote); + total += nwrote; + } +} + +const char *ssl_cert_file = "test-cert.pem"; +const char *ssl_key_file = "test-key.pem"; + +static gpointer +server_thread (gpointer user_data) +{ + int listener = GPOINTER_TO_INT (user_data), client; + gnutls_certificate_credentials creds; + gnutls_session_t session; + struct sockaddr_in sin; + int len; + char buf[BUFSIZE]; + int status; + + gnutls_certificate_allocate_credentials (&creds); + if (gnutls_certificate_set_x509_key_file (creds, + ssl_cert_file, ssl_key_file, + GNUTLS_X509_FMT_PEM) != 0) { + g_error ("Failed to set SSL certificate and key files " + "(%s, %s).", ssl_cert_file, ssl_key_file); + } + gnutls_certificate_set_dh_params (creds, dh_params); + + /* Create a new session */ + gnutls_init (&session, GNUTLS_SERVER); + gnutls_set_default_priority (session); + gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, creds); + gnutls_dh_set_prime_bits (session, DH_BITS); + + /* Wait for client thread to connect */ + len = sizeof (sin); + client = accept (listener, (struct sockaddr *) &sin, (void *)&len); + gnutls_transport_set_ptr (session, GINT_TO_POINTER (client)); + + /* Initial handshake */ + status = gnutls_handshake (session); + if (status < 0) + g_error ("initial handshake failed: %d", status); + + /* Synchronous client test. */ + server_read (session, buf, BUFSIZE); + server_write (session, buf, BUFSIZE); + + /* Async client test. */ + server_read (session, buf, BUFSIZE); + server_write (session, buf, BUFSIZE); + + /* That's all, folks. */ + gnutls_bye (session, GNUTLS_SHUT_WR); + gnutls_deinit (session); + close (client); + + return NULL; +} + +/* async client code */ + +typedef struct { + char writebuf[BUFSIZE], readbuf[BUFSIZE]; + int total; +} AsyncData; + +static void +async_read (SoupSocket *sock, gpointer user_data) +{ + AsyncData *data = user_data; + SoupSocketIOStatus status; + gsize n; + + do { + status = soup_socket_read (sock, data->readbuf + data->total, + BUFSIZE - data->total, &n); + if (status == SOUP_SOCKET_OK) + data->total += n; + } while (status == SOUP_SOCKET_OK && data->total < BUFSIZE); + + if (status == SOUP_SOCKET_ERROR || status == SOUP_SOCKET_EOF) + g_error ("Async read got status %d", status); + else if (status == SOUP_SOCKET_WOULD_BLOCK) + return; + + if (memcmp (data->writebuf, data->readbuf, BUFSIZE) != 0) + g_error ("Sync read didn't match write"); + + g_main_loop_quit (loop); +} + +static void +async_write (SoupSocket *sock, gpointer user_data) +{ + AsyncData *data = user_data; + SoupSocketIOStatus status; + gsize n; + + do { + status = soup_socket_write (sock, data->writebuf + data->total, + BUFSIZE - data->total, &n); + if (status == SOUP_SOCKET_OK) + data->total += n; + } while (status == SOUP_SOCKET_OK && data->total < BUFSIZE); + + if (status == SOUP_SOCKET_ERROR || status == SOUP_SOCKET_EOF) + g_error ("Async write got status %d", status); + else if (status == SOUP_SOCKET_WOULD_BLOCK) + return; + + data->total = 0; + async_read (sock, user_data); +} + +static gboolean +start_writing (gpointer user_data) +{ + SoupSocket *sock = user_data; + AsyncData *data; + int i; + + data = g_new (AsyncData, 1); + for (i = 0; i < BUFSIZE; i++) + data->writebuf[i] = i & 0xFF; + + g_signal_connect (sock, "writable", + G_CALLBACK (async_write), data); + g_signal_connect (sock, "readable", + G_CALLBACK (async_read), data); + + async_write (sock, data); + return FALSE; +} + +int debug; + +static void +debug_log (int level, const char *str) +{ + fputs (str, stderr); +} + +int +main (int argc, char **argv) +{ + int opt, listener, sin_len, port, i; + struct sockaddr_in sin; + GThread *server; + char writebuf[BUFSIZE], readbuf[BUFSIZE]; + SoupSocket *sock; + gsize n, total; + SoupSocketIOStatus status; + + g_type_init (); + g_thread_init (NULL); + + while ((opt = getopt (argc, argv, "c:d:k:")) != -1) { + switch (opt) { + case 'c': + ssl_cert_file = optarg; + break; + case 'd': + debug = atoi (optarg); + break; + case 'k': + ssl_key_file = optarg; + break; + + case '?': + fprintf (stderr, "Usage: %s [-d debuglevel] [-c ssl-cert-file] [-k ssl-key-file]\n", + argv[0]); + break; + } + } + + if (debug) { + gnutls_global_set_log_function (debug_log); + gnutls_global_set_log_level (debug); + } + + /* Create server socket */ + listener = socket (AF_INET, SOCK_STREAM, 0); + if (listener == -1) { + perror ("creating listening socket"); + exit (1); + } + + memset (&sin, 0, sizeof (sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = INADDR_ANY; + + if (bind (listener, (struct sockaddr *) &sin, sizeof (sin)) == -1) { + perror ("binding listening socket"); + exit (1); + } + + if (listen (listener, 1) == -1) { + perror ("listening on socket"); + exit (1); + } + + sin_len = sizeof (sin); + getsockname (listener, (struct sockaddr *)&sin, (void *)&sin_len); + port = ntohs (sin.sin_port); + + /* Now spawn server thread */ + server = g_thread_create (server_thread, GINT_TO_POINTER (listener), + FALSE, NULL); + + /* And create the client */ + sock = soup_socket_client_new_sync ("127.0.0.1", port, + soup_ssl_get_client_credentials (NULL), + &status); + if (status != SOUP_STATUS_OK) { + g_error ("Could not create client socket: %s", + soup_status_get_phrase (status)); + } + + soup_socket_start_ssl (sock); + + /* Synchronous client test */ + for (i = 0; i < BUFSIZE; i++) + writebuf[i] = i & 0xFF; + + total = 0; + while (total < BUFSIZE) { + status = soup_socket_write (sock, writebuf + total, + BUFSIZE - total, &n); + if (status != SOUP_SOCKET_OK) + g_error ("Sync write got status %d", status); + total += n; + } + + total = 0; + while (total < BUFSIZE) { + status = soup_socket_read (sock, readbuf + total, + BUFSIZE - total, &n); + if (status != SOUP_SOCKET_OK) + g_error ("Sync read got status %d", status); + total += n; + } + + if (memcmp (writebuf, readbuf, BUFSIZE) != 0) + g_error ("Sync read didn't match write"); + + printf ("SYNCHRONOUS SSL TEST PASSED\n"); + + /* Switch socket to async and do it again */ + + g_object_set (sock, + SOUP_SOCKET_FLAG_NONBLOCKING, TRUE, + NULL); + + g_idle_add (start_writing, sock); + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); + + printf ("ASYNCHRONOUS SSL TEST PASSED\n"); + + /* Success */ + return 0; +}
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor