[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] Prerequisites for client-side SASL support

From: David Anderson <david.anderson_at_calixo.net>
Date: 2006-07-15 04:36:25 CEST

* David Anderson <david.anderson@calixo.net> [2006-07-14 16:48:58]:
> I'll review your patch later today

Here goes.

> [[

<pedantic> Missing a [ here. </pedantic> :-)

> Refactor libsvn_ra_svn's authentication code. This is mainly to
> facilitate the subsequent introduction of Cyrus SASL support.
>
> * subversion/libsvn_ra_svn/client.c
> (ra_svn_session_baton_t): Moved to ra_svn.h and renamed to
> svn_ra_svn__session_baton_t. Changed all occurrences to reflect this.
> (find_mech, read_success): Moved to simple_auth.c.
> (do_auth): Moved to simple_auth.c and renamed to svn_ra_svn__do_auth.
> (auth_response): Renamed to svn_ra_svn__auth_response.
>
> * subversion/libsvn_ra_svn/simple_auth.c: New file. Contains
> functions taken from client.c.
>
> * subversion/libsvn_ra_svn/ra_svn.h
> (svn_ra_svn__session_baton_t): Copied from client.c.
> (svn_ra_svn__do_auth,
> svn_ra_svn__auth_response): New declarations.
> ]]]

> Index: subversion/libsvn_ra_svn/client.c
> ===================================================================
> --- subversion/libsvn_ra_svn/client.c (revision 20664)
> +++ subversion/libsvn_ra_svn/client.c (working copy)
> @@ -44,26 +44,15 @@
> #include "ra_svn.h"
>
> typedef struct {
> + svn_ra_svn__session_baton_t *sess_baton;
> apr_pool_t *pool;
> - svn_ra_svn_conn_t *conn;
> - int protocol_version;
> - svn_boolean_t is_tunneled;
> - svn_auth_baton_t *auth_baton;
> - const char *user;
> - const char *realm_prefix;
> - const char **tunnel_argv;
> -} ra_svn_session_baton_t;
> -
> -typedef struct {
> - ra_svn_session_baton_t *sess_baton;
> - apr_pool_t *pool;
> svn_revnum_t *new_rev;
> svn_commit_callback2_t callback;
> void *callback_baton;
> } ra_svn_commit_callback_baton_t;
>
> typedef struct {
> - ra_svn_session_baton_t *sess_baton;
> + svn_ra_svn__session_baton_t *sess_baton;
> svn_ra_svn_conn_t *conn;
> apr_pool_t *pool;
> const svn_delta_editor_t *editor;
> @@ -72,7 +61,6 @@
>
> /* Parse an svn URL's tunnel portion into tunnel, if there is a tunnel
> portion. */
> -
> static void parse_tunnel(const char *url, const char **tunnel,
> apr_pool_t *pool)
> {
> @@ -230,28 +218,11 @@
>
> /* --- AUTHENTICATION ROUTINES --- */
>
> -static svn_boolean_t find_mech(apr_array_header_t *mechlist, const char *mech)
> +svn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn,
> + apr_pool_t *pool,
> + const char *mech, const char *mech_arg,
> + svn_boolean_t compat)
> {
> - int i;
> - svn_ra_svn_item_t *elt;
> -
> - for (i = 0; i < mechlist->nelts; i++)
> - {
> - elt = &((svn_ra_svn_item_t *) mechlist->elts)[i];
> - if (elt->kind == SVN_RA_SVN_WORD && strcmp(elt->u.word, mech) == 0)
> - return TRUE;
> - }
> - return FALSE;
> -}
> -
> -/* Having picked a mechanism, start authentication by writing out an
> - * auth response. If COMPAT is true, also write out a version number
> - * and capability list. MECH_ARG may be NULL for mechanisms with no
> - * initial client response. */
> -static svn_error_t *auth_response(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
> - const char *mech, const char *mech_arg,
> - svn_boolean_t compat)
> -{
> if (compat)
> return svn_ra_svn_write_tuple(conn, pool, "nw(?c)(www)", (apr_uint64_t) 1,
> mech, mech_arg,
> @@ -262,79 +233,7 @@
> return svn_ra_svn_write_tuple(conn, pool, "w(?c)", mech, mech_arg);
> }
>
> -/* Read the "success" response to ANONYMOUS or EXTERNAL authentication. */
> -static svn_error_t *read_success(svn_ra_svn_conn_t *conn, apr_pool_t *pool)
> -{
> - const char *status, *arg;
> -
> - SVN_ERR(svn_ra_svn_read_tuple(conn, pool, "w(?c)", &status, &arg));
> - if (strcmp(status, "failure") == 0 && arg)
> - return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
> - _("Authentication error from server: %s"), arg);
> - else if (strcmp(status, "success") != 0 || arg)
> - return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
> - _("Unexpected server response to authentication"));
> - return SVN_NO_ERROR;
> -}
> -
> -/* Respond to an auth request and perform authentication. REALM may
> - * be NULL for the initial authentication exchange of protocol version
> - * 1. */
> -static svn_error_t *do_auth(ra_svn_session_baton_t *sess,
> - apr_array_header_t *mechlist,
> - const char *realm, apr_pool_t *pool)
> -{
> - svn_ra_svn_conn_t *conn = sess->conn;
> - const char *realmstring, *user, *password, *msg;
> - svn_auth_iterstate_t *iterstate;
> - void *creds;
> - svn_boolean_t compat = (realm == NULL);
> -
> - realmstring = realm ? apr_psprintf(pool, "%s %s", sess->realm_prefix, realm)
> - : sess->realm_prefix;
> - if (sess->is_tunneled && find_mech(mechlist, "EXTERNAL"))
> - {
> - /* Ask the server to use the tunnel connection environment (on
> - * Unix, that means uid) to determine the authentication name. */
> - SVN_ERR(auth_response(conn, pool, "EXTERNAL", "", compat));
> - return read_success(conn, pool);
> - }
> - else if (find_mech(mechlist, "ANONYMOUS"))
> - {
> - SVN_ERR(auth_response(conn, pool, "ANONYMOUS", "", compat));
> - return read_success(conn, pool);
> - }
> - else if (find_mech(mechlist, "CRAM-MD5"))
> - {
> - SVN_ERR(svn_auth_first_credentials(&creds, &iterstate,
> - SVN_AUTH_CRED_SIMPLE, realmstring,
> - sess->auth_baton, pool));
> - if (!creds)
> - return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
> - _("Can't get password"));
> - while (creds)
> - {
> - user = ((svn_auth_cred_simple_t *) creds)->username;
> - password = ((svn_auth_cred_simple_t *) creds)->password;
> - SVN_ERR(auth_response(conn, pool, "CRAM-MD5", NULL, compat));
> - SVN_ERR(svn_ra_svn__cram_client(conn, pool, user, password, &msg));
> - if (!msg)
> - break;
> - SVN_ERR(svn_auth_next_credentials(&creds, iterstate, pool));
> - }
> - if (!creds)
> - return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
> - _("Authentication error from server: %s"),
> - msg);
> - SVN_ERR(svn_auth_save_credentials(iterstate, pool));
> - return SVN_NO_ERROR;
> - }
> - else
> - return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
> - _("Cannot negotiate authentication mechanism"));
> -}
> -
> -static svn_error_t *handle_auth_request(ra_svn_session_baton_t *sess,
> +static svn_error_t *handle_auth_request(svn_ra_svn__session_baton_t *sess,
> apr_pool_t *pool)
> {
> svn_ra_svn_conn_t *conn = sess->conn;
> @@ -346,7 +245,7 @@
> SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "lc", &mechlist, &realm));
> if (mechlist->nelts == 0)
> return SVN_NO_ERROR;
> - return do_auth(sess, mechlist, realm, pool);
> + return svn_ra_svn__do_auth(sess, mechlist, realm, pool);
> }
>
> /* --- REPORTER IMPLEMENTATION --- */
> @@ -417,7 +316,7 @@
> ra_svn_abort_report
> };
>
> -static void ra_svn_get_reporter(ra_svn_session_baton_t *sess_baton,
> +static void ra_svn_get_reporter(svn_ra_svn__session_baton_t *sess_baton,
> apr_pool_t *pool,
> const svn_delta_editor_t *editor,
> void *edit_baton,
> @@ -569,7 +468,6 @@
>
> /* Guard against dotfile output to stdout on the server. */
> *conn = svn_ra_svn_create_conn(NULL, proc->out, proc->in, pool);
> - (*conn)->proc = proc;
> SVN_ERR(svn_ra_svn_skip_leading_garbage(*conn, pool));
> return SVN_NO_ERROR;
> }
> @@ -597,14 +495,14 @@
> URI is a parsed version of URL. AUTH_BATON is provided by the caller of
> ra_svn_open. If tunnel_argv is non-null, it points to a program
> argument list to use when invoking the tunnel agent. */
> -static svn_error_t *open_session(ra_svn_session_baton_t **sess_p,
> +static svn_error_t *open_session(svn_ra_svn__session_baton_t **sess_p,
> const char *url,
> const apr_uri_t *uri,
> svn_auth_baton_t *auth_baton,
> const char **tunnel_argv,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess;
> + svn_ra_svn__session_baton_t *sess;
> svn_ra_svn_conn_t *conn;
> apr_socket_t *sock;
> apr_uint64_t minver, maxver;
> @@ -643,17 +541,17 @@
> * capability list, and the URL, and subsequently there is an auth
> * request. In version 1, we send back the protocol version, auth
> * mechanism, mechanism initial response, and capability list, and;
> - * then send the URL after authentication. do_auth temporarily has
> + * then send the URL after authentication. svn_ra_svn__do_auth temporarily has
> * support for the mixed-style response. */

Missing comment rewrapping here.

> /* When we punt support for protocol version 1, we should:
> * - Eliminate this conditional and the similar one below
> - * - Remove v1 support from auth_response and inline it into do_auth
> - * - Remove the (realm == NULL) support from do_auth
> - * - Inline do_auth into handle_auth_request
> + * - Remove v1 support from svn_ra_svn__auth_response and inline it
> + * into svn_ra_svn__do_auth
> + * - Remove the (realm == NULL) support from svn_ra_svn__do_auth
> * - Remove the protocol version check from handle_auth_request */
> if (sess->protocol_version == 1)
> {
> - SVN_ERR(do_auth(sess, mechlist, NULL, pool));
> + SVN_ERR(svn_ra_svn__do_auth(sess, mechlist, NULL, pool));
> SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "c", url));
> }
> else
> @@ -714,7 +612,7 @@
> apr_pool_t *pool)
> {
> apr_pool_t *sess_pool = svn_pool_create(pool);
> - ra_svn_session_baton_t *sess;
> + svn_ra_svn__session_baton_t *sess;
> const char *tunnel, **tunnel_argv;
> apr_uri_t uri;
>
> @@ -741,11 +639,11 @@
> const char *url,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = ra_session->priv;
> + svn_ra_svn__session_baton_t *sess = ra_session->priv;
> svn_ra_svn_conn_t *conn = sess->conn;
> svn_error_t *err;
> apr_pool_t *sess_pool;
> - ra_svn_session_baton_t *new_sess;
> + svn_ra_svn__session_baton_t *new_sess;
> apr_uri_t uri;
>
> SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "reparent", "c", url));
> @@ -782,7 +680,7 @@
> static svn_error_t *ra_svn_get_latest_rev(svn_ra_session_t *session,
> svn_revnum_t *rev, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "get-latest-rev", ""));
> @@ -795,7 +693,7 @@
> svn_revnum_t *rev, apr_time_t tm,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "get-dated-rev", "c",
> @@ -810,7 +708,7 @@
> const svn_string_t *value,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "change-rev-prop", "rc?s",
> @@ -823,7 +721,7 @@
> static svn_error_t *ra_svn_get_uuid(svn_ra_session_t *session, const char **uuid,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> *uuid = conn->uuid;
> @@ -833,7 +731,7 @@
> static svn_error_t *ra_svn_get_repos_root(svn_ra_session_t *session, const char **url,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> if (!conn->repos_root)
> @@ -846,7 +744,7 @@
> static svn_error_t *ra_svn_rev_proplist(svn_ra_session_t *session, svn_revnum_t rev,
> apr_hash_t **props, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> apr_array_header_t *proplist;
>
> @@ -861,7 +759,7 @@
> const char *name,
> svn_string_t **value, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "rev-prop", "rc", rev, name));
> @@ -897,7 +795,7 @@
> svn_boolean_t keep_locks,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> ra_svn_commit_callback_baton_t *ccb;
> apr_hash_index_t *hi;
> @@ -946,7 +844,7 @@
> apr_hash_t **props,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> svn_ra_svn_item_t *item;
> apr_array_header_t *proplist;
> @@ -1017,7 +915,7 @@
> apr_uint32_t dirent_fields,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> svn_revnum_t crev;
> apr_array_header_t *proplist, *dirlist;
> @@ -1103,7 +1001,7 @@
> const svn_delta_editor_t *update_editor,
> void *update_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> /* Tell the server we want to start an update. */
> @@ -1126,7 +1024,7 @@
> const svn_delta_editor_t *update_editor,
> void *update_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> /* Tell the server we want to start a switch. */
> @@ -1149,7 +1047,7 @@
> const svn_delta_editor_t *status_editor,
> void *status_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> /* Tell the server we want to start a status operation. */
> @@ -1175,7 +1073,7 @@
> const svn_delta_editor_t *diff_editor,
> void *diff_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
>
> /* Tell the server we want to start a diff. */
> @@ -1200,7 +1098,7 @@
> svn_log_message_receiver_t receiver,
> void *receiver_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> apr_pool_t *subpool;
> int i;
> @@ -1284,7 +1182,7 @@
> const char *path, svn_revnum_t rev,
> svn_node_kind_t *kind, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> const char *kind_word;
>
> @@ -1312,7 +1210,7 @@
> const char *path, svn_revnum_t rev,
> svn_dirent_t **dirent, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> apr_array_header_t *list = NULL;
> const char *kind, *cdate, *cauthor;
> @@ -1360,7 +1258,7 @@
> apr_array_header_t *location_revisions,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> svn_ra_svn_conn_t *conn = sess_baton->conn;
> svn_revnum_t revision;
> svn_ra_svn_item_t *item;
> @@ -1418,7 +1316,7 @@
> svn_ra_file_rev_handler_t handler,
> void *handler_baton, apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess_baton = session->priv;
> + svn_ra_svn__session_baton_t *sess_baton = session->priv;
> apr_pool_t *rev_pool, *chunk_pool;
> svn_ra_svn_item_t *item;
> const char *p;
> @@ -1527,7 +1425,7 @@
> void *lock_baton,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t* conn = sess->conn;
> apr_array_header_t *list;
> apr_hash_index_t *hi;
> @@ -1591,7 +1489,7 @@
> void *lock_baton,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t* conn = sess->conn;
> apr_hash_index_t *hi;
> apr_pool_t *iterpool = svn_pool_create(pool);
> @@ -1650,7 +1548,7 @@
> void *lock_baton,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t *conn = sess->conn;
> apr_hash_index_t *hi;
> svn_ra_svn_item_t *elt;
> @@ -1771,7 +1669,7 @@
> void *lock_baton,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t *conn = sess->conn;
> apr_hash_index_t *hi;
> apr_pool_t *subpool = svn_pool_create(pool);
> @@ -1889,7 +1787,7 @@
> const char *path,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t* conn = sess->conn;
> apr_array_header_t *list;
>
> @@ -1914,7 +1812,7 @@
> const char *path,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
> svn_ra_svn_conn_t* conn = sess->conn;
> apr_array_header_t *list;
> int i;
> @@ -1955,7 +1853,7 @@
> void *edit_baton,
> apr_pool_t *pool)
> {
> - ra_svn_session_baton_t *sess = session->priv;
> + svn_ra_svn__session_baton_t *sess = session->priv;
>
> SVN_ERR(svn_ra_svn_write_cmd(sess->conn, pool, "replay", "rrb", revision,
> low_water_mark, send_deltas));
> Index: subversion/libsvn_ra_svn/simple_auth.c
> ===================================================================
> --- subversion/libsvn_ra_svn/simple_auth.c (revision 0)
> +++ subversion/libsvn_ra_svn/simple_auth.c (revision 0)
> @@ -0,0 +1,116 @@
> +/*
> + * simple_auth.c : Simple SASL-based authentication, used in case
> + * Cyrus SASL isn't available.
> + *
> + * ====================================================================
> + * Copyright (c) 2000-2006 CollabNet. All rights reserved.

This is a new file, created in 2006, so this copyright notice should
read "Copyright (c) 2006 CollabNet. All rights reserved."

> + *
> + * This software is licensed as described in the file COPYING, which
> + * you should have received as part of this distribution. The terms
> + * are also available at http://subversion.tigris.org/license-1.html.
> + * If newer versions of this license are posted there, you may use a
> + * newer version instead, at your option.
> + *
> + * This software consists of voluntary contributions made by many
> + * individuals. For exact contribution history, see the revision
> + * history and logs, available at http://subversion.tigris.org/.
> + * ====================================================================
> + */
> +
> [snip]
>
> +typedef struct {

According to recent cleanup commits on trunk, our source policy is to
name the struct with the same name as the type. So, this should be:

typedef struct svn_ra_svn__session_baton_t {
  ...
} svn_ra_svn__session_baton_t;

> + apr_pool_t *pool;
> + svn_ra_svn_conn_t *conn;
> + int protocol_version;
> + svn_boolean_t is_tunneled;
> + struct svn_auth_baton_t *auth_baton;
> + const char *user;
> + const char *realm_prefix;
> + const char **tunnel_argv;
> +} svn_ra_svn__session_baton_t;
> +
> /* Set a callback for blocked writes on conn. This handler may
> * perform reads on the connection in order to prevent deadlock due to
> * pipelining. If callback is NULL, the connection goes back to
> @@ -95,6 +106,22 @@
> svn_error_t *svn_ra_svn__handle_failure_status(apr_array_header_t *params,
> apr_pool_t *pool);
>
> +/* Respond to an auth request and perform authentication. REALM may
> + * be NULL for the initial authentication exchange of protocol version
> + * 1. */
> +svn_error_t *svn_ra_svn__do_auth(svn_ra_svn__session_baton_t *sess,
> + apr_array_header_t *mechlist,
> + const char *realm, apr_pool_t *pool);
> +
> +/* Having picked a mechanism, start authentication by writing out an
> + * auth response. If COMPAT is true, also write out a version number
> + * and capability list. MECH_ARG may be NULL for mechanisms with no
> + * initial client response. */
> +svn_error_t *svn_ra_svn__auth_response(svn_ra_svn_conn_t *conn,
> + apr_pool_t *pool,
> + const char *mech, const char *mech_arg,
> + svn_boolean_t compat);
> +
> #ifdef __cplusplus
> }
> #endif /* __cplusplus */

All in all, minus these few minor nitpicks, it looks good to me. I've
made the necessary adjustments and commited your patch as r20681.
Thanks, and keep the good patches coming!

- Dave

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Jul 15 04:36:10 2006

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.