diff options
| author | Jamie Beverly <jamie.r.beverly@gmail.com> | 2016-06-25 12:16:22 -0700 |
|---|---|---|
| committer | Han-Wen Nienhuys <hanwen@google.com> | 2016-07-04 10:34:16 +0000 |
| commit | 0c565bf13221fb55497d7ae2bb95694db1fd1bff (patch) | |
| tree | 6c16fcc56506d5cb0842ce1fd0c8c1d5ff78e659 /ssh/client_auth_test.go | |
| parent | 811831de4c4dd03a0b8737233af3b36852386373 (diff) | |
| download | go-x-crypto-0c565bf13221fb55497d7ae2bb95694db1fd1bff.tar.xz | |
x/crypto/ssh: Add support for retryable authentication
Adds a new AuthMethod called "RetryableAuthMethod" which decorates any
other authmethod, allowing it to be retried up to maxTries before
aborting.
Fixes #16077
Change-Id: Ie310c24643e53dca4fa452750a69936674906484
Reviewed-on: https://go-review.googlesource.com/24156
Reviewed-by: Han-Wen Nienhuys <hanwen@google.com>
Run-TryBot: Han-Wen Nienhuys <hanwen@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'ssh/client_auth_test.go')
| -rw-r--r-- | ssh/client_auth_test.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/ssh/client_auth_test.go b/ssh/client_auth_test.go index 2ea4462..2fa3103 100644 --- a/ssh/client_auth_test.go +++ b/ssh/client_auth_test.go @@ -391,3 +391,49 @@ func TestPermissionsPassing(t *testing.T) { func TestNoPermissionsPassing(t *testing.T) { testPermissionsPassing(false, t) } + +func TestRetryableAuth(t *testing.T) { + n := 0 + passwords := []string{"WRONG1", "WRONG2"} + + config := &ClientConfig{ + User: "testuser", + Auth: []AuthMethod{ + RetryableAuthMethod(PasswordCallback(func() (string, error) { + p := passwords[n] + n++ + return p, nil + }), 2), + PublicKeys(testSigners["rsa"]), + }, + } + + if err := tryAuth(t, config); err != nil { + t.Fatalf("unable to dial remote side: %s", err) + } + if n != 2 { + t.Fatalf("Did not try all passwords") + } +} + +func ExampleRetryableAuthMethod(t *testing.T) { + user := "testuser" + NumberOfPrompts := 3 + + // Normally this would be a callback that prompts the user to answer the + // provided questions + Cb := func(user, instruction string, questions []string, echos []bool) (answers []string, err error) { + return []string{"answer1", "answer2"}, nil + } + + config := &ClientConfig{ + User: user, + Auth: []AuthMethod{ + RetryableAuthMethod(KeyboardInteractiveChallenge(Cb), NumberOfPrompts), + }, + } + + if err := tryAuth(t, config); err != nil { + t.Fatalf("unable to dial remote side: %s", err) + } +} |
