mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-29 17:52:32 +00:00
101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package api
|
|
|
|
// NOTE: this file was copied from
|
|
// https://github.com/hashicorp/vault/blob/main/sdk/helper/consts/plugin_types.go
|
|
// Any changes made should be made to both files at the same time.
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
var PluginTypes = []PluginType{
|
|
PluginTypeUnknown,
|
|
PluginTypeCredential,
|
|
PluginTypeDatabase,
|
|
PluginTypeSecrets,
|
|
}
|
|
|
|
type PluginType uint32
|
|
|
|
// This is a list of PluginTypes used by Vault.
|
|
// If we need to add any in the future, it would
|
|
// be best to add them to the _end_ of the list below
|
|
// because they resolve to incrementing numbers,
|
|
// which may be saved in state somewhere. Thus if
|
|
// the name for one of those numbers changed because
|
|
// a value were added to the middle, that could cause
|
|
// the wrong plugin types to be read from storage
|
|
// for a given underlying number. Example of the problem
|
|
// here: https://play.golang.org/p/YAaPw5ww3er
|
|
const (
|
|
PluginTypeUnknown PluginType = iota
|
|
PluginTypeCredential
|
|
PluginTypeDatabase
|
|
PluginTypeSecrets
|
|
)
|
|
|
|
func (p PluginType) String() string {
|
|
switch p {
|
|
case PluginTypeUnknown:
|
|
return "unknown"
|
|
case PluginTypeCredential:
|
|
return "auth"
|
|
case PluginTypeDatabase:
|
|
return "database"
|
|
case PluginTypeSecrets:
|
|
return "secret"
|
|
default:
|
|
return "unsupported"
|
|
}
|
|
}
|
|
|
|
func ParsePluginType(pluginType string) (PluginType, error) {
|
|
switch pluginType {
|
|
case "unknown":
|
|
return PluginTypeUnknown, nil
|
|
case "auth":
|
|
return PluginTypeCredential, nil
|
|
case "database":
|
|
return PluginTypeDatabase, nil
|
|
case "secret":
|
|
return PluginTypeSecrets, nil
|
|
default:
|
|
return PluginTypeUnknown, fmt.Errorf("%q is not a supported plugin type", pluginType)
|
|
}
|
|
}
|
|
|
|
// UnmarshalJSON implements json.Unmarshaler. It supports unmarshaling either a
|
|
// string or a uint32. All new serialization will be as a string, but we
|
|
// previously serialized as a uint32 so we need to support that for backwards
|
|
// compatibility.
|
|
func (p *PluginType) UnmarshalJSON(data []byte) error {
|
|
var asString string
|
|
err := json.Unmarshal(data, &asString)
|
|
if err == nil {
|
|
*p, err = ParsePluginType(asString)
|
|
return err
|
|
}
|
|
|
|
var asUint32 uint32
|
|
err = json.Unmarshal(data, &asUint32)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*p = PluginType(asUint32)
|
|
switch *p {
|
|
case PluginTypeUnknown, PluginTypeCredential, PluginTypeDatabase, PluginTypeSecrets:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("%d is not a supported plugin type", asUint32)
|
|
}
|
|
}
|
|
|
|
// MarshalJSON implements json.Marshaler.
|
|
func (p PluginType) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(p.String())
|
|
}
|