Skip to content

Commit 35fcb23

Browse files
committed
libgit2: change credentialsCallback logic
This changes the logic of `credentialsCallback` so that it takes the `allowedTypes` passed on by `git2go` into account. Reason for this change is because this prepares it to work with `v33`, but also because it can provide better guidance when `libgit2` has been compiled with a different configuration, which e.g. doesn't allow for "in-memory SSH keys". Because `AuthOptions#Identity` now gets validated by the callback and go-git does its own validaiton, the check has been removed from `Validate` (and now does a simple check if the fields are set). Signed-off-by: Hidde Beydals <hello@hidde.co>
1 parent 3c42c7e commit 35fcb23

File tree

2 files changed

+21
-27
lines changed

2 files changed

+21
-27
lines changed

pkg/git/libgit2/transport.go

+21-17
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"crypto/sha1"
2424
"crypto/sha256"
2525
"crypto/x509"
26+
"fmt"
2627
"hash"
2728
"net"
2829
"strings"
@@ -52,29 +53,32 @@ func RemoteCallbacks(opts *git.AuthOptions) git2go.RemoteCallbacks {
5253
}
5354

5455
// credentialsCallback constructs CredentialsCallbacks with the given options
55-
// for git.Transport if the given opts is not nil, and returns the result.
56+
// for git.Transport, and returns the result.
5657
func credentialsCallback(opts *git.AuthOptions) git2go.CredentialsCallback {
57-
switch opts.Transport {
58-
case git.HTTP:
59-
if opts.Username != "" {
60-
return func(u string, user string, allowedTypes git2go.CredentialType) (*git2go.Credential, error) {
61-
return git2go.NewCredentialUsername(opts.Username)
58+
return func(url string, username string, allowedTypes git2go.CredentialType) (*git2go.Credential, error) {
59+
if allowedTypes & (git2go.CredentialTypeSSHKey|git2go.CredentialTypeSSHCustom|git2go.CredentialTypeSSHMemory) != 0 {
60+
var (
61+
signer ssh.Signer
62+
err error
63+
)
64+
if opts.Password != "" {
65+
signer, err = ssh.ParsePrivateKeyWithPassphrase(opts.Identity, []byte(opts.Password))
66+
} else {
67+
signer, err = ssh.ParsePrivateKey(opts.Identity)
6268
}
63-
}
64-
case git.HTTPS:
65-
if opts.Username != "" && opts.Password != "" {
66-
return func(u string, user string, allowedTypes git2go.CredentialType) (*git2go.Credential, error) {
67-
return git2go.NewCredentialUserpassPlaintext(opts.Username, opts.Password)
69+
if err != nil {
70+
return nil, err
6871
}
72+
return git2go.NewCredentialSSHKeyFromSigner(opts.Username, signer)
6973
}
70-
case git.SSH:
71-
if len(opts.Identity) > 0 {
72-
return func(u string, user string, allowedTypes git2go.CredentialType) (*git2go.Credential, error) {
73-
return git2go.NewCredentialSSHKeyFromMemory(opts.Username, "", string(opts.Identity), opts.Password)
74-
}
74+
if (allowedTypes & git2go.CredentialTypeUserpassPlaintext) != 0 {
75+
return git2go.NewCredentialUserpassPlaintext(opts.Username, opts.Password)
7576
}
77+
if (allowedTypes & git2go.CredentialTypeUsername) != 0 {
78+
return git2go.NewCredentialUsername(opts.Username)
79+
}
80+
return nil, fmt.Errorf("unknown credential type %+v", allowedTypes)
7681
}
77-
return nil
7882
}
7983

8084
// certificateCallback constructs CertificateCallback with the given options

pkg/git/options.go

-10
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"fmt"
2121
"net/url"
2222

23-
"golang.org/x/crypto/ssh"
2423
v1 "k8s.io/api/core/v1"
2524
)
2625

@@ -82,15 +81,6 @@ func (o AuthOptions) Validate() error {
8281
if len(o.Identity) == 0 {
8382
return fmt.Errorf("invalid '%s' auth option: 'identity' is required", o.Transport)
8483
}
85-
var err error
86-
if o.Password != "" {
87-
_, err = ssh.ParsePrivateKeyWithPassphrase(o.Identity, []byte(o.Password))
88-
} else {
89-
_, err = ssh.ParsePrivateKey(o.Identity)
90-
}
91-
if err != nil {
92-
return fmt.Errorf("invalid '%s' auth option 'identity': %w", o.Transport, err)
93-
}
9484
if len(o.KnownHosts) == 0 {
9585
return fmt.Errorf("invalid '%s' auth option: 'known_hosts' is required", o.Transport)
9686
}

0 commit comments

Comments
 (0)