Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upauthenticate using ssh agent #424
Conversation
|
Neat, but the naming doesn't match the ssh keypair constructor we already have. The class for the full ssh keypair is Have you considered having a static method in Keypair to act as a constructor, so we can use it like |
|
@carlosmn does that look better? |
|
Yeah. Though you took both of my suggestions when I meant them as alternatives. Having simply What I was thinking a an alternative to that was having But having the |
|
@carlosmn Done. |
| class KeypairFromAgent(Keypair): | ||
| def __init__(self, username): | ||
| self._username = username | ||
| super(KeypairFromAgent, self).__init__(username, None, None, None) |
This comment has been minimized.
This comment has been minimized.
carlosmn
Sep 15, 2014
Member
One of these lies is redundant. If we're going to rely on the superclass' constructor, then there's no need for us to store the username explicitly.
jbiel
commented
Sep 24, 2014
|
Thanks for this patch! |
|
@carlosmn Anything outstanding to get this merged or do is it just a matter of you having the cycles to take a look (I know that feeling)? |
| err = C.git_cred_ssh_key_new(ccred, to_bytes(name), to_bytes(pubkey), | ||
| to_bytes(privkey), to_bytes(passphrase)) | ||
|
|
||
| if isinstance(creds, KeypairFromAgent): |
This comment has been minimized.
This comment has been minimized.
carlosmn
Sep 25, 2014
Member
I'd rather see this choose based on the values returned from .credential_tuple rather than based on inheritance. It's not too big a deal, but the idea behind these is that each instance tells us about what it's doing, rather than rely on the type.
This comment has been minimized.
This comment has been minimized.
ashb
Sep 26, 2014
Contributor
We thought about this and weren't sure which way to go. The only thing useful we could detect is tuple[1:] are all None. We went with this way as this is what the Ruby libgit2 bindings do.
Happy to change this to trigger off pubkey & privkey being None instead if you'd prefer.
This comment has been minimized.
This comment has been minimized.
carlosmn
Oct 6, 2014
Member
Yeah, that's how I'd go. This is designed so you can use your own classes which get the data from wherever you need (disc, the user, a database, whatever), and there's no need for them to hang off of these classes, all they need to do is have this attribute with the data we need.
This comment has been minimized.
This comment has been minimized.
ashb
Oct 6, 2014
Contributor
So something like this diff then?
@@ -455,9 +456,13 @@ def get_credentials(fn, url, username, allowed):
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 pubkey is None and privkey is None:
+ err = C.git_cred_ssh_key_from_agent(ccred, to_bytes(name))
+ else:
+ 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")
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
Great, |
kyriakosoikonomakos commentedSep 10, 2014
Introduce the ability for pygit2 to use the SSH agent for authentication.
Example use:
import pygit2
x = pygit2.credentials.SSHKeyFromAgent('git')
r = pygit2.clone_repository('ssh://git@github.com/some-org/some-repo', '/tmp/something', credentials=x)