diff --git a/changelog/unreleased/list-mime-types.md b/changelog/unreleased/list-mime-types.md new file mode 100644 index 0000000000..af2af001f7 --- /dev/null +++ b/changelog/unreleased/list-mime-types.md @@ -0,0 +1,3 @@ +Enhancement: Implement listing supported mime types in app registry + +https://github.com/cs3org/reva/pull/1944 diff --git a/cmd/reva/main.go b/cmd/reva/main.go index 5ffd2921af..3968ba4088 100644 --- a/cmd/reva/main.go +++ b/cmd/reva/main.go @@ -64,6 +64,7 @@ var ( ocmShareUpdateCommand(), ocmShareListReceivedCommand(), ocmShareUpdateReceivedCommand(), + openInAppCommand(), preferencesCommand(), genCommand(), publicShareCreateCommand(), @@ -79,8 +80,6 @@ var ( shareUpdateCommand(), shareListReceivedCommand(), shareUpdateReceivedCommand(), - openInAppCommand(), - openFileInAppProviderCommand(), transferCreateCommand(), transferGetStatusCommand(), transferCancelCommand(), diff --git a/cmd/reva/open-file-in-app-provider.go b/cmd/reva/open-file-in-app-provider.go deleted file mode 100644 index aee37ea492..0000000000 --- a/cmd/reva/open-file-in-app-provider.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2018-2021 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 main - -import ( - "fmt" - "io" - - gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" - rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" - provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" - typespb "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" - "github.com/pkg/errors" -) - -func openFileInAppProviderCommand() *command { - cmd := newCommand("open-file-in-app-provider") - cmd.Description = func() string { return "open a file in an external app provider" } - cmd.Usage = func() string { - return "Usage: open-file-in-app-provider [-flags] [-viewmode view|read|write] " - } - viewMode := cmd.String("viewmode", "view", "the view permissions, defaults to view") - insecureFlag := cmd.Bool("insecure", false, "disables grpc transport security") - skipVerifyFlag := cmd.Bool("skip-verify", false, "whether to skip verifying remote reva's certificate chain and host name") - - cmd.ResetFlags = func() { - *viewMode = "view" - *insecureFlag = false - *skipVerifyFlag = false - } - - cmd.Action = func(w ...io.Writer) error { - ctx := getAuthContext() - if cmd.NArg() < 1 { - return errors.New("Invalid arguments: " + cmd.Usage()) - } - path := cmd.Args()[0] - - vm := getViewModeDeprecated(*viewMode) - - client, err := getClient() - if err != nil { - return err - } - - ref := &provider.Reference{Path: path} - - opaqueObj := &typespb.Opaque{ - Map: map[string]*typespb.OpaqueEntry{}, - } - if *insecureFlag { - opaqueObj.Map["insecure"] = &typespb.OpaqueEntry{} - } - if *skipVerifyFlag { - opaqueObj.Map["skip-verify"] = &typespb.OpaqueEntry{} - } - - openRequest := &gateway.OpenFileInAppProviderRequest{Ref: ref, ViewMode: vm, Opaque: opaqueObj} - - openRes, err := client.OpenFileInAppProvider(ctx, openRequest) - if err != nil { - return err - } - - if openRes.Status.Code != rpc.Code_CODE_OK { - return formatError(openRes.Status) - } - - fmt.Println("App provider url: " + openRes.AppProviderUrl) - - return nil - } - return cmd -} - -func getViewModeDeprecated(viewMode string) gateway.OpenFileInAppProviderRequest_ViewMode { - switch viewMode { - case "view": - return gateway.OpenFileInAppProviderRequest_VIEW_MODE_VIEW_ONLY - case "read": - return gateway.OpenFileInAppProviderRequest_VIEW_MODE_READ_ONLY - case "write": - return gateway.OpenFileInAppProviderRequest_VIEW_MODE_READ_WRITE - default: - return gateway.OpenFileInAppProviderRequest_VIEW_MODE_INVALID - } -} diff --git a/go.mod b/go.mod index 1594cfe7cd..8e20e6700e 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc v2.2.1+incompatible github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e - github.com/cs3org/go-cs3apis v0.0.0-20210726064751-4e567a2c8df1 + github.com/cs3org/go-cs3apis v0.0.0-20210802061248-fecffdb89898 github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 github.com/gdexlab/go-render v1.0.1 github.com/go-ldap/ldap/v3 v3.3.0 diff --git a/go.sum b/go.sum index d1710bdbac..0f2f3109b7 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= -github.com/cs3org/go-cs3apis v0.0.0-20210726064751-4e567a2c8df1 h1:HLVbsiCs1vydncvl6OsiH8iO3D1/p9l/gZ4nMnwcnjQ= -github.com/cs3org/go-cs3apis v0.0.0-20210726064751-4e567a2c8df1/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/go-cs3apis v0.0.0-20210802061248-fecffdb89898 h1:vU4zvv01HSz2D3Fjeudcsv0SkT7uICPG6sZIHzGvQFY= +github.com/cs3org/go-cs3apis v0.0.0-20210802061248-fecffdb89898/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/internal/grpc/services/appprovider/appprovider.go b/internal/grpc/services/appprovider/appprovider.go index fe2479d433..8dd446d704 100644 --- a/internal/grpc/services/appprovider/appprovider.go +++ b/internal/grpc/services/appprovider/appprovider.go @@ -158,7 +158,3 @@ func (s *service) OpenInApp(ctx context.Context, req *providerpb.OpenInAppReques return res, nil } - -func (s *service) OpenFileInAppProvider(ctx context.Context, req *providerpb.OpenFileInAppProviderRequest) (*providerpb.OpenFileInAppProviderResponse, error) { - return nil, errtypes.NotSupported("Deprecated") -} diff --git a/internal/grpc/services/appregistry/appregistry.go b/internal/grpc/services/appregistry/appregistry.go index 5fa7ed6f76..abbfdc1fac 100644 --- a/internal/grpc/services/appregistry/appregistry.go +++ b/internal/grpc/services/appregistry/appregistry.go @@ -143,6 +143,21 @@ func (s *svc) ListAppProviders(ctx context.Context, req *registrypb.ListAppProvi return res, nil } +func (s *svc) ListSupportedMimeTypes(ctx context.Context, req *registrypb.ListSupportedMimeTypesRequest) (*registrypb.ListSupportedMimeTypesResponse, error) { + mimeTypes, err := s.reg.ListSupportedMimeTypes(ctx) + if err != nil { + return ®istrypb.ListSupportedMimeTypesResponse{ + Status: status.NewInternal(ctx, err, "error listing the supported mime types"), + }, nil + } + + res := ®istrypb.ListSupportedMimeTypesResponse{ + Status: status.NewOK(ctx), + MimeTypes: mimeTypes, + } + return res, nil +} + func (s *svc) GetDefaultAppProviderForMimeType(ctx context.Context, req *registrypb.GetDefaultAppProviderForMimeTypeRequest) (*registrypb.GetDefaultAppProviderForMimeTypeResponse, error) { provider, err := s.reg.GetDefaultProviderForMimeType(ctx, req.MimeType) if err != nil { diff --git a/internal/grpc/services/gateway/appprovider.go b/internal/grpc/services/gateway/appprovider.go index 304e36f038..c52cba92ba 100644 --- a/internal/grpc/services/gateway/appprovider.go +++ b/internal/grpc/services/gateway/appprovider.go @@ -115,11 +115,6 @@ func (s *svc) OpenInApp(ctx context.Context, req *gateway.OpenInAppRequest) (*pr return s.openLocalResources(ctx, fileInfo, req.ViewMode, req.App) } -func (s *svc) OpenFileInAppProvider(ctx context.Context, req *gateway.OpenFileInAppProviderRequest) (*providerpb.OpenFileInAppProviderResponse, error) { - // TODO to be removed in a future PR - return nil, errtypes.NotSupported("Deprecated") -} - func (s *svc) openFederatedShares(ctx context.Context, targetURL string, vm gateway.OpenInAppRequest_ViewMode, app string, insecure, skipVerify bool, nameQueries ...string) (*providerpb.OpenInAppResponse, error) { log := appctx.GetLogger(ctx) diff --git a/internal/grpc/services/gateway/appregistry.go b/internal/grpc/services/gateway/appregistry.go index cf50c14079..c1f73ed65e 100644 --- a/internal/grpc/services/gateway/appregistry.go +++ b/internal/grpc/services/gateway/appregistry.go @@ -78,6 +78,23 @@ func (s *svc) ListAppProviders(ctx context.Context, req *registry.ListAppProvide return res, nil } +func (s *svc) ListSupportedMimeTypes(ctx context.Context, req *registry.ListSupportedMimeTypesRequest) (*registry.ListSupportedMimeTypesResponse, error) { + c, err := pool.GetAppRegistryClient(s.c.AppRegistryEndpoint) + if err != nil { + err = errors.Wrap(err, "gateway: error calling GetAppRegistryClient") + return ®istry.ListSupportedMimeTypesResponse{ + Status: status.NewInternal(ctx, err, "error getting app registry client"), + }, nil + } + + res, err := c.ListSupportedMimeTypes(ctx, req) + if err != nil { + return nil, errors.Wrap(err, "gateway: error calling ListSupportedMimeTypes") + } + + return res, nil +} + func (s *svc) GetDefaultAppProviderForMimeType(ctx context.Context, req *registry.GetDefaultAppProviderForMimeTypeRequest) (*registry.GetDefaultAppProviderForMimeTypeResponse, error) { c, err := pool.GetAppRegistryClient(s.c.AppRegistryEndpoint) if err != nil { diff --git a/pkg/app/app.go b/pkg/app/app.go index b4ff68925c..0e6c1f65a0 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -31,6 +31,7 @@ import ( type Registry interface { FindProviders(ctx context.Context, mimeType string) ([]*registry.ProviderInfo, error) ListProviders(ctx context.Context) ([]*registry.ProviderInfo, error) + ListSupportedMimeTypes(ctx context.Context) (map[string]*registry.AppProviderNameList, error) AddProvider(ctx context.Context, p *registry.ProviderInfo) error GetDefaultProviderForMimeType(ctx context.Context, mimeType string) (*registry.ProviderInfo, error) SetDefaultProviderForMimeType(ctx context.Context, mimeType string, p *registry.ProviderInfo) error diff --git a/pkg/app/registry/static/static.go b/pkg/app/registry/static/static.go index 19fc94c5e1..548452d4a0 100644 --- a/pkg/app/registry/static/static.go +++ b/pkg/app/registry/static/static.go @@ -120,8 +120,7 @@ func (b *reg) AddProvider(ctx context.Context, p *registrypb.ProviderInfo) error b.providers[p.Address] = p for _, m := range p.MimeTypes { - _, ok := b.mimetypes[m] - if ok { + if _, ok := b.mimetypes[m]; ok { b.mimetypes[m].apps = append(b.mimetypes[m].apps, p.Address) } else { b.mimetypes[m] = &mimeTypeIndex{apps: []string{p.Address}} @@ -131,13 +130,27 @@ func (b *reg) AddProvider(ctx context.Context, p *registrypb.ProviderInfo) error } func (b *reg) ListProviders(ctx context.Context) ([]*registrypb.ProviderInfo, error) { - var providers = make([]*registrypb.ProviderInfo, 0, len(b.providers)) + providers := make([]*registrypb.ProviderInfo, 0, len(b.providers)) for _, p := range b.providers { providers = append(providers, p) } return providers, nil } +func (b *reg) ListSupportedMimeTypes(ctx context.Context) (map[string]*registrypb.AppProviderNameList, error) { + mimeTypes := make(map[string]*registrypb.AppProviderNameList) + for _, p := range b.providers { + for _, m := range p.MimeTypes { + if _, ok := mimeTypes[m]; ok { + mimeTypes[m].AppProviderName = append(mimeTypes[m].AppProviderName, p.Name) + } else { + mimeTypes[m] = ®istrypb.AppProviderNameList{AppProviderName: []string{p.Name}} + } + } + } + return mimeTypes, nil +} + func (b *reg) SetDefaultProviderForMimeType(ctx context.Context, mimeType string, p *registrypb.ProviderInfo) error { _, ok := b.mimetypes[mimeType] if ok {