From 81e184c3a24791d1a706b0a8ec0e97eb53a4a9b2 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Wed, 6 Sep 2023 09:12:04 +0200 Subject: [PATCH 1/2] add noversions interceptor --- internal/grpc/interceptors/loader/loader.go | 1 + .../interceptors/noversions/noversions.go | 73 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 internal/grpc/interceptors/noversions/noversions.go diff --git a/internal/grpc/interceptors/loader/loader.go b/internal/grpc/interceptors/loader/loader.go index 8b995af76f..5beab8b35c 100644 --- a/internal/grpc/interceptors/loader/loader.go +++ b/internal/grpc/interceptors/loader/loader.go @@ -21,6 +21,7 @@ package loader import ( // Load core GRPC services. _ "github.com/cs3org/reva/internal/grpc/interceptors/eventsmiddleware" + _ "github.com/cs3org/reva/internal/grpc/interceptors/noversions" _ "github.com/cs3org/reva/internal/grpc/interceptors/readonly" // Add your own service here. ) diff --git a/internal/grpc/interceptors/noversions/noversions.go b/internal/grpc/interceptors/noversions/noversions.go new file mode 100644 index 0000000000..20b6ae7f01 --- /dev/null +++ b/internal/grpc/interceptors/noversions/noversions.go @@ -0,0 +1,73 @@ +// Copyright 2018-2023 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package noversions + +import ( + "context" + + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/rgrpc" + rstatus "github.com/cs3org/reva/pkg/rgrpc/status" + "google.golang.org/grpc" +) + +const ( + defaultPriority = 200 +) + +func init() { + rgrpc.RegisterUnaryInterceptor("noversions", NewUnary) +} + +// NewUnary returns a new unary interceptor +// that checks grpc calls and blocks write requests. +func NewUnary(_ map[string]interface{}) (grpc.UnaryServerInterceptor, int, error) { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + switch req.(type) { + case *provider.ListContainerRequest: + resp, err := handler(ctx, req) + if listResp, ok := resp.(*provider.ListContainerResponse); ok && listResp.Infos != nil { + for _, info := range listResp.Infos { + if info.PermissionSet != nil { + info.PermissionSet.ListFileVersions = false + info.PermissionSet.RestoreFileVersion = false + } + } + } + return resp, err + case *provider.StatRequest: + resp, err := handler(ctx, req) + if statResp, ok := resp.(*provider.StatResponse); ok && statResp.Info != nil && statResp.Info.PermissionSet != nil { + statResp.Info.PermissionSet.ListFileVersions = false + statResp.Info.PermissionSet.RestoreFileVersion = false + } + return resp, err + case *provider.ListFileVersionsRequest: + return &provider.ListFileVersionsResponse{ + Status: rstatus.NewPermissionDenied(ctx, nil, "permission denied: tried to list file versions on a no versions storage"), + }, nil + case *provider.RestoreFileVersionRequest: + return &provider.RestoreFileVersionResponse{ + Status: rstatus.NewPermissionDenied(ctx, nil, "permission denied: tried to restore file version on a no versions storage"), + }, nil + default: + return handler(ctx, req) + } + }, defaultPriority, nil +} From b94d39d41adb24ea14bb6b36b71d473f14ac438e Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Wed, 6 Sep 2023 09:15:07 +0200 Subject: [PATCH 2/2] add changelog --- changelog/unreleased/noversions.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog/unreleased/noversions.md diff --git a/changelog/unreleased/noversions.md b/changelog/unreleased/noversions.md new file mode 100644 index 0000000000..21d35e891d --- /dev/null +++ b/changelog/unreleased/noversions.md @@ -0,0 +1,6 @@ +Enhancement: Disable versions on a storage provider + +Added a GRPC interceptor that disable the versions +on a storage provider. + +https://github.com/cs3org/reva/pull/4164 \ No newline at end of file