1a324cf347
Functionality is split into ExternalTokenHelper, which is used if a path is given in a configuration file, and InternalTokenHelper which is used otherwise. The internal helper no longer shells out to the same Vault binary, instead performing the same actions with internal code. This avoids problems using dev mode when there are spaces in paths or when the binary is built in a container without a shell. Fixes #850 among others
200 lines
3.5 KiB
Go
200 lines
3.5 KiB
Go
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/vault/api"
|
|
"github.com/hashicorp/vault/http"
|
|
"github.com/hashicorp/vault/vault"
|
|
"github.com/mitchellh/cli"
|
|
)
|
|
|
|
func TestAuth_methods(t *testing.T) {
|
|
core, _, token := vault.TestCoreUnsealed(t)
|
|
ln, addr := http.TestServer(t, core)
|
|
defer ln.Close()
|
|
|
|
testAuthInit(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &AuthCommand{
|
|
Meta: Meta{
|
|
ClientToken: token,
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-address", addr,
|
|
"-methods",
|
|
}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
|
}
|
|
|
|
output := ui.OutputWriter.String()
|
|
if !strings.Contains(output, "token") {
|
|
t.Fatalf("bad: %#v", output)
|
|
}
|
|
}
|
|
|
|
func TestAuth_token(t *testing.T) {
|
|
core, _, token := vault.TestCoreUnsealed(t)
|
|
ln, addr := http.TestServer(t, core)
|
|
defer ln.Close()
|
|
|
|
testAuthInit(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &AuthCommand{
|
|
Meta: Meta{
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-address", addr,
|
|
token,
|
|
}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
|
}
|
|
|
|
helper, err := c.TokenHelper()
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
actual, err := helper.Get()
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
if actual != token {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func TestAuth_stdin(t *testing.T) {
|
|
core, _, token := vault.TestCoreUnsealed(t)
|
|
ln, addr := http.TestServer(t, core)
|
|
defer ln.Close()
|
|
|
|
testAuthInit(t)
|
|
|
|
stdinR, stdinW := io.Pipe()
|
|
ui := new(cli.MockUi)
|
|
c := &AuthCommand{
|
|
Meta: Meta{
|
|
Ui: ui,
|
|
},
|
|
testStdin: stdinR,
|
|
}
|
|
|
|
go func() {
|
|
stdinW.Write([]byte(token))
|
|
stdinW.Close()
|
|
}()
|
|
|
|
args := []string{
|
|
"-address", addr,
|
|
"-",
|
|
}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
|
}
|
|
}
|
|
|
|
func TestAuth_badToken(t *testing.T) {
|
|
core, _, _ := vault.TestCoreUnsealed(t)
|
|
ln, addr := http.TestServer(t, core)
|
|
defer ln.Close()
|
|
|
|
testAuthInit(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &AuthCommand{
|
|
Meta: Meta{
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-address", addr,
|
|
"not-a-valid-token",
|
|
}
|
|
if code := c.Run(args); code != 1 {
|
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
|
}
|
|
}
|
|
|
|
func TestAuth_method(t *testing.T) {
|
|
core, _, token := vault.TestCoreUnsealed(t)
|
|
ln, addr := http.TestServer(t, core)
|
|
defer ln.Close()
|
|
|
|
testAuthInit(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &AuthCommand{
|
|
Handlers: map[string]AuthHandler{
|
|
"test": &testAuthHandler{},
|
|
},
|
|
Meta: Meta{
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-address", addr,
|
|
"-method=test",
|
|
"foo=" + token,
|
|
}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
|
}
|
|
|
|
helper, err := c.TokenHelper()
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
actual, err := helper.Get()
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
if actual != token {
|
|
t.Fatalf("bad: %s", actual)
|
|
}
|
|
}
|
|
|
|
func testAuthInit(t *testing.T) {
|
|
td, err := ioutil.TempDir("", "vault")
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
// Set the HOME env var so we get that right
|
|
os.Setenv("HOME", td)
|
|
|
|
// Write a .vault config to use our custom token helper
|
|
config := fmt.Sprintf(
|
|
"token_helper = \"\"\n")
|
|
ioutil.WriteFile(filepath.Join(td, ".vault"), []byte(config), 0644)
|
|
}
|
|
|
|
type testAuthHandler struct{}
|
|
|
|
func (h *testAuthHandler) Auth(c *api.Client, m map[string]string) (string, error) {
|
|
return m["foo"], nil
|
|
}
|
|
|
|
func (h *testAuthHandler) Help() string { return "" }
|