96 lines
2.4 KiB
Go
96 lines
2.4 KiB
Go
|
// Copyright (c) HashiCorp, Inc.
|
||
|
// SPDX-License-Identifier: MPL-2.0
|
||
|
|
||
|
package framework
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"time"
|
||
|
|
||
|
"github.com/hashicorp/vault/sdk/logical"
|
||
|
)
|
||
|
|
||
|
// Secret is a type of secret that can be returned from a backend.
|
||
|
type Secret struct {
|
||
|
// Type is the name of this secret type. This is used to setup the
|
||
|
// vault ID and to look up the proper secret structure when revocation/
|
||
|
// renewal happens. Once this is set this should not be changed.
|
||
|
//
|
||
|
// The format of this must match (case insensitive): ^a-Z0-9_$
|
||
|
Type string
|
||
|
|
||
|
// Fields is the mapping of data fields and schema that comprise
|
||
|
// the structure of this secret.
|
||
|
Fields map[string]*FieldSchema
|
||
|
|
||
|
// DefaultDuration is the default value for the duration of the lease for
|
||
|
// this secret. This can be manually overwritten with the result of
|
||
|
// Response().
|
||
|
//
|
||
|
// If these aren't set, Vault core will set a default lease period which
|
||
|
// may come from a mount tuning.
|
||
|
DefaultDuration time.Duration
|
||
|
|
||
|
// Renew is the callback called to renew this secret. If Renew is
|
||
|
// not specified then renewable is set to false in the secret.
|
||
|
// See lease.go for helpers for this value.
|
||
|
Renew OperationFunc
|
||
|
|
||
|
// Revoke is the callback called to revoke this secret. This is required.
|
||
|
Revoke OperationFunc
|
||
|
}
|
||
|
|
||
|
func (s *Secret) Renewable() bool {
|
||
|
return s.Renew != nil
|
||
|
}
|
||
|
|
||
|
func (s *Secret) Response(
|
||
|
data, internal map[string]interface{},
|
||
|
) *logical.Response {
|
||
|
internalData := make(map[string]interface{})
|
||
|
for k, v := range internal {
|
||
|
internalData[k] = v
|
||
|
}
|
||
|
internalData["secret_type"] = s.Type
|
||
|
|
||
|
return &logical.Response{
|
||
|
Secret: &logical.Secret{
|
||
|
LeaseOptions: logical.LeaseOptions{
|
||
|
TTL: s.DefaultDuration,
|
||
|
Renewable: s.Renewable(),
|
||
|
},
|
||
|
InternalData: internalData,
|
||
|
},
|
||
|
|
||
|
Data: data,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// HandleRenew is the request handler for renewing this secret.
|
||
|
func (s *Secret) HandleRenew(ctx context.Context, req *logical.Request) (*logical.Response, error) {
|
||
|
if !s.Renewable() {
|
||
|
return nil, logical.ErrUnsupportedOperation
|
||
|
}
|
||
|
|
||
|
data := &FieldData{
|
||
|
Raw: req.Data,
|
||
|
Schema: s.Fields,
|
||
|
}
|
||
|
|
||
|
return s.Renew(ctx, req, data)
|
||
|
}
|
||
|
|
||
|
// HandleRevoke is the request handler for revoking this secret.
|
||
|
func (s *Secret) HandleRevoke(ctx context.Context, req *logical.Request) (*logical.Response, error) {
|
||
|
data := &FieldData{
|
||
|
Raw: req.Data,
|
||
|
Schema: s.Fields,
|
||
|
}
|
||
|
|
||
|
if s.Revoke != nil {
|
||
|
return s.Revoke(ctx, req, data)
|
||
|
}
|
||
|
|
||
|
return nil, logical.ErrUnsupportedOperation
|
||
|
}
|