]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
guile: Wrap `gnutls_priority_set_direct'; deprecate the old method.
authorLudovic Courtès <ludo@gnu.org>
Sun, 27 Feb 2011 18:51:57 +0000 (19:51 +0100)
committerLudovic Courtès <ludo@gnu.org>
Sun, 27 Feb 2011 18:51:57 +0000 (19:51 +0100)
guile/modules/gnutls.scm
guile/modules/gnutls/build/enums.scm
guile/modules/gnutls/build/priorities.scm
guile/src/core.c
guile/src/errors.c
guile/src/errors.h
guile/tests/Makefile.am
guile/tests/priorities.scm [new file with mode: 0644]

index ed5efd893c268a124b8e4e6b9b8b383af062f98c..0f4aa62db092032ce4c35686e743114d109a14d0 100644 (file)
@@ -1,5 +1,5 @@
 ;;; GnuTLS --- Guile bindings for GnuTLS.
-;;; Copyright (C) 2007, 2010 Free Software Foundation, Inc.
+;;; Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
 ;;;
 ;;; GnuTLS is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU Lesser General Public
            set-psk-server-credentials-file!
            server-session-psk-username
 
-           ;; priority functions
+           ;; priorities
+           set-session-priorities!
+
+           ;; priority functions (deprecated)
            set-session-cipher-priority! set-session-mac-priority!
            set-session-compression-method-priority!
            set-session-kx-priority! set-session-protocol-priority!
index 91b61614e5f1a125e4add28ef1ecb4acb7e3f6a0..8f53d8e0dd1ac302431371af4879806a8736cf36 100644 (file)
@@ -485,6 +485,7 @@ insufficient-credentials
 insuficient-credentials
 insufficient-cred
 insuficient-cred
+invalid-request
 hash-failed
 base64-decoding-error
 mpi-print-failed
index 3cd733a65f1d97494b7b99f3f2321825c1cefcf3..479e601fd7b75d74cc2c15216fae0ccf9d4e49d6 100644 (file)
@@ -1,5 +1,5 @@
 ;;; GnuTLS --- Guile bindings for GnuTLS.
-;;; Copyright (C) 2007, 2010 Free Software Foundation, Inc.
+;;; Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
 ;;;
 ;;; GnuTLS is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU Lesser General Public
@@ -64,6 +64,9 @@
     (format port "  ~a *c_items;~%"
             (enum-type-c-type enum))
     (format port "  long int c_len, i;~%")
+    (format port "  scm_c_issue_deprecation_warning \
+(\"`set-session-~a-priority!'is deprecated, \
+use `set-session-priorities!' instead\");~%" (enum-type-subsystem enum))
     (format port "  c_session = scm_to_gnutls_session (session, 1, FUNC_NAME);~%")
     (format port "  SCM_VALIDATE_LIST_COPYLEN (2, items, c_len);~%")
     (format port "  c_items = (~a *) alloca (sizeof (* c_items) * c_len);~%"
index dfe0fc33ddd299336f0d07f7961e72b1ebfba080..e0b264bf88c14505bf19cea6fe65a70d09a9e922 100644 (file)
@@ -1,5 +1,5 @@
 /* GnuTLS --- Guile bindings for GnuTLS.
-   Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    GnuTLS is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -532,7 +532,49 @@ SCM_DEFINE (scm_gnutls_set_default_export_priority_x,
 
   return SCM_UNSPECIFIED;
 }
+#undef FUNC_NAME
+
+SCM_DEFINE (scm_gnutls_set_session_priorities_x,
+           "set-session-priorities!", 2, 0, 0,
+           (SCM session, SCM priorities),
+           "Have @var{session} use the given @var{priorities} for "
+           "the ciphers, key exchange methods, MACs and compression "
+           "methods.  @var{priorities} must be a string; see the "
+           "manual for the syntax.  When @var{priorities} cannot be "
+           "parsed, an @code{error/invalid-request} error is raised, "
+           "with an extra argument indication the position of the "
+           "error.\n")
+#define FUNC_NAME s_scm_gnutls_set_session_priorities_x
+{
+  int err;
+  char *c_priorities;
+  const char *err_pos;
+  gnutls_session_t c_session;
+
+  c_session = scm_to_gnutls_session (session, 1, FUNC_NAME);
+  c_priorities = scm_to_locale_string (priorities); /* XXX: to_latin1_string */
 
+  err = gnutls_priority_set_direct (c_session, c_priorities, &err_pos);
+  free (c_priorities);
+
+  switch (err)
+    {
+    case GNUTLS_E_SUCCESS:
+      break;
+    case GNUTLS_E_INVALID_REQUEST:
+      {
+       size_t pos;
+       pos = err_pos - c_priorities;
+       scm_gnutls_error_with_args (err, FUNC_NAME,
+                                   scm_list_1 (scm_from_size_t (pos)));
+       break;
+      }
+    default:
+      scm_gnutls_error (err, FUNC_NAME);
+    }
+
+  return SCM_UNSPECIFIED;
+}
 #undef FUNC_NAME
 
 SCM_DEFINE (scm_gnutls_cipher_suite_to_string, "cipher-suite->string",
index b2bbd8f8260dd35531fa5a840e9cd0377369496a..987dd421137e120203f35b7921ed66ddf8f3f999 100644 (file)
@@ -1,5 +1,5 @@
 /* GnuTLS --- Guile bindings for GnuTLS.
-   Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    GnuTLS is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -30,7 +30,7 @@
 SCM_SYMBOL (gnutls_error_key, "gnutls-error");
 
 void
-scm_gnutls_error (int c_err, const char *c_func)
+scm_gnutls_error_with_args (int c_err, const char *c_func, SCM args)
 {
   SCM err, func;
 
@@ -38,13 +38,20 @@ scm_gnutls_error (int c_err, const char *c_func)
   err = scm_from_gnutls_error (c_err);
   func = scm_from_locale_symbol (c_func);
 
-  (void) scm_throw (gnutls_error_key, scm_list_2 (err, func));
+  (void) scm_throw (gnutls_error_key, scm_cons2 (err, func, args));
 
   /* XXX: This is actually never reached, but since the Guile headers don't
      declare `scm_throw ()' as `noreturn', we must add this to avoid GCC's
      complaints.  */
   abort ();
 }
+
+void
+scm_gnutls_error (int c_err, const char *c_func)
+{
+  scm_gnutls_error_with_args (c_err, c_func, SCM_EOL);
+}
+
 \f
 
 void
index 337cdb6ed028cb4fd13c40fccb1f7bbd75a7f9b6..341807d04e2278bbb91683627ce3ffdca567506d 100644 (file)
@@ -1,5 +1,5 @@
 /* GnuTLS --- Guile bindings for GnuTLS.
-   Copyright (C) 2007, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
 
    GnuTLS is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
 
 #include "utils.h"
 
-SCM_API void
-scm_gnutls_error (int, const char *)
+SCM_API void scm_gnutls_error_with_args (int, const char *, SCM)
   NO_RETURN;
-     SCM_API void scm_init_gnutls_error (void);
 
-#endif
+SCM_API void scm_gnutls_error (int, const char *)
+  NO_RETURN;
 
-/* arch-tag: e7a92e44-b399-4c85-99d4-2dd3564600f7
- */
+SCM_API void scm_init_gnutls_error (void);
+
+#endif
index 0832b1e806da394bfc779546f2b85026f26a9d36..49aaf54660d72f8c37239f85dcfff460f742ab2b 100644 (file)
@@ -1,5 +1,5 @@
 #  GnuTLS --- Guile bindings for GnuTLS.
-#  Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+#  Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 #
 #  GnuTLS is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
 #  License along with GnuTLS; if not, write to the Free Software
 #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-TESTS = anonymous-auth.scm session-record-port.scm             \
-        pkcs-import-export.scm                                 \
-        errors.scm                                             \
-       x509-certificates.scm x509-auth.scm
+TESTS = anonymous-auth.scm session-record-port.scm     \
+        pkcs-import-export.scm                         \
+        errors.scm                                     \
+       x509-certificates.scm x509-auth.scm             \
+       priorities.scm
 
 if ENABLE_OPENPGP
 TESTS += openpgp-keys.scm openpgp-keyring.scm openpgp-auth.scm
diff --git a/guile/tests/priorities.scm b/guile/tests/priorities.scm
new file mode 100644 (file)
index 0000000..1ee072b
--- /dev/null
@@ -0,0 +1,76 @@
+;;; GnuTLS --- Guile bindings for GnuTLS
+;;; Copyright (C) 2011 Free Software Foundation, Inc.
+;;;
+;;; GnuTLS is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; GnuTLS is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GnuTLS-EXTRA; if not, write to the Free Software
+;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+;;; USA.
+
+;;; Written by Ludovic Courtès <ludo@gnu.org>.
+
+
+;;;
+;;; Exercise the priority API of GnuTLS.
+;;;
+
+(use-modules (gnutls)
+             (srfi srfi-26))
+
+(define %valid-priority-strings
+  ;; Valid priority strings (from the manual).
+  '("NONE:+VERS-TLS-ALL:+MAC-ALL:+RSA:+AES-128-CBC:+SIGN-ALL:+COMP-NULL"
+    "NORMAL:-ARCFOUR-128"
+    "SECURE:-VERS-SSL3.0:+COMP-DEFLATE"
+    "NONE:+VERS-TLS-ALL:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1"))
+
+(define %invalid-priority-strings
+  ;; Invalid strings: the prefix and the suffix that leads to a parse error.
+  '(("" . "THIS-DOES-NOT-WORK")
+    ("NORMAL:" . "FAIL-HERE")
+    ("SECURE:-VERS-SSL3.0:" . "+FAIL-HERE")
+    ("NONE:+VERS-TLS-ALL:+AES-128-CBC:"
+     . "+FAIL-HERE:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1")))
+
+(dynamic-wind
+
+    (lambda ()
+      #t)
+
+    (lambda ()
+      (let ((s (make-session connection-end/client)))
+        ;; We shouldn't have any exception with the valid priority strings.
+        (for-each (cut set-session-priorities! s <>)
+                  %valid-priority-strings)
+
+        (for-each (lambda (prefix+suffix)
+                    (let* ((prefix (car prefix+suffix))
+                           (suffix (cdr prefix+suffix))
+                           (pos    (string-length prefix))
+                           (string (string-append prefix suffix)))
+                      (catch 'gnutls-error
+                        (lambda ()
+                          (let ((s (make-session connection-end/client)))
+                            (set-session-priorities! s string)))
+                        (lambda (key err function error-location . unused)
+                          (or (and (eq? key 'gnutls-error)
+                                   (eq? err error/invalid-request)
+                                   (eq? function 'set-session-priorities!)
+                                   (= error-location pos))
+                              (exit 1))))))
+                  %invalid-priority-strings)
+
+        (exit 0)))
+
+    (lambda ()
+      ;; failure
+      (exit 1)))