mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-03 20:17:59 +00:00
* Handle ns lease and token renew/revoke via relative paths * s/usin/using/ * add token and lease lookup paths; set ctx only on non-nil ns Addtionally, use client token's ns for auth/token/lookup if no token is provided
This commit is contained in:
@@ -200,6 +200,67 @@ func handleLogicalInternal(core *vault.Core, injectDataIntoTopLevel bool) http.H
|
|||||||
// requests for these paths always go to the token NS
|
// requests for these paths always go to the token NS
|
||||||
case "auth/token/lookup-self", "auth/token/renew-self", "auth/token/revoke-self":
|
case "auth/token/lookup-self", "auth/token/renew-self", "auth/token/revoke-self":
|
||||||
r = r.WithContext(newCtx)
|
r = r.WithContext(newCtx)
|
||||||
|
|
||||||
|
// For the following operations, we can set the proper namespace context
|
||||||
|
// using the token's embedded nsID if a relative path was provided. Since
|
||||||
|
// this is done at the HTTP layer, the operation will still be gated by
|
||||||
|
// ACLs.
|
||||||
|
case "auth/token/lookup", "auth/token/renew", "auth/token/revoke", "auth/token/revoke-orphan":
|
||||||
|
token, ok := req.Data["token"]
|
||||||
|
// If the token is not present (e.g. a bad request), break out and let the backend
|
||||||
|
// handle the error
|
||||||
|
if !ok {
|
||||||
|
// If this is a token lookup request and if the token is not
|
||||||
|
// explicitly provided, it will use the client token so we simply set
|
||||||
|
// the context to the client token's context.
|
||||||
|
if req.Path == "auth/token/lookup" {
|
||||||
|
r = r.WithContext(newCtx)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
_, nsID := namespace.SplitIDFromString(token.(string))
|
||||||
|
if nsID != "" {
|
||||||
|
ns, err := vault.NamespaceByID(newCtx, nsID, core)
|
||||||
|
if err != nil {
|
||||||
|
core.Logger().Warn("error looking up namespace from the token's namespace ID", "error", err)
|
||||||
|
respondError(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ns != nil {
|
||||||
|
newCtx = namespace.ContextWithNamespace(newCtx, ns)
|
||||||
|
r = r.WithContext(newCtx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following relative sys/leases/ paths handles re-routing requests
|
||||||
|
// to the proper namespace using the lease ID on applicable paths.
|
||||||
|
case strings.HasPrefix(req.Path, "sys/leases/"):
|
||||||
|
switch req.Path {
|
||||||
|
// For the following operations, we can set the proper namespace context
|
||||||
|
// using the lease's embedded nsID if a relative path was provided. Since
|
||||||
|
// this is done at the HTTP layer, the operation will still be gated by
|
||||||
|
// ACLs.
|
||||||
|
case "sys/leases/lookup", "sys/leases/renew", "sys/leases/revoke", "sys/leases/revoke-force":
|
||||||
|
leaseID, ok := req.Data["lease_id"]
|
||||||
|
// If lease ID is not present, break out and let the backend handle the error
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
_, nsID := namespace.SplitIDFromString(leaseID.(string))
|
||||||
|
if nsID != "" {
|
||||||
|
newCtx := r.Context()
|
||||||
|
ns, err := vault.NamespaceByID(newCtx, nsID, core)
|
||||||
|
if err != nil {
|
||||||
|
core.Logger().Warn("error looking up namespace from the lease's namespace ID", "error", err)
|
||||||
|
respondError(w, http.StatusInternalServerError, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ns != nil {
|
||||||
|
newCtx = namespace.ContextWithNamespace(newCtx, ns)
|
||||||
|
r = r.WithContext(newCtx)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -827,11 +827,11 @@ func (m *ExpirationManager) Renew(ctx context.Context, leaseID string, increment
|
|||||||
return logical.ErrorResponse("lease does not correspond to a secret"), nil
|
return logical.ErrorResponse("lease does not correspond to a secret"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
reqNS, err := namespace.FromContext(ctx)
|
ns, err := namespace.FromContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if reqNS.ID != le.namespace.ID {
|
if ns.ID != le.namespace.ID {
|
||||||
return nil, errors.New("cannot renew a lease across namespaces")
|
return nil, errors.New("cannot renew a lease across namespaces")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user