diff options
Diffstat (limited to 'credentials.go')
| -rw-r--r-- | credentials.go | 136 |
1 files changed, 101 insertions, 35 deletions
diff --git a/credentials.go b/credentials.go index 5469b20..b1051b9 100644 --- a/credentials.go +++ b/credentials.go @@ -2,62 +2,128 @@ package git /* #include <git2.h> -#include <git2/sys/cred.h> +#include <git2/credential.h> -git_credtype_t _go_git_cred_credtype(git_cred *cred); +git_credential_t _go_git_credential_credtype(git_credential *cred); */ import "C" import ( + "fmt" "runtime" + "strings" "unsafe" ) -type CredType uint +// CredentialType is a bitmask of supported credential types. +// +// This represents the various types of authentication methods supported by the +// library. +type CredentialType uint const ( - CredTypeUserpassPlaintext CredType = C.GIT_CREDTYPE_USERPASS_PLAINTEXT - CredTypeSshKey CredType = C.GIT_CREDTYPE_SSH_KEY - CredTypeSshCustom CredType = C.GIT_CREDTYPE_SSH_CUSTOM - CredTypeDefault CredType = C.GIT_CREDTYPE_DEFAULT + CredentialTypeUserpassPlaintext CredentialType = C.GIT_CREDENTIAL_USERPASS_PLAINTEXT + CredentialTypeSSHKey CredentialType = C.GIT_CREDENTIAL_SSH_KEY + CredentialTypeSSHCustom CredentialType = C.GIT_CREDENTIAL_SSH_CUSTOM + CredentialTypeDefault CredentialType = C.GIT_CREDENTIAL_DEFAULT + CredentialTypeSSHInteractive CredentialType = C.GIT_CREDENTIAL_SSH_INTERACTIVE + CredentialTypeUsername CredentialType = C.GIT_CREDENTIAL_USERNAME + CredentialTypeSSHMemory CredentialType = C.GIT_CREDENTIAL_SSH_MEMORY ) -type Cred struct { - ptr *C.git_cred +func (t CredentialType) String() string { + if t == 0 { + return "CredentialType(0)" + } + + var parts []string + + if (t & CredentialTypeUserpassPlaintext) != 0 { + parts = append(parts, "UserpassPlaintext") + t &= ^CredentialTypeUserpassPlaintext + } + if (t & CredentialTypeSSHKey) != 0 { + parts = append(parts, "SSHKey") + t &= ^CredentialTypeSSHKey + } + if (t & CredentialTypeSSHCustom) != 0 { + parts = append(parts, "SSHCustom") + t &= ^CredentialTypeSSHCustom + } + if (t & CredentialTypeDefault) != 0 { + parts = append(parts, "Default") + t &= ^CredentialTypeDefault + } + if (t & CredentialTypeSSHInteractive) != 0 { + parts = append(parts, "SSHInteractive") + t &= ^CredentialTypeSSHInteractive + } + if (t & CredentialTypeUsername) != 0 { + parts = append(parts, "Username") + t &= ^CredentialTypeUsername + } + if (t & CredentialTypeSSHMemory) != 0 { + parts = append(parts, "SSHMemory") + t &= ^CredentialTypeSSHMemory + } + + if t != 0 { + parts = append(parts, fmt.Sprintf("CredentialType(%#x)", t)) + } + + return strings.Join(parts, "|") } -func newCred() *Cred { - cred := &Cred{} - runtime.SetFinalizer(cred, (*Cred).Free) +type Credential struct { + ptr *C.git_credential +} + +func newCredential() *Credential { + cred := &Credential{} + runtime.SetFinalizer(cred, (*Credential).Free) return cred } -func (o *Cred) HasUsername() bool { - if C.git_cred_has_username(o.ptr) == 1 { +func (o *Credential) HasUsername() bool { + if C.git_credential_has_username(o.ptr) == 1 { return true } return false } -func (o *Cred) Type() CredType { - return (CredType)(C._go_git_cred_credtype(o.ptr)) +func (o *Credential) Type() CredentialType { + return (CredentialType)(C._go_git_credential_credtype(o.ptr)) } -func (o *Cred) Free() { - C.git_cred_free(o.ptr) +func (o *Credential) Free() { + C.git_credential_free(o.ptr) runtime.SetFinalizer(o, nil) o.ptr = nil } -func NewCredUserpassPlaintext(username string, password string) (*Cred, error) { +func NewCredentialUsername(username string) (*Credential, error) { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + cred := newCredential() + cusername := C.CString(username) + ret := C.git_credential_username_new(&cred.ptr, cusername) + if ret != 0 { + cred.Free() + return nil, MakeGitError(ret) + } + return cred, nil +} + +func NewCredentialUserpassPlaintext(username string, password string) (*Credential, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - cred := newCred() + cred := newCredential() cusername := C.CString(username) defer C.free(unsafe.Pointer(cusername)) cpassword := C.CString(password) defer C.free(unsafe.Pointer(cpassword)) - ret := C.git_cred_userpass_plaintext_new(&cred.ptr, cusername, cpassword) + ret := C.git_credential_userpass_plaintext_new(&cred.ptr, cusername, cpassword) if ret != 0 { cred.Free() return nil, MakeGitError(ret) @@ -65,13 +131,13 @@ func NewCredUserpassPlaintext(username string, password string) (*Cred, error) { return cred, nil } -// NewCredSshKey creates new ssh credentials reading the public and private keys +// NewCredentialSSHKey creates new ssh credentials reading the public and private keys // from the file system. -func NewCredSshKey(username string, publicKeyPath string, privateKeyPath string, passphrase string) (*Cred, error) { +func NewCredentialSSHKey(username string, publicKeyPath string, privateKeyPath string, passphrase string) (*Credential, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - cred := newCred() + cred := newCredential() cusername := C.CString(username) defer C.free(unsafe.Pointer(cusername)) cpublickey := C.CString(publicKeyPath) @@ -80,7 +146,7 @@ func NewCredSshKey(username string, publicKeyPath string, privateKeyPath string, defer C.free(unsafe.Pointer(cprivatekey)) cpassphrase := C.CString(passphrase) defer C.free(unsafe.Pointer(cpassphrase)) - ret := C.git_cred_ssh_key_new(&cred.ptr, cusername, cpublickey, cprivatekey, cpassphrase) + ret := C.git_credential_ssh_key_new(&cred.ptr, cusername, cpublickey, cprivatekey, cpassphrase) if ret != 0 { cred.Free() return nil, MakeGitError(ret) @@ -88,13 +154,13 @@ func NewCredSshKey(username string, publicKeyPath string, privateKeyPath string, return cred, nil } -// NewCredSshKeyFromMemory creates new ssh credentials using the publicKey and privateKey +// NewCredentialSSHKeyFromMemory creates new ssh credentials using the publicKey and privateKey // arguments as the values for the public and private keys. -func NewCredSshKeyFromMemory(username string, publicKey string, privateKey string, passphrase string) (*Cred, error) { +func NewCredentialSSHKeyFromMemory(username string, publicKey string, privateKey string, passphrase string) (*Credential, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - cred := newCred() + cred := newCredential() cusername := C.CString(username) defer C.free(unsafe.Pointer(cusername)) cpublickey := C.CString(publicKey) @@ -103,7 +169,7 @@ func NewCredSshKeyFromMemory(username string, publicKey string, privateKey strin defer C.free(unsafe.Pointer(cprivatekey)) cpassphrase := C.CString(passphrase) defer C.free(unsafe.Pointer(cpassphrase)) - ret := C.git_cred_ssh_key_memory_new(&cred.ptr, cusername, cpublickey, cprivatekey, cpassphrase) + ret := C.git_credential_ssh_key_memory_new(&cred.ptr, cusername, cpublickey, cprivatekey, cpassphrase) if ret != 0 { cred.Free() return nil, MakeGitError(ret) @@ -111,14 +177,14 @@ func NewCredSshKeyFromMemory(username string, publicKey string, privateKey strin return cred, nil } -func NewCredSshKeyFromAgent(username string) (*Cred, error) { +func NewCredentialSSHKeyFromAgent(username string) (*Credential, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - cred := newCred() + cred := newCredential() cusername := C.CString(username) defer C.free(unsafe.Pointer(cusername)) - ret := C.git_cred_ssh_key_from_agent(&cred.ptr, cusername) + ret := C.git_credential_ssh_key_from_agent(&cred.ptr, cusername) if ret != 0 { cred.Free() return nil, MakeGitError(ret) @@ -126,12 +192,12 @@ func NewCredSshKeyFromAgent(username string) (*Cred, error) { return cred, nil } -func NewCredDefault() (*Cred, error) { +func NewCredentialDefault() (*Credential, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() - cred := newCred() - ret := C.git_cred_default_new(&cred.ptr) + cred := newCredential() + ret := C.git_credential_default_new(&cred.ptr) if ret != 0 { cred.Free() return nil, MakeGitError(ret) |
