Skip to content

Commit f5d95d4

Browse files
authored
SigV4: Update to not use env variables (#150)
1 parent a309fdf commit f5d95d4

File tree

7 files changed

+36
-19
lines changed

7 files changed

+36
-19
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## 0.28.0
6+
7+
- Add SigV4MiddlewareWithAuthSettings and deprecate SigV4Middleware [#150](https://github.com/grafana/grafana-aws-sdk/pull/150)
8+
9+
[Breaking Change] `sigv4.New` now expects the auth settings to be passed in instead of fetched from environment variables.
10+
511
## 0.27.1
612

713
- add case sensitive metric name millisBehindLatest for KinesisAnalytics by @tristanburgess in https://github.com/grafana/grafana-aws-sdk/pull/148

pkg/awsds/authSettings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const (
4040
)
4141

4242
// ReadAuthSettings gets the Grafana auth settings from the context if its available, the environment variables if not
43+
// Deprecated: This function is only for backwards compatibility, generally ReadAuthSettingsFromContext should be used instead
4344
func ReadAuthSettings(ctx context.Context) *AuthSettings {
4445
settings, exists := ReadAuthSettingsFromContext(ctx)
4546
if !exists {

pkg/awsds/sessions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ func (sc *SessionCache) GetSession(c SessionConfig) (*session.Session, error) {
295295
return sess, nil
296296
}
297297

298-
// AuthSettings can be grabed from the datasource instance's context with ReadSettingsFromContext
298+
// AuthSettings can be grabed from the datasource instance's context with ReadAuthSettingsFromContext
299299
func (sc *SessionCache) GetSessionWithAuthSettings(c GetSessionConfig, as AuthSettings) (*session.Session, error) {
300300
return sc.GetSession(SessionConfig{
301301
Settings: c.Settings,

pkg/sigv4/sigv4.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) {
7979

8080
// New instantiates a new signing middleware with an optional succeeding
8181
// middleware. The http.DefaultTransport will be used if nil
82-
func New(cfg *Config, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
82+
// AuthSettings can be gotten from the datasource instance's context with awsds.ReadAuthSettingsFromContext
83+
func New(cfg *Config, authSettings awsds.AuthSettings, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
8384
var sigv4Opts Opts
8485
switch len(opts) {
8586
case 0:
@@ -107,7 +108,7 @@ func New(cfg *Config, next http.RoundTripper, opts ...Opts) (http.RoundTripper,
107108
signer = cached
108109
} else {
109110
var err error
110-
signer, err = createSigner(cfg, sigv4Opts.VerboseMode)
111+
signer, err = createSigner(cfg, authSettings, sigv4Opts.VerboseMode)
111112
if err != nil {
112113
return nil, err
113114
}
@@ -181,13 +182,12 @@ func cachedSigner(cfg *Config) (*v4.Signer, bool) {
181182
return nil, false
182183
}
183184

184-
func createSigner(cfg *Config, verboseMode bool) (*v4.Signer, error) {
185+
func createSigner(cfg *Config, authSettings awsds.AuthSettings, verboseMode bool) (*v4.Signer, error) {
185186
authType, err := awsds.ToAuthType(cfg.AuthType)
186187
if err != nil {
187188
return nil, err
188189
}
189190

190-
authSettings := awsds.ReadAuthSettingsFromEnvironmentVariables()
191191
authTypeAllowed := false
192192
for _, provider := range authSettings.AllowedAuthProviders {
193193
if provider == authType.String() {

pkg/sigv4/sigv4_middleware.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"net/http"
66

7+
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
78
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
89
)
910

@@ -12,8 +13,9 @@ const SigV4MiddlewareName = "sigv4"
1213

1314
var newSigV4Func = New
1415

15-
// SigV4Middleware applies AWS Signature Version 4 request signing for the outgoing request.
16-
func SigV4Middleware(verboseLogging bool) httpclient.Middleware {
16+
// SigV4MiddlewareWithAuthSettings applies AWS Signature Version 4 request signing for the outgoing request.
17+
// AuthSettings can be gotten from the datasource instance's context with awsds.ReadAuthSettingsFromContext
18+
func SigV4MiddlewareWithAuthSettings(verboseLogging bool, authSettings awsds.AuthSettings) httpclient.Middleware {
1719
return httpclient.NamedMiddlewareFunc(SigV4MiddlewareName, func(opts httpclient.Options, next http.RoundTripper) http.RoundTripper {
1820
if opts.SigV4 == nil {
1921
return next
@@ -30,7 +32,7 @@ func SigV4Middleware(verboseLogging bool) httpclient.Middleware {
3032
Profile: opts.SigV4.Profile,
3133
}
3234

33-
rt, err := newSigV4Func(conf, next, Opts{VerboseMode: verboseLogging})
35+
rt, err := newSigV4Func(conf, authSettings, next, Opts{VerboseMode: verboseLogging})
3436
if err != nil {
3537
return invalidSigV4Config(err)
3638
}
@@ -39,6 +41,12 @@ func SigV4Middleware(verboseLogging bool) httpclient.Middleware {
3941
})
4042
}
4143

44+
// SigV4Middleware applies AWS Signature Version 4 request signing for the outgoing request.
45+
// Deprecated: Use SigV4MiddlewareWithAuthSettings instead
46+
func SigV4Middleware(verboseLogging bool) httpclient.Middleware {
47+
return SigV4MiddlewareWithAuthSettings(verboseLogging, *awsds.ReadAuthSettingsFromEnvironmentVariables())
48+
}
49+
4250
func invalidSigV4Config(err error) http.RoundTripper {
4351
return httpclient.RoundTripperFunc(func(req *http.Request) (*http.Response, error) {
4452
return nil, fmt.Errorf("invalid SigV4 configuration: %w", err)

pkg/sigv4/sigv4_middleware_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"net/http"
88
"testing"
99

10+
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
1011
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
1112
"github.com/stretchr/testify/require"
1213
)
@@ -31,7 +32,7 @@ func TestSigV4Middleware(t *testing.T) {
3132
origSigV4Func := newSigV4Func
3233
newSigV4Called := false
3334
middlewareCalled := false
34-
newSigV4Func = func(config *Config, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
35+
newSigV4Func = func(config *Config, authSettings awsds.AuthSettings, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
3536
newSigV4Called = true
3637
return httpclient.RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
3738
middlewareCalled = true
@@ -69,7 +70,7 @@ func TestSigV4Middleware(t *testing.T) {
6970
origSigV4Func := newSigV4Func
7071
newSigV4Called := false
7172
middlewareCalled := false
72-
newSigV4Func = func(config *Config, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
73+
newSigV4Func = func(config *Config, authSettings awsds.AuthSettings, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
7374
newSigV4Called = true
7475
return httpclient.RoundTripperFunc(func(r *http.Request) (*http.Response, error) {
7576
middlewareCalled = true
@@ -106,7 +107,7 @@ func TestSigV4Middleware(t *testing.T) {
106107

107108
t.Run("With sigv4 error returned", func(t *testing.T) {
108109
origSigV4Func := newSigV4Func
109-
newSigV4Func = func(config *Config, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
110+
newSigV4Func = func(config *Config, authSettings awsds.AuthSettings, next http.RoundTripper, opts ...Opts) (http.RoundTripper, error) {
110111
return nil, fmt.Errorf("problem")
111112
}
112113
t.Cleanup(func() {

pkg/sigv4/sigv4_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77
"testing"
88

9+
"github.com/grafana/grafana-aws-sdk/pkg/awsds"
910
"github.com/grafana/grafana-plugin-sdk-go/backend"
1011
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
1112

@@ -17,14 +18,14 @@ import (
1718

1819
func TestNew(t *testing.T) {
1920
t.Run("Can't create new middleware without valid auth type", func(t *testing.T) {
20-
rt, err := New(&Config{}, nil)
21+
rt, err := New(&Config{}, awsds.AuthSettings{}, nil)
2122
require.Error(t, err)
2223
require.Nil(t, rt)
2324

2425
})
2526
t.Run("Can create new middleware with any valid auth type", func(t *testing.T) {
2627
for _, authType := range []string{"credentials", "sharedCreds", "keys", "default", "ec2_iam_role", "arn"} {
27-
rt, err := New(&Config{AuthType: authType}, nil)
28+
rt, err := New(&Config{AuthType: authType}, awsds.AuthSettings{}, nil)
2829

2930
require.NoError(t, err)
3031
require.NotNil(t, rt)
@@ -33,7 +34,7 @@ func TestNew(t *testing.T) {
3334

3435
t.Run("Can sign a request", func(t *testing.T) {
3536
cfg := &Config{AuthType: "default"}
36-
rt, err := New(cfg, &fakeTransport{})
37+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{})
3738
require.NoError(t, err)
3839
require.NotNil(t, rt)
3940
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)
@@ -63,7 +64,7 @@ func TestNew(t *testing.T) {
6364

6465
t.Run("Can sign a request with extra headers which are not signed", func(t *testing.T) {
6566
cfg := &Config{AuthType: "default"}
66-
rt, err := New(cfg, &fakeTransport{})
67+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{})
6768
require.NoError(t, err)
6869
require.NotNil(t, rt)
6970
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)
@@ -96,7 +97,7 @@ func TestNew(t *testing.T) {
9697

9798
t.Run("Signed request overwrites existing Authorization header", func(t *testing.T) {
9899
cfg := &Config{AuthType: "default"}
99-
rt, err := New(cfg, &fakeTransport{})
100+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{})
100101
require.NoError(t, err)
101102
require.NotNil(t, rt)
102103
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)
@@ -122,7 +123,7 @@ func TestNew(t *testing.T) {
122123

123124
t.Run("Can't sign a request without valid credentials", func(t *testing.T) {
124125
cfg := &Config{AuthType: "ec2_iam_role"}
125-
rt, err := New(cfg, &fakeTransport{})
126+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{})
126127
require.NoError(t, err)
127128
require.NotNil(t, rt)
128129
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)
@@ -150,7 +151,7 @@ func TestNew(t *testing.T) {
150151
fakeLogger := &fakeLogger{}
151152
backend.Logger = fakeLogger
152153

153-
rt, err := New(cfg, &fakeTransport{}, Opts{VerboseMode: true})
154+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{}, Opts{VerboseMode: true})
154155
require.NoError(t, err)
155156
require.NotNil(t, rt)
156157
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)
@@ -182,7 +183,7 @@ func TestNew(t *testing.T) {
182183
fakeLogger := &fakeLogger{}
183184
backend.Logger = fakeLogger
184185

185-
rt, err := New(cfg, &fakeTransport{}, Opts{VerboseMode: false})
186+
rt, err := New(cfg, awsds.AuthSettings{}, &fakeTransport{}, Opts{VerboseMode: false})
186187
require.NoError(t, err)
187188
require.NotNil(t, rt)
188189
r, err := http.NewRequest("GET", "http://grafana.sigv4.test", nil)

0 commit comments

Comments
 (0)