master
go 61 lines 1.8 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package secretstore
4
5 import (
6 "context"
7 "fmt"
8 "strings"
9 )
10
11 // runtimeResolver resolves ${store:<kind>:<name>:<operand>} references against a captured snapshot.
12 type runtimeResolver struct{}
13
14 func newRuntimeResolver() *runtimeResolver { return &runtimeResolver{} }
15
16 func (r *runtimeResolver) resolveContext(ctx context.Context, snapshot *Snapshot, ref, original string) (string, error) {
17 if ctx == nil {
18 ctx = context.Background()
19 }
20 select {
21 case <-ctx.Done():
22 return "", ctx.Err()
23 default:
24 }
25
26 kindPart, rest, ok := strings.Cut(ref, ":")
27 if !ok {
28 return "", fmt.Errorf("resolving secret '%s': store reference must be in format 'kind:name:operand'", original)
29 }
30 namePart, operand, ok := strings.Cut(rest, ":")
31 if !ok {
32 return "", fmt.Errorf("resolving secret '%s': store reference must be in format 'kind:name:operand'", original)
33 }
34
35 kind := StoreKind(strings.TrimSpace(kindPart))
36 name := strings.TrimSpace(namePart)
37 operand = strings.TrimSpace(operand)
38 if !kind.IsValid() || name == "" || operand == "" {
39 return "", fmt.Errorf("resolving secret '%s': store reference must be in format 'kind:name:operand'", original)
40 }
41 storeKey := StoreKey(kind, name)
42
43 if snapshot == nil {
44 return "", fmt.Errorf("resolving secret '%s': secretstore '%s' is not configured", original, storeKey)
45 }
46 store, ok := snapshot.lookupStore(storeKey)
47 if !ok {
48 return "", fmt.Errorf("resolving secret '%s': secretstore '%s' is not configured", original, storeKey)
49 }
50 if store.published == nil {
51 return "", fmt.Errorf("resolving secret '%s': secretstore '%s' has no published resolver state", original, storeKey)
52 }
53
54 return store.published.Resolve(ctx, ResolveRequest{
55 StoreKey: storeKey,
56 StoreKind: kind,
57 StoreName: name,
58 Operand: operand,
59 Original: original,
60 })
61 }