diff --git a/api/sys_capabilities.go b/api/sys_capabilities.go index 80f6218849..cbb3a72d7e 100644 --- a/api/sys_capabilities.go +++ b/api/sys_capabilities.go @@ -34,8 +34,14 @@ func (c *Sys) Capabilities(token, path string) ([]string, error) { return nil, err } + if result["capabilities"] == nil { + return nil, nil + } var capabilities []string - capabilitiesRaw := result["capabilities"].([]interface{}) + capabilitiesRaw, ok := result["capabilities"].([]interface{}) + if !ok { + return nil, fmt.Errorf("error interpreting returned capabilities") + } for _, capability := range capabilitiesRaw { capabilities = append(capabilities, capability.(string)) } diff --git a/command/token_capabilities.go b/command/token_capabilities.go index 68ec32af18..2c877a7133 100644 --- a/command/token_capabilities.go +++ b/command/token_capabilities.go @@ -93,6 +93,10 @@ func (c *TokenCapabilitiesCommand) Run(args []string) int { c.UI.Error(fmt.Sprintf("Error listing capabilities: %s", err)) return 2 } + if capabilities == nil { + c.UI.Error(fmt.Sprintf("No capabilities found")) + return 1 + } switch Format(c.UI) { case "table": diff --git a/command/token_capabilities_test.go b/command/token_capabilities_test.go index d529d33eec..874db49129 100644 --- a/command/token_capabilities_test.go +++ b/command/token_capabilities_test.go @@ -165,6 +165,23 @@ func TestTokenCapabilitiesCommand_Run(t *testing.T) { } }) + t.Run("multiple_paths", func(t *testing.T) { + t.Parallel() + + client, closer := testVaultServer(t) + defer closer() + + _, cmd := testTokenCapabilitiesCommand(t) + cmd.client = client + + code := cmd.Run([]string{ + "secret/foo,secret/bar", + }) + if exp := 1; code != exp { + t.Errorf("expected %d to be %d", code, exp) + } + }) + t.Run("no_tabs", func(t *testing.T) { t.Parallel()