grim/convey

Remove the implicit task types and make it so the type attribute is the only way to define a task's type now
// Convey
// Copyright 2016-2018 Gary Kramlich <grim@reaperworld.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package ssh
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"net"
"testing"
"github.com/stretchr/testify/assert"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/agent"
)
func setupAgent(keys []agent.AddedKey) net.Conn {
a := agent.NewKeyring()
for _, key := range keys {
err := a.Add(key)
if err != nil {
panic(err)
}
}
c1, c2 := net.Pipe()
go func() {
defer c2.Close()
err := agent.ServeAgent(a, c2)
if err != nil {
panic(err)
}
}()
return c1
}
func generateKey() *ecdsa.PrivateKey {
priv, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
if err != nil {
panic(err)
}
return priv
}
func TestKeysAvailableEmpty(t *testing.T) {
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{}),
[]string{},
)
assert.False(t, avail)
assert.NotNil(t, err)
}
func TestKeysAvailableWildcardNoKeys(t *testing.T) {
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{}),
[]string{"*"},
)
assert.False(t, avail)
assert.NotNil(t, err)
}
func TestKeysAvailableWildcardWithKeys(t *testing.T) {
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: generateKey()},
}),
[]string{"*"},
)
assert.True(t, avail)
assert.Nil(t, err)
}
func TestKeysAvailableUnknownFingerprint(t *testing.T) {
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: generateKey()},
}),
[]string{"SHA256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"},
)
assert.False(t, avail)
assert.NotNil(t, err)
}
func TestKeysAvailableFingerprintMD5NoPrefix(t *testing.T) {
key := generateKey()
pub := key.Public()
sshPub, err := ssh.NewPublicKey(pub)
if err != nil {
panic(err)
}
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: key},
}),
[]string{ssh.FingerprintLegacyMD5(sshPub)},
)
assert.Nil(t, err)
assert.True(t, avail)
}
func TestKeysAvailableFingerprintMD5Prefix(t *testing.T) {
key := generateKey()
pub := key.Public()
sshPub, err := ssh.NewPublicKey(pub)
if err != nil {
panic(err)
}
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: key},
}),
[]string{"MD5:" + ssh.FingerprintLegacyMD5(sshPub)},
)
assert.Nil(t, err)
assert.True(t, avail)
}
func TestKeysAvailableFingerprintSHA256Prefix(t *testing.T) {
key := generateKey()
pub := key.Public()
sshPub, err := ssh.NewPublicKey(pub)
if err != nil {
panic(err)
}
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: key},
}),
[]string{ssh.FingerprintSHA256(sshPub)},
)
assert.Nil(t, err)
assert.True(t, avail)
}
func TestKeysAvailableFingerprintSHA256NoPrefix(t *testing.T) {
key := generateKey()
pub := key.Public()
sshPub, err := ssh.NewPublicKey(pub)
if err != nil {
panic(err)
}
// FingerprintSHA256 always has the prefix so we strip it off for testing
avail, err := keysAvailable(
setupAgent([]agent.AddedKey{
{PrivateKey: key},
}),
[]string{ssh.FingerprintSHA256(sshPub)[7:]},
)
assert.Nil(t, err)
assert.True(t, avail)
}