func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { if req.Auth == nil { return nil, fmt.Errorf("request auth was nil") } tokenRaw, ok := req.Auth.InternalData["token"] if !ok { return nil, fmt.Errorf("token created in previous version of Vault cannot be validated properly at renewal time") } token := tokenRaw.(string) var verifyResp *verifyCredentialsResp if verifyResponse, resp, err := b.verifyCredentials(req, token); err != nil { return nil, err } else if resp != nil { return resp, nil } else { verifyResp = verifyResponse } if !policyutil.EquivalentPolicies(verifyResp.Policies, req.Auth.Policies) { return nil, fmt.Errorf("policies do not match") } config, err := b.Config(req.Storage) if err != nil { return nil, err } return framework.LeaseExtend(config.TTL, config.MaxTTL, b.System())(req, d) }
func TestAppRole_RoleList(t *testing.T) { var resp *logical.Response var err error b, storage := createBackendWithStorage(t) createRole(t, b, storage, "role1", "a,b") createRole(t, b, storage, "role2", "c,d") createRole(t, b, storage, "role3", "e,f") createRole(t, b, storage, "role4", "g,h") createRole(t, b, storage, "role5", "i,j") listReq := &logical.Request{ Operation: logical.ListOperation, Path: "role", Storage: storage, } resp, err = b.HandleRequest(listReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } actual := resp.Data["keys"].([]string) expected := []string{"role1", "role2", "role3", "role4", "role5"} if !policyutil.EquivalentPolicies(actual, expected) { t.Fatalf("bad: listed roles: expected:%s\nactual:%s", expected, actual) } }
func (rTag1 *roleTag) Equal(rTag2 *roleTag) bool { return rTag1 != nil && rTag2 != nil && rTag1.Version == rTag2.Version && rTag1.Nonce == rTag2.Nonce && policyutil.EquivalentPolicies(rTag1.Policies, rTag2.Policies) && rTag1.MaxTTL == rTag2.MaxTTL && rTag1.Role == rTag2.Role && rTag1.HMAC == rTag2.HMAC && rTag1.InstanceID == rTag2.InstanceID && rTag1.DisallowReauthentication == rTag2.DisallowReauthentication && rTag1.AllowInstanceMigration == rTag2.AllowInstanceMigration }
func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { config, err := b.Config(req.Storage) if err != nil { return nil, err } if !config.DisableBinding { var matched *ParsedCert if verifyResp, resp, err := b.verifyCredentials(req); err != nil { return nil, err } else if resp != nil { return resp, nil } else { matched = verifyResp } if matched == nil { return nil, nil } clientCerts := req.Connection.ConnState.PeerCertificates if len(clientCerts) == 0 { return nil, fmt.Errorf("no client certificate found") } skid := base64.StdEncoding.EncodeToString(clientCerts[0].SubjectKeyId) akid := base64.StdEncoding.EncodeToString(clientCerts[0].AuthorityKeyId) // Certificate should not only match a registered certificate policy. // Also, the identity of the certificate presented should match the identity of the certificate used during login if req.Auth.InternalData["subject_key_id"] != skid && req.Auth.InternalData["authority_key_id"] != akid { return nil, fmt.Errorf("client identity during renewal not matching client identity used during login") } } // Get the cert and use its TTL cert, err := b.Cert(req.Storage, req.Auth.Metadata["cert_name"]) if err != nil { return nil, err } if cert == nil { // User no longer exists, do not renew return nil, nil } if !policyutil.EquivalentPolicies(cert.Policies, req.Auth.Policies) { return nil, fmt.Errorf("policies have changed, not renewing") } return framework.LeaseExtend(cert.TTL, 0, b.System())(req, d) }
func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { username := req.Auth.Metadata["username"] password := req.Auth.InternalData["password"].(string) loginPolicies, resp, err := b.Login(req, username, password) if len(loginPolicies) == 0 { return resp, err } if !policyutil.EquivalentPolicies(loginPolicies, req.Auth.Policies) { return nil, fmt.Errorf("policies have changed, not renewing") } return framework.LeaseExtend(0, 0, b.System())(req, d) }
func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { // Get the user user, err := b.user(req.Storage, req.Auth.Metadata["username"]) if err != nil { return nil, err } if user == nil { // User no longer exists, do not renew return nil, nil } if !policyutil.EquivalentPolicies(user.Policies, req.Auth.Policies) { return logical.ErrorResponse("policies have changed, not renewing"), nil } return framework.LeaseExtend(user.TTL, user.MaxTTL, b.System())(req, d) }
func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { token := req.Auth.InternalData["token"].(string) var verifyResp *verifyCredentialsResp if verifyResponse, resp, err := b.verifyCredentials(req, token); err != nil { return nil, err } else if resp != nil { return resp, nil } else { verifyResp = verifyResponse } if !policyutil.EquivalentPolicies(verifyResp.Policies, req.Auth.Policies) { return logical.ErrorResponse("policies do not match"), nil } config, err := b.Config(req.Storage) if err != nil { return nil, err } return framework.LeaseExtend(config.TTL, config.MaxTTL, b.System())(req, d) }
func (b *backend) pathLoginRenew( req *logical.Request, d *framework.FieldData) (*logical.Response, error) { appId := req.Auth.InternalData["app-id"].(string) userId := req.Auth.InternalData["user-id"].(string) // Skipping CIDR verification to enable renewal from machines other than // the ones encompassed by CIDR block. if _, resp, err := b.verifyCredentials(req, appId, userId); err != nil { return nil, err } else if resp != nil { return resp, nil } // Get the policies associated with the app mapPolicies, err := b.MapAppId.Policies(req.Storage, appId) if err != nil { return nil, err } if !policyutil.EquivalentPolicies(mapPolicies, req.Auth.Policies) { return nil, fmt.Errorf("policies do not match") } return framework.LeaseExtend(0, 0, b.System())(req, d) }
func TestBackend_parseAndVerifyRoleTagValue(t *testing.T) { // create a backend config := logical.TestBackendConfig() storage := &logical.InmemStorage{} config.StorageView = storage b, err := Backend(config) if err != nil { t.Fatal(err) } _, err = b.Setup(config) if err != nil { t.Fatal(err) } // create a role data := map[string]interface{}{ "policies": "p,q,r,s", "max_ttl": "120s", "role_tag": "VaultRole", "bound_ami_id": "abcd-123", } resp, err := b.HandleRequest(&logical.Request{ Operation: logical.CreateOperation, Path: "role/abcd-123", Storage: storage, Data: data, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } // verify that the entry is created resp, err = b.HandleRequest(&logical.Request{ Operation: logical.ReadOperation, Path: "role/abcd-123", Storage: storage, }) if resp == nil { t.Fatalf("expected an role entry for abcd-123") } // create a role tag data2 := map[string]interface{}{ "policies": "p,q,r,s", } resp, err = b.HandleRequest(&logical.Request{ Operation: logical.UpdateOperation, Path: "role/abcd-123/tag", Storage: storage, Data: data2, }) if err != nil { t.Fatal(err) } if resp.Data["tag_key"].(string) == "" || resp.Data["tag_value"].(string) == "" { t.Fatalf("invalid tag response: %#v\n", resp) } tagValue := resp.Data["tag_value"].(string) // parse the value and check if the verifiable values match rTag, err := b.parseAndVerifyRoleTagValue(storage, tagValue) if err != nil { t.Fatalf("err: %s", err) } if rTag == nil { t.Fatalf("failed to parse role tag") } if rTag.Version != "v1" || !policyutil.EquivalentPolicies(rTag.Policies, []string{"p", "q", "r", "s"}) || rTag.Role != "abcd-123" { t.Fatalf("bad: parsed role tag contains incorrect values. Got: %#v\n", rTag) } }
func TestBackend_pathRole(t *testing.T) { config := logical.TestBackendConfig() storage := &logical.InmemStorage{} config.StorageView = storage b, err := Backend(config) if err != nil { t.Fatal(err) } _, err = b.Setup(config) if err != nil { t.Fatal(err) } data := map[string]interface{}{ "policies": "p,q,r,s", "max_ttl": "2h", "bound_ami_id": "ami-abcd123", } resp, err := b.HandleRequest(&logical.Request{ Operation: logical.CreateOperation, Path: "role/ami-abcd123", Data: data, Storage: storage, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } resp, err = b.HandleRequest(&logical.Request{ Operation: logical.ReadOperation, Path: "role/ami-abcd123", Storage: storage, }) if err != nil { t.Fatal(err) } if resp == nil || resp.IsError() { t.Fatal("failed to read the role entry") } if !policyutil.EquivalentPolicies(strings.Split(data["policies"].(string), ","), resp.Data["policies"].([]string)) { t.Fatalf("bad: policies: expected: %#v\ngot: %#v\n", data, resp.Data) } data["allow_instance_migration"] = true data["disallow_reauthentication"] = true resp, err = b.HandleRequest(&logical.Request{ Operation: logical.UpdateOperation, Path: "role/ami-abcd123", Data: data, Storage: storage, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } resp, err = b.HandleRequest(&logical.Request{ Operation: logical.ReadOperation, Path: "role/ami-abcd123", Storage: storage, }) if err != nil { t.Fatal(err) } if !resp.Data["allow_instance_migration"].(bool) || !resp.Data["disallow_reauthentication"].(bool) { t.Fatal("bad: expected:true got:false\n") } // add another entry, to test listing of role entries resp, err = b.HandleRequest(&logical.Request{ Operation: logical.UpdateOperation, Path: "role/ami-abcd456", Data: data, Storage: storage, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } resp, err = b.HandleRequest(&logical.Request{ Operation: logical.ListOperation, Path: "roles", Storage: storage, }) if err != nil { t.Fatal(err) } if resp == nil || resp.Data == nil || resp.IsError() { t.Fatalf("failed to list the role entries") } keys := resp.Data["keys"].([]string) if len(keys) != 2 { t.Fatalf("bad: keys: %#v\n", keys) } _, err = b.HandleRequest(&logical.Request{ Operation: logical.DeleteOperation, Path: "role/ami-abcd123", Storage: storage, }) if err != nil { t.Fatal(err) } resp, err = b.HandleRequest(&logical.Request{ Operation: logical.ReadOperation, Path: "role/ami-abcd123", Storage: storage, }) if err != nil { t.Fatal(err) } if resp != nil { t.Fatalf("bad: response: expected:nil actual:%#v\n", resp) } }
func TestBackend_CreateParseVerifyRoleTag(t *testing.T) { // create a backend config := logical.TestBackendConfig() storage := &logical.InmemStorage{} config.StorageView = storage b, err := Backend(config) if err != nil { t.Fatal(err) } _, err = b.Setup(config) if err != nil { t.Fatal(err) } // create a role entry data := map[string]interface{}{ "policies": "p,q,r,s", "bound_ami_id": "abcd-123", } resp, err := b.HandleRequest(&logical.Request{ Operation: logical.UpdateOperation, Path: "role/abcd-123", Storage: storage, Data: data, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } // read the created role entry roleEntry, err := b.lockedAWSRole(storage, "abcd-123") if err != nil { t.Fatal(err) } // create a nonce for the role tag nonce, err := createRoleTagNonce() if err != nil { t.Fatal(err) } rTag1 := &roleTag{ Version: "v1", Role: "abcd-123", Nonce: nonce, Policies: []string{"p", "q", "r"}, MaxTTL: 200000000000, // 200s } // create a role tag against the role entry val, err := createRoleTagValue(rTag1, roleEntry) if err != nil { t.Fatal(err) } if val == "" { t.Fatalf("failed to create role tag") } // parse the created role tag rTag2, err := b.parseAndVerifyRoleTagValue(storage, val) if err != nil { t.Fatal(err) } // check the values in parsed role tag if rTag2.Version != "v1" || rTag2.Nonce != nonce || rTag2.Role != "abcd-123" || rTag2.MaxTTL != 200000000000 || // 200s !policyutil.EquivalentPolicies(rTag2.Policies, []string{"p", "q", "r"}) || len(rTag2.HMAC) == 0 { t.Fatalf("parsed role tag is invalid") } // verify the tag contents using role specific HMAC key verified, err := verifyRoleTagValue(rTag2, roleEntry) if err != nil { t.Fatal(err) } if !verified { t.Fatalf("failed to verify the role tag") } // register a different role resp, err = b.HandleRequest(&logical.Request{ Operation: logical.UpdateOperation, Path: "role/ami-6789", Storage: storage, Data: data, }) if resp != nil && resp.IsError() { t.Fatalf("failed to create role") } if err != nil { t.Fatal(err) } // get the entry of the newly created role entry roleEntry2, err := b.lockedAWSRole(storage, "ami-6789") if err != nil { t.Fatal(err) } // try to verify the tag created with previous role's HMAC key // with the newly registered entry's HMAC key verified, err = verifyRoleTagValue(rTag2, roleEntry2) if err != nil { t.Fatal(err) } if verified { t.Fatalf("verification of role tag should have failed") } // modify any value in role tag and try to verify it rTag2.Version = "v2" verified, err = verifyRoleTagValue(rTag2, roleEntry) if err != nil { t.Fatal(err) } if verified { t.Fatalf("verification of role tag should have failed: invalid Version") } }
func TestAppRole_RoleCRUD(t *testing.T) { var resp *logical.Response var err error b, storage := createBackendWithStorage(t) roleData := map[string]interface{}{ "policies": "p,q,r,s", "secret_id_num_uses": 10, "secret_id_ttl": 300, "token_ttl": 400, "token_max_ttl": 500, "bound_cidr_list": "127.0.0.1/32,127.0.0.1/16", } roleReq := &logical.Request{ Operation: logical.CreateOperation, Path: "role/role1", Storage: storage, Data: roleData, } resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } expected := map[string]interface{}{ "bind_secret_id": true, "policies": []string{"default", "p", "q", "r", "s"}, "secret_id_num_uses": 10, "secret_id_ttl": 300, "token_ttl": 400, "token_max_ttl": 500, "bound_cidr_list": "127.0.0.1/32,127.0.0.1/16", } var expectedStruct roleStorageEntry err = mapstructure.Decode(expected, &expectedStruct) if err != nil { t.Fatal(err) } var actualStruct roleStorageEntry err = mapstructure.Decode(resp.Data, &actualStruct) if err != nil { t.Fatal(err) } expectedStruct.RoleID = actualStruct.RoleID if !reflect.DeepEqual(expectedStruct, actualStruct) { t.Fatalf("bad:\nexpected:%#v\nactual:%#v\n", expectedStruct, actualStruct) } roleData = map[string]interface{}{ "role_id": "test_role_id", "policies": "a,b,c,d", "secret_id_num_uses": 100, "secret_id_ttl": 3000, "token_ttl": 4000, "token_max_ttl": 5000, } roleReq.Data = roleData roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } expected = map[string]interface{}{ "policies": []string{"a", "b", "c", "d", "default"}, "secret_id_num_uses": 100, "secret_id_ttl": 3000, "token_ttl": 4000, "token_max_ttl": 5000, } err = mapstructure.Decode(expected, &expectedStruct) if err != nil { t.Fatal(err) } err = mapstructure.Decode(resp.Data, &actualStruct) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(expectedStruct, actualStruct) { t.Fatalf("bad:\nexpected:%#v\nactual:%#v\n", expectedStruct, actualStruct) } // RU for role_id field roleReq.Path = "role/role1/role-id" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["role_id"].(string) != "test_role_id" { t.Fatalf("bad: role_id: expected:test_role_id actual:%s\n", resp.Data["role_id"].(string)) } roleReq.Data = map[string]interface{}{"role_id": "custom_role_id"} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["role_id"].(string) != "custom_role_id" { t.Fatalf("bad: role_id: expected:custom_role_id actual:%s\n", resp.Data["role_id"].(string)) } // RUD for bind_secret_id field roleReq.Path = "role/role1/bind-secret-id" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"bind_secret_id": false} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["bind_secret_id"].(bool) { t.Fatalf("bad: bind_secret_id: expected:false actual:%t\n", resp.Data["bind_secret_id"].(bool)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if !resp.Data["bind_secret_id"].(bool) { t.Fatalf("expected the default value of 'true' to be set") } // RUD for policiess field roleReq.Path = "role/role1/policies" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"policies": "a1,b1,c1,d1"} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if !reflect.DeepEqual(resp.Data["policies"].([]string), []string{"a1", "b1", "c1", "d1", "default"}) { t.Fatalf("bad: policies: actual:%s\n", resp.Data["policies"].([]string)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } expectedPolicies := []string{"default"} actualPolicies := resp.Data["policies"].([]string) if !policyutil.EquivalentPolicies(expectedPolicies, actualPolicies) { t.Fatalf("bad: policies: expected:%s actual:%s", expectedPolicies, actualPolicies) } // RUD for secret-id-num-uses field roleReq.Path = "role/role1/secret-id-num-uses" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"secret_id_num_uses": 200} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["secret_id_num_uses"].(int) != 200 { t.Fatalf("bad: secret_id_num_uses: expected:200 actual:%d\n", resp.Data["secret_id_num_uses"].(int)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["secret_id_num_uses"].(int) != 0 { t.Fatalf("expected value to be reset") } // RUD for secret_id_ttl field roleReq.Path = "role/role1/secret-id-ttl" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"secret_id_ttl": 3001} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["secret_id_ttl"].(time.Duration) != 3001 { t.Fatalf("bad: secret_id_ttl: expected:3001 actual:%d\n", resp.Data["secret_id_ttl"].(time.Duration)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["secret_id_ttl"].(time.Duration) != 0 { t.Fatalf("expected value to be reset") } // RUD for 'period' field roleReq.Path = "role/role1/period" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"period": 9001} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["period"].(time.Duration) != 9001 { t.Fatalf("bad: period: expected:9001 actual:%d\n", resp.Data["9001"].(time.Duration)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["period"].(time.Duration) != 0 { t.Fatalf("expected value to be reset") } // RUD for token_ttl field roleReq.Path = "role/role1/token-ttl" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"token_ttl": 4001} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["token_ttl"].(time.Duration) != 4001 { t.Fatalf("bad: token_ttl: expected:4001 actual:%d\n", resp.Data["token_ttl"].(time.Duration)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["token_ttl"].(time.Duration) != 0 { t.Fatalf("expected value to be reset") } // RUD for token_max_ttl field roleReq.Path = "role/role1/token-max-ttl" roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Data = map[string]interface{}{"token_max_ttl": 5001} roleReq.Operation = logical.UpdateOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["token_max_ttl"].(time.Duration) != 5001 { t.Fatalf("bad: token_max_ttl: expected:5001 actual:%d\n", resp.Data["token_max_ttl"].(time.Duration)) } roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp.Data["token_max_ttl"].(time.Duration) != 0 { t.Fatalf("expected value to be reset") } // Delete test for role roleReq.Path = "role/role1" roleReq.Operation = logical.DeleteOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } roleReq.Operation = logical.ReadOperation resp, err = b.HandleRequest(roleReq) if err != nil || (resp != nil && resp.IsError()) { t.Fatalf("err:%v resp:%#v", err, resp) } if resp != nil { t.Fatalf("expected a nil response") } }