func TestPassthroughBackend_Delete(t *testing.T) { test := func(b logical.Backend) { req := logical.TestRequest(t, logical.WriteOperation, "foo") req.Data["raw"] = "test" storage := req.Storage if _, err := b.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } req = logical.TestRequest(t, logical.DeleteOperation, "foo") req.Storage = storage resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } req = logical.TestRequest(t, logical.ReadOperation, "foo") req.Storage = storage resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } } b := testPassthroughBackend() test(b) b = testPassthroughLeasedBackend() test(b) }
func TestSystemBackend_disableAudit(t *testing.T) { c, b, _ := testCoreSystemBackend(t) c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) { return &NoopAudit{ Config: config, }, nil } req := logical.TestRequest(t, logical.WriteOperation, "audit/foo") req.Data["type"] = "noop" req.Data["description"] = "testing" req.Data["options"] = map[string]interface{}{ "foo": "bar", } b.HandleRequest(req) // Deregister it req = logical.TestRequest(t, logical.DeleteOperation, "audit/foo") resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } }
func TestPassthroughBackend_List(t *testing.T) { test := func(b logical.Backend) { req := logical.TestRequest(t, logical.WriteOperation, "foo") req.Data["raw"] = "test" storage := req.Storage if _, err := b.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } req = logical.TestRequest(t, logical.ListOperation, "") req.Storage = storage resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } expected := &logical.Response{ Data: map[string]interface{}{ "keys": []string{"foo"}, }, } if !reflect.DeepEqual(resp, expected) { t.Fatalf("bad response.\n\nexpected: %#v\n\nGot: %#v", expected, resp) } } b := testPassthroughBackend() test(b) b = testPassthroughLeasedBackend() test(b) }
func TestCubbyholeBackend_Read(t *testing.T) { b := testCubbyholeBackend() req := logical.TestRequest(t, logical.UpdateOperation, "foo") req.Data["raw"] = "test" storage := req.Storage clientToken := uuid.GenerateUUID() req.ClientToken = clientToken if _, err := b.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } req = logical.TestRequest(t, logical.ReadOperation, "foo") req.Storage = storage req.ClientToken = clientToken resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } expected := &logical.Response{ Data: map[string]interface{}{ "raw": "test", }, } if !reflect.DeepEqual(resp, expected) { t.Fatalf("bad response.\n\nexpected: %#v\n\nGot: %#v", expected, resp) } }
func TestCubbyholeBackend_Delete(t *testing.T) { b := testCubbyholeBackend() req := logical.TestRequest(t, logical.UpdateOperation, "foo") req.Data["raw"] = "test" storage := req.Storage clientToken := uuid.GenerateUUID() req.ClientToken = clientToken if _, err := b.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } req = logical.TestRequest(t, logical.DeleteOperation, "foo") req.Storage = storage req.ClientToken = clientToken resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } req = logical.TestRequest(t, logical.ReadOperation, "foo") req.Storage = storage req.ClientToken = clientToken resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } }
func TestSystemBackend_rawReadWrite(t *testing.T) { c, b, _ := testCoreSystemBackend(t) req := logical.TestRequest(t, logical.UpdateOperation, "raw/sys/policy/test") req.Data["value"] = `path "secret/" { policy = "read" }` resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } // Read via raw API req = logical.TestRequest(t, logical.ReadOperation, "raw/sys/policy/test") resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if !strings.HasPrefix(resp.Data["value"].(string), "path") { t.Fatalf("bad: %v", resp) } // Read the policy! p, err := c.policyStore.GetPolicy("test") if err != nil { t.Fatalf("err: %v", err) } if p == nil || len(p.Paths) == 0 { t.Fatalf("missing policy %#v", p) } if p.Paths[0].Prefix != "secret/" || p.Paths[0].Policy != ReadCapability { t.Fatalf("Bad: %#v", p) } }
func TestSystemBackend_rotate(t *testing.T) { b := testSystemBackend(t) req := logical.TestRequest(t, logical.WriteOperation, "rotate") resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } req = logical.TestRequest(t, logical.ReadOperation, "key-status") resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } exp := map[string]interface{}{ "term": 2, } delete(resp.Data, "install_time") if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("got: %#v expect: %#v", resp.Data, exp) } }
func TestSystemBackend_auditTable(t *testing.T) { c, b, _ := testCoreSystemBackend(t) c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) { return &NoopAudit{ Config: config, }, nil } req := logical.TestRequest(t, logical.WriteOperation, "audit/foo") req.Data["type"] = "noop" req.Data["description"] = "testing" req.Data["options"] = map[string]interface{}{ "foo": "bar", } b.HandleRequest(req) req = logical.TestRequest(t, logical.ReadOperation, "audit") resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } exp := map[string]interface{}{ "foo/": map[string]interface{}{ "type": "noop", "description": "testing", "options": map[string]string{ "foo": "bar", }, }, } if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("got: %#v expect: %#v", resp.Data, exp) } }
func TestSystemBackend_CapabilitiesAccessor(t *testing.T) { core, b, rootToken := testCoreSystemBackend(t) te, err := core.tokenStore.Lookup(rootToken) if err != nil { t.Fatal(err) } req := logical.TestRequest(t, logical.UpdateOperation, "capabilities-accessor") // Accessor of root token req.Data["accessor"] = te.Accessor req.Data["path"] = "any_path" resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp == nil { t.Fatalf("bad: %v", resp) } actual := resp.Data["capabilities"] expected := []string{"root"} if !reflect.DeepEqual(actual, expected) { t.Fatalf("bad: got\n%#v\nexpected\n%#v\n", actual, expected) } policy, _ := Parse(capabilitiesPolicy) err = core.policyStore.SetPolicy(policy) if err != nil { t.Fatalf("err: %v", err) } testMakeToken(t, core.tokenStore, rootToken, "tokenid", "", []string{"test"}) te, err = core.tokenStore.Lookup("tokenid") if err != nil { t.Fatal(err) } req = logical.TestRequest(t, logical.UpdateOperation, "capabilities-accessor") req.Data["accessor"] = te.Accessor req.Data["path"] = "foo/bar" resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp == nil { t.Fatalf("bad: %v", resp) } actual = resp.Data["capabilities"] expected = []string{"create", "sudo", "update"} if !reflect.DeepEqual(actual, expected) { t.Fatalf("bad: got\n%#v\nexpected\n%#v\n", actual, expected) } }
// Verify that we are able to update from non-salted (<0.2) to // using a Salt for the paths func TestBackend_upgradeToSalted(t *testing.T) { inm := new(logical.InmemStorage) // Create some fake keys se, _ := logical.StorageEntryJSON("struct/map/app-id/foo", map[string]string{"value": "test"}) inm.Put(se) se, _ = logical.StorageEntryJSON("struct/map/user-id/bar", map[string]string{"value": "foo"}) inm.Put(se) // Initialize the backend, this should do the automatic upgrade conf := &logical.BackendConfig{ StorageView: inm, } backend, err := Factory(conf) if err != nil { t.Fatalf("err: %v", err) } // Check the keys have been upgraded out, err := inm.Get("struct/map/app-id/foo") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("unexpected key") } out, err = inm.Get("struct/map/user-id/bar") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("unexpected key") } // Backend should still be able to resolve req := logical.TestRequest(t, logical.ReadOperation, "map/app-id/foo") req.Storage = inm resp, err := backend.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp.Data["value"] != "test" { t.Fatalf("bad: %#v", resp) } req = logical.TestRequest(t, logical.ReadOperation, "map/user-id/bar") req.Storage = inm resp, err = backend.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp.Data["value"] != "foo" { t.Fatalf("bad: %#v", resp) } }
// Renew of a token should not create a new lease func TestCore_RenewToken_SingleRegister(t *testing.T) { c, _, root := TestCoreUnsealed(t) // Create a new token req := &logical.Request{ Operation: logical.UpdateOperation, Path: "auth/token/create", Data: map[string]interface{}{ "lease": "1h", }, ClientToken: root, } resp, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } newClient := resp.Auth.ClientToken // Renew the token req = logical.TestRequest(t, logical.UpdateOperation, "auth/token/renew") req.ClientToken = newClient req.Data = map[string]interface{}{ "token": newClient, } resp, err = c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Revoke using the renew prefix req = logical.TestRequest(t, logical.UpdateOperation, "sys/revoke-prefix/auth/token/renew/") req.ClientToken = root resp, err = c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Verify our token is still valid (e.g. we did not get invalided by the revoke) req = logical.TestRequest(t, logical.UpdateOperation, "auth/token/lookup") req.Data = map[string]interface{}{ "token": newClient, } req.ClientToken = newClient resp, err = c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Verify the token exists if resp.Data["id"] != newClient { t.Fatalf("bad: %#v", resp.Data) } }
func TestTokenStore_HandleRequest_Lookup(t *testing.T) { _, ts, root := mockTokenStore(t) req := logical.TestRequest(t, logical.ReadOperation, "lookup/"+root) resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp == nil { t.Fatalf("bad: %#v", resp) } exp := map[string]interface{}{ "id": root, "policies": []string{"root"}, "path": "auth/token/root", "meta": map[string]string(nil), "display_name": "root", "orphan": true, "num_uses": 0, "ttl": 0, } delete(resp.Data, "creation_time") if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("bad:\n%#v\nexp:\n%#v\n", resp.Data, exp) } testMakeToken(t, ts, root, "client", []string{"foo"}) req = logical.TestRequest(t, logical.ReadOperation, "lookup/client") resp, err = ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp == nil { t.Fatalf("bad: %#v", resp) } exp = map[string]interface{}{ "id": "client", "policies": []string{"foo"}, "path": "auth/token/create", "meta": map[string]string(nil), "display_name": "token", "orphan": false, "num_uses": 0, "ttl": 2592000, } delete(resp.Data, "creation_time") if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("bad:\n%#v\nexp:\n%#v\n", resp.Data, exp) } }
func TestSystemBackend_auditHash(t *testing.T) { c, b, _ := testCoreSystemBackend(t) c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) { view := &logical.InmemStorage{} view.Put(&logical.StorageEntry{ Key: "salt", Value: []byte("foo"), }) var err error config.Salt, err = salt.NewSalt(view, &salt.Config{ HMAC: sha256.New, HMACType: "hmac-sha256", }) if err != nil { t.Fatalf("error getting new salt: %v", err) } return &NoopAudit{ Config: config, }, nil } req := logical.TestRequest(t, logical.UpdateOperation, "audit/foo") req.Data["type"] = "noop" resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } req = logical.TestRequest(t, logical.UpdateOperation, "audit-hash/foo") req.Data["input"] = "bar" resp, err = b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp == nil || resp.Data == nil { t.Fatalf("response or its data was nil") } hash, ok := resp.Data["hash"] if !ok { t.Fatalf("did not get hash back in response, response was %#v", resp.Data) } if hash.(string) != "hmac-sha256:f9320baf0249169e73850cd6156ded0106e2bb6ad8cab01b7bbbebe6d1065317" { t.Fatalf("bad hash back: %s", hash.(string)) } }
func TestPassthroughBackend_Read(t *testing.T) { test := func(b logical.Backend, ttlType string, leased bool) { req := logical.TestRequest(t, logical.WriteOperation, "foo") req.Data["raw"] = "test" req.Data[ttlType] = "1h" storage := req.Storage if _, err := b.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } req = logical.TestRequest(t, logical.ReadOperation, "foo") req.Storage = storage resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } expected := &logical.Response{ Secret: &logical.Secret{ LeaseOptions: logical.LeaseOptions{ Renewable: true, TTL: time.Hour, }, }, Data: map[string]interface{}{ "raw": "test", ttlType: "1h", }, } if !leased { expected.Secret.Renewable = false } resp.Secret.InternalData = nil resp.Secret.LeaseID = "" if !reflect.DeepEqual(resp, expected) { t.Fatalf("bad response.\n\nexpected: %#v\n\nGot: %#v", expected, resp) } } b := testPassthroughLeasedBackend() test(b, "lease", true) test(b, "ttl", true) b = testPassthroughBackend() test(b, "lease", false) test(b, "ttl", false) }
func TestCore_HandleRequest_ConnOnLogin(t *testing.T) { noop := &NoopBackend{ Login: []string{"login"}, Response: &logical.Response{}, } c, _, root := TestCoreUnsealed(t) c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) { return noop, nil } // Enable the credential backend req := logical.TestRequest(t, logical.UpdateOperation, "sys/auth/foo") req.Data["type"] = "noop" req.ClientToken = root _, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Attempt to request with connection data req = &logical.Request{ Path: "auth/foo/login", Connection: &logical.Connection{}, } if _, err := c.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } if noop.Requests[0].Connection == nil { t.Fatalf("bad: %#v", noop.Requests) } }
func TestTokenStore_HandleRequest_LookupSelf(t *testing.T) { _, ts, _, root := TestCoreWithTokenStore(t) req := logical.TestRequest(t, logical.ReadOperation, "lookup-self") req.ClientToken = root resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp == nil { t.Fatalf("bad: %#v", resp) } exp := map[string]interface{}{ "id": root, "policies": []string{"root"}, "path": "auth/token/root", "meta": map[string]string(nil), "display_name": "root", "orphan": true, "num_uses": 0, "ttl": int64(0), } if resp.Data["creation_time"].(int64) == 0 { t.Fatalf("creation time was zero") } delete(resp.Data, "creation_time") if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("bad:\ngot %#v\nexpected: %#v\n", resp.Data, exp) } }
func TestCore_HandleRequest_NoClientToken(t *testing.T) { noop := &NoopBackend{ Response: &logical.Response{}, } c, _, root := TestCoreUnsealed(t) c.logicalBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) { return noop, nil } // Enable the logical backend req := logical.TestRequest(t, logical.UpdateOperation, "sys/mounts/foo") req.Data["type"] = "noop" req.Data["description"] = "foo" req.ClientToken = root _, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Attempt to request with connection data req = &logical.Request{ Path: "foo/login", } req.ClientToken = root if _, err := c.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } ct := noop.Requests[0].ClientToken if ct == "" || ct == root { t.Fatalf("bad: %#v", noop.Requests) } }
func TestSystemBackend_mounts(t *testing.T) { b := testSystemBackend(t) req := logical.TestRequest(t, logical.ReadOperation, "mounts") resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // We can't know the pointer address ahead of time so simply // copy what's given exp := map[string]interface{}{ "secret/": map[string]interface{}{ "type": "generic", "description": "generic secret storage", "config": map[string]interface{}{ "default_lease_ttl": resp.Data["secret/"].(map[string]interface{})["config"].(map[string]interface{})["default_lease_ttl"].(time.Duration), "max_lease_ttl": resp.Data["secret/"].(map[string]interface{})["config"].(map[string]interface{})["max_lease_ttl"].(time.Duration), }, }, "sys/": map[string]interface{}{ "type": "system", "description": "system endpoints used for control, policy and debugging", "config": map[string]interface{}{ "default_lease_ttl": resp.Data["sys/"].(map[string]interface{})["config"].(map[string]interface{})["default_lease_ttl"].(time.Duration), "max_lease_ttl": resp.Data["sys/"].(map[string]interface{})["config"].(map[string]interface{})["max_lease_ttl"].(time.Duration), }, }, } if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("Got:\n%#v\nExpected:\n%#v", resp.Data, exp) } }
// Ensure login does not return a secret func TestCore_HandleLogin_ReturnSecret(t *testing.T) { // Create a badass credential backend that always logs in as armon noopBack := &NoopBackend{ Login: []string{"login"}, Response: &logical.Response{ Secret: &logical.Secret{}, Auth: &logical.Auth{ Policies: []string{"foo", "bar"}, }, }, } c, _, root := TestCoreUnsealed(t) c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) { return noopBack, nil } // Enable the credential backend req := logical.TestRequest(t, logical.UpdateOperation, "sys/auth/foo") req.Data["type"] = "noop" req.ClientToken = root _, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Attempt to login lreq := &logical.Request{ Path: "auth/foo/login", } _, err = c.HandleRequest(lreq) if err != ErrInternalError { t.Fatalf("err: %v", err) } }
func TestCore_HandleRequest_AuditTrail(t *testing.T) { // Create a noop audit backend noop := &NoopAudit{} c, _, root := TestCoreUnsealed(t) c.auditBackends["noop"] = func(map[string]string) (audit.Backend, error) { return noop, nil } // Enable the audit backend req := logical.TestRequest(t, logical.WriteOperation, "sys/audit/noop") req.Data["type"] = "noop" req.ClientToken = root resp, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Make a request req = &logical.Request{ Operation: logical.WriteOperation, Path: "secret/test", Data: map[string]interface{}{ "foo": "bar", "lease": "1h", }, ClientToken: root, } req.ClientToken = root if _, err := c.HandleRequest(req); err != nil { t.Fatalf("err: %v", err) } // Check the audit trail on request and response if len(noop.ReqAuth) != 1 { t.Fatalf("bad: %#v", noop) } auth := noop.ReqAuth[0] if auth.ClientToken != root { t.Fatalf("bad client token: %#v", auth) } if len(auth.Policies) != 1 || auth.Policies[0] != "root" { t.Fatalf("bad: %#v", auth) } if len(noop.Req) != 1 || !reflect.DeepEqual(noop.Req[0], req) { t.Fatalf("Bad: %#v", noop.Req[0]) } if len(noop.RespAuth) != 2 { t.Fatalf("bad: %#v", noop) } if !reflect.DeepEqual(noop.RespAuth[1], auth) { t.Fatalf("bad: %#v", auth) } if len(noop.RespReq) != 2 || !reflect.DeepEqual(noop.RespReq[1], req) { t.Fatalf("Bad: %#v", noop.RespReq[1]) } if len(noop.Resp) != 2 || !reflect.DeepEqual(noop.Resp[1], resp) { t.Fatalf("Bad: %#v", noop.Resp[1]) } }
func TestCore_LimitedUseToken(t *testing.T) { c, _, root := TestCoreUnsealed(t) // Create a new credential req := logical.TestRequest(t, logical.UpdateOperation, "auth/token/create") req.ClientToken = root req.Data["num_uses"] = "1" resp, err := c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Put a secret req = &logical.Request{ Operation: logical.UpdateOperation, Path: "secret/foo", Data: map[string]interface{}{ "foo": "bar", }, ClientToken: resp.Auth.ClientToken, } _, err = c.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } // Second operation should fail _, err = c.HandleRequest(req) if err == nil || !errwrap.Contains(err, logical.ErrPermissionDenied.Error()) { t.Fatalf("err: %v", err) } }
func TestSystemBackend_rawDelete(t *testing.T) { c, b, _ := testCoreSystemBackend(t) // set the policy! p := &Policy{Name: "test"} err := c.policy.SetPolicy(p) if err != nil { t.Fatalf("err: %v", err) } // Delete the policy req := logical.TestRequest(t, logical.DeleteOperation, "raw/sys/policy/test") resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } // Policy should be gone c.policy.lru.Purge() out, err := c.policy.GetPolicy("test") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("policy should be gone") } }
func TestTokenStore_HandleRequest_Revoke(t *testing.T) { _, ts, _, root := TestCoreWithTokenStore(t) testMakeToken(t, ts, root, "child", "", []string{"root", "foo"}) testMakeToken(t, ts, "child", "sub-child", "", []string{"foo"}) req := logical.TestRequest(t, logical.UpdateOperation, "revoke/child") resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp != nil { t.Fatalf("bad: %#v", resp) } out, err := ts.Lookup("child") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("bad: %v", out) } // Sub-child should not exist out, err = ts.Lookup("sub-child") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("bad: %v", out) } }
func TestTokenStore_HandleRequest_CreateToken_Metadata(t *testing.T) { _, ts, root := mockTokenStore(t) req := logical.TestRequest(t, logical.WriteOperation, "create") req.ClientToken = root req.Data["policies"] = []string{"foo"} meta := map[string]string{ "user": "******", "source": "github", } req.Data["meta"] = meta resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp.Auth.ClientToken == "" { t.Fatalf("bad: %#v", resp) } out, _ := ts.Lookup(resp.Auth.ClientToken) if !reflect.DeepEqual(out.Meta, meta) { t.Fatalf("bad: %#v", out) } }
func TestTokenStore_HandleRequest_CreateToken_NoPolicy(t *testing.T) { _, ts, root := mockTokenStore(t) req := logical.TestRequest(t, logical.WriteOperation, "create") req.ClientToken = root resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } expected := &TokenEntry{ ID: resp.Auth.ClientToken, Parent: root, Policies: []string{"root"}, Path: "auth/token/create", DisplayName: "token", TTL: 0, } out, err := ts.Lookup(resp.Auth.ClientToken) if err != nil { t.Fatalf("err: %v", err) } expected.CreationTime = out.CreationTime if !reflect.DeepEqual(out, expected) { t.Fatalf("bad: %#v", out) } }
func TestTokenStore_HandleRequest_RevokeOrphan_NonRoot(t *testing.T) { _, ts, root := mockTokenStore(t) testMakeToken(t, ts, root, "child", []string{"foo"}) out, err := ts.Lookup("child") if err != nil { t.Fatalf("err: %v", err) } if out == nil { t.Fatalf("bad: %v", out) } req := logical.TestRequest(t, logical.WriteOperation, "revoke-orphan/child") req.ClientToken = "child" resp, err := ts.HandleRequest(req) if err != logical.ErrInvalidRequest { t.Fatalf("did not get error when non-root revoking itself with orphan flag; resp is %#v", resp) } // Should still exist out, err = ts.Lookup("child") if err != nil { t.Fatalf("err: %v", err) } if out == nil { t.Fatalf("bad: %v", out) } }
func TestTokenStore_HandleRequest_RevokeOrphan(t *testing.T) { _, ts, root := mockTokenStore(t) testMakeToken(t, ts, root, "child", []string{"root", "foo"}) testMakeToken(t, ts, "child", "sub-child", []string{"foo"}) req := logical.TestRequest(t, logical.WriteOperation, "revoke-orphan/child") req.ClientToken = root resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp != nil { t.Fatalf("bad: %#v", resp) } out, err := ts.Lookup("child") if err != nil { t.Fatalf("err: %v", err) } if out != nil { t.Fatalf("bad: %v", out) } // Sub-child should exist! out, err = ts.Lookup("sub-child") if err != nil { t.Fatalf("err: %v", err) } if out == nil { t.Fatalf("bad: %v", out) } }
func TestTokenStore_HandleRequest_CreateToken_DisplayName(t *testing.T) { _, ts, _, root := TestCoreWithTokenStore(t) req := logical.TestRequest(t, logical.UpdateOperation, "create") req.ClientToken = root req.Data["display_name"] = "foo_bar.baz!" resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } expected := &TokenEntry{ ID: resp.Auth.ClientToken, Parent: root, Policies: []string{"root"}, Path: "auth/token/create", DisplayName: "token-foo-bar-baz", TTL: 0, } out, err := ts.Lookup(resp.Auth.ClientToken) if err != nil { t.Fatalf("err: %v", err) } expected.CreationTime = out.CreationTime if !reflect.DeepEqual(out, expected) { t.Fatalf("bad: %#v", out) } }
func TestTokenStore_HandleRequest_LookupSelf(t *testing.T) { _, ts, root := mockTokenStore(t) req := logical.TestRequest(t, logical.ReadOperation, "lookup-self") req.ClientToken = root resp, err := ts.HandleRequest(req) if err != nil { t.Fatalf("err: %v %v", err, resp) } if resp == nil { t.Fatalf("bad: %#v", resp) } exp := map[string]interface{}{ "id": root, "policies": []string{"root"}, "path": "auth/token/root", "meta": map[string]string(nil), "display_name": "root", "num_uses": 0, "ttl": 0, } delete(resp.Data, "creation_time") if !reflect.DeepEqual(resp.Data, exp) { t.Fatalf("bad: %#v exp: %#v", resp.Data, exp) } }
func TestSystemBackend_rawWrite(t *testing.T) { c, b, _ := testCoreSystemBackend(t) req := logical.TestRequest(t, logical.WriteOperation, "raw/sys/policy/test") req.Data["value"] = `path "secret/" { policy = "read" }` resp, err := b.HandleRequest(req) if err != nil { t.Fatalf("err: %v", err) } if resp != nil { t.Fatalf("bad: %v", resp) } // Read the policy! p, err := c.policy.GetPolicy("test") if err != nil { t.Fatalf("err: %v", err) } if p == nil || len(p.Paths) == 0 { t.Fatalf("missing policy %#v", p) } if p.Paths[0].Prefix != "secret/" || p.Paths[0].Policy != PathPolicyRead { t.Fatalf("Bad: %#v", p) } }