mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-03 20:17:59 +00:00 
			
		
		
		
	builtin: deprecate errwrap.Wrapf() throughout (#11430)
* audit: deprecate errwrap.Wrapf() * builtin/audit/file: deprecate errwrap.Wrapf() * builtin/crediential/app-id: deprecate errwrap.Wrapf() * builtin/credential/approle: deprecate errwrap.Wrapf() * builtin/credential/aws: deprecate errwrap.Wrapf() * builtin/credentials/token: deprecate errwrap.Wrapf() * builtin/credential/github: deprecate errwrap.Wrapf() * builtin/credential/cert: deprecate errwrap.Wrapf() * builtin/logical/transit: deprecate errwrap.Wrapf() * builtin/logical/totp: deprecate errwrap.Wrapf() * builtin/logical/ssh: deprecate errwrap.Wrapf() * builtin/logical/rabbitmq: deprecate errwrap.Wrapf() * builtin/logical/postgresql: deprecate errwrap.Wrapf() * builtin/logical/pki: deprecate errwrap.Wrapf() * builtin/logical/nomad: deprecate errwrap.Wrapf() * builtin/logical/mssql: deprecate errwrap.Wrapf() * builtin/logical/database: deprecate errwrap.Wrapf() * builtin/logical/consul: deprecate errwrap.Wrapf() * builtin/logical/cassandra: deprecate errwrap.Wrapf() * builtin/logical/aws: deprecate errwrap.Wrapf()
This commit is contained in:
		@@ -10,7 +10,6 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	squarejwt "gopkg.in/square/go-jose.v2/jwt"
 | 
						squarejwt "gopkg.in/square/go-jose.v2/jwt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/helper/namespace"
 | 
						"github.com/hashicorp/vault/helper/namespace"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/salt"
 | 
						"github.com/hashicorp/vault/sdk/helper/salt"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -48,7 +47,7 @@ func (f *AuditFormatter) FormatRequest(ctx context.Context, w io.Writer, config
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	salt, err := f.Salt(ctx)
 | 
						salt, err := f.Salt(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error fetching salt: {{err}}", err)
 | 
							return fmt.Errorf("error fetching salt: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set these to the input values at first
 | 
						// Set these to the input values at first
 | 
				
			||||||
@@ -159,7 +158,7 @@ func (f *AuditFormatter) FormatResponse(ctx context.Context, w io.Writer, config
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	salt, err := f.Salt(ctx)
 | 
						salt, err := f.Salt(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error fetching salt: {{err}}", err)
 | 
							return fmt.Errorf("error fetching salt: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set these to the input values at first
 | 
						// Set these to the input values at first
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/audit"
 | 
						"github.com/hashicorp/vault/audit"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/salt"
 | 
						"github.com/hashicorp/vault/sdk/helper/salt"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -121,7 +120,7 @@ func Factory(ctx context.Context, conf *audit.BackendConfig) (audit.Backend, err
 | 
				
			|||||||
		// otherwise it will be too late to catch later without problems
 | 
							// otherwise it will be too late to catch later without problems
 | 
				
			||||||
		// (ref: https://github.com/hashicorp/vault/issues/550)
 | 
							// (ref: https://github.com/hashicorp/vault/issues/550)
 | 
				
			||||||
		if err := b.open(); err != nil {
 | 
							if err := b.open(); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf(fmt.Sprintf("sanity check failed; unable to open %q for writing: {{err}}", path), err)
 | 
								return nil, fmt.Errorf("sanity check failed; unable to open %q for writing: %w", path, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/policyutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/policyutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -169,7 +168,7 @@ func (b *backend) verifyCredentials(ctx context.Context, req *logical.Request, a
 | 
				
			|||||||
	if raw, ok := appsMap["cidr_block"]; ok {
 | 
						if raw, ok := appsMap["cidr_block"]; ok {
 | 
				
			||||||
		_, cidr, err := net.ParseCIDR(raw.(string))
 | 
							_, cidr, err := net.ParseCIDR(raw.(string))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return "", nil, errwrap.Wrapf("invalid restriction cidr: {{err}}", err)
 | 
								return "", nil, fmt.Errorf("invalid restriction cidr: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var addr string
 | 
							var addr string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
				
			||||||
@@ -93,12 +92,12 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
							secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to create HMAC of secret_id: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to create HMAC of secret_id: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
							roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
							entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
				
			||||||
@@ -123,7 +122,7 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
		// entry, revoke the secret ID immediately
 | 
							// entry, revoke the secret ID immediately
 | 
				
			||||||
		accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, entry.SecretIDAccessor, role.SecretIDPrefix)
 | 
							accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, entry.SecretIDAccessor, role.SecretIDPrefix)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to read secret ID accessor entry: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to read secret ID accessor entry: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if accessorEntry == nil {
 | 
							if accessorEntry == nil {
 | 
				
			||||||
			// Switch the locks and recheck the conditions
 | 
								// Switch the locks and recheck the conditions
 | 
				
			||||||
@@ -141,12 +140,12 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, entry.SecretIDAccessor, role.SecretIDPrefix)
 | 
								accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, entry.SecretIDAccessor, role.SecretIDPrefix)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf("failed to read secret ID accessor entry: {{err}}", err)
 | 
									return nil, fmt.Errorf("failed to read secret ID accessor entry: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if accessorEntry == nil {
 | 
								if accessorEntry == nil {
 | 
				
			||||||
				if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
									if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf(fmt.Sprintf("error deleting secret ID %q from storage: {{err}}", secretIDHMAC), err)
 | 
										return nil, fmt.Errorf("error deleting secret ID %q from storage: %w", secretIDHMAC, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return logical.ErrorResponse("invalid secret id"), nil
 | 
								return logical.ErrorResponse("invalid secret id"), nil
 | 
				
			||||||
@@ -176,7 +175,11 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, entry.CIDRList)
 | 
									belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, entry.CIDRList)
 | 
				
			||||||
				if !belongs || err != nil {
 | 
									if !belongs || err != nil {
 | 
				
			||||||
					return logical.ErrorResponse(errwrap.Wrapf(fmt.Sprintf("source address %q unauthorized through CIDR restrictions on the secret ID: {{err}}", req.Connection.RemoteAddr), err).Error()), nil
 | 
										return logical.ErrorResponse(fmt.Errorf(
 | 
				
			||||||
 | 
											"source address %q unauthorized through CIDR restrictions on the secret ID: %w",
 | 
				
			||||||
 | 
											req.Connection.RemoteAddr,
 | 
				
			||||||
 | 
											err,
 | 
				
			||||||
 | 
										).Error()), nil
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
@@ -210,7 +213,7 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				err = req.Storage.Delete(ctx, entryIndex)
 | 
									err = req.Storage.Delete(ctx, entryIndex)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf("failed to delete secret ID: {{err}}", err)
 | 
										return nil, fmt.Errorf("failed to delete secret ID: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				// If the use count is greater than one, decrement it and update the last updated time.
 | 
									// If the use count is greater than one, decrement it and update the last updated time.
 | 
				
			||||||
@@ -244,7 +247,12 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, entry.CIDRList)
 | 
									belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, entry.CIDRList)
 | 
				
			||||||
				if err != nil || !belongs {
 | 
									if err != nil || !belongs {
 | 
				
			||||||
					return logical.ErrorResponse(errwrap.Wrapf(fmt.Sprintf("source address %q unauthorized by CIDR restrictions on the secret ID: {{err}}", req.Connection.RemoteAddr), err).Error()), nil
 | 
										return logical.ErrorResponse(
 | 
				
			||||||
 | 
											fmt.Errorf(
 | 
				
			||||||
 | 
												"source address %q unauthorized by CIDR restrictions on the secret ID: %w",
 | 
				
			||||||
 | 
												req.Connection.RemoteAddr,
 | 
				
			||||||
 | 
												err,
 | 
				
			||||||
 | 
											).Error()), nil
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -258,7 +266,12 @@ func (b *backend) pathLoginUpdate(ctx context.Context, req *logical.Request, dat
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, role.SecretIDBoundCIDRs)
 | 
							belongs, err := cidrutil.IPBelongsToCIDRBlocksSlice(req.Connection.RemoteAddr, role.SecretIDBoundCIDRs)
 | 
				
			||||||
		if err != nil || !belongs {
 | 
							if err != nil || !belongs {
 | 
				
			||||||
			return logical.ErrorResponse(errwrap.Wrapf(fmt.Sprintf("source address %q unauthorized by CIDR restrictions on the role: {{err}}", req.Connection.RemoteAddr), err).Error()), nil
 | 
								return logical.ErrorResponse(
 | 
				
			||||||
 | 
									fmt.Errorf(
 | 
				
			||||||
 | 
										"source address %q unauthorized by CIDR restrictions on the role: %w",
 | 
				
			||||||
 | 
										req.Connection.RemoteAddr,
 | 
				
			||||||
 | 
										err,
 | 
				
			||||||
 | 
									).Error()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -314,7 +327,7 @@ func (b *backend) pathLoginRenew(ctx context.Context, req *logical.Request, data
 | 
				
			|||||||
	// Ensure that the Role still exists.
 | 
						// Ensure that the Role still exists.
 | 
				
			||||||
	role, err := b.roleEntry(ctx, req.Storage, roleName)
 | 
						role, err := b.roleEntry(ctx, req.Storage, roleName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("failed to validate role %q during renewal: {{err}}", roleName), err)
 | 
							return nil, fmt.Errorf("failed to validate role %q during renewal: %w", roleName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if role == nil {
 | 
						if role == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("role %q does not exist during renewal", roleName)
 | 
							return nil, fmt.Errorf("role %q does not exist during renewal", roleName)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	uuid "github.com/hashicorp/go-uuid"
 | 
						uuid "github.com/hashicorp/go-uuid"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
				
			||||||
@@ -654,7 +653,7 @@ func (b *backend) pathRoleSecretIDList(ctx context.Context, req *logical.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
						roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Listing works one level at a time. Get the first level of data
 | 
						// Listing works one level at a time. Get the first level of data
 | 
				
			||||||
@@ -750,7 +749,7 @@ func (b *backend) setRoleEntry(ctx context.Context, s logical.Storage, roleName
 | 
				
			|||||||
	// Check if the index from the role_id to role already exists
 | 
						// Check if the index from the role_id to role already exists
 | 
				
			||||||
	roleIDIndex, err := b.roleIDEntry(ctx, s, role.RoleID)
 | 
						roleIDIndex, err := b.roleIDEntry(ctx, s, role.RoleID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("failed to read role_id index: {{err}}", err)
 | 
							return fmt.Errorf("failed to read role_id index: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If the entry exists, make sure that it belongs to the current role
 | 
						// If the entry exists, make sure that it belongs to the current role
 | 
				
			||||||
@@ -762,7 +761,7 @@ func (b *backend) setRoleEntry(ctx context.Context, s logical.Storage, roleName
 | 
				
			|||||||
	// a new one is created
 | 
						// a new one is created
 | 
				
			||||||
	if previousRoleID != "" && previousRoleID != role.RoleID {
 | 
						if previousRoleID != "" && previousRoleID != role.RoleID {
 | 
				
			||||||
		if err = b.roleIDEntryDelete(ctx, s, previousRoleID); err != nil {
 | 
							if err = b.roleIDEntryDelete(ctx, s, previousRoleID); err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("failed to delete previous role ID index: {{err}}", err)
 | 
								return fmt.Errorf("failed to delete previous role ID index: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -870,7 +869,7 @@ func (b *backend) pathRoleCreateUpdate(ctx context.Context, req *logical.Request
 | 
				
			|||||||
	case role == nil && req.Operation == logical.CreateOperation:
 | 
						case role == nil && req.Operation == logical.CreateOperation:
 | 
				
			||||||
		hmacKey, err := uuid.GenerateUUID()
 | 
							hmacKey, err := uuid.GenerateUUID()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to create role_id: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to create role_id: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		role = &roleStorageEntry{
 | 
							role = &roleStorageEntry{
 | 
				
			||||||
			name:              strings.ToLower(roleName),
 | 
								name:              strings.ToLower(roleName),
 | 
				
			||||||
@@ -918,7 +917,7 @@ func (b *backend) pathRoleCreateUpdate(ctx context.Context, req *logical.Request
 | 
				
			|||||||
	} else if req.Operation == logical.CreateOperation {
 | 
						} else if req.Operation == logical.CreateOperation {
 | 
				
			||||||
		roleID, err := uuid.GenerateUUID()
 | 
							roleID, err := uuid.GenerateUUID()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to generate role_id: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to generate role_id: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		role.RoleID = roleID
 | 
							role.RoleID = roleID
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -939,7 +938,7 @@ func (b *backend) pathRoleCreateUpdate(ctx context.Context, req *logical.Request
 | 
				
			|||||||
	if len(role.SecretIDBoundCIDRs) != 0 {
 | 
						if len(role.SecretIDBoundCIDRs) != 0 {
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListSlice(role.SecretIDBoundCIDRs)
 | 
							valid, err := cidrutil.ValidateCIDRListSlice(role.SecretIDBoundCIDRs)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate CIDR blocks: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate CIDR blocks: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse("invalid CIDR blocks"), nil
 | 
								return logical.ErrorResponse("invalid CIDR blocks"), nil
 | 
				
			||||||
@@ -1064,7 +1063,7 @@ func (b *backend) pathRoleRead(ctx context.Context, req *logical.Request, data *
 | 
				
			|||||||
			})
 | 
								})
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				lockRelease()
 | 
									lockRelease()
 | 
				
			||||||
				return nil, errwrap.Wrapf(fmt.Sprintf("failed to create secondary index for role_id %q: {{err}}", role.RoleID), err)
 | 
									return nil, fmt.Errorf("failed to create secondary index for role_id %q: %w", role.RoleID, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			resp.AddWarning("Role identifier was missing an index back to role name. A new index has been added. Please report this observation.")
 | 
								resp.AddWarning("Role identifier was missing an index back to role name. A new index has been added. Please report this observation.")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1096,12 +1095,12 @@ func (b *backend) pathRoleDelete(ctx context.Context, req *logical.Request, data
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Just before the role is deleted, remove all the SecretIDs issued as part of the role.
 | 
						// Just before the role is deleted, remove all the SecretIDs issued as part of the role.
 | 
				
			||||||
	if err = b.flushRoleSecrets(ctx, req.Storage, role.name, role.HMACKey, role.SecretIDPrefix); err != nil {
 | 
						if err = b.flushRoleSecrets(ctx, req.Storage, role.name, role.HMACKey, role.SecretIDPrefix); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("failed to invalidate the secrets belonging to role %q: {{err}}", role.name), err)
 | 
							return nil, fmt.Errorf("failed to invalidate the secrets belonging to role %q: %w", role.name, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Delete the reverse mapping from RoleID to the role
 | 
						// Delete the reverse mapping from RoleID to the role
 | 
				
			||||||
	if err = b.roleIDEntryDelete(ctx, req.Storage, role.RoleID); err != nil {
 | 
						if err = b.roleIDEntryDelete(ctx, req.Storage, role.RoleID); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("failed to delete the mapping from RoleID to role %q: {{err}}", role.name), err)
 | 
							return nil, fmt.Errorf("failed to delete the mapping from RoleID to role %q: %w", role.name, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// After deleting the SecretIDs and the RoleID, delete the role itself
 | 
						// After deleting the SecretIDs and the RoleID, delete the role itself
 | 
				
			||||||
@@ -1140,13 +1139,13 @@ func (b *backend) pathRoleSecretIDLookupUpdate(ctx context.Context, req *logical
 | 
				
			|||||||
	// Create the HMAC of the secret ID using the per-role HMAC key
 | 
						// Create the HMAC of the secret ID using the per-role HMAC key
 | 
				
			||||||
	secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
						secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create the HMAC of the roleName using the per-role HMAC key
 | 
						// Create the HMAC of the roleName using the per-role HMAC key
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
						roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create the index at which the secret_id would've been stored
 | 
						// Create the index at which the secret_id would've been stored
 | 
				
			||||||
@@ -1168,11 +1167,11 @@ func (b *backend) pathRoleSecretIDLookupUpdate(ctx context.Context, req *logical
 | 
				
			|||||||
	// entry, revoke the secret ID immediately
 | 
						// entry, revoke the secret ID immediately
 | 
				
			||||||
	accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, secretIDEntry.SecretIDAccessor, role.SecretIDPrefix)
 | 
						accessorEntry, err := b.secretIDAccessorEntry(ctx, req.Storage, secretIDEntry.SecretIDAccessor, role.SecretIDPrefix)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read secret ID accessor entry: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read secret ID accessor entry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if accessorEntry == nil {
 | 
						if accessorEntry == nil {
 | 
				
			||||||
		if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
							if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf(fmt.Sprintf("error deleting secret ID %q from storage: {{err}}", secretIDHMAC), err)
 | 
								return nil, fmt.Errorf("error deleting secret ID %q from storage: %w", secretIDHMAC, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return logical.ErrorResponse("invalid secret id"), nil
 | 
							return logical.ErrorResponse("invalid secret id"), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1225,12 +1224,12 @@ func (b *backend) pathRoleSecretIDDestroyUpdateDelete(ctx context.Context, req *
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
						secretIDHMAC, err := createHMAC(role.HMACKey, secretID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
						roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
						entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
				
			||||||
@@ -1254,7 +1253,7 @@ func (b *backend) pathRoleSecretIDDestroyUpdateDelete(ctx context.Context, req *
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Delete the storage entry that corresponds to the SecretID
 | 
						// Delete the storage entry that corresponds to the SecretID
 | 
				
			||||||
	if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
						if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to delete secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to delete secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, nil
 | 
						return nil, nil
 | 
				
			||||||
@@ -1299,7 +1298,7 @@ func (b *backend) pathRoleSecretIDAccessorLookupUpdate(ctx context.Context, req
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
						roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	secretLock := b.secretIDLock(accessorEntry.SecretIDHMAC)
 | 
						secretLock := b.secretIDLock(accessorEntry.SecretIDHMAC)
 | 
				
			||||||
@@ -1352,7 +1351,7 @@ func (b *backend) pathRoleSecretIDAccessorDestroyUpdateDelete(ctx context.Contex
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
						roleNameHMAC, err := createHMAC(role.HMACKey, role.name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, accessorEntry.SecretIDHMAC)
 | 
						entryIndex := fmt.Sprintf("%s%s/%s", role.SecretIDPrefix, roleNameHMAC, accessorEntry.SecretIDHMAC)
 | 
				
			||||||
@@ -1368,7 +1367,7 @@ func (b *backend) pathRoleSecretIDAccessorDestroyUpdateDelete(ctx context.Contex
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Delete the storage entry that corresponds to the SecretID
 | 
						// Delete the storage entry that corresponds to the SecretID
 | 
				
			||||||
	if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
						if err := req.Storage.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to delete secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to delete secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, nil
 | 
						return nil, nil
 | 
				
			||||||
@@ -1418,7 +1417,7 @@ func (b *backend) pathRoleBoundCIDRUpdateCommon(ctx context.Context, req *logica
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListSlice(cidrs)
 | 
							valid, err := cidrutil.ValidateCIDRListSlice(cidrs)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return logical.ErrorResponse(errwrap.Wrapf("failed to validate CIDR blocks: {{err}}", err).Error()), nil
 | 
								return logical.ErrorResponse(fmt.Errorf("failed to validate CIDR blocks: %w", err).Error()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse("failed to validate CIDR blocks"), nil
 | 
								return logical.ErrorResponse("failed to validate CIDR blocks"), nil
 | 
				
			||||||
@@ -1428,7 +1427,7 @@ func (b *backend) pathRoleBoundCIDRUpdateCommon(ctx context.Context, req *logica
 | 
				
			|||||||
	} else if cidrsIfc, ok := data.GetOk("token_bound_cidrs"); ok {
 | 
						} else if cidrsIfc, ok := data.GetOk("token_bound_cidrs"); ok {
 | 
				
			||||||
		cidrs, err := parseutil.ParseAddrs(cidrsIfc.([]string))
 | 
							cidrs, err := parseutil.ParseAddrs(cidrsIfc.([]string))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return logical.ErrorResponse(errwrap.Wrapf("failed to parse token_bound_cidrs: {{err}}", err).Error()), nil
 | 
								return logical.ErrorResponse(fmt.Errorf("failed to parse token_bound_cidrs: %w", err).Error()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		role.TokenBoundCIDRs = cidrs
 | 
							role.TokenBoundCIDRs = cidrs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -2271,7 +2270,7 @@ func (b *backend) pathRoleTokenMaxTTLDelete(ctx context.Context, req *logical.Re
 | 
				
			|||||||
func (b *backend) pathRoleSecretIDUpdate(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | 
					func (b *backend) pathRoleSecretIDUpdate(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | 
				
			||||||
	secretID, err := uuid.GenerateUUID()
 | 
						secretID, err := uuid.GenerateUUID()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to generate secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to generate secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return b.handleRoleSecretIDCommon(ctx, req, data, secretID)
 | 
						return b.handleRoleSecretIDCommon(ctx, req, data, secretID)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -2312,7 +2311,7 @@ func (b *backend) handleRoleSecretIDCommon(ctx context.Context, req *logical.Req
 | 
				
			|||||||
	if len(secretIDCIDRs) != 0 {
 | 
						if len(secretIDCIDRs) != 0 {
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListSlice(secretIDCIDRs)
 | 
							valid, err := cidrutil.ValidateCIDRListSlice(secretIDCIDRs)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate CIDR blocks: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate CIDR blocks: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse("failed to validate CIDR blocks"), nil
 | 
								return logical.ErrorResponse("failed to validate CIDR blocks"), nil
 | 
				
			||||||
@@ -2327,7 +2326,7 @@ func (b *backend) handleRoleSecretIDCommon(ctx context.Context, req *logical.Req
 | 
				
			|||||||
	if len(secretIDTokenCIDRs) != 0 {
 | 
						if len(secretIDTokenCIDRs) != 0 {
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListSlice(secretIDTokenCIDRs)
 | 
							valid, err := cidrutil.ValidateCIDRListSlice(secretIDTokenCIDRs)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate token CIDR blocks: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate token CIDR blocks: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse("failed to validate token CIDR blocks"), nil
 | 
								return logical.ErrorResponse("failed to validate token CIDR blocks"), nil
 | 
				
			||||||
@@ -2355,7 +2354,7 @@ func (b *backend) handleRoleSecretIDCommon(ctx context.Context, req *logical.Req
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if secretIDStorage, err = b.registerSecretIDEntry(ctx, req.Storage, role.name, secretID, role.HMACKey, role.SecretIDPrefix, secretIDStorage); err != nil {
 | 
						if secretIDStorage, err = b.registerSecretIDEntry(ctx, req.Storage, role.name, secretID, role.HMACKey, role.SecretIDPrefix, secretIDStorage); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to store secret_id: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to store secret_id: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp := &logical.Response{
 | 
						resp := &logical.Response{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"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/helper/locksutil"
 | 
				
			||||||
@@ -114,7 +113,7 @@ func (b *backend) tidySecretIDinternal(s logical.Storage) {
 | 
				
			|||||||
			entryIndex := fmt.Sprintf("%s%s%s", secretIDPrefixToUse, roleNameHMAC, secretIDHMAC)
 | 
								entryIndex := fmt.Sprintf("%s%s%s", secretIDPrefixToUse, roleNameHMAC, secretIDHMAC)
 | 
				
			||||||
			secretIDEntry, err := s.Get(ctx, entryIndex)
 | 
								secretIDEntry, err := s.Get(ctx, entryIndex)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return errwrap.Wrapf(fmt.Sprintf("error fetching SecretID %q: {{err}}", secretIDHMAC), err)
 | 
									return fmt.Errorf("error fetching SecretID %q: %w", secretIDHMAC, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if secretIDEntry == nil {
 | 
								if secretIDEntry == nil {
 | 
				
			||||||
@@ -135,12 +134,12 @@ func (b *backend) tidySecretIDinternal(s logical.Storage) {
 | 
				
			|||||||
			// entry, revoke the secret ID immediately
 | 
								// entry, revoke the secret ID immediately
 | 
				
			||||||
			accessorEntry, err := b.secretIDAccessorEntry(ctx, s, result.SecretIDAccessor, secretIDPrefixToUse)
 | 
								accessorEntry, err := b.secretIDAccessorEntry(ctx, s, result.SecretIDAccessor, secretIDPrefixToUse)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return errwrap.Wrapf("failed to read secret ID accessor entry: {{err}}", err)
 | 
									return fmt.Errorf("failed to read secret ID accessor entry: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if accessorEntry == nil {
 | 
								if accessorEntry == nil {
 | 
				
			||||||
				logger.Trace("found nil accessor")
 | 
									logger.Trace("found nil accessor")
 | 
				
			||||||
				if err := s.Delete(ctx, entryIndex); err != nil {
 | 
									if err := s.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
					return errwrap.Wrapf(fmt.Sprintf("error deleting secret ID %q from storage: {{err}}", secretIDHMAC), err)
 | 
										return fmt.Errorf("error deleting secret ID %q from storage: %w", secretIDHMAC, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -151,11 +150,11 @@ func (b *backend) tidySecretIDinternal(s logical.Storage) {
 | 
				
			|||||||
				// Clean up the accessor of the secret ID first
 | 
									// Clean up the accessor of the secret ID first
 | 
				
			||||||
				err = b.deleteSecretIDAccessorEntry(ctx, s, result.SecretIDAccessor, secretIDPrefixToUse)
 | 
									err = b.deleteSecretIDAccessorEntry(ctx, s, result.SecretIDAccessor, secretIDPrefixToUse)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return errwrap.Wrapf("failed to delete secret ID accessor entry: {{err}}", err)
 | 
										return fmt.Errorf("failed to delete secret ID accessor entry: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if err := s.Delete(ctx, entryIndex); err != nil {
 | 
									if err := s.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
					return errwrap.Wrapf(fmt.Sprintf("error deleting SecretID %q from storage: {{err}}", secretIDHMAC), err)
 | 
										return fmt.Errorf("error deleting SecretID %q from storage: %w", secretIDHMAC, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				return nil
 | 
									return nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	uuid "github.com/hashicorp/go-uuid"
 | 
						uuid "github.com/hashicorp/go-uuid"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/locksutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/locksutil"
 | 
				
			||||||
@@ -79,7 +78,12 @@ func verifyCIDRRoleSecretIDSubset(secretIDCIDRs []string, roleBoundCIDRList []st
 | 
				
			|||||||
		if len(roleBoundCIDRList) != 0 {
 | 
							if len(roleBoundCIDRList) != 0 {
 | 
				
			||||||
			subset, err := cidrutil.SubsetBlocks(roleBoundCIDRList, secretIDCIDRs)
 | 
								subset, err := cidrutil.SubsetBlocks(roleBoundCIDRList, secretIDCIDRs)
 | 
				
			||||||
			if !subset || err != nil {
 | 
								if !subset || err != nil {
 | 
				
			||||||
				return errwrap.Wrapf(fmt.Sprintf("failed to verify subset relationship between CIDR blocks on the role %q and CIDR blocks on the secret ID %q: {{err}}", roleBoundCIDRList, secretIDCIDRs), err)
 | 
									return fmt.Errorf(
 | 
				
			||||||
 | 
										"failed to verify subset relationship between CIDR blocks on the role %q and CIDR blocks on the secret ID %q: %w",
 | 
				
			||||||
 | 
										roleBoundCIDRList,
 | 
				
			||||||
 | 
										secretIDCIDRs,
 | 
				
			||||||
 | 
										err,
 | 
				
			||||||
 | 
									)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -151,7 +155,7 @@ func (b *backend) nonLockedSecretIDStorageEntry(ctx context.Context, s logical.S
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if persistNeeded {
 | 
						if persistNeeded {
 | 
				
			||||||
		if err := b.nonLockedSetSecretIDStorageEntry(ctx, s, roleSecretIDPrefix, roleNameHMAC, secretIDHMAC, &result); err != nil {
 | 
							if err := b.nonLockedSetSecretIDStorageEntry(ctx, s, roleSecretIDPrefix, roleNameHMAC, secretIDHMAC, &result); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to upgrade role storage entry {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to upgrade role storage entry %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -194,11 +198,11 @@ func (b *backend) nonLockedSetSecretIDStorageEntry(ctx context.Context, s logica
 | 
				
			|||||||
func (b *backend) registerSecretIDEntry(ctx context.Context, s logical.Storage, roleName, secretID, hmacKey, roleSecretIDPrefix string, secretEntry *secretIDStorageEntry) (*secretIDStorageEntry, error) {
 | 
					func (b *backend) registerSecretIDEntry(ctx context.Context, s logical.Storage, roleName, secretID, hmacKey, roleSecretIDPrefix string, secretEntry *secretIDStorageEntry) (*secretIDStorageEntry, error) {
 | 
				
			||||||
	secretIDHMAC, err := createHMAC(hmacKey, secretID)
 | 
						secretIDHMAC, err := createHMAC(hmacKey, secretID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of secret ID: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of secret ID: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(hmacKey, roleName)
 | 
						roleNameHMAC, err := createHMAC(hmacKey, roleName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lock := b.secretIDLock(secretIDHMAC)
 | 
						lock := b.secretIDLock(secretIDHMAC)
 | 
				
			||||||
@@ -335,7 +339,7 @@ func (b *backend) createSecretIDAccessorEntry(ctx context.Context, s logical.Sto
 | 
				
			|||||||
	}); err != nil {
 | 
						}); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	} else if err = s.Put(ctx, entry); err != nil {
 | 
						} else if err = s.Put(ctx, entry); err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("failed to persist accessor index entry: {{err}}", err)
 | 
							return fmt.Errorf("failed to persist accessor index entry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -360,7 +364,7 @@ func (b *backend) deleteSecretIDAccessorEntry(ctx context.Context, s logical.Sto
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Delete the accessor of the SecretID first
 | 
						// Delete the accessor of the SecretID first
 | 
				
			||||||
	if err := s.Delete(ctx, entryIndex); err != nil {
 | 
						if err := s.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("failed to delete accessor storage entry: {{err}}", err)
 | 
							return fmt.Errorf("failed to delete accessor storage entry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -371,7 +375,7 @@ func (b *backend) deleteSecretIDAccessorEntry(ctx context.Context, s logical.Sto
 | 
				
			|||||||
func (b *backend) flushRoleSecrets(ctx context.Context, s logical.Storage, roleName, hmacKey, roleSecretIDPrefix string) error {
 | 
					func (b *backend) flushRoleSecrets(ctx context.Context, s logical.Storage, roleName, hmacKey, roleSecretIDPrefix string) error {
 | 
				
			||||||
	roleNameHMAC, err := createHMAC(hmacKey, roleName)
 | 
						roleNameHMAC, err := createHMAC(hmacKey, roleName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("failed to create HMAC of role_name: {{err}}", err)
 | 
							return fmt.Errorf("failed to create HMAC of role_name: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Acquire the custom lock to perform listing of SecretIDs
 | 
						// Acquire the custom lock to perform listing of SecretIDs
 | 
				
			||||||
@@ -389,7 +393,7 @@ func (b *backend) flushRoleSecrets(ctx context.Context, s logical.Storage, roleN
 | 
				
			|||||||
		entryIndex := fmt.Sprintf("%s%s/%s", roleSecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
							entryIndex := fmt.Sprintf("%s%s/%s", roleSecretIDPrefix, roleNameHMAC, secretIDHMAC)
 | 
				
			||||||
		if err := s.Delete(ctx, entryIndex); err != nil {
 | 
							if err := s.Delete(ctx, entryIndex); err != nil {
 | 
				
			||||||
			lock.Unlock()
 | 
								lock.Unlock()
 | 
				
			||||||
			return errwrap.Wrapf(fmt.Sprintf("error deleting SecretID %q from storage: {{err}}", secretIDHMAC), err)
 | 
								return fmt.Errorf("error deleting SecretID %q from storage: %w", secretIDHMAC, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		lock.Unlock()
 | 
							lock.Unlock()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,6 @@ import (
 | 
				
			|||||||
	"github.com/aws/aws-sdk-go/aws/endpoints"
 | 
						"github.com/aws/aws-sdk-go/aws/endpoints"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/aws/session"
 | 
						"github.com/aws/aws-sdk-go/aws/session"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/sts"
 | 
						"github.com/aws/aws-sdk-go/service/sts"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/go-hclog"
 | 
						"github.com/hashicorp/go-hclog"
 | 
				
			||||||
	"github.com/hashicorp/vault/api"
 | 
						"github.com/hashicorp/vault/api"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
				
			||||||
@@ -155,7 +154,7 @@ func RetrieveCreds(accessKey, secretKey, sessionToken string, logger hclog.Logge
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	_, err = creds.Get()
 | 
						_, err = creds.Get()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to retrieve credentials from credential chain: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to retrieve credentials from credential chain: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return creds, nil
 | 
						return creds, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ import (
 | 
				
			|||||||
	"github.com/aws/aws-sdk-go/service/ec2"
 | 
						"github.com/aws/aws-sdk-go/service/ec2"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam"
 | 
						"github.com/aws/aws-sdk-go/service/iam"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/sts"
 | 
						"github.com/aws/aws-sdk-go/service/sts"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	cleanhttp "github.com/hashicorp/go-cleanhttp"
 | 
						cleanhttp "github.com/hashicorp/go-cleanhttp"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -117,12 +116,12 @@ func (b *backend) getClientConfig(ctx context.Context, s logical.Storage, region
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			client := sts.New(sess)
 | 
								client := sts.New(sess)
 | 
				
			||||||
			if client == nil {
 | 
								if client == nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf("could not obtain sts client: {{err}}", err)
 | 
									return nil, fmt.Errorf("could not obtain sts client: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			inputParams := &sts.GetCallerIdentityInput{}
 | 
								inputParams := &sts.GetCallerIdentityInput{}
 | 
				
			||||||
			identity, err := client.GetCallerIdentity(inputParams)
 | 
								identity, err := client.GetCallerIdentity(inputParams)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf("unable to fetch current caller: {{err}}", err)
 | 
									return nil, fmt.Errorf("unable to fetch current caller: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if identity == nil {
 | 
								if identity == nil {
 | 
				
			||||||
				return nil, fmt.Errorf("got nil result from GetCallerIdentity")
 | 
									return nil, fmt.Errorf("got nil result from GetCallerIdentity")
 | 
				
			||||||
@@ -182,7 +181,7 @@ func (b *backend) stsRoleForAccount(ctx context.Context, s logical.Storage, acco
 | 
				
			|||||||
	// Check if an STS configuration exists for the AWS account
 | 
						// Check if an STS configuration exists for the AWS account
 | 
				
			||||||
	sts, err := b.lockedAwsStsEntry(ctx, s, accountID)
 | 
						sts, err := b.lockedAwsStsEntry(ctx, s, accountID)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", errwrap.Wrapf(fmt.Sprintf("error fetching STS config for account ID %q: {{err}}", accountID), err)
 | 
							return "", fmt.Errorf("error fetching STS config for account ID %q: %w", accountID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// An empty STS role signifies the master account
 | 
						// An empty STS role signifies the master account
 | 
				
			||||||
	if sts != nil {
 | 
						if sts != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ import (
 | 
				
			|||||||
	"github.com/aws/aws-sdk-go/service/ec2"
 | 
						"github.com/aws/aws-sdk-go/service/ec2"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam"
 | 
						"github.com/aws/aws-sdk-go/service/iam"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam/iamiface"
 | 
						"github.com/aws/aws-sdk-go/service/iam/iamiface"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/go-cleanhttp"
 | 
						"github.com/hashicorp/go-cleanhttp"
 | 
				
			||||||
	"github.com/hashicorp/go-multierror"
 | 
						"github.com/hashicorp/go-multierror"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
@@ -72,7 +71,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	// Attempt to retrieve the region, error out if no region is provided.
 | 
						// Attempt to retrieve the region, error out if no region is provided.
 | 
				
			||||||
	region, err := awsutil.GetRegion("")
 | 
						region, err := awsutil.GetRegion("")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving region: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving region: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	awsConfig := &aws.Config{
 | 
						awsConfig := &aws.Config{
 | 
				
			||||||
@@ -100,7 +99,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	var getUserInput iam.GetUserInput
 | 
						var getUserInput iam.GetUserInput
 | 
				
			||||||
	getUserRes, err := iamClient.GetUser(&getUserInput)
 | 
						getUserRes, err := iamClient.GetUser(&getUserInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error calling GetUser: {{err}}", err)
 | 
							return nil, fmt.Errorf("error calling GetUser: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if getUserRes == nil {
 | 
						if getUserRes == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("nil response from GetUser")
 | 
							return nil, fmt.Errorf("nil response from GetUser")
 | 
				
			||||||
@@ -118,7 +117,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	createAccessKeyRes, err := iamClient.CreateAccessKey(&createAccessKeyInput)
 | 
						createAccessKeyRes, err := iamClient.CreateAccessKey(&createAccessKeyInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error calling CreateAccessKey: {{err}}", err)
 | 
							return nil, fmt.Errorf("error calling CreateAccessKey: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if createAccessKeyRes.AccessKey == nil {
 | 
						if createAccessKeyRes.AccessKey == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("nil response from CreateAccessKey")
 | 
							return nil, fmt.Errorf("nil response from CreateAccessKey")
 | 
				
			||||||
@@ -150,7 +149,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	// we need to hold onto the lock.
 | 
						// we need to hold onto the lock.
 | 
				
			||||||
	newEntry, err := b.configClientToEntry(clientConf)
 | 
						newEntry, err := b.configClientToEntry(clientConf)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		errs = multierror.Append(errs, errwrap.Wrapf("error generating new client config JSON: {{err}}", err))
 | 
							errs = multierror.Append(errs, fmt.Errorf("error generating new client config JSON: %w", err))
 | 
				
			||||||
		return nil, errs
 | 
							return nil, errs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -162,7 +161,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	// before deleting the previous access key to allow work to complete. That would allow
 | 
						// before deleting the previous access key to allow work to complete. That would allow
 | 
				
			||||||
	// AWS, which is eventually consistent, to finish populating the new key in all places.
 | 
						// AWS, which is eventually consistent, to finish populating the new key in all places.
 | 
				
			||||||
	if err := req.Storage.Put(ctx, newEntry); err != nil {
 | 
						if err := req.Storage.Put(ctx, newEntry); err != nil {
 | 
				
			||||||
		errs = multierror.Append(errs, errwrap.Wrapf("error saving new client config: {{err}}", err))
 | 
							errs = multierror.Append(errs, fmt.Errorf("error saving new client config: %w", err))
 | 
				
			||||||
		return nil, errs
 | 
							return nil, errs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	storedNewConf = true
 | 
						storedNewConf = true
 | 
				
			||||||
@@ -178,7 +177,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
		UserName:    getUserRes.User.UserName,
 | 
							UserName:    getUserRes.User.UserName,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if _, err = iamClient.DeleteAccessKey(&deleteAccessKeyInput); err != nil {
 | 
						if _, err = iamClient.DeleteAccessKey(&deleteAccessKeyInput); err != nil {
 | 
				
			||||||
		errs = multierror.Append(errs, errwrap.Wrapf(fmt.Sprintf("error deleting old access key ID %s: {{err}}", oldAccessKey), err))
 | 
							errs = multierror.Append(errs, fmt.Errorf("error deleting old access key ID %s: %w", oldAccessKey, err))
 | 
				
			||||||
		return nil, errs
 | 
							return nil, errs
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &logical.Response{
 | 
						return &logical.Response{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -185,7 +185,7 @@ func (b *backend) validateInstance(ctx context.Context, s logical.Storage, insta
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		errW := errwrap.Wrapf(fmt.Sprintf("error fetching description for instance ID %q: {{err}}", instanceID), err)
 | 
							errW := fmt.Errorf("error fetching description for instance ID %q: %w", instanceID, err)
 | 
				
			||||||
		return nil, errwrap.Wrap(errW, awsutil.CheckAWSError(err))
 | 
							return nil, errwrap.Wrap(errW, awsutil.CheckAWSError(err))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if status == nil {
 | 
						if status == nil {
 | 
				
			||||||
@@ -328,7 +328,7 @@ func (b *backend) parseIdentityDocument(ctx context.Context, s logical.Storage,
 | 
				
			|||||||
	// Parse the signature from asn1 format into a struct
 | 
						// Parse the signature from asn1 format into a struct
 | 
				
			||||||
	pkcs7Data, err := pkcs7.Parse(pkcs7BER.Bytes)
 | 
						pkcs7Data, err := pkcs7.Parse(pkcs7BER.Bytes)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to parse the BER encoded PKCS#7 signature: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to parse the BER encoded PKCS#7 signature: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Get the public certificates that are used to verify the signature.
 | 
						// Get the public certificates that are used to verify the signature.
 | 
				
			||||||
@@ -511,19 +511,19 @@ func (b *backend) verifyInstanceMeetsRoleRequirements(ctx context.Context,
 | 
				
			|||||||
		// profile ARN
 | 
							// profile ARN
 | 
				
			||||||
		iamInstanceProfileEntity, err := parseIamArn(iamInstanceProfileARN)
 | 
							iamInstanceProfileEntity, err := parseIamArn(iamInstanceProfileARN)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf(fmt.Sprintf("failed to parse IAM instance profile ARN %q: {{err}}", iamInstanceProfileARN), err)
 | 
								return nil, fmt.Errorf("failed to parse IAM instance profile ARN %q: %w", iamInstanceProfileARN, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Use instance profile ARN to fetch the associated role ARN
 | 
							// Use instance profile ARN to fetch the associated role ARN
 | 
				
			||||||
		iamClient, err := b.clientIAM(ctx, s, identityDoc.Region, identityDoc.AccountID)
 | 
							iamClient, err := b.clientIAM(ctx, s, identityDoc.Region, identityDoc.AccountID)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("could not fetch IAM client: {{err}}", err)
 | 
								return nil, fmt.Errorf("could not fetch IAM client: %w", err)
 | 
				
			||||||
		} else if iamClient == nil {
 | 
							} else if iamClient == nil {
 | 
				
			||||||
			return nil, fmt.Errorf("received a nil iamClient")
 | 
								return nil, fmt.Errorf("received a nil iamClient")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		iamRoleARN, err := b.instanceIamRoleARN(iamClient, iamInstanceProfileEntity.FriendlyName)
 | 
							iamRoleARN, err := b.instanceIamRoleARN(iamClient, iamInstanceProfileEntity.FriendlyName)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("IAM role ARN could not be fetched: {{err}}", err)
 | 
								return nil, fmt.Errorf("IAM role ARN could not be fetched: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if iamRoleARN == "" {
 | 
							if iamRoleARN == "" {
 | 
				
			||||||
			return nil, fmt.Errorf("IAM role ARN could not be fetched")
 | 
								return nil, fmt.Errorf("IAM role ARN could not be fetched")
 | 
				
			||||||
@@ -1018,7 +1018,7 @@ func (b *backend) pathLoginRenewIam(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
				b.Logger().Debug("account_id not present during iam renewal attempt, continuing to attempt validation")
 | 
									b.Logger().Debug("account_id not present during iam renewal attempt, continuing to attempt validation")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if _, err := b.validateInstance(ctx, req.Storage, instanceID, instanceRegion, accountID); err != nil {
 | 
								if _, err := b.validateInstance(ctx, req.Storage, instanceID, instanceRegion, accountID); err != nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf(fmt.Sprintf("failed to verify instance ID %q: {{err}}", instanceID), err)
 | 
									return nil, fmt.Errorf("failed to verify instance ID %q: %w", instanceID, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			return nil, fmt.Errorf("unrecognized entity_type in metadata: %q", roleEntry.InferredEntityType)
 | 
								return nil, fmt.Errorf("unrecognized entity_type in metadata: %q", roleEntry.InferredEntityType)
 | 
				
			||||||
@@ -1054,11 +1054,21 @@ func (b *backend) pathLoginRenewIam(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
			if fullArn == "" {
 | 
								if fullArn == "" {
 | 
				
			||||||
				entity, err := parseIamArn(canonicalArn)
 | 
									entity, err := parseIamArn(canonicalArn)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf(fmt.Sprintf("error parsing ARN %q when updating login for role %q: {{err}}", canonicalArn, roleName), err)
 | 
										return nil, fmt.Errorf(
 | 
				
			||||||
 | 
											"error parsing ARN %q when updating login for role %q: %w",
 | 
				
			||||||
 | 
											canonicalArn,
 | 
				
			||||||
 | 
											roleName,
 | 
				
			||||||
 | 
											err,
 | 
				
			||||||
 | 
										)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				fullArn, err = b.fullArn(ctx, entity, req.Storage)
 | 
									fullArn, err = b.fullArn(ctx, entity, req.Storage)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf(fmt.Sprintf("error looking up full ARN of entity %v when updating login for role %q: {{err}}", entity, roleName), err)
 | 
										return nil, fmt.Errorf(
 | 
				
			||||||
 | 
											"error looking up full ARN of entity %v when updating login for role %q: %w",
 | 
				
			||||||
 | 
											entity,
 | 
				
			||||||
 | 
											roleName,
 | 
				
			||||||
 | 
											err,
 | 
				
			||||||
 | 
										)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if fullArn == "" {
 | 
									if fullArn == "" {
 | 
				
			||||||
					return nil, fmt.Errorf("got empty string back when looking up full ARN of entity %v when updating login for role %q", entity, roleName)
 | 
										return nil, fmt.Errorf("got empty string back when looking up full ARN of entity %v when updating login for role %q", entity, roleName)
 | 
				
			||||||
@@ -1103,7 +1113,7 @@ func (b *backend) pathLoginRenewEc2(ctx context.Context, req *logical.Request, _
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Cross check that the instance is still in 'running' state
 | 
						// Cross check that the instance is still in 'running' state
 | 
				
			||||||
	if _, err := b.validateInstance(ctx, req.Storage, instanceID, region, accountID); err != nil {
 | 
						if _, err := b.validateInstance(ctx, req.Storage, instanceID, region, accountID); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("failed to verify instance ID %q: {{err}}", instanceID), err)
 | 
							return nil, fmt.Errorf("failed to verify instance ID %q: %w", instanceID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	storedIdentity, err := accessListIdentityEntry(ctx, req.Storage, instanceID)
 | 
						storedIdentity, err := accessListIdentityEntry(ctx, req.Storage, instanceID)
 | 
				
			||||||
@@ -1649,7 +1659,7 @@ func submitCallerIdentityRequest(ctx context.Context, maxRetries int, method, en
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	response, err := retryingClient.Do(retryableReq)
 | 
						response, err := retryingClient.Do(retryableReq)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error making request: {{err}}", err)
 | 
							return nil, fmt.Errorf("error making request: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if response != nil {
 | 
						if response != nil {
 | 
				
			||||||
		defer response.Body.Close()
 | 
							defer response.Body.Close()
 | 
				
			||||||
@@ -1744,7 +1754,7 @@ func (b *backend) fullArn(ctx context.Context, e *iamEntity, s logical.Storage)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	client, err := b.clientIAM(ctx, s, region.ID(), e.AccountNumber)
 | 
						client, err := b.clientIAM(ctx, s, region.ID(), e.AccountNumber)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", errwrap.Wrapf("error creating IAM client: {{err}}", err)
 | 
							return "", fmt.Errorf("error creating IAM client: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch e.Type {
 | 
						switch e.Type {
 | 
				
			||||||
@@ -1754,7 +1764,7 @@ func (b *backend) fullArn(ctx context.Context, e *iamEntity, s logical.Storage)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		resp, err := client.GetUser(&input)
 | 
							resp, err := client.GetUser(&input)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return "", errwrap.Wrapf(fmt.Sprintf("error fetching user %q: {{err}}", e.FriendlyName), err)
 | 
								return "", fmt.Errorf("error fetching user %q: %w", e.FriendlyName, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if resp == nil {
 | 
							if resp == nil {
 | 
				
			||||||
			return "", fmt.Errorf("nil response from GetUser")
 | 
								return "", fmt.Errorf("nil response from GetUser")
 | 
				
			||||||
@@ -1768,7 +1778,7 @@ func (b *backend) fullArn(ctx context.Context, e *iamEntity, s logical.Storage)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		resp, err := client.GetRole(&input)
 | 
							resp, err := client.GetRole(&input)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return "", errwrap.Wrapf(fmt.Sprintf("error fetching role %q: {{err}}", e.FriendlyName), err)
 | 
								return "", fmt.Errorf("error fetching role %q: %w", e.FriendlyName, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if resp == nil {
 | 
							if resp == nil {
 | 
				
			||||||
			return "", fmt.Errorf("nil response form GetRole")
 | 
								return "", fmt.Errorf("nil response form GetRole")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	uuid "github.com/hashicorp/go-uuid"
 | 
						uuid "github.com/hashicorp/go-uuid"
 | 
				
			||||||
	"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"
 | 
				
			||||||
@@ -290,11 +289,11 @@ func (b *backend) roleInternal(ctx context.Context, s logical.Storage, roleName
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	needUpgrade, err := b.upgradeRole(ctx, s, result)
 | 
						needUpgrade, err := b.upgradeRole(ctx, s, result)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error upgrading roleEntry: {{err}}", err)
 | 
							return nil, fmt.Errorf("error upgrading roleEntry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if needUpgrade && (b.System().LocalMount() || !b.System().ReplicationState().HasState(consts.ReplicationPerformanceSecondary|consts.ReplicationPerformanceStandby)) {
 | 
						if needUpgrade && (b.System().LocalMount() || !b.System().ReplicationState().HasState(consts.ReplicationPerformanceSecondary|consts.ReplicationPerformanceStandby)) {
 | 
				
			||||||
		if err = b.setRole(ctx, s, roleName, result); err != nil {
 | 
							if err = b.setRole(ctx, s, roleName, result); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("error saving upgraded roleEntry: {{err}}", err)
 | 
								return nil, fmt.Errorf("error saving upgraded roleEntry: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -574,7 +573,7 @@ func (b *backend) pathRoleDelete(ctx context.Context, req *logical.Request, data
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	err := req.Storage.Delete(ctx, "role/"+strings.ToLower(roleName))
 | 
						err := req.Storage.Delete(ctx, "role/"+strings.ToLower(roleName))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error deleting role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error deleting role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b.roleCache.Delete(roleName)
 | 
						b.roleCache.Delete(roleName)
 | 
				
			||||||
@@ -923,7 +922,7 @@ func (b *backend) pathRoleCreateUpdate(ctx context.Context, req *logical.Request
 | 
				
			|||||||
	if roleEntry.HMACKey == "" {
 | 
						if roleEntry.HMACKey == "" {
 | 
				
			||||||
		roleEntry.HMACKey, err = uuid.GenerateUUID()
 | 
							roleEntry.HMACKey, err = uuid.GenerateUUID()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to generate role HMAC key: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to generate role HMAC key: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"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/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -70,7 +69,7 @@ func (b *backend) tidyAccessListIdentity(ctx context.Context, req *logical.Reque
 | 
				
			|||||||
			for _, instanceID := range identities {
 | 
								for _, instanceID := range identities {
 | 
				
			||||||
				identityEntry, err := s.Get(ctx, identityAccessListStorage+instanceID)
 | 
									identityEntry, err := s.Get(ctx, identityAccessListStorage+instanceID)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return errwrap.Wrapf(fmt.Sprintf("error fetching identity of instanceID %q: {{err}}", instanceID), err)
 | 
										return fmt.Errorf("error fetching identity of instanceID %q: %w", instanceID, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if identityEntry == nil {
 | 
									if identityEntry == nil {
 | 
				
			||||||
@@ -88,7 +87,7 @@ func (b *backend) tidyAccessListIdentity(ctx context.Context, req *logical.Reque
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				if time.Now().After(result.ExpirationTime.Add(bufferDuration)) {
 | 
									if time.Now().After(result.ExpirationTime.Add(bufferDuration)) {
 | 
				
			||||||
					if err := s.Delete(ctx, identityAccessListStorage+instanceID); err != nil {
 | 
										if err := s.Delete(ctx, identityAccessListStorage+instanceID); err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("error deleting identity of instanceID %q from storage: {{err}}", instanceID), err)
 | 
											return fmt.Errorf("error deleting identity of instanceID %q from storage: %w", instanceID, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"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/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -74,7 +73,7 @@ func (b *backend) tidyDenyListRoleTag(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
			for _, tag := range tags {
 | 
								for _, tag := range tags {
 | 
				
			||||||
				tagEntry, err := s.Get(ctx, denyListRoletagStorage+tag)
 | 
									tagEntry, err := s.Get(ctx, denyListRoletagStorage+tag)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return errwrap.Wrapf(fmt.Sprintf("error fetching tag %q: {{err}}", tag), err)
 | 
										return fmt.Errorf("error fetching tag %q: %w", tag, err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if tagEntry == nil {
 | 
									if tagEntry == nil {
 | 
				
			||||||
@@ -92,7 +91,7 @@ func (b *backend) tidyDenyListRoleTag(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				if time.Now().After(result.ExpirationTime.Add(bufferDuration)) {
 | 
									if time.Now().After(result.ExpirationTime.Add(bufferDuration)) {
 | 
				
			||||||
					if err := s.Delete(ctx, denyListRoletagStorage+tag); err != nil {
 | 
										if err := s.Delete(ctx, denyListRoletagStorage+tag); err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("error deleting tag %q from storage: {{err}}", tag), err)
 | 
											return fmt.Errorf("error deleting tag %q from storage: %w", tag, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@ package cert
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -52,7 +52,7 @@ func (b *backend) Config(ctx context.Context, s logical.Storage) (*config, error
 | 
				
			|||||||
	var result config
 | 
						var result config
 | 
				
			||||||
	if entry != nil {
 | 
						if entry != nil {
 | 
				
			||||||
		if err := entry.DecodeJSON(&result); err != nil {
 | 
							if err := entry.DecodeJSON(&result); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("error reading configuration: {{err}}", err)
 | 
								return nil, fmt.Errorf("error reading configuration: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &result, nil
 | 
						return &result, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/fatih/structs"
 | 
						"github.com/fatih/structs"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -55,7 +54,7 @@ func (b *backend) populateCRLs(ctx context.Context, storage logical.Storage) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	keys, err := storage.List(ctx, "crls/")
 | 
						keys, err := storage.List(ctx, "crls/")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error listing CRLs: {{err}}", err)
 | 
							return fmt.Errorf("error listing CRLs: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if keys == nil || len(keys) == 0 {
 | 
						if keys == nil || len(keys) == 0 {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
@@ -65,7 +64,7 @@ func (b *backend) populateCRLs(ctx context.Context, storage logical.Storage) err
 | 
				
			|||||||
		entry, err := storage.Get(ctx, "crls/"+key)
 | 
							entry, err := storage.Get(ctx, "crls/"+key)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			b.crls = nil
 | 
								b.crls = nil
 | 
				
			||||||
			return errwrap.Wrapf(fmt.Sprintf("error loading CRL %q: {{err}}", key), err)
 | 
								return fmt.Errorf("error loading CRL %q: %w", key, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if entry == nil {
 | 
							if entry == nil {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
@@ -74,7 +73,7 @@ func (b *backend) populateCRLs(ctx context.Context, storage logical.Storage) err
 | 
				
			|||||||
		err = entry.DecodeJSON(&crlInfo)
 | 
							err = entry.DecodeJSON(&crlInfo)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			b.crls = nil
 | 
								b.crls = nil
 | 
				
			||||||
			return errwrap.Wrapf(fmt.Sprintf("error decoding CRL %q: {{err}}", key), err)
 | 
								return fmt.Errorf("error decoding CRL %q: %w", key, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		b.crls[key] = crlInfo
 | 
							b.crls[key] = crlInfo
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/api"
 | 
						"github.com/hashicorp/vault/api"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/password"
 | 
						"github.com/hashicorp/vault/sdk/helper/password"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -43,12 +42,12 @@ func (h *CLIHandler) Auth(c *api.Client, m map[string]string) (*api.Secret, erro
 | 
				
			|||||||
				return nil, fmt.Errorf("user interrupted")
 | 
									return nil, fmt.Errorf("user interrupted")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return nil, errwrap.Wrapf("An error occurred attempting to "+
 | 
								return nil, fmt.Errorf("An error occurred attempting to "+
 | 
				
			||||||
				"ask for a token. The raw error message is shown below, but usually "+
 | 
									"ask for a token. The raw error message is shown below, but usually "+
 | 
				
			||||||
				"this is because you attempted to pipe a value into the command or "+
 | 
									"this is because you attempted to pipe a value into the command or "+
 | 
				
			||||||
				"you are executing outside of a terminal (tty). If you want to pipe "+
 | 
									"you are executing outside of a terminal (tty). If you want to pipe "+
 | 
				
			||||||
				"the value, pass \"-\" as the argument to read from stdin. The raw "+
 | 
									"the value, pass \"-\" as the argument to read from stdin. The raw "+
 | 
				
			||||||
				"error was: {{err}}", err)
 | 
									"error was: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/tokenutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/tokenutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -147,7 +146,7 @@ func (b *backend) Config(ctx context.Context, s logical.Storage) (*config, error
 | 
				
			|||||||
	var result config
 | 
						var result config
 | 
				
			||||||
	if entry != nil {
 | 
						if entry != nil {
 | 
				
			||||||
		if err := entry.DecodeJSON(&result); err != nil {
 | 
							if err := entry.DecodeJSON(&result); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("error reading configuration: {{err}}", err)
 | 
								return nil, fmt.Errorf("error reading configuration: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/google/go-github/github"
 | 
						"github.com/google/go-github/github"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/policyutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/policyutil"
 | 
				
			||||||
@@ -173,7 +172,7 @@ func (b *backend) verifyCredentials(ctx context.Context, req *logical.Request, t
 | 
				
			|||||||
	if config.BaseURL != "" {
 | 
						if config.BaseURL != "" {
 | 
				
			||||||
		parsedURL, err := url.Parse(config.BaseURL)
 | 
							parsedURL, err := url.Parse(config.BaseURL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, nil, errwrap.Wrapf("successfully parsed base_url when set but failing to parse now: {{err}}", err)
 | 
								return nil, nil, fmt.Errorf("successfully parsed base_url when set but failing to parse now: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		client.BaseURL = parsedURL
 | 
							client.BaseURL = parsedURL
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/api"
 | 
						"github.com/hashicorp/vault/api"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/password"
 | 
						"github.com/hashicorp/vault/sdk/helper/password"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -27,7 +26,7 @@ func (h *CLIHandler) Auth(c *api.Client, m map[string]string) (*api.Secret, erro
 | 
				
			|||||||
	if x, ok := m["lookup"]; ok {
 | 
						if x, ok := m["lookup"]; ok {
 | 
				
			||||||
		parsed, err := strconv.ParseBool(x)
 | 
							parsed, err := strconv.ParseBool(x)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("Failed to parse \"lookup\" as boolean: {{err}}", err)
 | 
								return nil, fmt.Errorf("Failed to parse \"lookup\" as boolean: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		lookup = parsed
 | 
							lookup = parsed
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -52,12 +51,12 @@ func (h *CLIHandler) Auth(c *api.Client, m map[string]string) (*api.Secret, erro
 | 
				
			|||||||
				return nil, fmt.Errorf("user interrupted")
 | 
									return nil, fmt.Errorf("user interrupted")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return nil, errwrap.Wrapf("An error occurred attempting to "+
 | 
								return nil, fmt.Errorf("An error occurred attempting to "+
 | 
				
			||||||
				"ask for a token. The raw error message is shown below, but usually "+
 | 
									"ask for a token. The raw error message is shown below, but usually "+
 | 
				
			||||||
				"this is because you attempted to pipe a value into the command or "+
 | 
									"this is because you attempted to pipe a value into the command or "+
 | 
				
			||||||
				"you are executing outside of a terminal (tty). If you want to pipe "+
 | 
									"you are executing outside of a terminal (tty). If you want to pipe "+
 | 
				
			||||||
				"the value, pass \"-\" as the argument to read from stdin. The raw "+
 | 
									"the value, pass \"-\" as the argument to read from stdin. The raw "+
 | 
				
			||||||
				"error was: {{err}}", err)
 | 
									"error was: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,7 +86,7 @@ func (h *CLIHandler) Auth(c *api.Client, m map[string]string) (*api.Secret, erro
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	secret, err := c.Auth().Token().LookupSelf()
 | 
						secret, err := c.Auth().Token().LookupSelf()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error looking up token: {{err}}", err)
 | 
							return nil, fmt.Errorf("error looking up token: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if secret == nil {
 | 
						if secret == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("empty response from lookup-self")
 | 
							return nil, fmt.Errorf("empty response from lookup-self")
 | 
				
			||||||
@@ -98,28 +97,28 @@ func (h *CLIHandler) Auth(c *api.Client, m map[string]string) (*api.Secret, erro
 | 
				
			|||||||
	// mirror that data here.
 | 
						// mirror that data here.
 | 
				
			||||||
	id, err := secret.TokenID()
 | 
						id, err := secret.TokenID()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error accessing token ID: {{err}}", err)
 | 
							return nil, fmt.Errorf("error accessing token ID: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	accessor, err := secret.TokenAccessor()
 | 
						accessor, err := secret.TokenAccessor()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error accessing token accessor: {{err}}", err)
 | 
							return nil, fmt.Errorf("error accessing token accessor: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// This populates secret.Auth
 | 
						// This populates secret.Auth
 | 
				
			||||||
	_, err = secret.TokenPolicies()
 | 
						_, err = secret.TokenPolicies()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error accessing token policies: {{err}}", err)
 | 
							return nil, fmt.Errorf("error accessing token policies: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	metadata, err := secret.TokenMetadata()
 | 
						metadata, err := secret.TokenMetadata()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error accessing token metadata: {{err}}", err)
 | 
							return nil, fmt.Errorf("error accessing token metadata: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dur, err := secret.TokenTTL()
 | 
						dur, err := secret.TokenTTL()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting token TTL: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting token TTL: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	renewable, err := secret.TokenIsRenewable()
 | 
						renewable, err := secret.TokenIsRenewable()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error checking if token is renewable: {{err}}", err)
 | 
							return nil, fmt.Errorf("error checking if token is renewable: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &api.Secret{
 | 
						return &api.Secret{
 | 
				
			||||||
		Auth: &api.SecretAuth{
 | 
							Auth: &api.SecretAuth{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ import (
 | 
				
			|||||||
	"github.com/aws/aws-sdk-go/aws/session"
 | 
						"github.com/aws/aws-sdk-go/aws/session"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam"
 | 
						"github.com/aws/aws-sdk-go/service/iam"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/sts"
 | 
						"github.com/aws/aws-sdk-go/service/sts"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	cleanhttp "github.com/hashicorp/go-cleanhttp"
 | 
						cleanhttp "github.com/hashicorp/go-cleanhttp"
 | 
				
			||||||
	"github.com/hashicorp/go-hclog"
 | 
						"github.com/hashicorp/go-hclog"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/awsutil"
 | 
				
			||||||
@@ -29,7 +28,7 @@ func getRootConfig(ctx context.Context, s logical.Storage, clientType string, lo
 | 
				
			|||||||
	if entry != nil {
 | 
						if entry != nil {
 | 
				
			||||||
		var config rootConfig
 | 
							var config rootConfig
 | 
				
			||||||
		if err := entry.DecodeJSON(&config); err != nil {
 | 
							if err := entry.DecodeJSON(&config); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("error reading root configuration: {{err}}", err)
 | 
								return nil, fmt.Errorf("error reading root configuration: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		credsConfig.AccessKey = config.AccessKey
 | 
							credsConfig.AccessKey = config.AccessKey
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/aws"
 | 
						"github.com/aws/aws-sdk-go/aws"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam"
 | 
						"github.com/aws/aws-sdk-go/service/iam"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -49,7 +48,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	var config rootConfig
 | 
						var config rootConfig
 | 
				
			||||||
	if err := rawRootConfig.DecodeJSON(&config); err != nil {
 | 
						if err := rawRootConfig.DecodeJSON(&config); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error reading root configuration: {{err}}", err)
 | 
							return nil, fmt.Errorf("error reading root configuration: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if config.AccessKey == "" || config.SecretKey == "" {
 | 
						if config.AccessKey == "" || config.SecretKey == "" {
 | 
				
			||||||
@@ -59,7 +58,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	var getUserInput iam.GetUserInput // empty input means get current user
 | 
						var getUserInput iam.GetUserInput // empty input means get current user
 | 
				
			||||||
	getUserRes, err := client.GetUser(&getUserInput)
 | 
						getUserRes, err := client.GetUser(&getUserInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error calling GetUser: {{err}}", err)
 | 
							return nil, fmt.Errorf("error calling GetUser: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if getUserRes == nil {
 | 
						if getUserRes == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("nil response from GetUser")
 | 
							return nil, fmt.Errorf("nil response from GetUser")
 | 
				
			||||||
@@ -76,7 +75,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	createAccessKeyRes, err := client.CreateAccessKey(&createAccessKeyInput)
 | 
						createAccessKeyRes, err := client.CreateAccessKey(&createAccessKeyInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error calling CreateAccessKey: {{err}}", err)
 | 
							return nil, fmt.Errorf("error calling CreateAccessKey: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if createAccessKeyRes.AccessKey == nil {
 | 
						if createAccessKeyRes.AccessKey == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("nil response from CreateAccessKey")
 | 
							return nil, fmt.Errorf("nil response from CreateAccessKey")
 | 
				
			||||||
@@ -92,10 +91,10 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	newEntry, err := logical.StorageEntryJSON("config/root", config)
 | 
						newEntry, err := logical.StorageEntryJSON("config/root", config)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error generating new config/root JSON: {{err}}", err)
 | 
							return nil, fmt.Errorf("error generating new config/root JSON: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := req.Storage.Put(ctx, newEntry); err != nil {
 | 
						if err := req.Storage.Put(ctx, newEntry); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error saving new config/root: {{err}}", err)
 | 
							return nil, fmt.Errorf("error saving new config/root: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b.iamClient = nil
 | 
						b.iamClient = nil
 | 
				
			||||||
@@ -107,7 +106,7 @@ func (b *backend) pathConfigRotateRootUpdate(ctx context.Context, req *logical.R
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	_, err = client.DeleteAccessKey(&deleteAccessKeyInput)
 | 
						_, err = client.DeleteAccessKey(&deleteAccessKeyInput)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error deleting old access key: {{err}}", err)
 | 
							return nil, fmt.Errorf("error deleting old access key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &logical.Response{
 | 
						return &logical.Response{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ import (
 | 
				
			|||||||
	"github.com/aws/aws-sdk-go/aws"
 | 
						"github.com/aws/aws-sdk-go/aws"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/aws/awserr"
 | 
						"github.com/aws/aws-sdk-go/aws/awserr"
 | 
				
			||||||
	"github.com/aws/aws-sdk-go/service/iam"
 | 
						"github.com/aws/aws-sdk-go/service/iam"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/strutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/strutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -51,7 +50,7 @@ func (b *backend) pathCredsRead(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
	// Read the policy
 | 
						// Read the policy
 | 
				
			||||||
	role, err := b.roleRead(ctx, req.Storage, roleName, true)
 | 
						role, err := b.roleRead(ctx, req.Storage, roleName, true)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if role == nil {
 | 
						if role == nil {
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf(
 | 
							return logical.ErrorResponse(fmt.Sprintf(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -226,7 +226,7 @@ func (b *backend) secretAccessKeysCreate(
 | 
				
			|||||||
		UserName: username,
 | 
							UserName: username,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error writing WAL entry: {{err}}", err)
 | 
							return nil, fmt.Errorf("error writing WAL entry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	userPath := role.UserPath
 | 
						userPath := role.UserPath
 | 
				
			||||||
@@ -246,8 +246,8 @@ func (b *backend) secretAccessKeysCreate(
 | 
				
			|||||||
	_, err = iamClient.CreateUser(createUserRequest)
 | 
						_, err = iamClient.CreateUser(createUserRequest)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if walErr := framework.DeleteWAL(ctx, s, walID); walErr != nil {
 | 
							if walErr := framework.DeleteWAL(ctx, s, walID); walErr != nil {
 | 
				
			||||||
			iamErr := errwrap.Wrapf("error creating IAM user: {{err}}", err)
 | 
								iamErr := fmt.Errorf("error creating IAM user: %w", err)
 | 
				
			||||||
			return nil, errwrap.Wrap(errwrap.Wrapf("failed to delete WAL entry: {{err}}", walErr), iamErr)
 | 
								return nil, errwrap.Wrap(fmt.Errorf("failed to delete WAL entry: %w", walErr), iamErr)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return logical.ErrorResponse("Error creating IAM user: %s", err), awsutil.CheckAWSError(err)
 | 
							return logical.ErrorResponse("Error creating IAM user: %s", err), awsutil.CheckAWSError(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -318,7 +318,7 @@ func (b *backend) secretAccessKeysCreate(
 | 
				
			|||||||
	// the secret because it'll get rolled back anyways, so we have to return
 | 
						// the secret because it'll get rolled back anyways, so we have to return
 | 
				
			||||||
	// an error here.
 | 
						// an error here.
 | 
				
			||||||
	if err := framework.DeleteWAL(ctx, s, walID); err != nil {
 | 
						if err := framework.DeleteWAL(ctx, s, walID); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to commit WAL entry: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to commit WAL entry: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Return the info!
 | 
						// Return the info!
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -45,7 +44,7 @@ func (b *backend) secretCredsRenew(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	role, err := getRole(ctx, req.Storage, roleName)
 | 
						role, err := getRole(ctx, req.Storage, roleName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("unable to load role: {{err}}", err)
 | 
							return nil, fmt.Errorf("unable to load role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp := &logical.Response{Secret: req.Secret}
 | 
						resp := &logical.Response{Secret: req.Secret}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gocql/gocql"
 | 
						"github.com/gocql/gocql"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/tlsutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/tlsutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -54,12 +53,12 @@ func createSession(cfg *sessionConfig, s logical.Storage) (*gocql.Session, error
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			parsedCertBundle, err := certBundle.ToParsedCertBundle()
 | 
								parsedCertBundle, err := certBundle.ToParsedCertBundle()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf("failed to parse certificate bundle: {{err}}", err)
 | 
									return nil, fmt.Errorf("failed to parse certificate bundle: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			tlsConfig, err = parsedCertBundle.GetTLSConfig(certutil.TLSClient)
 | 
								tlsConfig, err = parsedCertBundle.GetTLSConfig(certutil.TLSClient)
 | 
				
			||||||
			if err != nil || tlsConfig == nil {
 | 
								if err != nil || tlsConfig == nil {
 | 
				
			||||||
				return nil, errwrap.Wrapf(fmt.Sprintf("failed to get TLS configuration: tlsConfig: %#v; {{err}}", tlsConfig), err)
 | 
									return nil, fmt.Errorf("failed to get TLS configuration: tlsConfig: %#v; %w", tlsConfig, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			tlsConfig.InsecureSkipVerify = cfg.InsecureTLS
 | 
								tlsConfig.InsecureSkipVerify = cfg.InsecureTLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -83,13 +82,13 @@ func createSession(cfg *sessionConfig, s logical.Storage) (*gocql.Session, error
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	session, err := clusterConfig.CreateSession()
 | 
						session, err := clusterConfig.CreateSession()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error creating session: {{err}}", err)
 | 
							return nil, fmt.Errorf("error creating session: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Verify the info
 | 
						// Verify the info
 | 
				
			||||||
	err = session.Query(`LIST USERS`).Exec()
 | 
						err = session.Query(`LIST USERS`).Exec()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error validating connection info: {{err}}", err)
 | 
							return nil, fmt.Errorf("error validating connection info: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return session, nil
 | 
						return session, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -70,7 +69,7 @@ func (b *backend) readConfigAccess(ctx context.Context, storage logical.Storage)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	conf := &accessConfig{}
 | 
						conf := &accessConfig{}
 | 
				
			||||||
	if err := entry.DecodeJSON(conf); err != nil {
 | 
						if err := entry.DecodeJSON(conf); err != nil {
 | 
				
			||||||
		return nil, nil, errwrap.Wrapf("error reading consul access configuration: {{err}}", err)
 | 
							return nil, nil, fmt.Errorf("error reading consul access configuration: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return conf, nil, nil
 | 
						return conf, nil, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/consul/api"
 | 
						"github.com/hashicorp/consul/api"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -36,7 +35,7 @@ func (b *backend) pathTokenRead(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	entry, err := req.Storage.Get(ctx, "policy/"+role)
 | 
						entry, err := req.Storage.Get(ctx, "policy/"+role)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if entry == nil {
 | 
						if entry == nil {
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("role %q not found", role)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("role %q not found", role)), nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -42,7 +41,7 @@ func (b *backend) secretTokenRenew(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	entry, err := req.Storage.Get(ctx, "policy/"+role)
 | 
						entry, err := req.Storage.Get(ctx, "policy/"+role)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if entry == nil {
 | 
						if entry == nil {
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("issuing role %q not found", role)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("issuing role %q not found", role)), nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	log "github.com/hashicorp/go-hclog"
 | 
						log "github.com/hashicorp/go-hclog"
 | 
				
			||||||
	"github.com/hashicorp/go-uuid"
 | 
						"github.com/hashicorp/go-uuid"
 | 
				
			||||||
	v4 "github.com/hashicorp/vault/sdk/database/dbplugin"
 | 
						v4 "github.com/hashicorp/vault/sdk/database/dbplugin"
 | 
				
			||||||
@@ -135,7 +134,7 @@ type databaseBackend struct {
 | 
				
			|||||||
func (b *databaseBackend) DatabaseConfig(ctx context.Context, s logical.Storage, name string) (*DatabaseConfig, error) {
 | 
					func (b *databaseBackend) DatabaseConfig(ctx context.Context, s logical.Storage, name string) (*DatabaseConfig, error) {
 | 
				
			||||||
	entry, err := s.Get(ctx, fmt.Sprintf("config/%s", name))
 | 
						entry, err := s.Get(ctx, fmt.Sprintf("config/%s", name))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read connection configuration: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read connection configuration: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if entry == nil {
 | 
						if entry == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("failed to find entry for connection with name: %q", name)
 | 
							return nil, fmt.Errorf("failed to find entry for connection with name: %q", name)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/fatih/structs"
 | 
						"github.com/fatih/structs"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	uuid "github.com/hashicorp/go-uuid"
 | 
						uuid "github.com/hashicorp/go-uuid"
 | 
				
			||||||
	v5 "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
 | 
						v5 "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
@@ -225,7 +224,7 @@ func (b *databaseBackend) connectionDeleteHandler() framework.OperationFunc {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		err := req.Storage.Delete(ctx, fmt.Sprintf("config/%s", name))
 | 
							err := req.Storage.Delete(ctx, fmt.Sprintf("config/%s", name))
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to delete connection configuration: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to delete connection configuration: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := b.ClearConnection(name); err != nil {
 | 
							if err := b.ClearConnection(name); err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/go-multierror"
 | 
						"github.com/hashicorp/go-multierror"
 | 
				
			||||||
	v4 "github.com/hashicorp/vault/sdk/database/dbplugin"
 | 
						v4 "github.com/hashicorp/vault/sdk/database/dbplugin"
 | 
				
			||||||
	v5 "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
 | 
						v5 "github.com/hashicorp/vault/sdk/database/dbplugin/v5"
 | 
				
			||||||
@@ -354,7 +353,7 @@ func (b *databaseBackend) setStaticAccount(ctx context.Context, s logical.Storag
 | 
				
			|||||||
			LastVaultRotation: input.Role.StaticAccount.LastVaultRotation,
 | 
								LastVaultRotation: input.Role.StaticAccount.LastVaultRotation,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return output, errwrap.Wrapf("error writing WAL entry: {{err}}", err)
 | 
								return output, fmt.Errorf("error writing WAL entry: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,7 +369,7 @@ func (b *databaseBackend) setStaticAccount(ctx context.Context, s logical.Storag
 | 
				
			|||||||
	_, err = dbi.database.UpdateUser(ctx, updateReq, false)
 | 
						_, err = dbi.database.UpdateUser(ctx, updateReq, false)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		b.CloseIfShutdown(dbi, err)
 | 
							b.CloseIfShutdown(dbi, err)
 | 
				
			||||||
		return output, errwrap.Wrapf("error setting credentials: {{err}}", err)
 | 
							return output, fmt.Errorf("error setting credentials: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Store updated role information
 | 
						// Store updated role information
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"database/sql"
 | 
						"database/sql"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/dbtxn"
 | 
						"github.com/hashicorp/vault/sdk/helper/dbtxn"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -140,10 +139,10 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// can't drop if not all database users are dropped
 | 
						// can't drop if not all database users are dropped
 | 
				
			||||||
	if rows.Err() != nil {
 | 
						if rows.Err() != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("could not generate sql statements for all rows: {{err}}", rows.Err())
 | 
							return nil, fmt.Errorf("could not generate sql statements for all rows: %w", rows.Err())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if lastStmtError != nil {
 | 
						if lastStmtError != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("could not perform all sql statements: {{err}}", lastStmtError)
 | 
							return nil, fmt.Errorf("could not perform all sql statements: %w", lastStmtError)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Drop this login
 | 
						// Drop this login
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@ package nomad
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -76,7 +76,7 @@ func (b *backend) readConfigAccess(ctx context.Context, storage logical.Storage)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	conf := &accessConfig{}
 | 
						conf := &accessConfig{}
 | 
				
			||||||
	if err := entry.DecodeJSON(conf); err != nil {
 | 
						if err := entry.DecodeJSON(conf); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error reading nomad access configuration: {{err}}", err)
 | 
							return nil, fmt.Errorf("error reading nomad access configuration: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return conf, nil
 | 
						return conf, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/nomad/api"
 | 
						"github.com/hashicorp/nomad/api"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -42,7 +41,7 @@ func (b *backend) pathTokenRead(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	role, err := b.Role(ctx, req.Storage, name)
 | 
						role, err := b.Role(ctx, req.Storage, name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if role == nil {
 | 
						if role == nil {
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("role %q not found", name)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("role %q not found", name)), nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@ package nomad
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -77,7 +77,7 @@ func (b *backend) Role(ctx context.Context, storage logical.Storage, name string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	entry, err := storage.Get(ctx, "role/"+name)
 | 
						entry, err := storage.Get(ctx, "role/"+name)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if entry == nil {
 | 
						if entry == nil {
 | 
				
			||||||
		return nil, nil
 | 
							return nil, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
@@ -374,7 +373,7 @@ func validateOtherSANs(data *inputBundle, requested map[string][]string) (string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	allowed, err := parseOtherSANs(data.role.AllowedOtherSANs)
 | 
						allowed, err := parseOtherSANs(data.role.AllowedOtherSANs)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("error parsing role's allowed SANs: {{err}}", err)
 | 
							return "", "", fmt.Errorf("error parsing role's allowed SANs: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for oid, names := range requested {
 | 
						for oid, names := range requested {
 | 
				
			||||||
		for _, name := range names {
 | 
							for _, name := range names {
 | 
				
			||||||
@@ -682,7 +681,7 @@ func getOtherSANsFromX509Extensions(exts []pkix.Extension) ([]otherNameUtf8, err
 | 
				
			|||||||
			var other otherNameRaw
 | 
								var other otherNameRaw
 | 
				
			||||||
			_, err := asn1.UnmarshalWithParams(data, &other, "tag:0")
 | 
								_, err := asn1.UnmarshalWithParams(data, &other, "tag:0")
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return errwrap.Wrapf("could not parse requested other SAN: {{err}}", err)
 | 
									return fmt.Errorf("could not parse requested other SAN: %w", err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			val, err := other.extractUTF8String()
 | 
								val, err := other.extractUTF8String()
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
@@ -871,7 +870,7 @@ func generateCreationBundle(b *backend, data *inputBundle, caSign *certutil.CAIn
 | 
				
			|||||||
	if data.role.UseCSRSANs && csr != nil && len(csr.Extensions) > 0 {
 | 
						if data.role.UseCSRSANs && csr != nil && len(csr.Extensions) > 0 {
 | 
				
			||||||
		others, err := getOtherSANsFromX509Extensions(csr.Extensions)
 | 
							others, err := getOtherSANsFromX509Extensions(csr.Extensions)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errutil.UserError{Err: errwrap.Wrapf("could not parse requested other SAN: {{err}}", err).Error()}
 | 
								return nil, errutil.UserError{Err: fmt.Errorf("could not parse requested other SAN: %w", err).Error()}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for _, other := range others {
 | 
							for _, other := range others {
 | 
				
			||||||
			otherSANsInput = append(otherSANsInput, other.String())
 | 
								otherSANsInput = append(otherSANsInput, other.String())
 | 
				
			||||||
@@ -880,7 +879,7 @@ func generateCreationBundle(b *backend, data *inputBundle, caSign *certutil.CAIn
 | 
				
			|||||||
	if len(otherSANsInput) > 0 {
 | 
						if len(otherSANsInput) > 0 {
 | 
				
			||||||
		requested, err := parseOtherSANs(otherSANsInput)
 | 
							requested, err := parseOtherSANs(otherSANsInput)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errutil.UserError{Err: errwrap.Wrapf("could not parse requested other SAN: {{err}}", err).Error()}
 | 
								return nil, errutil.UserError{Err: fmt.Errorf("could not parse requested other SAN: %w", err).Error()}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		badOID, badName, err := validateOtherSANs(data, requested)
 | 
							badOID, badName, err := validateOtherSANs(data, requested)
 | 
				
			||||||
		switch {
 | 
							switch {
 | 
				
			||||||
@@ -1133,7 +1132,7 @@ func convertRespToPKCS8(resp *logical.Response) error {
 | 
				
			|||||||
	if block == nil {
 | 
						if block == nil {
 | 
				
			||||||
		keyData, err = base64.StdEncoding.DecodeString(priv)
 | 
							keyData, err = base64.StdEncoding.DecodeString(priv)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error converting response to pkcs8: error decoding original value: {{err}}", err)
 | 
								return fmt.Errorf("error converting response to pkcs8: error decoding original value: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		keyData = block.Bytes
 | 
							keyData = block.Bytes
 | 
				
			||||||
@@ -1149,12 +1148,12 @@ func convertRespToPKCS8(resp *logical.Response) error {
 | 
				
			|||||||
		return fmt.Errorf("unknown private key type %q", privKeyType)
 | 
							return fmt.Errorf("unknown private key type %q", privKeyType)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error converting response to pkcs8: error parsing previous key: {{err}}", err)
 | 
							return fmt.Errorf("error converting response to pkcs8: error parsing previous key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	keyData, err = x509.MarshalPKCS8PrivateKey(signer)
 | 
						keyData, err = x509.MarshalPKCS8PrivateKey(signer)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error converting response to pkcs8: error marshaling pkcs8 key: {{err}}", err)
 | 
							return fmt.Errorf("error converting response to pkcs8: error marshaling pkcs8 key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if pemUsed {
 | 
						if pemUsed {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -92,7 +91,7 @@ func revokeCert(ctx context.Context, b *backend, req *logical.Request, serial st
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		cert, err := x509.ParseCertificate(certEntry.Value)
 | 
							cert, err := x509.ParseCertificate(certEntry.Value)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("error parsing certificate: {{err}}", err)
 | 
								return nil, fmt.Errorf("error parsing certificate: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if cert == nil {
 | 
							if cert == nil {
 | 
				
			||||||
			return nil, fmt.Errorf("got a nil certificate")
 | 
								return nil, fmt.Errorf("got a nil certificate")
 | 
				
			||||||
@@ -132,7 +131,7 @@ func revokeCert(ctx context.Context, b *backend, req *logical.Request, serial st
 | 
				
			|||||||
	case errutil.UserError:
 | 
						case errutil.UserError:
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
				
			||||||
	case errutil.InternalError:
 | 
						case errutil.InternalError:
 | 
				
			||||||
		return nil, errwrap.Wrapf("error encountered during CRL building: {{err}}", crlErr)
 | 
							return nil, fmt.Errorf("error encountered during CRL building: %w", crlErr)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp := &logical.Response{
 | 
						resp := &logical.Response{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@ package pki
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
@@ -65,7 +65,7 @@ func (b *backend) pathCAWrite(ctx context.Context, req *logical.Request, data *f
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cb, err := parsedBundle.ToCertBundle()
 | 
						cb, err := parsedBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw values into cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw values into cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entry, err := logical.StorageEntryJSON("config/ca_bundle", cb)
 | 
						entry, err := logical.StorageEntryJSON("config/ca_bundle", cb)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -117,7 +116,7 @@ func (b *backend) pathCRLWrite(ctx context.Context, req *logical.Request, d *fra
 | 
				
			|||||||
		case errutil.UserError:
 | 
							case errutil.UserError:
 | 
				
			||||||
			return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
								return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
				
			||||||
		case errutil.InternalError:
 | 
							case errutil.InternalError:
 | 
				
			||||||
			return nil, errwrap.Wrapf("error encountered during CRL building: {{err}}", crlErr)
 | 
								return nil, fmt.Errorf("error encountered during CRL building: %w", crlErr)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
@@ -88,7 +87,7 @@ func (b *backend) pathGenerateIntermediate(ctx context.Context, req *logical.Req
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	csrb, err := parsedBundle.ToCSRBundle()
 | 
						csrb, err := parsedBundle.ToCSRBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw CSR bundle to CSR bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw CSR bundle to CSR bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp = &logical.Response{
 | 
						resp = &logical.Response{
 | 
				
			||||||
@@ -198,12 +197,12 @@ func (b *backend) pathSetSignedIntermediate(ctx context.Context, req *logical.Re
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := inputBundle.Verify(); err != nil {
 | 
						if err := inputBundle.Verify(); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("verification of parsed bundle failed: {{err}}", err)
 | 
							return nil, fmt.Errorf("verification of parsed bundle failed: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cb, err = inputBundle.ToCertBundle()
 | 
						cb, err = inputBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw values into cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw values into cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entry, err = logical.StorageEntryJSON("config/ca_bundle", cb)
 | 
						entry, err = logical.StorageEntryJSON("config/ca_bundle", cb)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/consts"
 | 
						"github.com/hashicorp/vault/sdk/helper/consts"
 | 
				
			||||||
@@ -229,18 +228,18 @@ func (b *backend) pathIssueSignCert(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
		case errutil.InternalError:
 | 
							case errutil.InternalError:
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nil, errwrap.Wrapf("error signing/generating certificate: {{err}}", err)
 | 
								return nil, fmt.Errorf("error signing/generating certificate: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	signingCB, err := signingBundle.ToCertBundle()
 | 
						signingCB, err := signingBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw signing bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw signing bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cb, err := parsedBundle.ToCertBundle()
 | 
						cb, err := parsedBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw cert bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw cert bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	respData := map[string]interface{}{
 | 
						respData := map[string]interface{}{
 | 
				
			||||||
@@ -321,7 +320,7 @@ func (b *backend) pathIssueSignCert(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
			Value: parsedBundle.CertificateBytes,
 | 
								Value: parsedBundle.CertificateBytes,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("unable to store certificate locally: {{err}}", err)
 | 
								return nil, fmt.Errorf("unable to store certificate locally: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"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/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
@@ -74,7 +73,7 @@ func (b *backend) pathRotateCRLRead(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
	case errutil.UserError:
 | 
						case errutil.UserError:
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("Error during CRL building: %s", crlErr)), nil
 | 
				
			||||||
	case errutil.InternalError:
 | 
						case errutil.InternalError:
 | 
				
			||||||
		return nil, errwrap.Wrapf("error encountered during CRL building: {{err}}", crlErr)
 | 
							return nil, fmt.Errorf("error encountered during CRL building: %w", crlErr)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return &logical.Response{
 | 
							return &logical.Response{
 | 
				
			||||||
			Data: map[string]interface{}{
 | 
								Data: map[string]interface{}{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/consts"
 | 
						"github.com/hashicorp/vault/sdk/helper/consts"
 | 
				
			||||||
@@ -588,7 +587,7 @@ func (b *backend) pathRoleCreate(ctx context.Context, req *logical.Request, data
 | 
				
			|||||||
	default:
 | 
						default:
 | 
				
			||||||
		_, err := parseOtherSANs(allowedOtherSANs)
 | 
							_, err := parseOtherSANs(allowedOtherSANs)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return logical.ErrorResponse(errwrap.Wrapf("error parsing allowed_other_sans: {{err}}", err).Error()), nil
 | 
								return logical.ErrorResponse(fmt.Errorf("error parsing allowed_other_sans: %w", err).Error()), nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	entry.AllowedOtherSANs = allowedOtherSANs
 | 
						entry.AllowedOtherSANs = allowedOtherSANs
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -158,7 +157,7 @@ func (b *backend) pathCAGenerateRoot(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cb, err := parsedBundle.ToCertBundle()
 | 
						cb, err := parsedBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw cert bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw cert bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp := &logical.Response{
 | 
						resp := &logical.Response{
 | 
				
			||||||
@@ -221,7 +220,7 @@ func (b *backend) pathCAGenerateRoot(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
		Value: parsedBundle.CertificateBytes,
 | 
							Value: parsedBundle.CertificateBytes,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("unable to store certificate locally: {{err}}", err)
 | 
							return nil, fmt.Errorf("unable to store certificate locally: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// For ease of later use, also store just the certificate at a known
 | 
						// For ease of later use, also store just the certificate at a known
 | 
				
			||||||
@@ -314,17 +313,17 @@ func (b *backend) pathCASignIntermediate(ctx context.Context, req *logical.Reque
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := parsedBundle.Verify(); err != nil {
 | 
						if err := parsedBundle.Verify(); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("verification of parsed bundle failed: {{err}}", err)
 | 
							return nil, fmt.Errorf("verification of parsed bundle failed: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	signingCB, err := signingBundle.ToCertBundle()
 | 
						signingCB, err := signingBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw signing bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw signing bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cb, err := parsedBundle.ToCertBundle()
 | 
						cb, err := parsedBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw cert bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw cert bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp := &logical.Response{
 | 
						resp := &logical.Response{
 | 
				
			||||||
@@ -371,7 +370,7 @@ func (b *backend) pathCASignIntermediate(ctx context.Context, req *logical.Reque
 | 
				
			|||||||
		Value: parsedBundle.CertificateBytes,
 | 
							Value: parsedBundle.CertificateBytes,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("unable to store certificate locally: {{err}}", err)
 | 
							return nil, fmt.Errorf("unable to store certificate locally: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if parsedBundle.Certificate.MaxPathLen == 0 {
 | 
						if parsedBundle.Certificate.MaxPathLen == 0 {
 | 
				
			||||||
@@ -418,7 +417,7 @@ func (b *backend) pathCASignSelfIssued(ctx context.Context, req *logical.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	signingCB, err := signingBundle.ToCertBundle()
 | 
						signingCB, err := signingBundle.ToCertBundle()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error converting raw signing bundle to cert bundle: {{err}}", err)
 | 
							return nil, fmt.Errorf("error converting raw signing bundle to cert bundle: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	urls := &certutil.URLEntries{}
 | 
						urls := &certutil.URLEntries{}
 | 
				
			||||||
@@ -431,7 +430,7 @@ func (b *backend) pathCASignSelfIssued(ctx context.Context, req *logical.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	newCert, err := x509.CreateCertificate(rand.Reader, cert, signingBundle.Certificate, cert.PublicKey, signingBundle.PrivateKey)
 | 
						newCert, err := x509.CreateCertificate(rand.Reader, cert, signingBundle.Certificate, cert.PublicKey, signingBundle.PrivateKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error signing self-issued certificate: {{err}}", err)
 | 
							return nil, fmt.Errorf("error signing self-issued certificate: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(newCert) == 0 {
 | 
						if len(newCert) == 0 {
 | 
				
			||||||
		return nil, fmt.Errorf("nil cert was created when signing self-issued certificate")
 | 
							return nil, fmt.Errorf("nil cert was created when signing self-issued certificate")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"sync/atomic"
 | 
						"sync/atomic"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"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/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -96,19 +95,19 @@ func (b *backend) pathTidyWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
			if tidyCertStore {
 | 
								if tidyCertStore {
 | 
				
			||||||
				serials, err := req.Storage.List(ctx, "certs/")
 | 
									serials, err := req.Storage.List(ctx, "certs/")
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return errwrap.Wrapf("error fetching list of certs: {{err}}", err)
 | 
										return fmt.Errorf("error fetching list of certs: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for _, serial := range serials {
 | 
									for _, serial := range serials {
 | 
				
			||||||
					certEntry, err := req.Storage.Get(ctx, "certs/"+serial)
 | 
										certEntry, err := req.Storage.Get(ctx, "certs/"+serial)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("error fetching certificate %q: {{err}}", serial), err)
 | 
											return fmt.Errorf("error fetching certificate %q: %w", serial, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if certEntry == nil {
 | 
										if certEntry == nil {
 | 
				
			||||||
						logger.Warn("certificate entry is nil; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
											logger.Warn("certificate entry is nil; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting nil entry with serial %s: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting nil entry with serial %s: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -116,19 +115,19 @@ func (b *backend) pathTidyWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
					if certEntry.Value == nil || len(certEntry.Value) == 0 {
 | 
										if certEntry.Value == nil || len(certEntry.Value) == 0 {
 | 
				
			||||||
						logger.Warn("certificate entry has no value; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
											logger.Warn("certificate entry has no value; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting entry with nil value with serial %s: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting entry with nil value with serial %s: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					cert, err := x509.ParseCertificate(certEntry.Value)
 | 
										cert, err := x509.ParseCertificate(certEntry.Value)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("unable to parse stored certificate with serial %q: {{err}}", serial), err)
 | 
											return fmt.Errorf("unable to parse stored certificate with serial %q: %w", serial, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if time.Now().After(cert.NotAfter.Add(bufferDuration)) {
 | 
										if time.Now().After(cert.NotAfter.Add(bufferDuration)) {
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting serial %q from storage: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting serial %q from storage: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -142,20 +141,20 @@ func (b *backend) pathTidyWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				revokedSerials, err := req.Storage.List(ctx, "revoked/")
 | 
									revokedSerials, err := req.Storage.List(ctx, "revoked/")
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return errwrap.Wrapf("error fetching list of revoked certs: {{err}}", err)
 | 
										return fmt.Errorf("error fetching list of revoked certs: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				var revInfo revocationInfo
 | 
									var revInfo revocationInfo
 | 
				
			||||||
				for _, serial := range revokedSerials {
 | 
									for _, serial := range revokedSerials {
 | 
				
			||||||
					revokedEntry, err := req.Storage.Get(ctx, "revoked/"+serial)
 | 
										revokedEntry, err := req.Storage.Get(ctx, "revoked/"+serial)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("unable to fetch revoked cert with serial %q: {{err}}", serial), err)
 | 
											return fmt.Errorf("unable to fetch revoked cert with serial %q: %w", serial, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if revokedEntry == nil {
 | 
										if revokedEntry == nil {
 | 
				
			||||||
						logger.Warn("revoked entry is nil; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
											logger.Warn("revoked entry is nil; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting nil revoked entry with serial %s: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting nil revoked entry with serial %s: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -163,19 +162,19 @@ func (b *backend) pathTidyWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
					if revokedEntry.Value == nil || len(revokedEntry.Value) == 0 {
 | 
										if revokedEntry.Value == nil || len(revokedEntry.Value) == 0 {
 | 
				
			||||||
						logger.Warn("revoked entry has nil value; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
											logger.Warn("revoked entry has nil value; tidying up since it is no longer useful for any server operations", "serial", serial)
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting revoked entry with nil value with serial %s: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting revoked entry with nil value with serial %s: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					err = revokedEntry.DecodeJSON(&revInfo)
 | 
										err = revokedEntry.DecodeJSON(&revInfo)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("error decoding revocation entry for serial %q: {{err}}", serial), err)
 | 
											return fmt.Errorf("error decoding revocation entry for serial %q: %w", serial, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					revokedCert, err := x509.ParseCertificate(revInfo.CertificateBytes)
 | 
										revokedCert, err := x509.ParseCertificate(revInfo.CertificateBytes)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return errwrap.Wrapf(fmt.Sprintf("unable to parse stored revoked certificate with serial %q: {{err}}", serial), err)
 | 
											return fmt.Errorf("unable to parse stored revoked certificate with serial %q: %w", serial, err)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// Only remove the entries from revoked/ and certs/ if we're
 | 
										// Only remove the entries from revoked/ and certs/ if we're
 | 
				
			||||||
@@ -184,10 +183,10 @@ func (b *backend) pathTidyWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
					// information on certs/ for lookup.
 | 
										// information on certs/ for lookup.
 | 
				
			||||||
					if time.Now().After(revokedCert.NotAfter.Add(bufferDuration)) {
 | 
										if time.Now().After(revokedCert.NotAfter.Add(bufferDuration)) {
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "revoked/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting serial %q from revoked list: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting serial %q from revoked list: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
											if err := req.Storage.Delete(ctx, "certs/"+serial); err != nil {
 | 
				
			||||||
							return errwrap.Wrapf(fmt.Sprintf("error deleting serial %q from store when tidying revoked: {{err}}", serial), err)
 | 
												return fmt.Errorf("error deleting serial %q from store when tidying revoked: %w", serial, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rebuildCRL = true
 | 
											rebuildCRL = true
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/dbtxn"
 | 
						"github.com/hashicorp/vault/sdk/helper/dbtxn"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/strutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/strutil"
 | 
				
			||||||
@@ -219,10 +218,10 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// can't drop if not all privileges are revoked
 | 
							// can't drop if not all privileges are revoked
 | 
				
			||||||
		if rows.Err() != nil {
 | 
							if rows.Err() != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("could not generate revocation statements for all rows: {{err}}", rows.Err())
 | 
								return nil, fmt.Errorf("could not generate revocation statements for all rows: %w", rows.Err())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if lastStmtError != nil {
 | 
							if lastStmtError != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("could not perform all revocation statements: {{err}}", lastStmtError)
 | 
								return nil, fmt.Errorf("could not perform all revocation statements: %w", lastStmtError)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Drop this user
 | 
							// Drop this user
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@ package rabbitmq
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
	rabbithole "github.com/michaelklishin/rabbit-hole"
 | 
						rabbithole "github.com/michaelklishin/rabbit-hole"
 | 
				
			||||||
@@ -73,12 +73,12 @@ func (b *backend) pathConnectionUpdate(ctx context.Context, req *logical.Request
 | 
				
			|||||||
		// Create RabbitMQ management client
 | 
							// Create RabbitMQ management client
 | 
				
			||||||
		client, err := rabbithole.NewClient(uri, username, password)
 | 
							client, err := rabbithole.NewClient(uri, username, password)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to create client: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to create client: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Verify that configured credentials is capable of listing
 | 
							// Verify that configured credentials is capable of listing
 | 
				
			||||||
		if _, err = client.ListUsers(); err != nil {
 | 
							if _, err = client.ListUsers(); err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate the connection: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate the connection: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -63,7 +62,7 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if _, err = client.DeleteUser(username); err != nil {
 | 
						if _, err = client.DeleteUser(username); err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("could not delete user: {{err}}", err)
 | 
							return nil, fmt.Errorf("could not delete user: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, nil
 | 
						return nil, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,6 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	log "github.com/hashicorp/go-hclog"
 | 
						log "github.com/hashicorp/go-hclog"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/crypto/ssh"
 | 
						"golang.org/x/crypto/ssh"
 | 
				
			||||||
@@ -278,7 +277,7 @@ func checkSCPStatus(r *bufio.Reader) error {
 | 
				
			|||||||
		// Treat any non-zero (really 1 and 2) as fatal errors
 | 
							// Treat any non-zero (really 1 and 2) as fatal errors
 | 
				
			||||||
		message, _, err := r.ReadLine()
 | 
							message, _, err := r.ReadLine()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error reading error message: {{err}}", err)
 | 
								return fmt.Errorf("error reading error message: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return errors.New(string(message))
 | 
							return errors.New(string(message))
 | 
				
			||||||
@@ -299,7 +298,7 @@ func scpUploadFile(dst string, src io.Reader, w io.Writer, r *bufio.Reader, fi *
 | 
				
			|||||||
		// so that we can determine the length, since SCP is length-prefixed.
 | 
							// so that we can determine the length, since SCP is length-prefixed.
 | 
				
			||||||
		tf, err := ioutil.TempFile("", "vault-ssh-upload")
 | 
							tf, err := ioutil.TempFile("", "vault-ssh-upload")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error creating temporary file for upload: {{err}}", err)
 | 
								return fmt.Errorf("error creating temporary file for upload: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		defer os.Remove(tf.Name())
 | 
							defer os.Remove(tf.Name())
 | 
				
			||||||
		defer tf.Close()
 | 
							defer tf.Close()
 | 
				
			||||||
@@ -313,17 +312,17 @@ func scpUploadFile(dst string, src io.Reader, w io.Writer, r *bufio.Reader, fi *
 | 
				
			|||||||
		// Sync the file so that the contents are definitely on disk, then
 | 
							// Sync the file so that the contents are definitely on disk, then
 | 
				
			||||||
		// read the length of it.
 | 
							// read the length of it.
 | 
				
			||||||
		if err := tf.Sync(); err != nil {
 | 
							if err := tf.Sync(); err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error creating temporary file for upload: {{err}}", err)
 | 
								return fmt.Errorf("error creating temporary file for upload: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Seek the file to the beginning so we can re-read all of it
 | 
							// Seek the file to the beginning so we can re-read all of it
 | 
				
			||||||
		if _, err := tf.Seek(0, 0); err != nil {
 | 
							if _, err := tf.Seek(0, 0); err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error creating temporary file for upload: {{err}}", err)
 | 
								return fmt.Errorf("error creating temporary file for upload: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		tfi, err := tf.Stat()
 | 
							tfi, err := tf.Stat()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return errwrap.Wrapf("error creating temporary file for upload: {{err}}", err)
 | 
								return fmt.Errorf("error creating temporary file for upload: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		size = tfi.Size()
 | 
							size = tfi.Size()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"encoding/pem"
 | 
						"encoding/pem"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	multierror "github.com/hashicorp/go-multierror"
 | 
						multierror "github.com/hashicorp/go-multierror"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -66,7 +65,7 @@ Read operations will return the public key, if already stored/generated.`,
 | 
				
			|||||||
func (b *backend) pathConfigCARead(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | 
					func (b *backend) pathConfigCARead(ctx context.Context, req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
 | 
				
			||||||
	publicKeyEntry, err := caKey(ctx, req.Storage, caPublicKey)
 | 
						publicKeyEntry, err := caKey(ctx, req.Storage, caPublicKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read CA public key: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read CA public key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if publicKeyEntry == nil {
 | 
						if publicKeyEntry == nil {
 | 
				
			||||||
@@ -107,7 +106,7 @@ func caKey(ctx context.Context, storage logical.Storage, keyType string) (*keySt
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	entry, err := storage.Get(ctx, path)
 | 
						entry, err := storage.Get(ctx, path)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("failed to read CA key of type %q: {{err}}", keyType), err)
 | 
							return nil, fmt.Errorf("failed to read CA key of type %q: %w", keyType, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if entry == nil {
 | 
						if entry == nil {
 | 
				
			||||||
@@ -203,12 +202,12 @@ func (b *backend) pathConfigCAUpdate(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	publicKeyEntry, err := caKey(ctx, req.Storage, caPublicKey)
 | 
						publicKeyEntry, err := caKey(ctx, req.Storage, caPublicKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read CA public key: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read CA public key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	privateKeyEntry, err := caKey(ctx, req.Storage, caPrivateKey)
 | 
						privateKeyEntry, err := caKey(ctx, req.Storage, caPrivateKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read CA private key: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read CA private key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (publicKeyEntry != nil && publicKeyEntry.Key != "") || (privateKeyEntry != nil && privateKeyEntry.Key != "") {
 | 
						if (publicKeyEntry != nil && publicKeyEntry.Key != "") || (privateKeyEntry != nil && privateKeyEntry.Key != "") {
 | 
				
			||||||
@@ -240,12 +239,12 @@ func (b *backend) pathConfigCAUpdate(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		var mErr *multierror.Error
 | 
							var mErr *multierror.Error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mErr = multierror.Append(mErr, errwrap.Wrapf("failed to store CA private key: {{err}}", err))
 | 
							mErr = multierror.Append(mErr, fmt.Errorf("failed to store CA private key: %w", err))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// If storing private key fails, the corresponding public key should be
 | 
							// If storing private key fails, the corresponding public key should be
 | 
				
			||||||
		// removed
 | 
							// removed
 | 
				
			||||||
		if delErr := req.Storage.Delete(ctx, caPublicKeyStoragePath); delErr != nil {
 | 
							if delErr := req.Storage.Delete(ctx, caPublicKeyStoragePath); delErr != nil {
 | 
				
			||||||
			mErr = multierror.Append(mErr, errwrap.Wrapf("failed to cleanup CA public key: {{err}}", delErr))
 | 
								mErr = multierror.Append(mErr, fmt.Errorf("failed to cleanup CA public key: %w", delErr))
 | 
				
			||||||
			return nil, mErr
 | 
								return nil, mErr
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	uuid "github.com/hashicorp/go-uuid"
 | 
						uuid "github.com/hashicorp/go-uuid"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -56,7 +55,7 @@ func (b *backend) pathCredsCreateWrite(ctx context.Context, req *logical.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	role, err := b.getRole(ctx, req.Storage, roleName)
 | 
						role, err := b.getRole(ctx, req.Storage, roleName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving role: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving role: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if role == nil {
 | 
						if role == nil {
 | 
				
			||||||
		return logical.ErrorResponse(fmt.Sprintf("Role %q not found", roleName)), nil
 | 
							return logical.ErrorResponse(fmt.Sprintf("Role %q not found", roleName)), nil
 | 
				
			||||||
@@ -98,7 +97,7 @@ func (b *backend) pathCredsCreateWrite(ctx context.Context, req *logical.Request
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	zeroAddressEntry, err := b.getZeroAddressRoles(ctx, req.Storage)
 | 
						zeroAddressEntry, err := b.getZeroAddressRoles(ctx, req.Storage)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error retrieving zero-address roles: {{err}}", err)
 | 
							return nil, fmt.Errorf("error retrieving zero-address roles: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var zeroAddressRoles []string
 | 
						var zeroAddressRoles []string
 | 
				
			||||||
	if zeroAddressEntry != nil {
 | 
						if zeroAddressEntry != nil {
 | 
				
			||||||
@@ -172,7 +171,7 @@ func (b *backend) GenerateDynamicCredential(ctx context.Context, req *logical.Re
 | 
				
			|||||||
	// Fetch the host key to be used for dynamic key installation
 | 
						// Fetch the host key to be used for dynamic key installation
 | 
				
			||||||
	keyEntry, err := req.Storage.Get(ctx, fmt.Sprintf("keys/%s", role.KeyName))
 | 
						keyEntry, err := req.Storage.Get(ctx, fmt.Sprintf("keys/%s", role.KeyName))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf(fmt.Sprintf("key %q not found: {{err}}", role.KeyName), err)
 | 
							return "", "", fmt.Errorf("key %q not found: %w", role.KeyName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if keyEntry == nil {
 | 
						if keyEntry == nil {
 | 
				
			||||||
@@ -181,13 +180,13 @@ func (b *backend) GenerateDynamicCredential(ctx context.Context, req *logical.Re
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	var hostKey sshHostKey
 | 
						var hostKey sshHostKey
 | 
				
			||||||
	if err := keyEntry.DecodeJSON(&hostKey); err != nil {
 | 
						if err := keyEntry.DecodeJSON(&hostKey); err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("error reading the host key: {{err}}", err)
 | 
							return "", "", fmt.Errorf("error reading the host key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Generate a new RSA key pair with the given key length.
 | 
						// Generate a new RSA key pair with the given key length.
 | 
				
			||||||
	dynamicPublicKey, dynamicPrivateKey, err := generateRSAKeys(role.KeyBits)
 | 
						dynamicPublicKey, dynamicPrivateKey, err := generateRSAKeys(role.KeyBits)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("error generating key: {{err}}", err)
 | 
							return "", "", fmt.Errorf("error generating key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(role.KeyOptionSpecs) != 0 {
 | 
						if len(role.KeyOptionSpecs) != 0 {
 | 
				
			||||||
@@ -197,7 +196,7 @@ func (b *backend) GenerateDynamicCredential(ctx context.Context, req *logical.Re
 | 
				
			|||||||
	// Add the public key to authorized_keys file in target machine
 | 
						// Add the public key to authorized_keys file in target machine
 | 
				
			||||||
	err = b.installPublicKeyInTarget(ctx, role.AdminUser, username, ip, role.Port, hostKey.Key, dynamicPublicKey, role.InstallScript, true)
 | 
						err = b.installPublicKeyInTarget(ctx, role.AdminUser, username, ip, role.Port, hostKey.Key, dynamicPublicKey, role.InstallScript, true)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("failed to add public key to authorized_keys file in target: {{err}}", err)
 | 
							return "", "", fmt.Errorf("failed to add public key to authorized_keys file in target: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return dynamicPublicKey, dynamicPrivateKey, nil
 | 
						return dynamicPublicKey, dynamicPrivateKey, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/cidrutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
				
			||||||
@@ -369,7 +368,7 @@ func (b *backend) pathRoleWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
	if cidrList != "" {
 | 
						if cidrList != "" {
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListString(cidrList, ",")
 | 
							valid, err := cidrutil.ValidateCIDRListString(cidrList, ",")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate cidr_list: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate cidr_list: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse("failed to validate cidr_list"), nil
 | 
								return logical.ErrorResponse("failed to validate cidr_list"), nil
 | 
				
			||||||
@@ -381,7 +380,7 @@ func (b *backend) pathRoleWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
	if excludeCidrList != "" {
 | 
						if excludeCidrList != "" {
 | 
				
			||||||
		valid, err := cidrutil.ValidateCIDRListString(excludeCidrList, ",")
 | 
							valid, err := cidrutil.ValidateCIDRListString(excludeCidrList, ",")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to validate exclude_cidr_list entry: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to validate exclude_cidr_list entry: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !valid {
 | 
							if !valid {
 | 
				
			||||||
			return logical.ErrorResponse(fmt.Sprintf("failed to validate exclude_cidr_list entry: %v", err)), nil
 | 
								return logical.ErrorResponse(fmt.Sprintf("failed to validate exclude_cidr_list entry: %v", err)), nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/certutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
				
			||||||
@@ -163,7 +162,7 @@ func (b *backend) pathSignCertificate(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	privateKeyEntry, err := caKey(ctx, req.Storage, caPrivateKey)
 | 
						privateKeyEntry, err := caKey(ctx, req.Storage, caPrivateKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to read CA private key: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to read CA private key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if privateKeyEntry == nil || privateKeyEntry.Key == "" {
 | 
						if privateKeyEntry == nil || privateKeyEntry.Key == "" {
 | 
				
			||||||
		return nil, fmt.Errorf("failed to read CA private key")
 | 
							return nil, fmt.Errorf("failed to read CA private key")
 | 
				
			||||||
@@ -171,7 +170,7 @@ func (b *backend) pathSignCertificate(ctx context.Context, req *logical.Request,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	signer, err := ssh.ParsePrivateKey([]byte(privateKeyEntry.Key))
 | 
						signer, err := ssh.ParsePrivateKey([]byte(privateKeyEntry.Key))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to parse stored CA private key: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to parse stored CA private key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cBundle := creationBundle{
 | 
						cBundle := creationBundle{
 | 
				
			||||||
@@ -532,7 +531,7 @@ func (b *creationBundle) sign() (retCert *ssh.Certificate, retErr error) {
 | 
				
			|||||||
	algo := b.Role.AlgorithmSigner
 | 
						algo := b.Role.AlgorithmSigner
 | 
				
			||||||
	sig, err := sshAlgorithmSigner.SignWithAlgorithm(rand.Reader, certificateBytes, algo)
 | 
						sig, err := sshAlgorithmSigner.SignWithAlgorithm(rand.Reader, certificateBytes, algo)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("failed to generate signed SSH key: sign error: {{err}}", err)
 | 
							return nil, fmt.Errorf("failed to generate signed SSH key: sign error: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	certificate.Signature = sig
 | 
						certificate.Signature = sig
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
	"github.com/mitchellh/mapstructure"
 | 
						"github.com/mitchellh/mapstructure"
 | 
				
			||||||
@@ -49,13 +48,13 @@ func (b *backend) secretDynamicKeyRevoke(ctx context.Context, req *logical.Reque
 | 
				
			|||||||
	intSec := &sec{}
 | 
						intSec := &sec{}
 | 
				
			||||||
	err := mapstructure.Decode(req.Secret.InternalData, intSec)
 | 
						err := mapstructure.Decode(req.Secret.InternalData, intSec)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("secret internal data could not be decoded: {{err}}", err)
 | 
							return nil, fmt.Errorf("secret internal data could not be decoded: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Fetch the host key using the key name
 | 
						// Fetch the host key using the key name
 | 
				
			||||||
	hostKey, err := b.getKey(ctx, req.Storage, intSec.HostKeyName)
 | 
						hostKey, err := b.getKey(ctx, req.Storage, intSec.HostKeyName)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf(fmt.Sprintf("key %q not found error: {{err}}", intSec.HostKeyName), err)
 | 
							return nil, fmt.Errorf("key %q not found error: %w", intSec.HostKeyName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if hostKey == nil {
 | 
						if hostKey == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("key %q not found", intSec.HostKeyName)
 | 
							return nil, fmt.Errorf("key %q not found", intSec.HostKeyName)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/parseutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,7 +25,7 @@ import (
 | 
				
			|||||||
func generateRSAKeys(keyBits int) (publicKeyRsa string, privateKeyRsa string, err error) {
 | 
					func generateRSAKeys(keyBits int) (publicKeyRsa string, privateKeyRsa string, err error) {
 | 
				
			||||||
	privateKey, err := rsa.GenerateKey(rand.Reader, keyBits)
 | 
						privateKey, err := rsa.GenerateKey(rand.Reader, keyBits)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("error generating RSA key-pair: {{err}}", err)
 | 
							return "", "", fmt.Errorf("error generating RSA key-pair: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	privateKeyRsa = string(pem.EncodeToMemory(&pem.Block{
 | 
						privateKeyRsa = string(pem.EncodeToMemory(&pem.Block{
 | 
				
			||||||
@@ -36,7 +35,7 @@ func generateRSAKeys(keyBits int) (publicKeyRsa string, privateKeyRsa string, er
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	sshPublicKey, err := ssh.NewPublicKey(privateKey.Public())
 | 
						sshPublicKey, err := ssh.NewPublicKey(privateKey.Public())
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", "", errwrap.Wrapf("error generating RSA key-pair: {{err}}", err)
 | 
							return "", "", fmt.Errorf("error generating RSA key-pair: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	publicKeyRsa = "ssh-rsa " + base64.StdEncoding.EncodeToString(sshPublicKey.Marshal())
 | 
						publicKeyRsa = "ssh-rsa " + base64.StdEncoding.EncodeToString(sshPublicKey.Marshal())
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
@@ -64,7 +63,7 @@ func (b *backend) installPublicKeyInTarget(ctx context.Context, adminUser, usern
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	err = comm.Upload(publicKeyFileName, bytes.NewBufferString(dynamicPublicKey), nil)
 | 
						err = comm.Upload(publicKeyFileName, bytes.NewBufferString(dynamicPublicKey), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error uploading public key: {{err}}", err)
 | 
							return fmt.Errorf("error uploading public key: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Transfer the script required to install or uninstall the key to the remote
 | 
						// Transfer the script required to install or uninstall the key to the remote
 | 
				
			||||||
@@ -73,14 +72,14 @@ func (b *backend) installPublicKeyInTarget(ctx context.Context, adminUser, usern
 | 
				
			|||||||
	scriptFileName := fmt.Sprintf("%s.sh", publicKeyFileName)
 | 
						scriptFileName := fmt.Sprintf("%s.sh", publicKeyFileName)
 | 
				
			||||||
	err = comm.Upload(scriptFileName, bytes.NewBufferString(installScript), nil)
 | 
						err = comm.Upload(scriptFileName, bytes.NewBufferString(installScript), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("error uploading install script: {{err}}", err)
 | 
							return fmt.Errorf("error uploading install script: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create a session to run remote command that triggers the script to install
 | 
						// Create a session to run remote command that triggers the script to install
 | 
				
			||||||
	// or uninstall the key.
 | 
						// or uninstall the key.
 | 
				
			||||||
	session, err := comm.NewSession()
 | 
						session, err := comm.NewSession()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errwrap.Wrapf("unable to create SSH Session using public keys: {{err}}", err)
 | 
							return fmt.Errorf("unable to create SSH Session using public keys: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if session == nil {
 | 
						if session == nil {
 | 
				
			||||||
		return fmt.Errorf("invalid session object")
 | 
							return fmt.Errorf("invalid session object")
 | 
				
			||||||
@@ -118,7 +117,7 @@ func roleContainsIP(ctx context.Context, s logical.Storage, roleName string, ip
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	roleEntry, err := s.Get(ctx, fmt.Sprintf("roles/%s", roleName))
 | 
						roleEntry, err := s.Get(ctx, fmt.Sprintf("roles/%s", roleName))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return false, errwrap.Wrapf("error retrieving role {{err}}", err)
 | 
							return false, fmt.Errorf("error retrieving role %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if roleEntry == nil {
 | 
						if roleEntry == nil {
 | 
				
			||||||
		return false, fmt.Errorf("role %q not found", roleName)
 | 
							return false, fmt.Errorf("role %q not found", roleName)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
	otplib "github.com/pquerna/otp"
 | 
						otplib "github.com/pquerna/otp"
 | 
				
			||||||
@@ -108,7 +107,7 @@ func (b *backend) pathValidateCode(ctx context.Context, req *logical.Request, da
 | 
				
			|||||||
			int64(key.Period)*
 | 
								int64(key.Period)*
 | 
				
			||||||
			int64((2+key.Skew))))
 | 
								int64((2+key.Skew))))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errwrap.Wrapf("error adding code to used cache: {{err}}", err)
 | 
							return nil, fmt.Errorf("error adding code to used cache: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &logical.Response{
 | 
						return &logical.Response{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,6 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
	otplib "github.com/pquerna/otp"
 | 
						otplib "github.com/pquerna/otp"
 | 
				
			||||||
@@ -357,7 +356,7 @@ func (b *backend) pathKeyCreate(ctx context.Context, req *logical.Request, data
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				barcode, err := keyObject.Image(qrSize, qrSize)
 | 
									barcode, err := keyObject.Image(qrSize, qrSize)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf("failed to generate QR code image: {{err}}", err)
 | 
										return nil, fmt.Errorf("failed to generate QR code image: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				var buff bytes.Buffer
 | 
									var buff bytes.Buffer
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,9 @@ package transit
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -66,7 +66,7 @@ func Backend(ctx context.Context, conf *logical.BackendConfig) (*backend, error)
 | 
				
			|||||||
		var err error
 | 
							var err error
 | 
				
			||||||
		cacheSize, err = GetCacheSizeFromStorage(ctx, conf.StorageView)
 | 
							cacheSize, err = GetCacheSizeFromStorage(ctx, conf.StorageView)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("Error retrieving cache size from storage: {{err}}", err)
 | 
								return nil, fmt.Errorf("Error retrieving cache size from storage: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@ package transit
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
@@ -68,7 +68,7 @@ func (b *backend) pathDecryptWrite(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
	if batchInputRaw != nil {
 | 
						if batchInputRaw != nil {
 | 
				
			||||||
		err = decodeBatchRequestItems(batchInputRaw, &batchInputItems)
 | 
							err = decodeBatchRequestItems(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
@@ -231,7 +230,7 @@ func (b *backend) pathEncryptWrite(ctx context.Context, req *logical.Request, d
 | 
				
			|||||||
	if batchInputRaw != nil {
 | 
						if batchInputRaw != nil {
 | 
				
			||||||
		err = decodeBatchRequestItems(batchInputRaw, &batchInputItems)
 | 
							err = decodeBatchRequestItems(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -147,7 +146,7 @@ func (b *backend) pathHMACWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
		err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
							err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			p.Unlock()
 | 
								p.Unlock()
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
@@ -253,7 +252,7 @@ func (b *backend) pathHMACVerify(ctx context.Context, req *logical.Request, d *f
 | 
				
			|||||||
		err := mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
							err := mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			p.Unlock()
 | 
								p.Unlock()
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,6 @@ import (
 | 
				
			|||||||
	"golang.org/x/crypto/ed25519"
 | 
						"golang.org/x/crypto/ed25519"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/fatih/structs"
 | 
						"github.com/fatih/structs"
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/logical"
 | 
						"github.com/hashicorp/vault/sdk/logical"
 | 
				
			||||||
@@ -296,7 +295,7 @@ func (b *backend) pathPolicyRead(ctx context.Context, req *logical.Request, d *f
 | 
				
			|||||||
					} else {
 | 
										} else {
 | 
				
			||||||
						ver, err := strconv.Atoi(k)
 | 
											ver, err := strconv.Atoi(k)
 | 
				
			||||||
						if err != nil {
 | 
											if err != nil {
 | 
				
			||||||
							return nil, errwrap.Wrapf(fmt.Sprintf("invalid version %q: {{err}}", k), err)
 | 
												return nil, fmt.Errorf("invalid version %q: %w", k, err)
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						derived, err := p.GetKey(context, ver, 32)
 | 
											derived, err := p.GetKey(context, ver, 32)
 | 
				
			||||||
						if err != nil {
 | 
											if err != nil {
 | 
				
			||||||
@@ -321,7 +320,7 @@ func (b *backend) pathPolicyRead(ctx context.Context, req *logical.Request, d *f
 | 
				
			|||||||
				// API
 | 
									// API
 | 
				
			||||||
				derBytes, err := x509.MarshalPKIXPublicKey(v.RSAKey.Public())
 | 
									derBytes, err := x509.MarshalPKIXPublicKey(v.RSAKey.Public())
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return nil, errwrap.Wrapf("error marshaling RSA public key: {{err}}", err)
 | 
										return nil, fmt.Errorf("error marshaling RSA public key: %w", err)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				pemBlock := &pem.Block{
 | 
									pemBlock := &pem.Block{
 | 
				
			||||||
					Type:  "PUBLIC KEY",
 | 
										Type:  "PUBLIC KEY",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
@@ -61,7 +60,7 @@ func (b *backend) pathRewrapWrite(ctx context.Context, req *logical.Request, d *
 | 
				
			|||||||
	if batchInputRaw != nil {
 | 
						if batchInputRaw != nil {
 | 
				
			||||||
		err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
							err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ import (
 | 
				
			|||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hashicorp/errwrap"
 | 
					 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/framework"
 | 
						"github.com/hashicorp/vault/sdk/framework"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/errutil"
 | 
				
			||||||
	"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
						"github.com/hashicorp/vault/sdk/helper/keysutil"
 | 
				
			||||||
@@ -272,7 +271,7 @@ func (b *backend) pathSignWrite(ctx context.Context, req *logical.Request, d *fr
 | 
				
			|||||||
		err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
							err = mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			p.Unlock()
 | 
								p.Unlock()
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
@@ -379,7 +378,7 @@ func (b *backend) pathVerifyWrite(ctx context.Context, req *logical.Request, d *
 | 
				
			|||||||
	if batchInputRaw != nil {
 | 
						if batchInputRaw != nil {
 | 
				
			||||||
		err := mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
							err := mapstructure.Decode(batchInputRaw, &batchInputItems)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, errwrap.Wrapf("failed to parse batch input: {{err}}", err)
 | 
								return nil, fmt.Errorf("failed to parse batch input: %w", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if len(batchInputItems) == 0 {
 | 
							if len(batchInputItems) == 0 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user