authenticate using ssh agent
This commit is contained in:

committed by
Ash Berlin

parent
51da3b767d
commit
3e87adaccd
@@ -85,3 +85,8 @@ class Keypair(object):
|
|||||||
|
|
||||||
def __call__(self, _url, _username, _allowed):
|
def __call__(self, _url, _username, _allowed):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class KeypairFromAgent(Keypair):
|
||||||
|
def __init__(self, username):
|
||||||
|
super(KeypairFromAgent, self).__init__(username, None, None, None)
|
||||||
|
@@ -204,6 +204,9 @@ int git_cred_ssh_key_new(
|
|||||||
const char *publickey,
|
const char *publickey,
|
||||||
const char *privatekey,
|
const char *privatekey,
|
||||||
const char *passphrase);
|
const char *passphrase);
|
||||||
|
int git_cred_ssh_key_from_agent(
|
||||||
|
git_cred **out,
|
||||||
|
const char *username);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* git_diff
|
* git_diff
|
||||||
|
@@ -32,6 +32,7 @@ from __future__ import absolute_import
|
|||||||
from _pygit2 import Oid
|
from _pygit2 import Oid
|
||||||
from .errors import check_error, GitError
|
from .errors import check_error, GitError
|
||||||
from .ffi import ffi, C
|
from .ffi import ffi, C
|
||||||
|
from .credentials import KeypairFromAgent
|
||||||
from .refspec import Refspec
|
from .refspec import Refspec
|
||||||
from .utils import to_bytes, strarray_to_strings, strings_to_strarray
|
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))
|
to_bytes(passwd))
|
||||||
|
|
||||||
elif cred_type == C.GIT_CREDTYPE_SSH_KEY:
|
elif cred_type == C.GIT_CREDTYPE_SSH_KEY:
|
||||||
name, pubkey, privkey, passphrase = creds.credential_tuple
|
if isinstance(creds, KeypairFromAgent):
|
||||||
err = C.git_cred_ssh_key_new(ccred, to_bytes(name), to_bytes(pubkey),
|
username = creds.credential_tuple[0]
|
||||||
to_bytes(privkey), to_bytes(passphrase))
|
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:
|
else:
|
||||||
raise TypeError("unsupported credential type")
|
raise TypeError("unsupported credential type")
|
||||||
|
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
import pygit2
|
import pygit2
|
||||||
from pygit2 import GIT_CREDTYPE_USERPASS_PLAINTEXT
|
from pygit2 import GIT_CREDTYPE_USERPASS_PLAINTEXT
|
||||||
|
from pygit2 import UserPass, Keypair, KeypairFromAgent
|
||||||
from pygit2 import UserPass, Keypair
|
from pygit2 import UserPass, Keypair
|
||||||
from . import utils
|
from . import utils
|
||||||
|
|
||||||
@@ -60,6 +61,13 @@ class CredentialCreateTest(utils.NoRepoTestCase):
|
|||||||
cred = Keypair(username, pubkey, privkey, passphrase)
|
cred = Keypair(username, pubkey, privkey, passphrase)
|
||||||
self.assertEqual((username, pubkey, privkey, passphrase), cred.credential_tuple)
|
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):
|
class CredentialCallback(utils.RepoTestCase):
|
||||||
def test_callback(self):
|
def test_callback(self):
|
||||||
def credentials_cb(url, username, allowed):
|
def credentials_cb(url, username, allowed):
|
||||||
|
Reference in New Issue
Block a user