Commit 54da69588e9560694b6687d3384ac53f18aa11ea

Carlos Martín Nieto 2014-06-25T15:41:01

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.

diff --git a/include/git2/transport.h b/include/git2/transport.h
index af7812b..d1322a1 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 913ec36..872b0ad 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;
+}