forked from cleanshavenalex/pvc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenvvar.go
More file actions
60 lines (54 loc) · 1.34 KB
/
envvar.go
File metadata and controls
60 lines (54 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package pvc
import (
"fmt"
"os"
"strings"
)
// Default mapping for this backend
const (
DefaultEnvVarMapping = "SECRET_{{ .ID }}" // DefaultEnvVarMapping is uppercased after interpolation for convenience
)
type envVarBackendGetter struct {
mapper SecretMapper
config *envVarBackend
}
func newEnvVarBackendGetter(eb *envVarBackend) (*envVarBackendGetter, error) {
if eb.mapping == "" {
eb.mapping = DefaultEnvVarMapping
}
sm, err := newSecretMapper(eb.mapping)
if err != nil {
return nil, fmt.Errorf("error with mapping: %v", err)
}
return &envVarBackendGetter{
mapper: sm,
config: eb,
}, nil
}
// sanitizeName replaces any illegal characters with underscores
func (ebg *envVarBackendGetter) sanitizeName(name string) string {
name = strings.ToUpper(name)
f := func(r rune) rune {
i := int(r)
switch {
// rune is alphanumeric or an underscore
case (i > 64 && i < 91) || (i > 47 && i < 58) || i == 95:
return r
default:
return '_'
}
}
return strings.Map(f, name)
}
func (ebg *envVarBackendGetter) Get(id string) ([]byte, error) {
vname, err := ebg.mapper.MapSecret(id)
if err != nil {
return nil, fmt.Errorf("error mapping id to var name: %v", err)
}
vname = ebg.sanitizeName(vname)
val, exists := os.LookupEnv(vname)
if !exists {
return nil, fmt.Errorf("secret not found: %v", vname)
}
return []byte(val), nil
}