mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-30 18:17:55 +00:00
This reverts commit 02064eccb4.
This commit is contained in:
committed by
GitHub
parent
467067371d
commit
20f66ef7dd
@@ -13,8 +13,6 @@ import (
|
||||
"github.com/hashicorp/vault/sdk/logical"
|
||||
"github.com/hashicorp/vault/sdk/version"
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"golang.org/x/text/cases"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
// OpenAPI specification (OAS): https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
|
||||
@@ -208,16 +206,16 @@ var (
|
||||
altRootsRe = regexp.MustCompile(`^\(([\w\-_]+(?:\|[\w\-_]+)+)\)(/.*)$`) // Pattern starting with alts, e.g. "(root1|root2)/(?P<name>regex)"
|
||||
cleanCharsRe = regexp.MustCompile("[()^$?]") // Set of regex characters that will be stripped during cleaning
|
||||
cleanSuffixRe = regexp.MustCompile(`/\?\$?$`) // Path suffix patterns that will be stripped during cleaning
|
||||
nonWordRe = regexp.MustCompile(`[^a-zA-Z0-9]+`) // Match a sequence of non-word characters
|
||||
nonWordRe = regexp.MustCompile(`[^\w]+`) // Match a sequence of non-word characters
|
||||
pathFieldsRe = regexp.MustCompile(`{(\w+)}`) // Capture OpenAPI-style named parameters, e.g. "lookup/{urltoken}",
|
||||
reqdRe = regexp.MustCompile(`\(?\?P<(\w+)>[^)]*\)?`) // Capture required parameters, e.g. "(?P<name>regex)"
|
||||
wsRe = regexp.MustCompile(`\s+`) // Match whitespace, to be compressed during cleaning
|
||||
)
|
||||
|
||||
// documentPaths parses all paths in a framework.Backend into OpenAPI paths.
|
||||
func documentPaths(backend *Backend, requestResponsePrefix string, doc *OASDocument) error {
|
||||
func documentPaths(backend *Backend, requestResponsePrefix string, genericMountPaths bool, doc *OASDocument) error {
|
||||
for _, p := range backend.Paths {
|
||||
if err := documentPath(p, backend.SpecialPaths(), requestResponsePrefix, backend.BackendType, doc); err != nil {
|
||||
if err := documentPath(p, backend.SpecialPaths(), requestResponsePrefix, genericMountPaths, backend.BackendType, doc); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -226,7 +224,7 @@ func documentPaths(backend *Backend, requestResponsePrefix string, doc *OASDocum
|
||||
}
|
||||
|
||||
// documentPath parses a framework.Path into one or more OpenAPI paths.
|
||||
func documentPath(p *Path, specialPaths *logical.Paths, requestResponsePrefix string, backendType logical.BackendType, doc *OASDocument) error {
|
||||
func documentPath(p *Path, specialPaths *logical.Paths, requestResponsePrefix string, genericMountPaths bool, backendType logical.BackendType, doc *OASDocument) error {
|
||||
var sudoPaths []string
|
||||
var unauthPaths []string
|
||||
|
||||
@@ -235,11 +233,6 @@ func documentPath(p *Path, specialPaths *logical.Paths, requestResponsePrefix st
|
||||
unauthPaths = specialPaths.Unauthenticated
|
||||
}
|
||||
|
||||
defaultMountPath := requestResponsePrefix
|
||||
if requestResponsePrefix == "kv" {
|
||||
defaultMountPath = "secret"
|
||||
}
|
||||
|
||||
// Convert optional parameters into distinct patterns to be processed independently.
|
||||
paths := expandPattern(p.Pattern)
|
||||
|
||||
@@ -270,17 +263,16 @@ func documentPath(p *Path, specialPaths *logical.Paths, requestResponsePrefix st
|
||||
// Body fields will be added to individual operations.
|
||||
pathFields, bodyFields := splitFields(p.Fields, path)
|
||||
|
||||
// Add mount path as a parameter
|
||||
if defaultMountPath != "system" && defaultMountPath != "identity" {
|
||||
if genericMountPaths && requestResponsePrefix != "system" && requestResponsePrefix != "identity" {
|
||||
// Add mount path as a parameter
|
||||
p := OASParameter{
|
||||
Name: "mount_path",
|
||||
Description: "Path where the backend was mounted; the endpoint path will be offset by the mount path",
|
||||
Name: "mountPath",
|
||||
Description: "Path that the backend was mounted at",
|
||||
In: "path",
|
||||
Schema: &OASSchema{
|
||||
Type: "string",
|
||||
Default: defaultMountPath,
|
||||
Type: "string",
|
||||
},
|
||||
Required: false,
|
||||
Required: true,
|
||||
}
|
||||
|
||||
pi.Parameters = append(pi.Parameters, p)
|
||||
@@ -349,7 +341,6 @@ func documentPath(p *Path, specialPaths *logical.Paths, requestResponsePrefix st
|
||||
op.Summary = props.Summary
|
||||
op.Description = props.Description
|
||||
op.Deprecated = props.Deprecated
|
||||
op.OperationID = constructOperationID(string(opType), path, defaultMountPath)
|
||||
|
||||
// Add any fields not present in the path as body parameters for POST.
|
||||
if opType == logical.CreateOperation || opType == logical.UpdateOperation {
|
||||
@@ -524,19 +515,6 @@ func constructRequestName(requestResponsePrefix string, path string) string {
|
||||
return b.String()
|
||||
}
|
||||
|
||||
func constructOperationID(method, path, defaultMountPath string) string {
|
||||
// title caser
|
||||
title := cases.Title(language.English)
|
||||
|
||||
// Space-split on non-words, title case everything, recombine
|
||||
id := nonWordRe.ReplaceAllLiteralString(strings.ToLower(path), " ")
|
||||
id = fmt.Sprintf("%s %s", defaultMountPath, id)
|
||||
id = title.String(id)
|
||||
id = strings.ReplaceAll(id, " ", "")
|
||||
|
||||
return method + id
|
||||
}
|
||||
|
||||
func specialPathMatch(path string, specialPaths []string) bool {
|
||||
// Test for exact or prefix match of special paths.
|
||||
for _, sp := range specialPaths {
|
||||
@@ -749,3 +727,61 @@ func cleanResponse(resp *logical.Response) *cleanedResponse {
|
||||
Headers: resp.Headers,
|
||||
}
|
||||
}
|
||||
|
||||
// CreateOperationIDs generates unique operationIds for all paths/methods.
|
||||
// The transform will convert path/method into camelcase. e.g.:
|
||||
//
|
||||
// /sys/tools/random/{urlbytes} -> postSysToolsRandomUrlbytes
|
||||
//
|
||||
// In the unlikely case of a duplicate ids, a numeric suffix is added:
|
||||
//
|
||||
// postSysToolsRandomUrlbytes_2
|
||||
//
|
||||
// An optional user-provided suffix ("context") may also be appended.
|
||||
func (d *OASDocument) CreateOperationIDs(context string) {
|
||||
opIDCount := make(map[string]int)
|
||||
var paths []string
|
||||
|
||||
// traverse paths in a stable order to ensure stable output
|
||||
for path := range d.Paths {
|
||||
paths = append(paths, path)
|
||||
}
|
||||
sort.Strings(paths)
|
||||
|
||||
for _, path := range paths {
|
||||
pi := d.Paths[path]
|
||||
for _, method := range []string{"get", "post", "delete"} {
|
||||
var oasOperation *OASOperation
|
||||
switch method {
|
||||
case "get":
|
||||
oasOperation = pi.Get
|
||||
case "post":
|
||||
oasOperation = pi.Post
|
||||
case "delete":
|
||||
oasOperation = pi.Delete
|
||||
}
|
||||
|
||||
if oasOperation == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// Space-split on non-words, title case everything, recombine
|
||||
opID := nonWordRe.ReplaceAllString(strings.ToLower(path), " ")
|
||||
opID = strings.Title(opID)
|
||||
opID = method + strings.ReplaceAll(opID, " ", "")
|
||||
|
||||
// deduplicate operationIds. This is a safeguard, since generated IDs should
|
||||
// already be unique given our current path naming conventions.
|
||||
opIDCount[opID]++
|
||||
if opIDCount[opID] > 1 {
|
||||
opID = fmt.Sprintf("%s_%d", opID, opIDCount[opID])
|
||||
}
|
||||
|
||||
if context != "" {
|
||||
opID += "_" + context
|
||||
}
|
||||
|
||||
oasOperation.OperationID = opID
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user