mirror of https://github.com/hashicorp/consul
Merge pull request #12167 from hashicorp/dnephin/acl-resolve-token-3
acl: rename ResolveTokenToIdentityAndAuthorizer to ResolveTokenpull/12242/head
commit
9d80c1886a
|
@ -86,16 +86,13 @@ func (a *TestACLAgent) ResolveToken(secretID string) (acl.Authorizer, error) {
|
||||||
return authz, err
|
return authz, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *TestACLAgent) ResolveTokenToIdentityAndAuthorizer(secretID string) (structs.ACLIdentity, acl.Authorizer, error) {
|
func (a *TestACLAgent) ResolveTokenAndDefaultMeta(secretID string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (consul.ACLResolveResult, error) {
|
||||||
if a.resolveAuthzFn == nil {
|
authz, err := a.ResolveToken(secretID)
|
||||||
return nil, nil, fmt.Errorf("ResolveTokenToIdentityAndAuthorizer call is unexpected - no authz resolver callback set")
|
if err != nil {
|
||||||
|
return consul.ACLResolveResult{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return a.resolveAuthzFn(secretID)
|
identity, err := a.resolveIdentFn(secretID)
|
||||||
}
|
|
||||||
|
|
||||||
func (a *TestACLAgent) ResolveTokenAndDefaultMeta(secretID string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (consul.ACLResolveResult, error) {
|
|
||||||
identity, authz, err := a.ResolveTokenToIdentityAndAuthorizer(secretID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return consul.ACLResolveResult{}, err
|
return consul.ACLResolveResult{}, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1053,13 +1053,16 @@ func (r *ACLResolver) resolveLocallyManagedToken(token string) (structs.ACLIdent
|
||||||
return r.resolveLocallyManagedEnterpriseToken(token)
|
return r.resolveLocallyManagedEnterpriseToken(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs.ACLIdentity, acl.Authorizer, error) {
|
// ResolveToken to an acl.Authorizer and structs.ACLIdentity. The acl.Authorizer
|
||||||
|
// can be used to check permissions granted to the token, and the ACLIdentity
|
||||||
|
// describes the token and any defaults applied to it.
|
||||||
|
func (r *ACLResolver) ResolveToken(token string) (ACLResolveResult, error) {
|
||||||
if !r.ACLsEnabled() {
|
if !r.ACLsEnabled() {
|
||||||
return nil, acl.ManageAll(), nil
|
return ACLResolveResult{Authorizer: acl.ManageAll()}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if acl.RootAuthorizer(token) != nil {
|
if acl.RootAuthorizer(token) != nil {
|
||||||
return nil, nil, acl.ErrRootDenied
|
return ACLResolveResult{}, acl.ErrRootDenied
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle the anonymous token
|
// handle the anonymous token
|
||||||
|
@ -1068,7 +1071,7 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs
|
||||||
}
|
}
|
||||||
|
|
||||||
if ident, authz, ok := r.resolveLocallyManagedToken(token); ok {
|
if ident, authz, ok := r.resolveLocallyManagedToken(token); ok {
|
||||||
return ident, authz, nil
|
return ACLResolveResult{Authorizer: authz, ACLIdentity: ident}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
defer metrics.MeasureSince([]string{"acl", "ResolveToken"}, time.Now())
|
defer metrics.MeasureSince([]string{"acl", "ResolveToken"}, time.Now())
|
||||||
|
@ -1078,10 +1081,11 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs
|
||||||
r.handleACLDisabledError(err)
|
r.handleACLDisabledError(err)
|
||||||
if IsACLRemoteError(err) {
|
if IsACLRemoteError(err) {
|
||||||
r.logger.Error("Error resolving token", "error", err)
|
r.logger.Error("Error resolving token", "error", err)
|
||||||
return &missingIdentity{reason: "primary-dc-down", token: token}, r.down, nil
|
ident := &missingIdentity{reason: "primary-dc-down", token: token}
|
||||||
|
return ACLResolveResult{Authorizer: r.down, ACLIdentity: ident}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, nil, err
|
return ACLResolveResult{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the Authorizer
|
// Build the Authorizer
|
||||||
|
@ -1094,7 +1098,7 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs
|
||||||
|
|
||||||
authz, err := policies.Compile(r.cache, &conf)
|
authz, err := policies.Compile(r.cache, &conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return ACLResolveResult{}, err
|
||||||
}
|
}
|
||||||
chain = append(chain, authz)
|
chain = append(chain, authz)
|
||||||
|
|
||||||
|
@ -1102,15 +1106,15 @@ func (r *ACLResolver) ResolveTokenToIdentityAndAuthorizer(token string) (structs
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if IsACLRemoteError(err) {
|
if IsACLRemoteError(err) {
|
||||||
r.logger.Error("Error resolving identity defaults", "error", err)
|
r.logger.Error("Error resolving identity defaults", "error", err)
|
||||||
return identity, r.down, nil
|
return ACLResolveResult{Authorizer: r.down, ACLIdentity: identity}, nil
|
||||||
}
|
}
|
||||||
return nil, nil, err
|
return ACLResolveResult{}, err
|
||||||
} else if authz != nil {
|
} else if authz != nil {
|
||||||
chain = append(chain, authz)
|
chain = append(chain, authz)
|
||||||
}
|
}
|
||||||
|
|
||||||
chain = append(chain, acl.RootAuthorizer(r.config.ACLDefaultPolicy))
|
chain = append(chain, acl.RootAuthorizer(r.config.ACLDefaultPolicy))
|
||||||
return identity, acl.NewChainedAuthorizer(chain), nil
|
return ACLResolveResult{Authorizer: acl.NewChainedAuthorizer(chain), ACLIdentity: identity}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type ACLResolveResult struct {
|
type ACLResolveResult struct {
|
||||||
|
@ -1143,7 +1147,7 @@ func (r *ACLResolver) ACLsEnabled() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *ACLResolver) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (ACLResolveResult, error) {
|
func (r *ACLResolver) ResolveTokenAndDefaultMeta(token string, entMeta *structs.EnterpriseMeta, authzContext *acl.AuthorizerContext) (ACLResolveResult, error) {
|
||||||
identity, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token)
|
result, err := r.ResolveToken(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ACLResolveResult{}, err
|
return ACLResolveResult{}, err
|
||||||
}
|
}
|
||||||
|
@ -1154,8 +1158,8 @@ func (r *ACLResolver) ResolveTokenAndDefaultMeta(token string, entMeta *structs.
|
||||||
|
|
||||||
// Default the EnterpriseMeta based on the Tokens meta or actual defaults
|
// Default the EnterpriseMeta based on the Tokens meta or actual defaults
|
||||||
// in the case of unknown identity
|
// in the case of unknown identity
|
||||||
if identity != nil {
|
if result.ACLIdentity != nil {
|
||||||
entMeta.Merge(identity.EnterpriseMetadata())
|
entMeta.Merge(result.ACLIdentity.EnterpriseMetadata())
|
||||||
} else {
|
} else {
|
||||||
entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition())
|
entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition())
|
||||||
}
|
}
|
||||||
|
@ -1163,7 +1167,7 @@ func (r *ACLResolver) ResolveTokenAndDefaultMeta(token string, entMeta *structs.
|
||||||
// Use the meta to fill in the ACL authorization context
|
// Use the meta to fill in the ACL authorization context
|
||||||
entMeta.FillAuthzContext(authzContext)
|
entMeta.FillAuthzContext(authzContext)
|
||||||
|
|
||||||
return ACLResolveResult{Authorizer: authz, ACLIdentity: identity}, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// aclFilter is used to filter results from our state store based on ACL rules
|
// aclFilter is used to filter results from our state store based on ACL rules
|
||||||
|
@ -1973,7 +1977,7 @@ func filterACLWithAuthorizer(logger hclog.Logger, authorizer acl.Authorizer, sub
|
||||||
// not authorized for read access will be removed from subj.
|
// not authorized for read access will be removed from subj.
|
||||||
func filterACL(r *ACLResolver, token string, subj interface{}) error {
|
func filterACL(r *ACLResolver, token string, subj interface{}) error {
|
||||||
// Get the ACL from the token
|
// Get the ACL from the token
|
||||||
_, authorizer, err := r.ResolveTokenToIdentityAndAuthorizer(token)
|
authorizer, err := r.ResolveToken(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,12 +165,6 @@ func (s *serverACLResolverBackend) ResolveRoleFromID(roleID string) (bool, *stru
|
||||||
return s.InPrimaryDatacenter() || index > 0, role, acl.ErrNotFound
|
return s.InPrimaryDatacenter() || index > 0, role, acl.ErrNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove
|
|
||||||
func (s *Server) ResolveToken(token string) (acl.Authorizer, error) {
|
|
||||||
_, authz, err := s.ACLResolver.ResolveTokenToIdentityAndAuthorizer(token)
|
|
||||||
return authz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Server) filterACL(token string, subj interface{}) error {
|
func (s *Server) filterACL(token string, subj interface{}) error {
|
||||||
return filterACL(s.ACLResolver, token, subj)
|
return filterACL(s.ACLResolver, token, subj)
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,10 +46,11 @@ type asyncResolutionResult struct {
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyAuthorizerChain(t *testing.T, expected acl.Authorizer, actual acl.Authorizer) {
|
func verifyAuthorizerChain(t *testing.T, expected ACLResolveResult, actual ACLResolveResult) {
|
||||||
expectedChainAuthz, ok := expected.(*acl.ChainedAuthorizer)
|
t.Helper()
|
||||||
|
expectedChainAuthz, ok := expected.Authorizer.(*acl.ChainedAuthorizer)
|
||||||
require.True(t, ok, "expected Authorizer is not a ChainedAuthorizer")
|
require.True(t, ok, "expected Authorizer is not a ChainedAuthorizer")
|
||||||
actualChainAuthz, ok := actual.(*acl.ChainedAuthorizer)
|
actualChainAuthz, ok := actual.Authorizer.(*acl.ChainedAuthorizer)
|
||||||
require.True(t, ok, "actual Authorizer is not a ChainedAuthorizer")
|
require.True(t, ok, "actual Authorizer is not a ChainedAuthorizer")
|
||||||
|
|
||||||
expectedChain := expectedChainAuthz.AuthorizerChain()
|
expectedChain := expectedChainAuthz.AuthorizerChain()
|
||||||
|
@ -65,19 +66,13 @@ func verifyAuthorizerChain(t *testing.T, expected acl.Authorizer, actual acl.Aut
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveTokenAsync(r *ACLResolver, token string, ch chan *asyncResolutionResult) {
|
func resolveTokenAsync(r *ACLResolver, token string, ch chan *asyncResolutionResult) {
|
||||||
_, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token)
|
authz, err := r.ResolveToken(token)
|
||||||
ch <- &asyncResolutionResult{authz: authz, err: err}
|
ch <- &asyncResolutionResult{authz: authz, err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: use resolveToken or ACLResolver.ResolveTokenToIdentityAndAuthorizer instead
|
|
||||||
func (r *ACLResolver) ResolveToken(token string) (acl.Authorizer, error) {
|
|
||||||
_, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token)
|
|
||||||
return authz, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolveToken(t *testing.T, r *ACLResolver, token string) acl.Authorizer {
|
func resolveToken(t *testing.T, r *ACLResolver, token string) acl.Authorizer {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
_, authz, err := r.ResolveTokenToIdentityAndAuthorizer(token)
|
authz, err := r.ResolveToken(token)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
return authz
|
return authz
|
||||||
}
|
}
|
||||||
|
@ -739,7 +734,7 @@ func TestACLResolver_Disabled(t *testing.T) {
|
||||||
r := newTestACLResolver(t, delegate, nil)
|
r := newTestACLResolver(t, delegate, nil)
|
||||||
|
|
||||||
authz, err := r.ResolveToken("does not exist")
|
authz, err := r.ResolveToken("does not exist")
|
||||||
require.Equal(t, acl.ManageAll(), authz)
|
require.Equal(t, ACLResolveResult{Authorizer: acl.ManageAll()}, authz)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -753,22 +748,19 @@ func TestACLResolver_ResolveRootACL(t *testing.T) {
|
||||||
r := newTestACLResolver(t, delegate, nil)
|
r := newTestACLResolver(t, delegate, nil)
|
||||||
|
|
||||||
t.Run("Allow", func(t *testing.T) {
|
t.Run("Allow", func(t *testing.T) {
|
||||||
authz, err := r.ResolveToken("allow")
|
_, err := r.ResolveToken("allow")
|
||||||
require.Nil(t, authz)
|
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.True(t, acl.IsErrRootDenied(err))
|
require.True(t, acl.IsErrRootDenied(err))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Deny", func(t *testing.T) {
|
t.Run("Deny", func(t *testing.T) {
|
||||||
authz, err := r.ResolveToken("deny")
|
_, err := r.ResolveToken("deny")
|
||||||
require.Nil(t, authz)
|
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.True(t, acl.IsErrRootDenied(err))
|
require.True(t, acl.IsErrRootDenied(err))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Manage", func(t *testing.T) {
|
t.Run("Manage", func(t *testing.T) {
|
||||||
authz, err := r.ResolveToken("manage")
|
_, err := r.ResolveToken("manage")
|
||||||
require.Nil(t, authz)
|
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.True(t, acl.IsErrRootDenied(err))
|
require.True(t, acl.IsErrRootDenied(err))
|
||||||
})
|
})
|
||||||
|
@ -817,7 +809,11 @@ func TestACLResolver_DownPolicy(t *testing.T) {
|
||||||
authz, err := r.ResolveToken("foo")
|
authz, err := r.ResolveToken("foo")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz)
|
||||||
require.Equal(t, authz, acl.DenyAll())
|
expected := ACLResolveResult{
|
||||||
|
Authorizer: acl.DenyAll(),
|
||||||
|
ACLIdentity: &missingIdentity{reason: "primary-dc-down", token: "foo"},
|
||||||
|
}
|
||||||
|
require.Equal(t, expected, authz)
|
||||||
|
|
||||||
requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present")
|
requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present")
|
||||||
})
|
})
|
||||||
|
@ -841,7 +837,11 @@ func TestACLResolver_DownPolicy(t *testing.T) {
|
||||||
authz, err := r.ResolveToken("foo")
|
authz, err := r.ResolveToken("foo")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz)
|
||||||
require.Equal(t, authz, acl.AllowAll())
|
expected := ACLResolveResult{
|
||||||
|
Authorizer: acl.AllowAll(),
|
||||||
|
ACLIdentity: &missingIdentity{reason: "primary-dc-down", token: "foo"},
|
||||||
|
}
|
||||||
|
require.Equal(t, expected, authz)
|
||||||
|
|
||||||
requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present")
|
requireIdentityCached(t, r, tokenSecretCacheID("foo"), false, "not present")
|
||||||
})
|
})
|
||||||
|
@ -958,7 +958,7 @@ func TestACLResolver_DownPolicy(t *testing.T) {
|
||||||
config.Config.ACLDownPolicy = "extend-cache"
|
config.Config.ACLDownPolicy = "extend-cache"
|
||||||
})
|
})
|
||||||
|
|
||||||
_, authz, err := r.ResolveTokenToIdentityAndAuthorizer("not-found")
|
authz, err := r.ResolveToken("not-found")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz)
|
||||||
require.Equal(t, acl.Deny, authz.NodeWrite("foo", nil))
|
require.Equal(t, acl.Deny, authz.NodeWrite("foo", nil))
|
||||||
|
@ -1255,10 +1255,9 @@ func TestACLResolver_DownPolicy(t *testing.T) {
|
||||||
|
|
||||||
// the go routine spawned will eventually return and this will be a not found error
|
// the go routine spawned will eventually return and this will be a not found error
|
||||||
retry.Run(t, func(t *retry.R) {
|
retry.Run(t, func(t *retry.R) {
|
||||||
authz3, err := r.ResolveToken("found")
|
_, err := r.ResolveToken("found")
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
assert.True(t, acl.IsErrNotFound(err))
|
assert.True(t, acl.IsErrNotFound(err))
|
||||||
assert.Nil(t, authz3)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
requireIdentityCached(t, r, tokenSecretCacheID("found"), false, "no longer cached")
|
requireIdentityCached(t, r, tokenSecretCacheID("found"), false, "no longer cached")
|
||||||
|
@ -1526,7 +1525,6 @@ func TestACLResolver_Client(t *testing.T) {
|
||||||
// policies within the cache)
|
// policies within the cache)
|
||||||
authz, err = r.ResolveToken("a1a54629-5050-4d17-8a4e-560d2423f835")
|
authz, err = r.ResolveToken("a1a54629-5050-4d17-8a4e-560d2423f835")
|
||||||
require.EqualError(t, err, acl.ErrNotFound.Error())
|
require.EqualError(t, err, acl.ErrNotFound.Error())
|
||||||
require.Nil(t, authz)
|
|
||||||
|
|
||||||
require.True(t, modified)
|
require.True(t, modified)
|
||||||
require.True(t, deleted)
|
require.True(t, deleted)
|
||||||
|
@ -1675,8 +1673,7 @@ func testACLResolver_variousTokens(t *testing.T, delegate *ACLResolverTestDelega
|
||||||
|
|
||||||
runTwiceAndReset("Missing Identity", func(t *testing.T) {
|
runTwiceAndReset("Missing Identity", func(t *testing.T) {
|
||||||
delegate.UseTestLocalData(nil)
|
delegate.UseTestLocalData(nil)
|
||||||
authz, err := r.ResolveToken("doesn't exist")
|
_, err := r.ResolveToken("doesn't exist")
|
||||||
require.Nil(t, authz)
|
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
require.True(t, acl.IsErrNotFound(err))
|
require.True(t, acl.IsErrNotFound(err))
|
||||||
})
|
})
|
||||||
|
@ -3929,12 +3926,12 @@ func TestACLResolver_AgentRecovery(t *testing.T) {
|
||||||
|
|
||||||
tokens.UpdateAgentRecoveryToken("9a184a11-5599-459e-b71a-550e5f9a5a23", token.TokenSourceConfig)
|
tokens.UpdateAgentRecoveryToken("9a184a11-5599-459e-b71a-550e5f9a5a23", token.TokenSourceConfig)
|
||||||
|
|
||||||
ident, authz, err := r.ResolveTokenToIdentityAndAuthorizer("9a184a11-5599-459e-b71a-550e5f9a5a23")
|
authz, err := r.ResolveToken("9a184a11-5599-459e-b71a-550e5f9a5a23")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, ident)
|
require.NotNil(t, authz.ACLIdentity)
|
||||||
require.Equal(t, "agent-recovery:foo", ident.ID())
|
require.Equal(t, "agent-recovery:foo", authz.ACLIdentity.ID())
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz.Authorizer)
|
||||||
require.Equal(t, r.agentRecoveryAuthz, authz)
|
require.Equal(t, r.agentRecoveryAuthz, authz.Authorizer)
|
||||||
require.Equal(t, acl.Allow, authz.AgentWrite("foo", nil))
|
require.Equal(t, acl.Allow, authz.AgentWrite("foo", nil))
|
||||||
require.Equal(t, acl.Allow, authz.NodeRead("bar", nil))
|
require.Equal(t, acl.Allow, authz.NodeRead("bar", nil))
|
||||||
require.Equal(t, acl.Deny, authz.NodeWrite("bar", nil))
|
require.Equal(t, acl.Deny, authz.NodeWrite("bar", nil))
|
||||||
|
@ -3998,7 +3995,7 @@ func TestACLResolver_ACLsEnabled(t *testing.T) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t *testing.T) {
|
func TestACLResolver_ResolveToken_UpdatesPurgeTheCache(t *testing.T) {
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
t.Skip("too slow for testing.Short")
|
t.Skip("too slow for testing.Short")
|
||||||
}
|
}
|
||||||
|
@ -4035,7 +4032,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
runStep(t, "first resolve", func(t *testing.T) {
|
runStep(t, "first resolve", func(t *testing.T) {
|
||||||
_, authz, err := srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(token)
|
authz, err := srv.ACLResolver.ResolveToken(token)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz)
|
||||||
require.Equal(t, acl.Allow, authz.KeyRead("foo", nil))
|
require.Equal(t, acl.Allow, authz.KeyRead("foo", nil))
|
||||||
|
@ -4054,7 +4051,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t
|
||||||
err := msgpackrpc.CallWithCodec(codec, "ACL.PolicySet", &reqPolicy, &structs.ACLPolicy{})
|
err := msgpackrpc.CallWithCodec(codec, "ACL.PolicySet", &reqPolicy, &structs.ACLPolicy{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, authz, err := srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(token)
|
authz, err := srv.ACLResolver.ResolveToken(token)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, authz)
|
require.NotNil(t, authz)
|
||||||
require.Equal(t, acl.Deny, authz.KeyRead("foo", nil))
|
require.Equal(t, acl.Deny, authz.KeyRead("foo", nil))
|
||||||
|
@ -4070,7 +4067,7 @@ func TestACLResolver_ResolveTokenToIdentityAndAuthorizer_UpdatesPurgeTheCache(t
|
||||||
err := msgpackrpc.CallWithCodec(codec, "ACL.TokenDelete", &req, &resp)
|
err := msgpackrpc.CallWithCodec(codec, "ACL.TokenDelete", &req, &resp)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, _, err = srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(token)
|
_, err = srv.ACLResolver.ResolveToken(token)
|
||||||
require.True(t, acl.IsErrNotFound(err), "Error %v is not acl.ErrNotFound", err)
|
require.True(t, acl.IsErrNotFound(err), "Error %v is not acl.ErrNotFound", err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,21 +100,13 @@ func (s *Intention) Apply(args *structs.IntentionRequest, reply *string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the ACL token for the request for the checks below.
|
// Get the ACL token for the request for the checks below.
|
||||||
// TODO: use ResolveTokenAndDefaultMeta
|
var entMeta structs.EnterpriseMeta
|
||||||
identity, authz, err := s.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := s.srv.ACLResolver.ResolveTokenAndDefaultMeta(args.Token, &entMeta, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var accessorID string
|
accessorID := authz.AccessorID()
|
||||||
var entMeta structs.EnterpriseMeta
|
|
||||||
if identity != nil {
|
|
||||||
entMeta.Merge(identity.EnterpriseMetadata())
|
|
||||||
accessorID = identity.ID()
|
|
||||||
} else {
|
|
||||||
entMeta.Merge(structs.DefaultEnterpriseMetaInDefaultPartition())
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
mut *structs.IntentionMutation
|
mut *structs.IntentionMutation
|
||||||
legacyWrite bool
|
legacyWrite bool
|
||||||
|
|
|
@ -433,11 +433,11 @@ func (m *Internal) KeyringOperation(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check ACLs
|
// Check ACLs
|
||||||
identity, authz, err := m.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := m.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := m.srv.validateEnterpriseToken(identity); err != nil {
|
if err := m.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
switch args.Operation {
|
switch args.Operation {
|
||||||
|
|
|
@ -17,11 +17,11 @@ func (op *Operator) AutopilotGetConfiguration(args *structs.DCSpecificRequest, r
|
||||||
}
|
}
|
||||||
|
|
||||||
// This action requires operator read access.
|
// This action requires operator read access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorRead(nil) != acl.Allow {
|
if authz.OperatorRead(nil) != acl.Allow {
|
||||||
|
@ -49,11 +49,11 @@ func (op *Operator) AutopilotSetConfiguration(args *structs.AutopilotSetConfigRe
|
||||||
}
|
}
|
||||||
|
|
||||||
// This action requires operator write access.
|
// This action requires operator write access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorWrite(nil) != acl.Allow {
|
if authz.OperatorWrite(nil) != acl.Allow {
|
||||||
|
@ -84,11 +84,11 @@ func (op *Operator) ServerHealth(args *structs.DCSpecificRequest, reply *structs
|
||||||
}
|
}
|
||||||
|
|
||||||
// This action requires operator read access.
|
// This action requires operator read access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorRead(nil) != acl.Allow {
|
if authz.OperatorRead(nil) != acl.Allow {
|
||||||
|
@ -151,11 +151,11 @@ func (op *Operator) AutopilotState(args *structs.DCSpecificRequest, reply *autop
|
||||||
}
|
}
|
||||||
|
|
||||||
// This action requires operator read access.
|
// This action requires operator read access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorRead(nil) != acl.Allow {
|
if authz.OperatorRead(nil) != acl.Allow {
|
||||||
|
|
|
@ -81,11 +81,11 @@ func (op *Operator) RaftRemovePeerByAddress(args *structs.RaftRemovePeerRequest,
|
||||||
|
|
||||||
// This is a super dangerous operation that requires operator write
|
// This is a super dangerous operation that requires operator write
|
||||||
// access.
|
// access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorWrite(nil) != acl.Allow {
|
if authz.OperatorWrite(nil) != acl.Allow {
|
||||||
|
@ -134,11 +134,11 @@ func (op *Operator) RaftRemovePeerByID(args *structs.RaftRemovePeerRequest, repl
|
||||||
|
|
||||||
// This is a super dangerous operation that requires operator write
|
// This is a super dangerous operation that requires operator write
|
||||||
// access.
|
// access.
|
||||||
identity, authz, err := op.srv.ACLResolver.ResolveTokenToIdentityAndAuthorizer(args.Token)
|
authz, err := op.srv.ACLResolver.ResolveToken(args.Token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := op.srv.validateEnterpriseToken(identity); err != nil {
|
if err := op.srv.validateEnterpriseToken(authz.ACLIdentity); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if authz.OperatorWrite(nil) != acl.Allow {
|
if authz.OperatorWrite(nil) != acl.Allow {
|
||||||
|
|
Loading…
Reference in New Issue