From 54da69588e9560694b6687d3384ac53f18aa11ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 25 Jun 2014 15:41:01 +0200 Subject: [PATCH] cred: introduce username-only cred This exists as ssh needs to know about the username to use before it can query for the supported authentication methods. --- include/git2/transport.h | 14 ++++++++++++++ src/transports/cred.c | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/include/git2/transport.h b/include/git2/transport.h index af7812b5d..d1322a10b 100644 --- a/include/git2/transport.h +++ b/include/git2/transport.h @@ -44,6 +44,14 @@ typedef enum { /* git_cred_ssh_interactive */ GIT_CREDTYPE_SSH_INTERACTIVE = (1u << 4), + + /** + * Username-only information + * + * If the SSH transport does not know which username to use, + * it will ask via this credential type. + */ + GIT_CREDTYPE_USERNAME = (1u << 5), } git_credtype_t; /* The base structure for all credential types */ @@ -105,6 +113,12 @@ typedef struct git_cred_ssh_custom { /** A key for NTLM/Kerberos "default" credentials */ typedef struct git_cred git_cred_default; +/** Username-only credential information */ +typedef struct git_cred_username { + git_cred parent; + char username[1]; +} git_cred_username; + /** * Check whether a credential object contains username information. * diff --git a/src/transports/cred.c b/src/transports/cred.c index 913ec36cc..872b0ad30 100644 --- a/src/transports/cred.c +++ b/src/transports/cred.c @@ -129,6 +129,11 @@ static void default_free(struct git_cred *cred) git__free(c); } +static void username_free(struct git_cred *cred) +{ + git__free(cred); +} + int git_cred_ssh_key_new( git_cred **cred, const char *username, @@ -263,3 +268,21 @@ int git_cred_default_new(git_cred **cred) *cred = c; return 0; } + +int git_cred_username_new(git_cred **cred, const char *username) +{ + git_cred_username *c; + size_t len; + + assert(cred); + + len = strlen(username); + c = git__malloc(sizeof(git_cred_username) + len + 1); + GITERR_CHECK_ALLOC(c); + + c->parent.credtype = GIT_CREDTYPE_USERNAME; + c->parent.free = username_free; + memcpy(c->username, username, len + 1); + + return 0; +}