Skip to content

Commit bec6a91

Browse files
authored
add KeyPass provider (tellerops#92)
* add KeyPass provider * change jondot review: change all fields to be default in env_sync * alignment test after change all fields behavior
1 parent d5d0669 commit bec6a91

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+7589
-8
lines changed

README.md

+31
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,37 @@ providers:
10621062
10631063
```
10641064

1065+
## KeyPass
1066+
1067+
### Authentication
1068+
1069+
requires the following environment variables to be set:
1070+
1071+
`KEYPASS_PASSWORD`: Password database credentials
1072+
`KEYPASS_DB_PATH`: Database path
1073+
1074+
### Features
1075+
1076+
* Sync - `no`
1077+
* Mapping - `yes`
1078+
* Modes - `read`
1079+
1080+
### Example Config
1081+
1082+
```yaml
1083+
1084+
providers:
1085+
keypass:
1086+
env_sync:
1087+
path: redis/config
1088+
# source: Optional, all fields is the default. Supported fields: Notes, Title, Password, URL, UserName
1089+
env:
1090+
ETC_DSN:
1091+
path: redis/config/foobar
1092+
# source: Optional, Password is the default. Supported fields: Notes, Title, Password, URL, UserName
1093+
1094+
```
1095+
10651096
# Semantics
10661097

10671098
## Addressing

go.mod

+4-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ require (
3030
github.com/mattn/lastpass-go v0.0.0-20160926001517-82bef8502f75
3131
github.com/mitchellh/go-homedir v1.1.0
3232
github.com/samber/lo v1.11.0
33+
github.com/sirupsen/logrus v1.7.0
3334
github.com/stretchr/testify v1.7.0
3435
github.com/testcontainers/testcontainers-go v0.10.1-0.20210331130832-54854fb15ccb
36+
github.com/tobischo/gokeepasslib/v3 v3.2.5
3537
go.etcd.io/etcd/api/v3 v3.5.0-alpha.0
3638
go.etcd.io/etcd/client/v3 v3.5.0-alpha.0
3739
go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0
@@ -57,6 +59,8 @@ require (
5759
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
5860
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3 // indirect
5961
github.com/Microsoft/hcsshim v0.8.15 // indirect
62+
github.com/aead/argon2 v0.0.0-20180111183520-a87724528b07 // indirect
63+
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
6064
github.com/alecthomas/colour v0.1.0 // indirect
6165
github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2 // indirect
6266
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
@@ -130,7 +134,6 @@ require (
130134
github.com/russross/blackfriday/v2 v2.1.0 // indirect
131135
github.com/ryanuber/go-glob v1.0.0 // indirect
132136
github.com/sergi/go-diff v1.1.0 // indirect
133-
github.com/sirupsen/logrus v1.7.0 // indirect
134137
github.com/spf13/cobra v0.0.5 // indirect
135138
github.com/spf13/pflag v1.0.5 // indirect
136139
github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect
@@ -142,7 +145,6 @@ require (
142145
go.uber.org/multierr v1.5.0 // indirect
143146
go.uber.org/zap v1.16.0 // indirect
144147
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
145-
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 // indirect
146148
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
147149
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect
148150
golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02 // indirect

go.sum

+8-4
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61
108108
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
109109
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
110110
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
111+
github.com/aead/argon2 v0.0.0-20180111183520-a87724528b07 h1:i9/M2RadeVsPBMNwXFiaYkXQi9lY9VuZeI4Onavd3pA=
112+
github.com/aead/argon2 v0.0.0-20180111183520-a87724528b07/go.mod h1:Tnm/osX+XXr9R+S71o5/F0E60sRkPVALdhWw25qPImQ=
113+
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
114+
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
111115
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
112116
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
113117
github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk=
@@ -417,7 +421,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
417421
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
418422
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
419423
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
420-
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
421424
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
422425
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
423426
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
@@ -831,6 +834,8 @@ github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M=
831834
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
832835
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
833836
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
837+
github.com/tobischo/gokeepasslib/v3 v3.2.5 h1:BW0HorAp/Eo5XsjA3pgyrLaRzn9J5tGq8NBOADpE39g=
838+
github.com/tobischo/gokeepasslib/v3 v3.2.5/go.mod h1:iwxOzUuk/ccA0mitrFC4MovT1p0IRY8EA35L4u1x/ug=
834839
github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U=
835840
github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
836841
github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ=
@@ -908,6 +913,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
908913
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
909914
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
910915
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
916+
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
911917
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
912918
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
913919
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
@@ -951,7 +957,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
951957
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
952958
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
953959
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4=
954-
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
955960
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
956961
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
957962
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1023,8 +1028,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
10231028
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
10241029
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
10251030
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1026-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
1027-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
10281031
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
10291032
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
10301033
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1081,6 +1084,7 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
10811084
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10821085
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10831086
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1087+
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10841088
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10851089
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
10861090
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

pkg/providers.go

+3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func (p *BuiltinProviders) ProviderHumanToMachine() map[string]string {
3636
"Gopass": "gopass",
3737
"LastPass": "lastpass",
3838
"GitHub": "github",
39+
"KeyPass": "keypass",
3940
}
4041
}
4142

@@ -78,6 +79,8 @@ func (p *BuiltinProviders) GetProvider(name string) (core.Provider, error) {
7879
return providers.NewLastPass(logger)
7980
case "github":
8081
return providers.NewGitHub(logger)
82+
case "keypass":
83+
return providers.NewKeyPass(logger)
8184
default:
8285
return nil, fmt.Errorf("provider '%s' does not exist", name)
8386
}

pkg/providers/keypass.go

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package providers
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
"strings"
8+
9+
"github.com/spectralops/teller/pkg/core"
10+
11+
"github.com/spectralops/teller/pkg/logging"
12+
"github.com/tobischo/gokeepasslib/v3"
13+
)
14+
15+
var (
16+
// keyPathFields describe all the available fields in KeyPass entry
17+
keyPathFields = []string{"Notes", "Password", "URL", "UserName"}
18+
)
19+
20+
type KeyPass struct {
21+
logger logging.Logger
22+
data map[string]gokeepasslib.Entry
23+
}
24+
25+
// NewKeyPass creates new provider instance
26+
func NewKeyPass(logger logging.Logger) (core.Provider, error) {
27+
28+
password := os.Getenv("KEYPASS_PASSWORD")
29+
if password == "" {
30+
return nil, errors.New("missing `KEYPASS_PASSWORD`")
31+
}
32+
dbPath := os.Getenv("KEYPASS_DB_PATH")
33+
if dbPath == "" {
34+
return nil, errors.New("missing `KEYPASS_DB_PATH`")
35+
}
36+
37+
file, err := os.Open(dbPath)
38+
if err != nil {
39+
return nil, err
40+
}
41+
defer file.Close()
42+
43+
db := gokeepasslib.NewDatabase()
44+
db.Credentials = gokeepasslib.NewPasswordCredentials(password)
45+
err = gokeepasslib.NewDecoder(file).Decode(db)
46+
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
err = db.UnlockProtectedEntries()
52+
if err != nil {
53+
return nil, err
54+
}
55+
keyPass := &KeyPass{
56+
logger: logger,
57+
}
58+
keyPass.data = keyPass.prepareGroups("", db.Content.Root.Groups, nil)
59+
return keyPass, nil
60+
}
61+
62+
// Name return the provider name
63+
func (k *KeyPass) Name() string {
64+
return "KeyPass"
65+
}
66+
67+
// Put will create a new single entry
68+
func (k *KeyPass) Put(p core.KeyPath, val string) error {
69+
return fmt.Errorf("provider %q does not implement write yet", k.Name())
70+
}
71+
72+
// PutMapping will create a multiple entries
73+
func (k *KeyPass) PutMapping(p core.KeyPath, m map[string]string) error {
74+
return fmt.Errorf("provider %q does not implement write yet", k.Name())
75+
}
76+
77+
// GetMapping returns a multiple entries
78+
func (k *KeyPass) GetMapping(p core.KeyPath) ([]core.EnvEntry, error) {
79+
80+
results := []core.EnvEntry{}
81+
for path, entry := range k.data { //nolint
82+
// get entries that start with the given path
83+
if strings.HasPrefix(path, p.Path) {
84+
if p.Source == "" {
85+
// getting all entries fields
86+
for _, field := range keyPathFields {
87+
val := entry.Get(field).Value.Content
88+
// skip on empty field
89+
if val == "" {
90+
k.logger.WithFields(map[string]interface{}{
91+
"field": field,
92+
"path": path,
93+
}).Debug("empty field")
94+
continue
95+
}
96+
results = append(results, p.FoundWithKey(fmt.Sprintf("%s/%s", path, strings.ToLower(field)), val))
97+
}
98+
} else {
99+
fieldContent := entry.Get(p.Source)
100+
if fieldContent == nil {
101+
k.logger.WithFields(map[string]interface{}{
102+
"source": p.Source,
103+
"path": path,
104+
}).Debug("field not found")
105+
continue
106+
}
107+
val := fieldContent.Value.Content
108+
if val != "" {
109+
results = append(results, p.FoundWithKey(path, val))
110+
}
111+
}
112+
}
113+
}
114+
return results, nil
115+
}
116+
117+
// Get returns a single entry
118+
func (k *KeyPass) Get(p core.KeyPath) (*core.EnvEntry, error) {
119+
ent := p.Missing()
120+
entry, found := k.data[p.Path]
121+
if !found {
122+
k.logger.WithField("path", p.Path).Debug("secret not found in path")
123+
return nil, fmt.Errorf("%v path: %s not exists", k.Name(), p.Path)
124+
}
125+
source := p.Source
126+
if source == "" {
127+
k.logger.WithField("path", p.Path).Debug("source attribute is empty, setting default field")
128+
source = "Password"
129+
}
130+
k.logger.WithFields(map[string]interface{}{
131+
"path": p.Path,
132+
"source": source,
133+
}).Debug("get keypass field")
134+
ent = p.Found(entry.Get(source).Value.Content)
135+
136+
return &ent, nil
137+
}
138+
139+
// Delete will delete entry
140+
func (k *KeyPass) Delete(kp core.KeyPath) error {
141+
return fmt.Errorf("provider %s does not implement delete yet", k.Name())
142+
}
143+
144+
// DeleteMapping will delete the given path recessively
145+
func (k *KeyPass) DeleteMapping(kp core.KeyPath) error {
146+
return fmt.Errorf("provider %s does not implement delete yet", k.Name())
147+
}
148+
149+
// prepareGroups all KeyPass entries for easy seearch
150+
func (k *KeyPass) prepareGroups(path string, groups []gokeepasslib.Group, mapData map[string]gokeepasslib.Entry) map[string]gokeepasslib.Entry {
151+
if mapData == nil {
152+
mapData = map[string]gokeepasslib.Entry{}
153+
}
154+
for _, group := range groups { //nolint
155+
// if entries found, adding the entry data fo the list
156+
if len(group.Entries) > 0 {
157+
for _, entry := range group.Entries { //nolint
158+
mapData[fmt.Sprintf("%s/%s/%s", path, group.Name, entry.GetTitle())] = entry
159+
}
160+
}
161+
if len(group.Groups) > 0 {
162+
// call recursively prepareGroups function get collect entries
163+
return k.prepareGroups(strings.TrimPrefix(fmt.Sprintf("%s/%s", path, group.Name), "/"), group.Groups, mapData)
164+
}
165+
}
166+
return mapData
167+
}

pkg/providers/keypass_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package providers
2+
3+
import (
4+
"os"
5+
"path"
6+
"runtime"
7+
"testing"
8+
9+
"github.com/alecthomas/assert"
10+
"github.com/spectralops/teller/pkg/core"
11+
)
12+
13+
func TestKetPass(t *testing.T) {
14+
15+
_, filename, _, _ := runtime.Caller(0) //nolint
16+
os.Setenv("KEYPASS_PASSWORD", "1234")
17+
18+
os.Setenv("KEYPASS_DB_PATH", path.Join(path.Dir(filename), "mock_providers", "keypass.kdbx"))
19+
20+
k, err := NewKeyPass(GetTestLogger())
21+
assert.Nil(t, err)
22+
AssertProvider(t, k, false)
23+
p := core.NewPopulate(map[string]string{"stage": "prod"})
24+
kpmap := p.KeyPath(core.KeyPath{Field: "MG_KEY", Path: "settings/{{stage}}/billing-svc/all", Decrypt: true})
25+
ents, err := k.GetMapping(kpmap)
26+
assert.Nil(t, err)
27+
assert.Equal(t, len(ents), 4)
28+
}
29+
30+
func TestKeypassFailures(t *testing.T) {
31+
32+
_, filename, _, _ := runtime.Caller(0) //nolint
33+
os.Setenv("KEYPASS_PASSWORD", "1234")
34+
35+
os.Setenv("KEYPASS_DB_PATH", path.Join(path.Dir(filename), "mock_providers", "keypass.kdbx"))
36+
37+
k, _ := NewKeyPass(GetTestLogger())
38+
_, err := k.Get(core.KeyPath{Env: "NOT_EXISTS", Path: "settings"})
39+
assert.NotNil(t, err)
40+
41+
}
2.08 KB
Binary file not shown.

pkg/wizard_template.go

+17
Original file line numberDiff line numberDiff line change
@@ -228,5 +228,22 @@ providers:
228228
script-value:
229229
path: owner/github-repo
230230
231+
{{end}}
232+
233+
{{- if index .ProviderKeys "keypass" }}
234+
235+
# Configure via environment variables for integration:
236+
# KEYPASS_PASSWORD: KeyPass password
237+
# KEYPASS_DB_PATH: Path to DB file
238+
239+
keypass:
240+
env_sync:
241+
path: redis/config
242+
# source: Optional, all fields is the default. Supported fields: Notes, Title, Password, URL, UserName
243+
env:
244+
ETC_DSN:
245+
path: redis/config/foobar
246+
# source: Optional, Password is the default. Supported fields: Notes, Title, Password, URL, UserName
247+
231248
{{end}}
232249
`

vendor/github.com/aead/argon2/.gitignore

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)