authenticate using ssh agent
This commit is contained in:
		 Kyriakos Oikonomakos
					Kyriakos Oikonomakos
				
			
				
					committed by
					
						 Ash Berlin
						Ash Berlin
					
				
			
			
				
	
			
			
			 Ash Berlin
						Ash Berlin
					
				
			
						parent
						
							51da3b767d
						
					
				
				
					commit
					3e87adaccd
				
			| @@ -85,3 +85,8 @@ class Keypair(object): | ||||
|  | ||||
|     def __call__(self, _url, _username, _allowed): | ||||
|         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 *privatekey, | ||||
| 	const char *passphrase); | ||||
| int git_cred_ssh_key_from_agent( | ||||
|     git_cred **out, | ||||
|     const char *username); | ||||
|  | ||||
| /* | ||||
|  * git_diff | ||||
|   | ||||
| @@ -32,6 +32,7 @@ from __future__ import absolute_import | ||||
| 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") | ||||
|  | ||||
|   | ||||
| @@ -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 @@ class CredentialCreateTest(utils.NoRepoTestCase): | ||||
|         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): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user