From 3e87adaccd1c6d6cc99a1cfea1c03d95e4ea334a Mon Sep 17 00:00:00 2001 From: Kyriakos Oikonomakos Date: Wed, 10 Sep 2014 11:39:01 +0100 Subject: [PATCH] authenticate using ssh agent --- pygit2/credentials.py | 5 +++++ pygit2/decl.h | 3 +++ pygit2/remote.py | 13 +++++++++---- test/test_credentials.py | 8 ++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pygit2/credentials.py b/pygit2/credentials.py index 532004e66..39d86eeb8 100644 --- a/pygit2/credentials.py +++ b/pygit2/credentials.py @@ -85,3 +85,8 @@ def credential_tuple(self): def __call__(self, _url, _username, _allowed): return self + + +class KeypairFromAgent(Keypair): + def __init__(self, username): + super(KeypairFromAgent, self).__init__(username, None, None, None) diff --git a/pygit2/decl.h b/pygit2/decl.h index c7b700157..781bc9898 100644 --- a/pygit2/decl.h +++ b/pygit2/decl.h @@ -204,6 +204,9 @@ int git_cred_ssh_key_new( const char *publickey, const char *privatekey, const char *passphrase); +int git_cred_ssh_key_from_agent( + git_cred **out, + const char *username); /* * git_diff diff --git a/pygit2/remote.py b/pygit2/remote.py index f9a74fe97..81c1ebd59 100644 --- a/pygit2/remote.py +++ b/pygit2/remote.py @@ -32,6 +32,7 @@ from _pygit2 import Oid from .errors import check_error, GitError from .ffi import ffi, C +from .credentials import KeypairFromAgent from .refspec import Refspec from .utils import to_bytes, strarray_to_strings, strings_to_strarray @@ -455,10 +456,14 @@ def get_credentials(fn, url, username, allowed): to_bytes(passwd)) elif cred_type == C.GIT_CREDTYPE_SSH_KEY: - name, pubkey, privkey, passphrase = creds.credential_tuple - err = C.git_cred_ssh_key_new(ccred, to_bytes(name), to_bytes(pubkey), - to_bytes(privkey), to_bytes(passphrase)) - + if isinstance(creds, KeypairFromAgent): + username = creds.credential_tuple[0] + err = C.git_cred_ssh_key_from_agent(ccred, to_bytes(username)) + else: + name, pubkey, privkey, passphrase = creds.credential_tuple + err = C.git_cred_ssh_key_new(ccred, to_bytes(name), + to_bytes(pubkey), to_bytes(privkey), + to_bytes(passphrase)) else: raise TypeError("unsupported credential type") diff --git a/test/test_credentials.py b/test/test_credentials.py index 3bdeb6fc4..376032fc8 100644 --- a/test/test_credentials.py +++ b/test/test_credentials.py @@ -31,6 +31,7 @@ import unittest import pygit2 from pygit2 import GIT_CREDTYPE_USERPASS_PLAINTEXT +from pygit2 import UserPass, Keypair, KeypairFromAgent from pygit2 import UserPass, Keypair from . import utils @@ -60,6 +61,13 @@ def test_ssh_key(self): cred = Keypair(username, pubkey, privkey, passphrase) self.assertEqual((username, pubkey, privkey, passphrase), cred.credential_tuple) + def test_ssh_agent(self): + username = "git" + + cred = KeypairFromAgent(username) + self.assertEqual((username, None, None, None), cred.credential_tuple) + + class CredentialCallback(utils.RepoTestCase): def test_callback(self): def credentials_cb(url, username, allowed):