Skip to content

Commit 1675bac

Browse files
authored
Merge pull request #6023 from tonistiigi/http-auth-secrets
http: allow authorization secrets per hostname
2 parents 8b35341 + 2f6fbdc commit 1675bac

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

client/client_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
112112
testBuildHTTPSource,
113113
testBuildHTTPSourceEtagScope,
114114
testBuildHTTPSourceAuthHeaderSecret,
115+
testBuildHTTPSourceHostTokenSecret,
115116
testBuildHTTPSourceHeader,
116117
testBuildPushAndValidate,
117118
testBuildExportWithUncompressed,
@@ -3238,6 +3239,47 @@ func testBuildHTTPSourceAuthHeaderSecret(t *testing.T, sb integration.Sandbox) {
32383239
require.Equal(t, "Bearer foo", allReqs[0].Header.Get("Authorization"))
32393240
}
32403241

3242+
func testBuildHTTPSourceHostTokenSecret(t *testing.T, sb integration.Sandbox) {
3243+
c, err := New(sb.Context(), sb.Address())
3244+
require.NoError(t, err)
3245+
defer c.Close()
3246+
3247+
modTime := time.Now().Add(-24 * time.Hour) // avoid false positive with current time
3248+
3249+
resp := httpserver.Response{
3250+
Etag: identity.NewID(),
3251+
Content: []byte("content1"),
3252+
LastModified: &modTime,
3253+
}
3254+
3255+
server := httpserver.NewTestServer(map[string]httpserver.Response{
3256+
"/foo": resp,
3257+
})
3258+
defer server.Close()
3259+
3260+
st := llb.HTTP(server.URL + "/foo")
3261+
3262+
def, err := st.Marshal(sb.Context())
3263+
require.NoError(t, err)
3264+
3265+
_, err = c.Solve(
3266+
sb.Context(),
3267+
def,
3268+
SolveOpt{
3269+
Session: []session.Attachable{secretsprovider.FromMap(map[string][]byte{
3270+
"HTTP_AUTH_TOKEN_127.0.0.1": []byte("123456"),
3271+
})},
3272+
},
3273+
nil,
3274+
)
3275+
require.NoError(t, err)
3276+
3277+
allReqs := server.Stats("/foo").Requests
3278+
require.Equal(t, 1, len(allReqs))
3279+
require.Equal(t, http.MethodGet, allReqs[0].Method)
3280+
require.Equal(t, "Bearer 123456", allReqs[0].Header.Get("Authorization"))
3281+
}
3282+
32413283
func testBuildHTTPSourceHeader(t *testing.T, sb integration.Sandbox) {
32423284
c, err := New(sb.Context(), sb.Address())
32433285
require.NoError(t, err)

source/http/source.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ import (
3434
"github.com/pkg/errors"
3535
)
3636

37+
const (
38+
HTTPAuthHeaderSecretPrefix = "HTTP_AUTH_HEADER_"
39+
HTTPAuthTokenSecretPrefix = "HTTP_AUTH_TOKEN_"
40+
)
41+
3742
// supportedUserHeaders defines supported user-defined header fields. Fields
3843
// not included here will be silently dropped.
3944
var supportedUserDefinedHeaders = map[string]bool{
@@ -506,18 +511,36 @@ func (hs *httpSourceHandler) newHTTPRequest(ctx context.Context, g session.Group
506511
req.Header.Set(field.Name, field.Value)
507512
}
508513

514+
type authSecret struct {
515+
name string
516+
token bool
517+
}
518+
519+
var secretNames []authSecret
509520
if hs.src.AuthHeaderSecret != "" {
521+
secretNames = append(secretNames, authSecret{name: hs.src.AuthHeaderSecret})
522+
} else {
523+
u, err := url.Parse(hs.src.URL)
524+
if err == nil {
525+
secretNames = append(secretNames, authSecret{name: HTTPAuthHeaderSecretPrefix + u.Hostname()})
526+
secretNames = append(secretNames, authSecret{name: HTTPAuthTokenSecretPrefix + u.Hostname(), token: true})
527+
}
528+
}
529+
530+
for _, secret := range secretNames {
510531
err := hs.sm.Any(ctx, g, func(ctx context.Context, _ string, caller session.Caller) error {
511-
dt, err := secrets.GetSecret(ctx, caller, hs.src.AuthHeaderSecret)
532+
dt, err := secrets.GetSecret(ctx, caller, secret.name)
512533
if err != nil {
513534
return err
514535
}
515-
516-
req.Header.Set("Authorization", string(dt))
517-
536+
v := string(dt)
537+
if secret.token {
538+
v = "Bearer " + v
539+
}
540+
req.Header.Set("Authorization", v)
518541
return nil
519542
})
520-
if err != nil {
543+
if err != nil && hs.src.AuthHeaderSecret != "" {
521544
return nil, errors.Wrapf(err, "failed to retrieve HTTP auth secret %s", hs.src.AuthHeaderSecret)
522545
}
523546
}

0 commit comments

Comments
 (0)