mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-03 20:17:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright (c) HashiCorp, Inc.
 | 
						|
// SPDX-License-Identifier: MPL-2.0
 | 
						|
 | 
						|
package api
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	retryablehttp "github.com/hashicorp/go-retryablehttp"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	ErrOutputStringRequest = "output a string, please"
 | 
						|
)
 | 
						|
 | 
						|
var LastOutputStringError *OutputStringError
 | 
						|
 | 
						|
type OutputStringError struct {
 | 
						|
	*retryablehttp.Request
 | 
						|
	TLSSkipVerify              bool
 | 
						|
	ClientCACert, ClientCAPath string
 | 
						|
	ClientCert, ClientKey      string
 | 
						|
	finalCurlString            string
 | 
						|
}
 | 
						|
 | 
						|
func (d *OutputStringError) Error() string {
 | 
						|
	if d.finalCurlString == "" {
 | 
						|
		cs, err := d.buildCurlString()
 | 
						|
		if err != nil {
 | 
						|
			return err.Error()
 | 
						|
		}
 | 
						|
		d.finalCurlString = cs
 | 
						|
	}
 | 
						|
 | 
						|
	return ErrOutputStringRequest
 | 
						|
}
 | 
						|
 | 
						|
func (d *OutputStringError) CurlString() (string, error) {
 | 
						|
	if d.finalCurlString == "" {
 | 
						|
		cs, err := d.buildCurlString()
 | 
						|
		if err != nil {
 | 
						|
			return "", err
 | 
						|
		}
 | 
						|
		d.finalCurlString = cs
 | 
						|
	}
 | 
						|
	return d.finalCurlString, nil
 | 
						|
}
 | 
						|
 | 
						|
func (d *OutputStringError) buildCurlString() (string, error) {
 | 
						|
	body, err := d.Request.BodyBytes()
 | 
						|
	if err != nil {
 | 
						|
		return "", err
 | 
						|
	}
 | 
						|
 | 
						|
	// Build cURL string
 | 
						|
	finalCurlString := "curl "
 | 
						|
	if d.TLSSkipVerify {
 | 
						|
		finalCurlString += "--insecure "
 | 
						|
	}
 | 
						|
	if d.Request.Method != http.MethodGet {
 | 
						|
		finalCurlString = fmt.Sprintf("%s-X %s ", finalCurlString, d.Request.Method)
 | 
						|
	}
 | 
						|
	if d.ClientCACert != "" {
 | 
						|
		clientCACert := strings.ReplaceAll(d.ClientCACert, "'", "'\"'\"'")
 | 
						|
		finalCurlString = fmt.Sprintf("%s--cacert '%s' ", finalCurlString, clientCACert)
 | 
						|
	}
 | 
						|
	if d.ClientCAPath != "" {
 | 
						|
		clientCAPath := strings.ReplaceAll(d.ClientCAPath, "'", "'\"'\"'")
 | 
						|
		finalCurlString = fmt.Sprintf("%s--capath '%s' ", finalCurlString, clientCAPath)
 | 
						|
	}
 | 
						|
	if d.ClientCert != "" {
 | 
						|
		clientCert := strings.ReplaceAll(d.ClientCert, "'", "'\"'\"'")
 | 
						|
		finalCurlString = fmt.Sprintf("%s--cert '%s' ", finalCurlString, clientCert)
 | 
						|
	}
 | 
						|
	if d.ClientKey != "" {
 | 
						|
		clientKey := strings.ReplaceAll(d.ClientKey, "'", "'\"'\"'")
 | 
						|
		finalCurlString = fmt.Sprintf("%s--key '%s' ", finalCurlString, clientKey)
 | 
						|
	}
 | 
						|
	for k, v := range d.Request.Header {
 | 
						|
		for _, h := range v {
 | 
						|
			if strings.ToLower(k) == "x-vault-token" {
 | 
						|
				h = `$(vault print token)`
 | 
						|
			}
 | 
						|
			finalCurlString = fmt.Sprintf("%s-H \"%s: %s\" ", finalCurlString, k, h)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if len(body) > 0 {
 | 
						|
		// We need to escape single quotes since that's what we're using to
 | 
						|
		// quote the body
 | 
						|
		escapedBody := strings.ReplaceAll(string(body), "'", "'\"'\"'")
 | 
						|
		finalCurlString = fmt.Sprintf("%s-d '%s' ", finalCurlString, escapedBody)
 | 
						|
	}
 | 
						|
 | 
						|
	return fmt.Sprintf("%s%s", finalCurlString, d.Request.URL.String()), nil
 | 
						|
}
 |