diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-06-12 11:37:39 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-06-12 22:27:00 +0200 |
commit | 64e4ad8a8b71e829d86bad55bc3d9b0f3a0fe745 (patch) | |
tree | 2da5c4f08fc994801c3d039981ad81248d80df02 /guile/src | |
parent | a229bb36c9592b151f6feb277238c41ab39f40a9 (diff) | |
download | gnutls-64e4ad8a8b71e829d86bad55bc3d9b0f3a0fe745.tar.gz |
guile: Add support for post-handshake reauthentication.
* guile/modules/gnutls/build/enums.scm (%connection-flag-enum): New
variable.
(%gnutls-enums): Add it.
* guile/modules/gnutls.in: Export 'reauthenticate',
'connection-flag->string', and all the 'connection-flag/' bindings.
* guile/src/core.c (scm_gnutls_make_session): Add rest arguments FLAGS
and honor it.
(scm_gnutls_reauthenticate): New function.
* guile/tests/reauth.scm: New file.
* guile/Makefile.am (TESTS): Add it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'guile/src')
-rw-r--r-- | guile/src/core.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/guile/src/core.c b/guile/src/core.c index a3b3e9f740..dc6611a4d7 100644 --- a/guile/src/core.c +++ b/guile/src/core.c @@ -129,21 +129,27 @@ SCM_DEFINE (scm_gnutls_version, "gnutls-version", 0, 0, 0, #undef FUNC_NAME -SCM_DEFINE (scm_gnutls_make_session, "make-session", 1, 0, 0, - (SCM end), +SCM_DEFINE (scm_gnutls_make_session, "make-session", 1, 0, 1, + (SCM end, SCM flags), "Return a new session for connection end @var{end}, either " - "@code{connection-end/server} or @code{connection-end/client}.") + "@code{connection-end/server} or @code{connection-end/client}. " + "The optional @var{flags} arguments are @code{connection-flag} " + "values such as @code{connection-flag/auto-reauth}.") #define FUNC_NAME s_scm_gnutls_make_session { - int err; + int err, i; gnutls_session_t c_session; gnutls_connection_end_t c_end; + gnutls_init_flags_t c_flags = 0; SCM session_data; c_end = scm_to_gnutls_connection_end (end, 1, FUNC_NAME); session_data = SCM_GNUTLS_MAKE_SESSION_DATA (); - err = gnutls_init (&c_session, c_end); + for (i = 2; scm_is_pair (flags); flags = scm_cdr (flags), i++) + c_flags |= scm_to_gnutls_connection_flag (scm_car (flags), i, FUNC_NAME); + + err = gnutls_init (&c_session, c_end | c_flags); if (EXPECT_FALSE (err)) scm_gnutls_error (err, FUNC_NAME); @@ -209,7 +215,24 @@ SCM_DEFINE (scm_gnutls_rehandshake, "rehandshake", 1, 0, 0, return SCM_UNSPECIFIED; } +#undef FUNC_NAME + +SCM_DEFINE (scm_gnutls_reauthenticate, "reauthenticate", 1, 0, 0, + (SCM session), "Perform a re-authentication step for @var{session}.") +#define FUNC_NAME s_scm_gnutls_reauthenticate +{ + int err; + gnutls_session_t c_session; + c_session = scm_to_gnutls_session (session, 1, FUNC_NAME); + + /* FIXME: Allow flags as an argument. */ + err = gnutls_reauth (c_session, 0); + if (EXPECT_FALSE (err)) + scm_gnutls_error (err, FUNC_NAME); + + return SCM_UNSPECIFIED; +} #undef FUNC_NAME SCM_DEFINE (scm_gnutls_alert_get, "alert-get", 1, 0, 0, |