Skip to content

Commit

Permalink
Merge pull request #16353 from mfojtik/allow-read-signatures
Browse files Browse the repository at this point in the history
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
  • Loading branch information
openshift-merge-robot committed Sep 18, 2017
2 parents 9cd1dc3 + f8d7d28 commit e4defee
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 25 deletions.
6 changes: 5 additions & 1 deletion pkg/dockerregistry/server/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,11 @@ func NewApp(ctx context.Context, registryClient client.RegistryClient, dockerCon

// Registry extensions endpoint provides extra functionality to handle the image
// signatures.
RegisterSignatureHandler(dockerApp)
isImageClient, err := registryClient.Client()
if err != nil {
context.GetLogger(dockerApp).Fatalf("unable to get client for signatures: %v", err)
}
RegisterSignatureHandler(dockerApp, isImageClient)

// Registry extensions endpoint provides prometheus metrics.
if extraConfig.Metrics.Enabled {
Expand Down
2 changes: 2 additions & 0 deletions pkg/dockerregistry/server/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,8 @@ func (ac *AccessController) Authorized(ctx context.Context, accessRecords ...reg
if err := verifyImageSignatureAccess(ctx, namespace, name, osClient); err != nil {
return nil, ac.wrapErr(ctx, err)
}
default:
return nil, ac.wrapErr(ctx, ErrUnsupportedAction)
}

case "metrics":
Expand Down
11 changes: 11 additions & 0 deletions pkg/dockerregistry/server/repositoryconfig.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const (
// DEPRECATED: Use the OPENSHIFT_DEFAULT_REGISTRY instead.
DockerRegistryURLEnvVar = "DOCKER_REGISTRY_URL"

// DockerRegistryURLEnvVarOption is an optional environment that overrides the
// DOCKER_REGISTRY_URL.
DockerRegistryURLEnvVarOption = "REGISTRY_MIDDLEWARE_REPOSITORY_OPENSHIFT_DOCKERREGISTRYURL"

// OpenShiftDefaultRegistry overrides the DockerRegistryURLEnvVar as in OpenShift the
// default registry URL is controller by this environment variable.
OpenShiftDefaultRegistryEnvVar = "OPENSHIFT_DEFAULT_REGISTRY"
Expand Down Expand Up @@ -74,6 +78,13 @@ func newRepositoryConfig(ctx context.Context, options map[string]interface{}) (r
} else {
context.GetLogger(ctx).Infof("DEPRECATED: %q is deprecated, use the %q instead", DockerRegistryURLEnvVar, OpenShiftDefaultRegistryEnvVar)
}
if len(rc.registryAddr) == 0 {
rc.registryAddr, err = getStringOption(DockerRegistryURLEnvVarOption, "dockerregistryurl", rc.registryAddr, options)
if err != nil {
return
}
}

// TODO: This is a fallback to assuming there is a service named 'docker-registry'. This
// might change in the future and we should make this configurable.
if len(rc.registryAddr) == 0 {
Expand Down
37 changes: 21 additions & 16 deletions pkg/dockerregistry/server/signaturedispatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/docker/distribution/registry/api/v2"
"github.com/docker/distribution/registry/handlers"

"github.com/openshift/origin/pkg/dockerregistry/server/client"
imageapi "github.com/openshift/origin/pkg/image/apis/image"
imageapiv1 "github.com/openshift/origin/pkg/image/apis/image/v1"

Expand Down Expand Up @@ -60,18 +61,27 @@ var (
)

type signatureHandler struct {
ctx *handlers.Context
reference imageapi.DockerImageReference
ctx *handlers.Context
reference imageapi.DockerImageReference
isImageClient client.ImageStreamImagesNamespacer
}

// SignatureDispatcher handles the GET and PUT requests for signature endpoint.
func SignatureDispatcher(ctx *handlers.Context, r *http.Request) http.Handler {
signatureHandler := &signatureHandler{ctx: ctx}
signatureHandler.reference, _ = imageapi.ParseDockerImageReference(ctxu.GetStringValue(ctx, "vars.name") + "@" + ctxu.GetStringValue(ctx, "vars.digest"))

return gorillahandlers.MethodHandler{
"GET": http.HandlerFunc(signatureHandler.Get),
"PUT": http.HandlerFunc(signatureHandler.Put),
// NewSignatureDispatcher provides a function that handles the GET and PUT
// requests for signature endpoint.
func NewSignatureDispatcher(isImageClient client.ImageStreamImagesNamespacer) func(*handlers.Context, *http.Request) http.Handler {
return func(ctx *handlers.Context, r *http.Request) http.Handler {
reference, _ := imageapi.ParseDockerImageReference(
ctxu.GetStringValue(ctx, "vars.name") + "@" + ctxu.GetStringValue(ctx, "vars.digest"),
)
signatureHandler := &signatureHandler{
ctx: ctx,
isImageClient: isImageClient,
reference: reference,
}
return gorillahandlers.MethodHandler{
"GET": http.HandlerFunc(signatureHandler.Get),
"PUT": http.HandlerFunc(signatureHandler.Put),
}
}
}

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

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

image, err := client.ImageStreamImages(s.reference.Namespace).Get(imageapi.MakeImageStreamImageName(s.reference.Name, s.reference.ID), metav1.GetOptions{})
image, err := s.isImageClient.ImageStreamImages(s.reference.Namespace).Get(imageapi.MakeImageStreamImageName(s.reference.Name, s.reference.ID), metav1.GetOptions{})
switch {
case err == nil:
case kapierrors.IsUnauthorized(err):
Expand Down
7 changes: 2 additions & 5 deletions pkg/dockerregistry/server/signaturedispatcher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"net/http"
"net/http/httptest"
"net/url"
"os"
"reflect"
"testing"

Expand Down Expand Up @@ -80,7 +79,7 @@ func TestSignatureGet(t *testing.T) {
},
Middleware: map[string][]configuration.Middleware{
"registry": {{Name: "openshift"}},
"repository": {{Name: "openshift"}},
"repository": {{Name: "openshift", Options: configuration.Parameters{"dockerregistryurl": "localhost:5000"}}},
"storage": {{Name: "openshift"}},
},
}, &registryconfig.Configuration{}, nil)
Expand All @@ -91,7 +90,6 @@ func TestSignatureGet(t *testing.T) {
if err != nil {
t.Fatalf("error parsing server url: %v", err)
}
os.Setenv("OPENSHIFT_DEFAULT_REGISTRY", serverURL.Host)

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

Expand Down Expand Up @@ -186,7 +184,7 @@ func TestSignaturePut(t *testing.T) {
},
Middleware: map[string][]configuration.Middleware{
"registry": {{Name: "openshift"}},
"repository": {{Name: "openshift"}},
"repository": {{Name: "openshift", Options: configuration.Parameters{"dockerregistryurl": "localhost:5000"}}},
"storage": {{Name: "openshift"}},
},
}, &registryconfig.Configuration{}, nil)
Expand All @@ -197,7 +195,6 @@ func TestSignaturePut(t *testing.T) {
if err != nil {
t.Fatalf("error parsing server url: %v", err)
}
os.Setenv("OPENSHIFT_DEFAULT_REGISTRY", serverURL.Host)

signData, err := json.Marshal(testSignature)
if err != nil {
Expand Down
7 changes: 4 additions & 3 deletions pkg/dockerregistry/server/signaturehandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import (
"github.com/docker/distribution/registry/handlers"

"github.com/openshift/origin/pkg/dockerregistry/server/api"
"github.com/openshift/origin/pkg/dockerregistry/server/client"
)

// RegisterSignatureHandler registers the Docker image signature extension to Docker
// registry.
func RegisterSignatureHandler(app *handlers.App) {
func RegisterSignatureHandler(app *handlers.App, isImageClient client.ImageStreamImagesNamespacer) {
extensionsRouter := app.NewRoute().PathPrefix(api.ExtensionsPrefix).Subrouter()
var (
getSignatureAccess = func(r *http.Request) []auth.Access {
Expand Down Expand Up @@ -40,13 +41,13 @@ func RegisterSignatureHandler(app *handlers.App) {
)
app.RegisterRoute(
extensionsRouter.Path(api.SignaturesPath).Methods("GET"),
SignatureDispatcher,
NewSignatureDispatcher(isImageClient),
handlers.NameRequired,
getSignatureAccess,
)
app.RegisterRoute(
extensionsRouter.Path(api.SignaturesPath).Methods("PUT"),
SignatureDispatcher,
NewSignatureDispatcher(isImageClient),
handlers.NameRequired,
putSignatureAccess,
)
Expand Down

0 comments on commit e4defee

Please sign in to comment.