Skip to content

Commit 86348c6

Browse files
committed
wip
1 parent 2fc3eb0 commit 86348c6

File tree

6 files changed

+125
-25
lines changed

6 files changed

+125
-25
lines changed

config/config.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"github.com/creasty/defaults"
77
"github.com/webhookx-io/webhookx/pkg/envconfig"
8+
"github.com/webhookx-io/webhookx/pkg/secret"
9+
"github.com/webhookx-io/webhookx/utils"
810
"gopkg.in/yaml.v3"
911
"io"
1012
"os"
@@ -38,6 +40,7 @@ type Config struct {
3840
Tracing TracingConfig `yaml:"tracing" json:"tracing" envconfig:"TRACING"`
3941
Role Role `yaml:"role" json:"role" envconfig:"ROLE" default:"standalone"`
4042
AnonymousReports bool `yaml:"anonymous_reports" json:"anonymous_reports" envconfig:"ANONYMOUS_REPORTS" default:"true"`
43+
Secret SecretConfig `yaml:"secret" json:"secret" envconfig:"SECRET"`
4144
}
4245

4346
func (cfg Config) String() string {
@@ -82,6 +85,9 @@ func (cfg Config) Validate() error {
8285
if !slices.Contains([]Role{RoleStandalone, RoleCP, RoleDPWorker, RoleDPProxy}, cfg.Role) {
8386
return fmt.Errorf("invalid role: '%s'", cfg.Role)
8487
}
88+
if err := cfg.Secret.Validate(); err != nil {
89+
return err
90+
}
8591

8692
return nil
8793
}
@@ -117,12 +123,25 @@ func InitWithFile(filename string) (*Config, error) {
117123
return nil, err
118124
}
119125

120-
err = envconfig.Process("WEBHOOKX", &cfg)
121-
if err != nil {
126+
if err := envconfig.Process("WEBHOOKX_SECRET", &cfg.Secret); err != nil {
122127
return nil, err
123128
}
129+
if cfg.Secret.Provider != "" {
130+
var providerConfig map[string]interface{}
131+
switch cfg.Secret.Provider {
132+
case ProviderAWS:
133+
providerConfig = utils.Must(utils.StructToMap(cfg.Secret.Aws))
134+
}
135+
manager := secret.NewManager(secret.ProviderType(cfg.Secret.Provider), providerConfig)
136+
err = envconfig.ProcessWithReader("WEBHOOKX", &cfg,
137+
envconfig.ReaderFunc(func(key string) (string, bool, error) {
138+
return manager.Get(key)
139+
}))
140+
return &cfg, err
141+
}
124142

125-
return &cfg, nil
143+
err = envconfig.Process("WEBHOOKX", &cfg)
144+
return &cfg, err
126145
}
127146

128147
func (cfg *Config) OverrideByRole(role Role) {

go.mod

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ go 1.25.3
55
require (
66
github.com/Masterminds/squirrel v1.5.4
77
github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef
8+
github.com/aws/aws-sdk-go-v2 v1.39.5
9+
github.com/aws/aws-sdk-go-v2/config v1.31.16
10+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.39.10
811
github.com/creasty/defaults v1.8.0
912
github.com/dop251/goja v0.0.0-20250309171923-bcd7cc6bf64c
1013
github.com/elazarl/goproxy v1.7.2
@@ -51,6 +54,17 @@ require github.com/felixge/httpsnoop v1.0.4 // indirect
5154

5255
require (
5356
github.com/Masterminds/semver/v3 v3.4.0 // indirect
57+
github.com/aws/aws-sdk-go-v2/credentials v1.18.20 // indirect
58+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 // indirect
59+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 // indirect
60+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 // indirect
61+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
62+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect
63+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 // indirect
64+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 // indirect
65+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 // indirect
66+
github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 // indirect
67+
github.com/aws/smithy-go v1.23.1 // indirect
5468
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
5569
github.com/dlclark/regexp2 v1.11.4 // indirect
5670
github.com/go-openapi/jsonpointer v0.21.0 // indirect
@@ -62,7 +76,7 @@ require (
6276
github.com/josharian/intern v1.0.0 // indirect
6377
github.com/mailru/easyjson v0.7.7 // indirect
6478
github.com/mattn/go-colorable v0.1.13 // indirect
65-
github.com/mattn/go-isatty v0.0.19 // indirect
79+
github.com/mattn/go-isatty v0.0.20 // indirect
6680
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
6781
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
6882
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
@@ -74,6 +88,7 @@ require (
7488
go.opentelemetry.io/contrib/propagators/ot v1.38.0 // indirect
7589
go.uber.org/automaxprocs v1.6.0 // indirect
7690
go.yaml.in/yaml/v3 v3.0.4 // indirect
91+
golang.org/x/time v0.12.0 // indirect
7792
)
7893

7994
require (
@@ -97,7 +112,7 @@ require (
97112
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
98113
github.com/leodido/go-urn v1.4.0 // indirect
99114
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
100-
github.com/spf13/pflag v1.0.6 // indirect
115+
github.com/spf13/pflag v1.0.10 // indirect
101116
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0
102117
go.opentelemetry.io/otel/trace v1.38.0
103118
go.opentelemetry.io/proto/otlp v1.7.1 // indirect

go.sum

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,34 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd
1212
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
1313
github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef h1:2JGTg6JapxP9/R33ZaagQtAM4EkkSYnIAlOG5EI8gkM=
1414
github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef/go.mod h1:JS7hed4L1fj0hXcyEejnW57/7LCetXggd+vwrRnYeII=
15+
github.com/aws/aws-sdk-go-v2 v1.39.5 h1:e/SXuia3rkFtapghJROrydtQpfQaaUgd1cUvyO1mp2w=
16+
github.com/aws/aws-sdk-go-v2 v1.39.5/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM=
17+
github.com/aws/aws-sdk-go-v2/config v1.31.16 h1:E4Tz+tJiPc7kGnXwIfCyUj6xHJNpENlY11oKpRTgsjc=
18+
github.com/aws/aws-sdk-go-v2/config v1.31.16/go.mod h1:2S9hBElpCyGMifv14WxQ7EfPumgoeCPZUpuPX8VtW34=
19+
github.com/aws/aws-sdk-go-v2/credentials v1.18.20 h1:KFndAnHd9NUuzikHjQ8D5CfFVO+bgELkmcGY8yAw98Q=
20+
github.com/aws/aws-sdk-go-v2/credentials v1.18.20/go.mod h1:9mCi28a+fmBHSQ0UM79omkz6JtN+PEsvLrnG36uoUv0=
21+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 h1:VO3FIM2TDbm0kqp6sFNR0PbioXJb/HzCDW6NtIZpIWE=
22+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12/go.mod h1:6C39gB8kg82tx3r72muZSrNhHia9rjGkX7ORaS2GKNE=
23+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 h1:p/9flfXdoAnwJnuW9xHEAFY22R3A6skYkW19JFF9F+8=
24+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12/go.mod h1:ZTLHakoVCTtW8AaLGSwJ3LXqHD9uQKnOcv1TrpO6u2k=
25+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 h1:2lTWFvRcnWFFLzHWmtddu5MTchc5Oj2OOey++99tPZ0=
26+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12/go.mod h1:hI92pK+ho8HVcWMHKHrK3Uml4pfG7wvL86FzO0LVtQQ=
27+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
28+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
29+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 h1:xtuxji5CS0JknaXoACOunXOYOQzgfTvGAc9s2QdCJA4=
30+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2/go.mod h1:zxwi0DIR0rcRcgdbl7E2MSOvxDyyXGBlScvBkARFaLQ=
31+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 h1:MM8imH7NZ0ovIVX7D2RxfMDv7Jt9OiUXkcQ+GqywA7M=
32+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12/go.mod h1:gf4OGwdNkbEsb7elw2Sy76odfhwNktWII3WgvQgQQ6w=
33+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.39.10 h1:S5Mw93I9uFjXnHvkZ19O3Zj0UM5k4v3pYrDZxXCbqUg=
34+
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.39.10/go.mod h1:wW/JqWY6yVr88XZJq5wX22l8XNkDdhw+8eDgkN51Rlc=
35+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 h1:xHXvxst78wBpJFgDW07xllOx0IAzbryrSdM4nMVQ4Dw=
36+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.0/go.mod h1:/e8m+AO6HNPPqMyfKRtzZ9+mBF5/x1Wk8QiDva4m07I=
37+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 h1:tBw2Qhf0kj4ZwtsVpDiVRU3zKLvjvjgIjHMKirxXg8M=
38+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4/go.mod h1:Deq4B7sRM6Awq/xyOBlxBdgW8/Z926KYNNaGMW2lrkA=
39+
github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 h1:C+BRMnasSYFcgDw8o9H5hzehKzXyAb9GY5v/8bP9DUY=
40+
github.com/aws/aws-sdk-go-v2/service/sts v1.39.0/go.mod h1:4EjU+4mIx6+JqKQkruye+CaigV7alL3thVPfDd9VlMs=
41+
github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M=
42+
github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
1543
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
1644
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
1745
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
@@ -152,8 +180,9 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ
152180
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
153181
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
154182
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
155-
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
156183
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
184+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
185+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
157186
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
158187
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
159188
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
@@ -201,8 +230,9 @@ github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c
201230
github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE=
202231
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
203232
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
204-
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
205233
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
234+
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
235+
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
206236
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
207237
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
208238
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -276,8 +306,8 @@ golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
276306
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
277307
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
278308
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
279-
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
280-
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
309+
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
310+
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
281311
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
282312
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
283313
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=

pkg/envconfig/env_os.go

Lines changed: 0 additions & 8 deletions
This file was deleted.

pkg/envconfig/env_syscall.go

Lines changed: 0 additions & 8 deletions
This file was deleted.

pkg/secret/reference.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package secret
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"net/url"
7+
"strings"
8+
)
9+
10+
var (
11+
ErrReferenceInvalid = errors.New("invalid reference")
12+
)
13+
14+
// Reference represents the struct of {secret://<type>/<name>?<properties>}
15+
type Reference struct {
16+
Type string
17+
Name string
18+
Properties map[string]string
19+
}
20+
21+
func Parse(s string) (*Reference, error) {
22+
s = strings.Trim(s, "{}")
23+
s = strings.TrimSpace(s)
24+
u, err := url.Parse(s)
25+
if err != nil {
26+
return nil, err
27+
}
28+
if u.Scheme == "" {
29+
return nil, fmt.Errorf("%w: %q", ErrReferenceInvalid, "missing schema")
30+
}
31+
if u.Host == "" {
32+
return nil, fmt.Errorf("%w: %q", ErrReferenceInvalid, "missing host")
33+
}
34+
if u.Path == "" {
35+
return nil, fmt.Errorf("%w: %q", ErrReferenceInvalid, "missing path")
36+
}
37+
38+
values, err := url.ParseQuery(u.RawQuery)
39+
if err != nil {
40+
return nil, fmt.Errorf("%w: %v", ErrReferenceInvalid, err)
41+
}
42+
43+
ref := &Reference{
44+
Type: u.Host,
45+
Name: u.Path,
46+
Properties: make(map[string]string),
47+
}
48+
for k := range values {
49+
ref.Properties[k] = values.Get(k)
50+
}
51+
return ref, err
52+
}

0 commit comments

Comments
 (0)