Skip to content

Commit e4defee

Browse files
Merge pull request #16353 from mfojtik/allow-read-signatures
Automatic merge from submit-queue (batch tested with PRs 15834, 16321, 16353, 15298, 15433) use privileged client in registry instead of user client when getting or creating signatures @csrwng Fixes: #16349
2 parents 9cd1dc3 + f8d7d28 commit e4defee

File tree

6 files changed

+45
-25
lines changed

6 files changed

+45
-25
lines changed

pkg/dockerregistry/server/app.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,11 @@ func NewApp(ctx context.Context, registryClient client.RegistryClient, dockerCon
115115

116116
// Registry extensions endpoint provides extra functionality to handle the image
117117
// signatures.
118-
RegisterSignatureHandler(dockerApp)
118+
isImageClient, err := registryClient.Client()
119+
if err != nil {
120+
context.GetLogger(dockerApp).Fatalf("unable to get client for signatures: %v", err)
121+
}
122+
RegisterSignatureHandler(dockerApp, isImageClient)
119123

120124
// Registry extensions endpoint provides prometheus metrics.
121125
if extraConfig.Metrics.Enabled {

pkg/dockerregistry/server/auth.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,8 @@ func (ac *AccessController) Authorized(ctx context.Context, accessRecords ...reg
333333
if err := verifyImageSignatureAccess(ctx, namespace, name, osClient); err != nil {
334334
return nil, ac.wrapErr(ctx, err)
335335
}
336+
default:
337+
return nil, ac.wrapErr(ctx, ErrUnsupportedAction)
336338
}
337339

338340
case "metrics":

pkg/dockerregistry/server/repositoryconfig.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ const (
1515
// DEPRECATED: Use the OPENSHIFT_DEFAULT_REGISTRY instead.
1616
DockerRegistryURLEnvVar = "DOCKER_REGISTRY_URL"
1717

18+
// DockerRegistryURLEnvVarOption is an optional environment that overrides the
19+
// DOCKER_REGISTRY_URL.
20+
DockerRegistryURLEnvVarOption = "REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_DOCKERREGISTRYURL"
21+
1822
// OpenShiftDefaultRegistry overrides the DockerRegistryURLEnvVar as in OpenShift the
1923
// default registry URL is controller by this environment variable.
2024
OpenShiftDefaultRegistryEnvVar = "OPENSHIFT_DEFAULT_REGISTRY"
@@ -74,6 +78,13 @@ func newRepositoryConfig(ctx context.Context, options map[string]interface{}) (r
7478
} else {
7579
context.GetLogger(ctx).Infof("DEPRECATED: %q is deprecated, use the %q instead", DockerRegistryURLEnvVar, OpenShiftDefaultRegistryEnvVar)
7680
}
81+
if len(rc.registryAddr) == 0 {
82+
rc.registryAddr, err = getStringOption(DockerRegistryURLEnvVarOption, "dockerregistryurl", rc.registryAddr, options)
83+
if err != nil {
84+
return
85+
}
86+
}
87+
7788
// TODO: This is a fallback to assuming there is a service named 'docker-registry'. This
7889
// might change in the future and we should make this configurable.
7990
if len(rc.registryAddr) == 0 {

pkg/dockerregistry/server/signaturedispatcher.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/docker/distribution/registry/api/v2"
1818
"github.com/docker/distribution/registry/handlers"
1919

20+
"github.com/openshift/origin/pkg/dockerregistry/server/client"
2021
imageapi "github.com/openshift/origin/pkg/image/apis/image"
2122
imageapiv1 "github.com/openshift/origin/pkg/image/apis/image/v1"
2223

@@ -60,18 +61,27 @@ var (
6061
)
6162

6263
type signatureHandler struct {
63-
ctx *handlers.Context
64-
reference imageapi.DockerImageReference
64+
ctx *handlers.Context
65+
reference imageapi.DockerImageReference
66+
isImageClient client.ImageStreamImagesNamespacer
6567
}
6668

67-
// SignatureDispatcher handles the GET and PUT requests for signature endpoint.
68-
func SignatureDispatcher(ctx *handlers.Context, r *http.Request) http.Handler {
69-
signatureHandler := &signatureHandler{ctx: ctx}
70-
signatureHandler.reference, _ = imageapi.ParseDockerImageReference(ctxu.GetStringValue(ctx, "vars.name") + "@" + ctxu.GetStringValue(ctx, "vars.digest"))
71-
72-
return gorillahandlers.MethodHandler{
73-
"GET": http.HandlerFunc(signatureHandler.Get),
74-
"PUT": http.HandlerFunc(signatureHandler.Put),
69+
// NewSignatureDispatcher provides a function that handles the GET and PUT
70+
// requests for signature endpoint.
71+
func NewSignatureDispatcher(isImageClient client.ImageStreamImagesNamespacer) func(*handlers.Context, *http.Request) http.Handler {
72+
return func(ctx *handlers.Context, r *http.Request) http.Handler {
73+
reference, _ := imageapi.ParseDockerImageReference(
74+
ctxu.GetStringValue(ctx, "vars.name") + "@" + ctxu.GetStringValue(ctx, "vars.digest"),
75+
)
76+
signatureHandler := &signatureHandler{
77+
ctx: ctx,
78+
isImageClient: isImageClient,
79+
reference: reference,
80+
}
81+
return gorillahandlers.MethodHandler{
82+
"GET": http.HandlerFunc(signatureHandler.Get),
83+
"PUT": http.HandlerFunc(signatureHandler.Put),
84+
}
7585
}
7686
}
7787

@@ -142,18 +152,13 @@ func (s *signatureHandler) Get(w http.ResponseWriter, req *http.Request) {
142152
s.handleError(s.ctx, v2.ErrorCodeNameInvalid.WithDetail("missing image name or image ID"), w)
143153
return
144154
}
145-
client, ok := userClientFrom(s.ctx)
146-
if !ok {
147-
s.handleError(s.ctx, errcode.ErrorCodeUnknown.WithDetail("unable to get origin client"), w)
148-
return
149-
}
150155

151156
if len(s.reference.ID) == 0 {
152157
s.handleError(s.ctx, v2.ErrorCodeNameInvalid.WithDetail("the image ID must be specified (sha256:<digest>"), w)
153158
return
154159
}
155160

156-
image, err := client.ImageStreamImages(s.reference.Namespace).Get(imageapi.MakeImageStreamImageName(s.reference.Name, s.reference.ID), metav1.GetOptions{})
161+
image, err := s.isImageClient.ImageStreamImages(s.reference.Namespace).Get(imageapi.MakeImageStreamImageName(s.reference.Name, s.reference.ID), metav1.GetOptions{})
157162
switch {
158163
case err == nil:
159164
case kapierrors.IsUnauthorized(err):

pkg/dockerregistry/server/signaturedispatcher_test.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"net/http"
99
"net/http/httptest"
1010
"net/url"
11-
"os"
1211
"reflect"
1312
"testing"
1413

@@ -80,7 +79,7 @@ func TestSignatureGet(t *testing.T) {
8079
},
8180
Middleware: map[string][]configuration.Middleware{
8281
"registry": {{Name: "openshift"}},
83-
"repository": {{Name: "openshift"}},
82+
"repository": {{Name: "openshift", Options: configuration.Parameters{"dockerregistryurl": "localhost:5000"}}},
8483
"storage": {{Name: "openshift"}},
8584
},
8685
}, &registryconfig.Configuration{}, nil)
@@ -91,7 +90,6 @@ func TestSignatureGet(t *testing.T) {
9190
if err != nil {
9291
t.Fatalf("error parsing server url: %v", err)
9392
}
94-
os.Setenv("OPENSHIFT_DEFAULT_REGISTRY", serverURL.Host)
9593

9694
url := fmt.Sprintf("http://%s/extensions/v2/user/app/signatures/%s", serverURL.Host, testImage.Name)
9795

@@ -186,7 +184,7 @@ func TestSignaturePut(t *testing.T) {
186184
},
187185
Middleware: map[string][]configuration.Middleware{
188186
"registry": {{Name: "openshift"}},
189-
"repository": {{Name: "openshift"}},
187+
"repository": {{Name: "openshift", Options: configuration.Parameters{"dockerregistryurl": "localhost:5000"}}},
190188
"storage": {{Name: "openshift"}},
191189
},
192190
}, &registryconfig.Configuration{}, nil)
@@ -197,7 +195,6 @@ func TestSignaturePut(t *testing.T) {
197195
if err != nil {
198196
t.Fatalf("error parsing server url: %v", err)
199197
}
200-
os.Setenv("OPENSHIFT_DEFAULT_REGISTRY", serverURL.Host)
201198

202199
signData, err := json.Marshal(testSignature)
203200
if err != nil {

pkg/dockerregistry/server/signaturehandler.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import (
88
"github.com/docker/distribution/registry/handlers"
99

1010
"github.com/openshift/origin/pkg/dockerregistry/server/api"
11+
"github.com/openshift/origin/pkg/dockerregistry/server/client"
1112
)
1213

1314
// RegisterSignatureHandler registers the Docker image signature extension to Docker
1415
// registry.
15-
func RegisterSignatureHandler(app *handlers.App) {
16+
func RegisterSignatureHandler(app *handlers.App, isImageClient client.ImageStreamImagesNamespacer) {
1617
extensionsRouter := app.NewRoute().PathPrefix(api.ExtensionsPrefix).Subrouter()
1718
var (
1819
getSignatureAccess = func(r *http.Request) []auth.Access {
@@ -40,13 +41,13 @@ func RegisterSignatureHandler(app *handlers.App) {
4041
)
4142
app.RegisterRoute(
4243
extensionsRouter.Path(api.SignaturesPath).Methods("GET"),
43-
SignatureDispatcher,
44+
NewSignatureDispatcher(isImageClient),
4445
handlers.NameRequired,
4546
getSignatureAccess,
4647
)
4748
app.RegisterRoute(
4849
extensionsRouter.Path(api.SignaturesPath).Methods("PUT"),
49-
SignatureDispatcher,
50+
NewSignatureDispatcher(isImageClient),
5051
handlers.NameRequired,
5152
putSignatureAccess,
5253
)

0 commit comments

Comments
 (0)