You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2015/12/07 15:59:18 UTC
svn commit: r1718391 -
/subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c
Author: rhuijben
Date: Mon Dec 7 14:59:18 2015
New Revision: 1718391
URL: http://svn.apache.org/viewvc?rev=1718391&view=rev
Log:
On the ra-git branch: hook up a bit more auth handling on fetching updates
from a remote git repository.
* subversion/libsvn_ra_git/fetch.c
(RA_GIT_DEFAULT_REF): Remove as unused.
(get_username): Use sess directly. Remove obsolete parts of comment.
(ra_git_remote_baton_t): Add variable.
(remote_credentials_acquire): Add basic implementation.
Modified:
subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c
Modified: subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c
URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c?rev=1718391&r1=1718390&r2=1718391&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c (original)
+++ subversion/branches/ra-git/subversion/libsvn_ra_git/fetch.c Mon Dec 7 14:59:18 2015
@@ -51,7 +51,6 @@
#define RA_GIT_DEFAULT_REFSPEC "+refs/*:refs/*"
#define RA_GIT_DEFAULT_REMOTE_NAME "origin"
-#define RA_GIT_DEFAULT_REF "refs/remotes/origin/master"
/*----------------------------------------------------------------*/
@@ -291,18 +290,13 @@ svn_ra_git__git_fetch(svn_ra_session_t *
-/* Fetch a username for use with SESSION, and store it in SESSION->username.
- *
- * Allocate the username in SESSION->pool. Use SCRATCH_POOL for temporary
- * allocations. */
+/* Fetch a username for use with SESS */
static svn_error_t *
get_username(const char **username,
- svn_ra_session_t *session,
+ svn_ra_git__session_t *sess,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_ra_git__session_t *sess = session->priv;
-
*username = NULL;
/* Get a username somehow, so we have some svn:author property to
@@ -352,6 +346,7 @@ typedef struct ra_git_remote_baton_t
apr_pool_t *scratch_pool;
svn_auth_iterstate_t *auth_iter;
+ unsigned int authtypes_done;
svn_boolean_t stopped;
svn_ra_git__session_t *sess;
@@ -391,6 +386,72 @@ remote_credentials_acquire(git_cred **cr
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ const char *realm;
+ *cred = NULL;
+
+ allowed_types &= ~grb->authtypes_done;
+
+ realm = apr_pstrcat(scratch_pool, "<", url, "> git repository", SVN_VA_NULL);
+
+ if (allowed_types & GIT_CREDTYPE_DEFAULT)
+ {
+ GIT2_ERR(git_cred_default_new(cred));
+ grb->authtypes_done |= GIT_CREDTYPE_DEFAULT; /* Only do this once */
+ return SVN_NO_ERROR;
+ }
+
+ if (allowed_types & GIT_CREDTYPE_USERPASS_PLAINTEXT)
+ {
+ void *svn_creds;
+ if (!grb->auth_iter)
+ SVN_ERR(svn_auth_first_credentials(&svn_creds, &grb->auth_iter,
+ SVN_AUTH_CRED_SIMPLE,
+ apr_pstrdup(grb->remote_pool, realm),
+ grb->sess->callbacks->auth_baton,
+ grb->remote_pool));
+ else
+ SVN_ERR(svn_auth_next_credentials(&svn_creds, grb->auth_iter,
+ result_pool));
+
+ if (svn_creds)
+ {
+ svn_auth_cred_simple_t *simple_creds = svn_creds;
+
+ GIT2_ERR(git_cred_userpass_plaintext_new(cred,
+ simple_creds->username,
+ simple_creds->password));
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ grb->auth_iter = NULL; /* Don't save on success */
+ grb->authtypes_done |= GIT_CREDTYPE_USERPASS_PLAINTEXT;
+ /* And fall through to try other cred types */
+ }
+ }
+
+ if (allowed_types & GIT_CREDTYPE_USERNAME)
+ {
+ const char *username;
+ SVN_ERR(get_username(&username, grb->sess, scratch_pool,
+ scratch_pool));
+
+ if (username)
+ {
+ GIT2_ERR(git_cred_username_new(cred, username));
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ grb->authtypes_done |= GIT_CREDTYPE_USERNAME;
+ /* And fall through */
+ }
+ }
+
+ /* TODO: GIT_CREDTYPE_SSH_KEY,
+ GIT_CREDTYPE_SSH_CUSTOM,
+ GIT_CREDTYPE_SSH_INTERACTIVE,
+ GIT_CREDTYPE_SSH_MEMORY */
return SVN_NO_ERROR;
}
@@ -403,6 +464,7 @@ remote_transport_certificate_check(ra_gi
const char *host,
void *payload)
{
+ /* ### TODO: */
return SVN_NO_ERROR;
}
@@ -511,6 +573,12 @@ git_remote_completion_cb(git_remote_comp
git_remote_stop(grb->remote);
}
+ if (!grb->err && grb->auth_iter)
+ {
+ grb->err = svn_auth_save_credentials(grb->auth_iter, grb->scratch_pool);
+ grb->auth_iter = NULL;
+ }
+
return (grb->err ? 1 : 0);
}