summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Straub <bs@github.com>2013-08-12 12:05:58 -0700
committerBen Straub <bs@github.com>2013-08-12 12:05:58 -0700
commit14da618260be02c63b4f08dca8e6ab479f7449d7 (patch)
tree4901e8bc0210c3f1ee8cb34610c3c4dd453a049b /src
parent423e3b0c4838537608bede2c166abd3b589dd23c (diff)
parentd10de8bd8dff0ebbb7d6684f5a7b9d3e1ec04667 (diff)
downloadlibgit2-14da618260be02c63b4f08dca8e6ab479f7449d7.tar.gz
Merge pull request #1775 from libgit2/ssh-default-user
SSH username fixes
Diffstat (limited to 'src')
-rw-r--r--src/transports/cred.c39
-rw-r--r--src/transports/ssh.c22
2 files changed, 51 insertions, 10 deletions
diff --git a/src/transports/cred.c b/src/transports/cred.c
index a6727e902..35aaf4f91 100644
--- a/src/transports/cred.c
+++ b/src/transports/cred.c
@@ -9,6 +9,31 @@
#include "smart.h"
#include "git2/cred_helpers.h"
+int git_cred_has_username(git_cred *cred)
+{
+ int ret = 0;
+
+ switch (cred->credtype) {
+ case GIT_CREDTYPE_USERPASS_PLAINTEXT: {
+ git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred;
+ ret = !!c->username;
+ break;
+ }
+ case GIT_CREDTYPE_SSH_KEYFILE_PASSPHRASE: {
+ git_cred_ssh_keyfile_passphrase *c = (git_cred_ssh_keyfile_passphrase *)cred;
+ ret = !!c->username;
+ break;
+ }
+ case GIT_CREDTYPE_SSH_PUBLICKEY: {
+ git_cred_ssh_publickey *c = (git_cred_ssh_publickey *)cred;
+ ret = !!c->username;
+ break;
+ }
+ }
+
+ return ret;
+}
+
static void plaintext_free(struct git_cred *cred)
{
git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred;
@@ -64,6 +89,7 @@ static void ssh_keyfile_passphrase_free(struct git_cred *cred)
git_cred_ssh_keyfile_passphrase *c =
(git_cred_ssh_keyfile_passphrase *)cred;
+ git__free(c->username);
git__free(c->publickey);
git__free(c->privatekey);
@@ -82,6 +108,7 @@ static void ssh_publickey_free(struct git_cred *cred)
{
git_cred_ssh_publickey *c = (git_cred_ssh_publickey *)cred;
+ git__free(c->username);
git__free(c->publickey);
git__memzero(c, sizeof(*c));
@@ -90,6 +117,7 @@ static void ssh_publickey_free(struct git_cred *cred)
int git_cred_ssh_keyfile_passphrase_new(
git_cred **cred,
+ const char *username,
const char *publickey,
const char *privatekey,
const char *passphrase)
@@ -104,6 +132,11 @@ int git_cred_ssh_keyfile_passphrase_new(
c->parent.credtype = GIT_CREDTYPE_SSH_KEYFILE_PASSPHRASE;
c->parent.free = ssh_keyfile_passphrase_free;
+ if (username) {
+ c->username = git__strdup(username);
+ GITERR_CHECK_ALLOC(c->username);
+ }
+
c->privatekey = git__strdup(privatekey);
GITERR_CHECK_ALLOC(c->privatekey);
@@ -123,6 +156,7 @@ int git_cred_ssh_keyfile_passphrase_new(
int git_cred_ssh_publickey_new(
git_cred **cred,
+ const char *username,
const char *publickey,
size_t publickey_len,
git_cred_sign_callback sign_callback,
@@ -138,6 +172,11 @@ int git_cred_ssh_publickey_new(
c->parent.credtype = GIT_CREDTYPE_SSH_PUBLICKEY;
c->parent.free = ssh_publickey_free;
+ if (username) {
+ c->username = git__strdup(username);
+ GITERR_CHECK_ALLOC(c->username);
+ }
+
if (publickey_len > 0) {
c->publickey = git__malloc(publickey_len);
GITERR_CHECK_ALLOC(c->publickey);
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index 7fb53bc3c..1258a8e68 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -17,7 +17,6 @@
#define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
static const char prefix_ssh[] = "ssh://";
-static const char default_user[] = "git";
static const char cmd_uploadpack[] = "git-upload-pack";
static const char cmd_receivepack[] = "git-receive-pack";
@@ -214,11 +213,10 @@ static int git_ssh_extract_url_parts(
if (at) {
start = at+1;
*username = git__substrdup(url, at - url);
+ GITERR_CHECK_ALLOC(*username);
} else {
- start = url;
- *username = git__strdup(default_user);
+ *username = NULL;
}
- GITERR_CHECK_ALLOC(*username);
*host = git__substrdup(start, colon - start);
GITERR_CHECK_ALLOC(*host);
@@ -237,19 +235,23 @@ static int _git_ssh_authenticate_session(
switch (cred->credtype) {
case GIT_CREDTYPE_USERPASS_PLAINTEXT: {
git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred;
- rc = libssh2_userauth_password(session, c->username, c->password);
+ user = c->username ? c->username : user;
+ rc = libssh2_userauth_password(session, user, c->password);
break;
}
case GIT_CREDTYPE_SSH_KEYFILE_PASSPHRASE: {
git_cred_ssh_keyfile_passphrase *c = (git_cred_ssh_keyfile_passphrase *)cred;
+ user = c->username ? c->username : user;
rc = libssh2_userauth_publickey_fromfile(
- session, user, c->publickey, c->privatekey, c->passphrase);
+ session, c->username, c->publickey, c->privatekey, c->passphrase);
break;
}
case GIT_CREDTYPE_SSH_PUBLICKEY: {
git_cred_ssh_publickey *c = (git_cred_ssh_publickey *)cred;
+
+ user = c->username ? c->username : user;
rc = libssh2_userauth_publickey(
- session, user, (const unsigned char *)c->publickey,
+ session, c->username, (const unsigned char *)c->publickey,
c->publickey_len, c->sign_callback, &c->sign_data);
break;
}
@@ -351,9 +353,9 @@ static int _git_ssh_setup_conn(
}
assert(t->cred);
- if (!user) {
- user = git__strdup(default_user);
- GITERR_CHECK_ALLOC(user);
+ if (!user && !git_cred_has_username(t->cred)) {
+ giterr_set_str(GITERR_NET, "Cannot authenticate without a username");
+ goto on_error;
}
if (_git_ssh_session_create(&session, s->socket) < 0)