From 1e6bc65763603983d81bff9fc1c586d58be18af5 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 1 Apr 2015 17:09:11 -0700 Subject: [PATCH] command/auth-enable --- api/sys_auth.go | 2 +- command/auth_enable.go | 98 +++++++++++++++++++++++++++++++++++++ command/auth_enable_test.go | 49 +++++++++++++++++++ commands.go | 6 +++ 4 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 command/auth_enable.go create mode 100644 command/auth_enable_test.go diff --git a/api/sys_auth.go b/api/sys_auth.go index b161a53160..2e585766ea 100644 --- a/api/sys_auth.go +++ b/api/sys_auth.go @@ -27,7 +27,7 @@ func (c *Sys) EnableAuth(path, authType, desc string) error { "description": desc, } - r := c.c.NewRequest("PUT", fmt.Sprintf("/v1/sys/auth/%s", path)) + r := c.c.NewRequest("POST", fmt.Sprintf("/v1/sys/auth/%s", path)) if err := r.SetJSONBody(body); err != nil { return err } diff --git a/command/auth_enable.go b/command/auth_enable.go new file mode 100644 index 0000000000..bedb43f70b --- /dev/null +++ b/command/auth_enable.go @@ -0,0 +1,98 @@ +package command + +import ( + "fmt" + "strings" +) + +// AuthEnableCommand is a Command that enables a new endpoint. +type AuthEnableCommand struct { + Meta +} + +func (c *AuthEnableCommand) Run(args []string) int { + var description, path string + flags := c.Meta.FlagSet("auth-enable", FlagSetDefault) + flags.StringVar(&description, "description", "", "") + flags.StringVar(&path, "path", "", "") + flags.Usage = func() { c.Ui.Error(c.Help()) } + if err := flags.Parse(args); err != nil { + return 1 + } + + args = flags.Args() + if len(args) != 1 { + flags.Usage() + c.Ui.Error(fmt.Sprintf( + "\nauth-enable expects one argument: the type to enable.")) + return 1 + } + + authType := args[0] + + // If no path is specified, we default the path to the backend type + if path == "" { + path = authType + } + + client, err := c.Client() + if err != nil { + c.Ui.Error(fmt.Sprintf( + "Error initializing client: %s", err)) + return 2 + } + + if err := client.Sys().EnableAuth(path, authType, description); err != nil { + c.Ui.Error(fmt.Sprintf( + "Error: %s", err)) + return 2 + } + + c.Ui.Output(fmt.Sprintf( + "Successfully enabled '%s' at '%s'!", + authType, path)) + + return 0 +} + +func (c *AuthEnableCommand) Synopsis() string { + return "Enable a new auth provider" +} + +func (c *AuthEnableCommand) Help() string { + helpText := ` +Usage: vault auth-enable [options] type + + Enable a new auth provider. + + This command enables a new auth provider. An auth provider is responsible + for authenticating a user and assigning them policies with which they can + access Vault. + +General Options: + + -address=TODO The address of the Vault server. + + -ca-cert=path Path to a PEM encoded CA cert file to use to + verify the Vault server SSL certificate. + + -ca-path=path Path to a directory of PEM encoded CA cert files + to verify the Vault server SSL certificate. If both + -ca-cert and -ca-path are specified, -ca-path is used. + + -insecure Do not verify TLS certificate. This is highly + not recommended. This is especially not recommended + for unsealing a vault. + +Auth Enable Options: + + -description= Human-friendly description of the purpose for the + auth provider. This shows up in the auth-list command. + + -path= Mount point for the auth provider. This defaults + to the type of the mount. This will make the auth + provider available at "/auth/" + +` + return strings.TrimSpace(helpText) +} diff --git a/command/auth_enable_test.go b/command/auth_enable_test.go new file mode 100644 index 0000000000..0a3499d0d7 --- /dev/null +++ b/command/auth_enable_test.go @@ -0,0 +1,49 @@ +package command + +import ( + "testing" + + "github.com/hashicorp/vault/http" + "github.com/hashicorp/vault/vault" + "github.com/mitchellh/cli" +) + +func TestAuthEnable(t *testing.T) { + core, _, token := vault.TestCoreUnsealed(t) + ln, addr := http.TestServer(t, core) + defer ln.Close() + + ui := new(cli.MockUi) + c := &AuthEnableCommand{ + Meta: Meta{ + ClientToken: token, + Ui: ui, + }, + } + + args := []string{ + "-address", addr, + "noop", + } + if code := c.Run(args); code != 0 { + t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String()) + } + + client, err := c.Client() + if err != nil { + t.Fatalf("err: %s", err) + } + + mounts, err := client.Sys().ListAuth() + if err != nil { + t.Fatalf("err: %s", err) + } + + mount, ok := mounts["noop"] + if !ok { + t.Fatal("should have noop mount") + } + if mount.Type != "noop" { + t.Fatal("should be noop type") + } +} diff --git a/commands.go b/commands.go index ca1e3dea50..a72ff3a969 100644 --- a/commands.go +++ b/commands.go @@ -31,6 +31,12 @@ func init() { }, nil }, + "auth-enable": func() (cli.Command, error) { + return &command.AuthEnableCommand{ + Meta: meta, + }, nil + }, + "read": func() (cli.Command, error) { return &command.ReadCommand{ Meta: meta,