Index: subversion/libsvn_ra_svn/cyrus_auth.c =================================================================== --- subversion/libsvn_ra_svn/cyrus_auth.c (revision 33831) +++ subversion/libsvn_ra_svn/cyrus_auth.c (working copy) @@ -718,6 +718,20 @@ return SVN_NO_ERROR; } +static svn_boolean_t find_mech(apr_array_header_t *mechlist, const char *mech) +{ + int i; + svn_ra_svn_item_t *elt; + + for (i = 0; i < mechlist->nelts; i++) + { + elt = &APR_ARRAY_IDX(mechlist, i, svn_ra_svn_item_t); + if (elt->kind == SVN_RA_SVN_WORD && strcmp(elt->u.word, mech) == 0) + return TRUE; + } + return FALSE; +} + svn_error_t * svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess, apr_array_header_t *mechlist, @@ -740,22 +754,22 @@ sess->conn, pool)); } - /* Create a string containing the list of mechanisms, separated by spaces. */ - for (i = 0; i < mechlist->nelts; i++) + /* Prefer EXTERNAL, then ANONYMOUS, then let SASL decide. */ + if (find_mech(mechlist, "EXTERNAL")) + mechstring = "EXTERNAL"; + else if (find_mech(mechlist, "ANONYMOUS")) + mechstring = "ANONYMOUS"; + else { - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(mechlist, i, svn_ra_svn_item_t); - - /* Force the client to use ANONYMOUS or EXTERNAL if they are available.*/ - if (strcmp(elt->u.word, "ANONYMOUS") == 0 - || strcmp(elt->u.word, "EXTERNAL") == 0) + /* Create a string containing the list of mechanisms, separated by spaces. */ + for (i = 0; i < mechlist->nelts; i++) { - mechstring = elt->u.word; - break; + svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(mechlist, i, svn_ra_svn_item_t); + mechstring = apr_pstrcat(pool, + mechstring, + i == 0 ? "" : " ", + elt->u.word, NULL); } - mechstring = apr_pstrcat(pool, - mechstring, - i == 0 ? "" : " ", - elt->u.word, NULL); } realmstring = apr_psprintf(pool, "%s %s", sess->realm_prefix, realm);