mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-01 19:17:58 +00:00
Fix local alias processing (#25496)
* Fix local alias processing * PR feedback
This commit is contained in:
@@ -21,6 +21,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/helper/versions"
|
"github.com/hashicorp/vault/helper/versions"
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/locksutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
"github.com/patrickmn/go-cache"
|
"github.com/patrickmn/go-cache"
|
||||||
)
|
)
|
||||||
@@ -66,6 +67,7 @@ func NewIdentityStore(ctx context.Context, core *Core, config *logical.BackendCo
|
|||||||
entityCreator: core,
|
entityCreator: core,
|
||||||
mountLister: core,
|
mountLister: core,
|
||||||
mfaBackend: core.loginMFABackend,
|
mfaBackend: core.loginMFABackend,
|
||||||
|
aliasLocks: locksutil.CreateLocks(),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a memdb instance, which by default, operates on lower cased
|
// Create a memdb instance, which by default, operates on lower cased
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/hashicorp/vault/helper/storagepacker"
|
"github.com/hashicorp/vault/helper/storagepacker"
|
||||||
"github.com/hashicorp/vault/sdk/framework"
|
"github.com/hashicorp/vault/sdk/framework"
|
||||||
"github.com/hashicorp/vault/sdk/helper/consts"
|
"github.com/hashicorp/vault/sdk/helper/consts"
|
||||||
|
"github.com/hashicorp/vault/sdk/helper/locksutil"
|
||||||
"github.com/hashicorp/vault/sdk/logical"
|
"github.com/hashicorp/vault/sdk/logical"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -104,6 +105,10 @@ type IdentityStore struct {
|
|||||||
entityCreator EntityCreator
|
entityCreator EntityCreator
|
||||||
mountLister MountLister
|
mountLister MountLister
|
||||||
mfaBackend *LoginMFABackend
|
mfaBackend *LoginMFABackend
|
||||||
|
|
||||||
|
// aliasLocks is used to protect modifications to alias entries based on the uniqueness factor
|
||||||
|
// which is name + accessor
|
||||||
|
aliasLocks []*locksutil.LockEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
type groupDiff struct {
|
type groupDiff struct {
|
||||||
|
|||||||
@@ -1659,6 +1659,7 @@ func (c *Core) handleLoginRequest(ctx context.Context, req *logical.Request) (re
|
|||||||
var err error
|
var err error
|
||||||
// Fetch the entity for the alias, or create an entity if one
|
// Fetch the entity for the alias, or create an entity if one
|
||||||
// doesn't exist.
|
// doesn't exist.
|
||||||
|
|
||||||
entity, entityCreated, err := c.identityStore.CreateOrFetchEntity(ctx, auth.Alias)
|
entity, entityCreated, err := c.identityStore.CreateOrFetchEntity(ctx, auth.Alias)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch auth.Alias.Local {
|
switch auth.Alias.Local {
|
||||||
@@ -1666,7 +1667,7 @@ func (c *Core) handleLoginRequest(ctx context.Context, req *logical.Request) (re
|
|||||||
// Only create a new entity if the error was a readonly error and the creation flag is true
|
// Only create a new entity if the error was a readonly error and the creation flag is true
|
||||||
// i.e the entity was in the middle of being created
|
// i.e the entity was in the middle of being created
|
||||||
if entityCreated && errors.Is(err, logical.ErrReadOnly) {
|
if entityCreated && errors.Is(err, logical.ErrReadOnly) {
|
||||||
entity, err = possiblyForwardEntityCreation(ctx, c, err, auth, nil)
|
entity, err = registerLocalAlias(ctx, c, auth.Alias)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), errCreateEntityUnimplemented) {
|
if strings.Contains(err.Error(), errCreateEntityUnimplemented) {
|
||||||
resp.AddWarning("primary cluster doesn't yet issue entities for local auth mounts; falling back to not issuing entities for local auth mounts")
|
resp.AddWarning("primary cluster doesn't yet issue entities for local auth mounts; falling back to not issuing entities for local auth mounts")
|
||||||
@@ -1676,14 +1677,14 @@ func (c *Core) handleLoginRequest(ctx context.Context, req *logical.Request) (re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = updateLocalAlias(ctx, c, auth, entity)
|
|
||||||
default:
|
default:
|
||||||
entity, entityCreated, err = possiblyForwardAliasCreation(ctx, c, err, auth, entity)
|
entity, entityCreated, err = possiblyForwardAliasCreation(ctx, c, err, auth, entity)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
if entity == nil {
|
if entity == nil {
|
||||||
return nil, nil, fmt.Errorf("failed to create an entity for the authenticated alias")
|
return nil, nil, fmt.Errorf("failed to create an entity for the authenticated alias")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,12 +68,8 @@ func possiblyForwardAliasCreation(ctx context.Context, c *Core, inErr error, aut
|
|||||||
|
|
||||||
var errCreateEntityUnimplemented = "create entity unimplemented in the server"
|
var errCreateEntityUnimplemented = "create entity unimplemented in the server"
|
||||||
|
|
||||||
func possiblyForwardEntityCreation(ctx context.Context, c *Core, inErr error, auth *logical.Auth, entity *identity.Entity) (*identity.Entity, error) {
|
func registerLocalAlias(_ context.Context, _ *Core, _ *logical.Alias) (*identity.Entity, error) {
|
||||||
return entity, inErr
|
return nil, logical.ErrReadOnly
|
||||||
}
|
|
||||||
|
|
||||||
func updateLocalAlias(ctx context.Context, c *Core, auth *logical.Auth, entity *identity.Entity) error {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func possiblyForwardSaveCachedAuthResponse(ctx context.Context, c *Core, respAuth *MFACachedAuthResponse) error {
|
func possiblyForwardSaveCachedAuthResponse(ctx context.Context, c *Core, respAuth *MFACachedAuthResponse) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user