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 }