github.com/xmidt-org/webpa-common@v1.11.9/secure/key/resolver.go (about)

     1  package key
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/xmidt-org/webpa-common/resource"
     7  )
     8  
     9  // Resolver loads and parses keys associated with key identifiers.
    10  type Resolver interface {
    11  	// ResolveKey returns a key Pair associated with the given identifier.  The exact mechanics of resolving
    12  	// a keyId into a Pair are implementation-specific.  Implementations are free
    13  	// to ignore the keyId parameter altogether.
    14  	ResolveKey(keyId string) (Pair, error)
    15  }
    16  
    17  // basicResolver contains common items for all resolvers.
    18  type basicResolver struct {
    19  	parser  Parser
    20  	purpose Purpose
    21  }
    22  
    23  func (b *basicResolver) parseKey(data []byte) (Pair, error) {
    24  	return b.parser.ParseKey(b.purpose, data)
    25  }
    26  
    27  // singleResolver is a Resolver which expects only (1) key for all key ids.
    28  type singleResolver struct {
    29  	basicResolver
    30  	loader resource.Loader
    31  }
    32  
    33  func (r *singleResolver) String() string {
    34  	return fmt.Sprintf(
    35  		"singleResolver{parser: %v, purpose: %v, loader: %v}",
    36  		r.parser,
    37  		r.purpose,
    38  		r.loader,
    39  	)
    40  }
    41  
    42  func (r *singleResolver) ResolveKey(keyId string) (Pair, error) {
    43  	data, err := resource.ReadAll(r.loader)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	return r.parseKey(data)
    49  }
    50  
    51  // multiResolver is a Resolver which uses the key id and will most likely return
    52  // different keys for each key id value.
    53  type multiResolver struct {
    54  	basicResolver
    55  	expander resource.Expander
    56  }
    57  
    58  func (r *multiResolver) String() string {
    59  	return fmt.Sprintf(
    60  		"multiResolver{parser: %v, purpose: %v, expander: %v}",
    61  		r.parser,
    62  		r.purpose,
    63  		r.expander,
    64  	)
    65  }
    66  
    67  func (r *multiResolver) ResolveKey(keyId string) (Pair, error) {
    68  	values := map[string]interface{}{
    69  		KeyIdParameterName: keyId,
    70  	}
    71  
    72  	loader, err := r.expander.Expand(values)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	data, err := resource.ReadAll(loader)
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  
    82  	return r.parseKey(data)
    83  }