2019-03-05 20:42:49 +00:00
|
|
|
package provisioner
|
|
|
|
|
|
|
|
import (
|
2019-03-06 22:54:56 +00:00
|
|
|
"crypto/x509"
|
2019-03-05 20:42:49 +00:00
|
|
|
"encoding/json"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Interface is the interface that all provisioner types must implement.
|
|
|
|
type Interface interface {
|
2019-03-06 22:54:56 +00:00
|
|
|
GetID() string
|
|
|
|
GetName() string
|
|
|
|
GetType() Type
|
2019-03-05 22:52:26 +00:00
|
|
|
GetEncryptedKey() (kid string, key string, ok bool)
|
2019-03-07 02:32:56 +00:00
|
|
|
Init(config Config) error
|
2019-03-05 20:42:49 +00:00
|
|
|
Authorize(token string) ([]SignOption, error)
|
2019-03-06 22:54:56 +00:00
|
|
|
AuthorizeRenewal(cert *x509.Certificate) error
|
|
|
|
AuthorizeRevoke(token string) error
|
2019-03-05 20:42:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Type indicates the provisioner Type.
|
|
|
|
type Type int
|
|
|
|
|
|
|
|
const (
|
2019-03-08 00:04:29 +00:00
|
|
|
noopType Type = 0
|
|
|
|
|
2019-03-05 20:42:49 +00:00
|
|
|
// TypeJWK is used to indicate the JWK provisioners.
|
|
|
|
TypeJWK Type = 1
|
|
|
|
|
|
|
|
// TypeOIDC is used to indicate the OIDC provisioners.
|
|
|
|
TypeOIDC Type = 2
|
|
|
|
)
|
|
|
|
|
2019-03-07 02:32:56 +00:00
|
|
|
// Config defines the default parameters used in the initialization of
|
|
|
|
// provisioners.
|
|
|
|
type Config struct {
|
|
|
|
// Claims are the default claims.
|
|
|
|
Claims Claims
|
|
|
|
// Audiences are the audiences used in the default provisioner, (JWK).
|
|
|
|
Audiences []string
|
|
|
|
}
|
|
|
|
|
2019-03-05 20:42:49 +00:00
|
|
|
type provisioner struct {
|
|
|
|
Type string `json:"type"`
|
|
|
|
}
|
|
|
|
|
2019-03-07 21:07:39 +00:00
|
|
|
// List represents a list of provisioners.
|
|
|
|
type List []Interface
|
|
|
|
|
|
|
|
// UnmarshalJSON implements json.Unmarshaler and allows to unmarshal a list of a
|
|
|
|
// interfaces into the right type.
|
|
|
|
func (l *List) UnmarshalJSON(data []byte) error {
|
|
|
|
ps := []json.RawMessage{}
|
|
|
|
if err := json.Unmarshal(data, &ps); err != nil {
|
|
|
|
return errors.Wrap(err, "error unmarshaling provisioner list")
|
2019-03-06 22:54:56 +00:00
|
|
|
}
|
2019-03-05 22:28:32 +00:00
|
|
|
|
2019-03-08 00:04:29 +00:00
|
|
|
*l = List{}
|
2019-03-07 21:07:39 +00:00
|
|
|
for _, data := range ps {
|
|
|
|
var typ provisioner
|
|
|
|
if err := json.Unmarshal(data, &typ); err != nil {
|
|
|
|
return errors.Errorf("error unmarshaling provisioner")
|
|
|
|
}
|
|
|
|
var p Interface
|
|
|
|
switch strings.ToLower(typ.Type) {
|
|
|
|
case "jwk":
|
|
|
|
p = &JWK{}
|
|
|
|
case "oidc":
|
|
|
|
p = &OIDC{}
|
|
|
|
default:
|
|
|
|
return errors.Errorf("provisioner type %s not supported", typ.Type)
|
|
|
|
}
|
|
|
|
if err := json.Unmarshal(data, p); err != nil {
|
|
|
|
return errors.Errorf("error unmarshaling provisioner")
|
|
|
|
}
|
|
|
|
*l = append(*l, p)
|
2019-03-05 20:42:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|