2024 lines
37 KiB
Go
2024 lines
37 KiB
Go
package api_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hashicorp/vault/api"
|
|
)
|
|
|
|
func TestParseSecret(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
raw := strings.TrimSpace(`
|
|
{
|
|
"lease_id": "foo",
|
|
"renewable": true,
|
|
"lease_duration": 10,
|
|
"data": {
|
|
"key": "value"
|
|
},
|
|
"warnings": [
|
|
"a warning!"
|
|
],
|
|
"wrap_info": {
|
|
"token": "token",
|
|
"accessor": "accessor",
|
|
"ttl": 60,
|
|
"creation_time": "2016-06-07T15:52:10-04:00",
|
|
"wrapped_accessor": "abcd1234"
|
|
}
|
|
}`)
|
|
|
|
rawTime, _ := time.Parse(time.RFC3339, "2016-06-07T15:52:10-04:00")
|
|
|
|
secret, err := api.ParseSecret(strings.NewReader(raw))
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
expected := &api.Secret{
|
|
LeaseID: "foo",
|
|
Renewable: true,
|
|
LeaseDuration: 10,
|
|
Data: map[string]interface{}{
|
|
"key": "value",
|
|
},
|
|
Warnings: []string{
|
|
"a warning!",
|
|
},
|
|
WrapInfo: &api.SecretWrapInfo{
|
|
Token: "token",
|
|
Accessor: "accessor",
|
|
TTL: 60,
|
|
CreationTime: rawTime,
|
|
WrappedAccessor: "abcd1234",
|
|
},
|
|
}
|
|
if !reflect.DeepEqual(secret, expected) {
|
|
t.Fatalf("bad:\ngot\n%#v\nexpected\n%#v\n", secret, expected)
|
|
}
|
|
}
|
|
|
|
func TestSecret_TokenID(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp string
|
|
err bool
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"empty_auth_client_token",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
ClientToken: "",
|
|
},
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"real_auth_client_token",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
ClientToken: "my-token",
|
|
},
|
|
},
|
|
"my-token",
|
|
false,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"data_not_string",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"id": 123,
|
|
},
|
|
},
|
|
"",
|
|
true,
|
|
},
|
|
{
|
|
"data_string",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"id": "my-token",
|
|
},
|
|
},
|
|
"my-token",
|
|
false,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenID()
|
|
if err != nil && !tc.err {
|
|
t.Fatal(err)
|
|
}
|
|
if act != tc.exp {
|
|
t.Errorf("expected %q to be %q", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenID, err := secret.TokenID()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenID != token {
|
|
t.Errorf("expected %q to be %q", tokenID, token)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenAccessor(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp string
|
|
err bool
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"empty_auth_accessor",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Accessor: "",
|
|
},
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"real_auth_accessor",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Accessor: "my-accessor",
|
|
},
|
|
},
|
|
"my-accessor",
|
|
false,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
"",
|
|
false,
|
|
},
|
|
{
|
|
"data_not_string",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"accessor": 123,
|
|
},
|
|
},
|
|
"",
|
|
true,
|
|
},
|
|
{
|
|
"data_string",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"accessor": "my-accessor",
|
|
},
|
|
},
|
|
"my-accessor",
|
|
false,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenAccessor()
|
|
if err != nil && !tc.err {
|
|
t.Fatal(err)
|
|
}
|
|
if act != tc.exp {
|
|
t.Errorf("expected %q to be %q", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token, accessor := secret.Auth.ClientToken, secret.Auth.Accessor
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
newAccessor, err := secret.TokenAccessor()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if newAccessor != accessor {
|
|
t.Errorf("expected %q to be %q", newAccessor, accessor)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenRemainingUses(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp int
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
-1,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
-1,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
-1,
|
|
},
|
|
{
|
|
"data_not_json_number",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"num_uses": 123,
|
|
},
|
|
},
|
|
123,
|
|
},
|
|
{
|
|
"data_json_number",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"num_uses": json.Number("123"),
|
|
},
|
|
},
|
|
123,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenRemainingUses()
|
|
if tc.exp != -1 && err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if act != tc.exp {
|
|
t.Errorf("expected %d to be %d", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
"num_uses": uses,
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Remaining uses is not returned from this API
|
|
uses = -1
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
NumUses: uses,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// /auth/token/create does not return the number of uses
|
|
uses = -1
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
NumUses: uses,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
NumUses: uses,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
uses = uses - 1 // we just used it
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
NumUses: uses,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// /auth/token/renew does not return the number of uses
|
|
uses = -1
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
uses := 5
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
NumUses: uses,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// /auth/token/renew-self does not return the number of uses
|
|
uses = -1
|
|
remaining, err := secret.TokenRemainingUses()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if remaining != uses {
|
|
t.Errorf("expected %d to be %d", remaining, uses)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenPolicies(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp []string
|
|
err bool
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth_policies",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Policies: nil,
|
|
},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"empty_auth_policies",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Policies: []string{},
|
|
},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"real_auth_policies",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Policies: []string{"foo"},
|
|
},
|
|
},
|
|
[]string{"foo"},
|
|
false,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"data_not_slice",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"policies": 123,
|
|
},
|
|
},
|
|
nil,
|
|
true,
|
|
},
|
|
{
|
|
"data_slice",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"policies": []interface{}{"foo"},
|
|
},
|
|
},
|
|
[]string{"foo"},
|
|
false,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenPolicies()
|
|
if err != nil && !tc.err {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(act, tc.exp) {
|
|
t.Errorf("expected %#v to be %#v", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": strings.Join(policies, ","),
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: policies,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: policies,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: policies,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: policies,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
policies := []string{"bar", "default", "foo"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: policies,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tPol, err := secret.TokenPolicies()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tPol, policies) {
|
|
t.Errorf("expected %#v to be %#v", tPol, policies)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenMetadata(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp map[string]string
|
|
err bool
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth_metadata",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Metadata: nil,
|
|
},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"empty_auth_metadata",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Metadata: map[string]string{},
|
|
},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"real_auth_metdata",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Metadata: map[string]string{"foo": "bar"},
|
|
},
|
|
},
|
|
map[string]string{"foo": "bar"},
|
|
false,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"data_not_map",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"metadata": 123,
|
|
},
|
|
},
|
|
nil,
|
|
true,
|
|
},
|
|
{
|
|
"data_map",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"metadata": map[string]interface{}{"foo": "bar"},
|
|
},
|
|
},
|
|
map[string]string{"foo": "bar"},
|
|
false,
|
|
},
|
|
{
|
|
"data_map_bad_type",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"metadata": map[string]interface{}{"foo": 123},
|
|
},
|
|
},
|
|
nil,
|
|
true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenMetadata()
|
|
if err != nil && !tc.err {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(act, tc.exp) {
|
|
t.Errorf("expected %#v to be %#v", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Metadata: metadata,
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Metadata: metadata,
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Metadata: metadata,
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Metadata: metadata,
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
metadata := map[string]string{"username": "test"}
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Metadata: metadata,
|
|
Policies: []string{"default"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tMeta, err := secret.TokenMetadata()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(tMeta, metadata) {
|
|
t.Errorf("expected %#v to be %#v", tMeta, metadata)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenIsRenewable(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp bool
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
false,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"auth_renewable_false",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Renewable: false,
|
|
},
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"auth_renewable_true",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
Renewable: true,
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"data_not_bool",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"renewable": 123,
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
{
|
|
"data_bool_string",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"renewable": "true",
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
{
|
|
"data_bool_true",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"renewable": true,
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
{
|
|
"data_bool_false",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"renewable": true,
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if act != tc.exp {
|
|
t.Errorf("expected %t to be %t", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
Renewable: &renewable,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
Renewable: &renewable,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
Renewable: &renewable,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
Renewable: &renewable,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
renewable := true
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
Renewable: &renewable,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tRenew, err := secret.TokenIsRenewable()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tRenew != renewable {
|
|
t.Errorf("expected %t to be %t", tRenew, renewable)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestSecret_TokenTTL(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := []struct {
|
|
name string
|
|
secret *api.Secret
|
|
exp time.Duration
|
|
}{
|
|
{
|
|
"nil",
|
|
nil,
|
|
0,
|
|
},
|
|
{
|
|
"nil_auth",
|
|
&api.Secret{
|
|
Auth: nil,
|
|
},
|
|
0,
|
|
},
|
|
{
|
|
"nil_auth_lease_duration",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
LeaseDuration: 0,
|
|
},
|
|
},
|
|
0,
|
|
},
|
|
{
|
|
"real_auth_lease_duration",
|
|
&api.Secret{
|
|
Auth: &api.SecretAuth{
|
|
LeaseDuration: 3600,
|
|
},
|
|
},
|
|
1 * time.Hour,
|
|
},
|
|
{
|
|
"nil_data",
|
|
&api.Secret{
|
|
Data: nil,
|
|
},
|
|
0,
|
|
},
|
|
{
|
|
"empty_data",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{},
|
|
},
|
|
0,
|
|
},
|
|
{
|
|
"data_not_json_number",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"ttl": 123,
|
|
},
|
|
},
|
|
123 * time.Second,
|
|
},
|
|
{
|
|
"data_json_number",
|
|
&api.Secret{
|
|
Data: map[string]interface{}{
|
|
"ttl": json.Number("3600"),
|
|
},
|
|
},
|
|
1 * time.Hour,
|
|
},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
act, err := tc.secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if act != tc.exp {
|
|
t.Errorf("expected %q to be %q", act, tc.exp)
|
|
}
|
|
})
|
|
}
|
|
|
|
t.Run("auth", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
if err := client.Sys().EnableAuth("userpass", "userpass", ""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := client.Logical().Write("auth/userpass/users/test", map[string]interface{}{
|
|
"password": "test",
|
|
"policies": "default",
|
|
"ttl": ttl.String(),
|
|
"explicit_max_ttl": ttl.String(),
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
secret, err := client.Logical().Write("auth/userpass/login/test", map[string]interface{}{
|
|
"password": "test",
|
|
})
|
|
if err != nil || secret == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
|
|
t.Run("token create", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
TTL: ttl.String(),
|
|
ExplicitMaxTTL: ttl.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
TTL: ttl.String(),
|
|
ExplicitMaxTTL: ttl.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Lookup(token)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
|
|
t.Run("token lookup-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
TTL: ttl.String(),
|
|
ExplicitMaxTTL: ttl.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().LookupSelf()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
TTL: ttl.String(),
|
|
ExplicitMaxTTL: ttl.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
secret, err = client.Auth().Token().Renew(token, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
|
|
t.Run("token renew-self", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
client, closer := testVaultServer(t)
|
|
defer closer()
|
|
|
|
ttl := 30 * time.Minute
|
|
|
|
secret, err := client.Auth().Token().Create(&api.TokenCreateRequest{
|
|
Policies: []string{"default"},
|
|
TTL: ttl.String(),
|
|
ExplicitMaxTTL: ttl.String(),
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
token := secret.Auth.ClientToken
|
|
|
|
client.SetToken(token)
|
|
secret, err = client.Auth().Token().RenewSelf(0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
tokenTTL, err := secret.TokenTTL()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tokenTTL == 0 || tokenTTL > ttl {
|
|
t.Errorf("expected %q to non-zero and less than %q", tokenTTL, ttl)
|
|
}
|
|
})
|
|
}
|