From 419de249c6ab1fbd069f12e0c59927d0df5978bc Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Tue, 30 Jun 2020 13:20:37 +0200 Subject: [PATCH] Add logic to ls and stat to process arbitrary metadata keys (#905) * Add logic to ls and stat to process arbitrary metadata keys * Modify getPath to a variadic function --- .../grpc/services/gateway/storageprovider.go | 12 ++-- .../storageprovider/storageprovider.go | 8 +-- pkg/storage/fs/eosgrpc/eosgrpc.go | 14 ++-- pkg/storage/fs/owncloud/owncloud.go | 64 ++++++++++++------- pkg/storage/fs/s3/s3.go | 4 +- pkg/storage/storage.go | 4 +- pkg/storage/utils/eosfs/eosfs.go | 8 +-- pkg/storage/utils/localfs/localfs.go | 62 ++++++++++-------- 8 files changed, 102 insertions(+), 74 deletions(-) diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index 8da929ff10..ead6d49d6f 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -844,7 +844,7 @@ func (s *svc) stat(ctx context.Context, req *provider.StatRequest) (*provider.St } func (s *svc) Stat(ctx context.Context, req *provider.StatRequest) (*provider.StatResponse, error) { - p, err := s.getPath(ctx, req.Ref) + p, err := s.getPath(ctx, req.Ref, req.ArbitraryMetadataKeys...) if err != nil { return &provider.StatResponse{ Status: status.NewInternal(ctx, err, "gateway: error getting path for ref"), @@ -1054,7 +1054,7 @@ func (s *svc) listContainer(ctx context.Context, req *provider.ListContainerRequ } func (s *svc) ListContainer(ctx context.Context, req *provider.ListContainerRequest) (*provider.ListContainerResponse, error) { - p, err := s.getPath(ctx, req.Ref) + p, err := s.getPath(ctx, req.Ref, req.ArbitraryMetadataKeys...) if err != nil { return &provider.ListContainerResponse{ Status: status.NewInternal(ctx, err, "gateway: error getting path for ref"), @@ -1140,7 +1140,7 @@ func (s *svc) ListContainer(ctx context.Context, req *provider.ListContainerRequ }, } - newReq := &provider.ListContainerRequest{Ref: ref} + newReq := &provider.ListContainerRequest{Ref: ref, ArbitraryMetadataKeys: req.ArbitraryMetadataKeys} newRes, err := s.listContainer(ctx, newReq) if err != nil { return &provider.ListContainerResponse{ @@ -1213,7 +1213,7 @@ func (s *svc) ListContainer(ctx context.Context, req *provider.ListContainerRequ }, } - newReq := &provider.ListContainerRequest{Ref: ref} + newReq := &provider.ListContainerRequest{Ref: ref, ArbitraryMetadataKeys: req.ArbitraryMetadataKeys} newRes, err := s.listContainer(ctx, newReq) if err != nil { return &provider.ListContainerResponse{ @@ -1242,13 +1242,13 @@ func (s *svc) ListContainer(ctx context.Context, req *provider.ListContainerRequ panic("gateway: stating an unknown path:" + p) } -func (s *svc) getPath(ctx context.Context, ref *provider.Reference) (string, error) { +func (s *svc) getPath(ctx context.Context, ref *provider.Reference, keys ...string) (string, error) { if ref.GetPath() != "" { return ref.GetPath(), nil } if ref.GetId() != nil && ref.GetId().GetOpaqueId() != "" { - req := &provider.StatRequest{Ref: ref} + req := &provider.StatRequest{Ref: ref, ArbitraryMetadataKeys: keys} res, err := s.stat(ctx, req) if err != nil { err = errors.Wrap(err, "gateway: error stating ref:"+ref.String()) diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index e1860ef888..f28ae0049e 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -450,7 +450,7 @@ func (s *service) Stat(ctx context.Context, req *provider.StatRequest) (*provide }, nil } - md, err := s.storage.GetMD(ctx, newRef) + md, err := s.storage.GetMD(ctx, newRef, req.ArbitraryMetadataKeys) if err != nil { var st *rpc.Status if _, ok := err.(errtypes.IsNotFound); ok { @@ -491,7 +491,7 @@ func (s *service) ListContainerStream(req *provider.ListContainerStreamRequest, return nil } - mds, err := s.storage.ListFolder(ctx, newRef) + mds, err := s.storage.ListFolder(ctx, newRef, req.ArbitraryMetadataKeys) if err != nil { res := &provider.ListContainerStreamResponse{ Status: status.NewInternal(ctx, err, "error listing folder"), @@ -535,7 +535,7 @@ func (s *service) ListContainer(ctx context.Context, req *provider.ListContainer }, nil } - mds, err := s.storage.ListFolder(ctx, newRef) + mds, err := s.storage.ListFolder(ctx, newRef, req.ArbitraryMetadataKeys) if err != nil { return &provider.ListContainerResponse{ Status: status.NewInternal(ctx, err, "error listing folder"), @@ -832,7 +832,7 @@ func (s *service) unwrap(ctx context.Context, ref *provider.Reference) (*provide idRef := &provider.Reference{ Spec: &provider.Reference_Id{ Id: &provider.ResourceId{ - StorageId: "", // on purpose, we are unwrapping, bottom layers only need OpaqueId. + StorageId: "", // we are unwrapping on purpose, bottom layers only need OpaqueId. OpaqueId: ref.GetId().OpaqueId, }, }, diff --git a/pkg/storage/fs/eosgrpc/eosgrpc.go b/pkg/storage/fs/eosgrpc/eosgrpc.go index 8d115d2bd9..ea097e6eb2 100644 --- a/pkg/storage/fs/eosgrpc/eosgrpc.go +++ b/pkg/storage/fs/eosgrpc/eosgrpc.go @@ -626,7 +626,7 @@ func (fs *eosfs) getGrantPermissionSet(mode string) *provider.ResourcePermission return p } -func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) { +func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { u, err := getUser(ctx) if err != nil { return nil, err @@ -643,7 +643,7 @@ func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider. // if path is home we need to add in the response any shadow folder in the shadow homedirectory. if fs.conf.EnableHome { if fs.isShareFolder(ctx, p) { - return fs.getMDShareFolder(ctx, p) + return fs.getMDShareFolder(ctx, p, mdKeys) } } @@ -658,7 +658,7 @@ func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider. return fi, nil } -func (fs *eosfs) getMDShareFolder(ctx context.Context, p string) (*provider.ResourceInfo, error) { +func (fs *eosfs) getMDShareFolder(ctx context.Context, p string, mdKeys []string) (*provider.ResourceInfo, error) { u, err := getUser(ctx) if err != nil { return nil, err @@ -677,7 +677,7 @@ func (fs *eosfs) getMDShareFolder(ctx context.Context, p string) (*provider.Reso return fs.convertToFileReference(ctx, eosFileInfo), nil } -func (fs *eosfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) { +func (fs *eosfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { u, err := getUser(ctx) if err != nil { return nil, errors.Wrap(err, "eos: no user in ctx") @@ -1440,7 +1440,7 @@ func (fs *eosfs) getEosMetadata(finfo *eosclientgrpc.FileInfo) []byte { No - CreateDir(ctx context.Context, fn string) error No -Delete(ctx context.Context, ref *provider.Reference) error No -Move(ctx context.Context, oldRef, newRef *provider.Reference) error - No -GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) + No -GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) Yes -ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) No -Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error No -Download(ctx context.Context, ref *provider.Reference) (io.ReadCloser, error) @@ -1471,7 +1471,7 @@ func (fs *eosfs) getEosMetadata(finfo *eosclientgrpc.FileInfo) []byte { No - CreateDir(ctx context.Context, fn string) error Maybe -Delete(ctx context.Context, ref *provider.Reference) error No -Move(ctx context.Context, oldRef, newRef *provider.Reference) error - Yes -GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) + Yes -GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) Yes -ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) No -Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error No -Download(ctx context.Context, ref *provider.Reference) (io.ReadCloser, error) @@ -1502,7 +1502,7 @@ func (fs *eosfs) getEosMetadata(finfo *eosclientgrpc.FileInfo) []byte { No - CreateDir(ctx context.Context, fn string) error Maybe -Delete(ctx context.Context, ref *provider.Reference) error Yes -Move(ctx context.Context, oldRef, newRef *provider.Reference) error - Yes -GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) + Yes -GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) No -ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) No -Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error No -Download(ctx context.Context, ref *provider.Reference) (io.ReadCloser, error) diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index 0cf7ba6ddb..5d79662aac 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -402,7 +402,7 @@ func (fs *ocfs) getOwner(internal string) string { return "" } -func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, np string, c redis.Conn) *provider.ResourceInfo { +func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, np string, c redis.Conn, mdKeys []string) *provider.ResourceInfo { id := readOrCreateID(ctx, np, c) fn := fs.unwrap(ctx, path.Join("/", np)) @@ -417,28 +417,42 @@ func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, np st etag = string(val) } - // TODO how do we tell the storage provider/driver which arbitrary metadata to retrieve? an analogy to webdav allprops or a list of requested properties - favorite := "" - if u, ok := user.ContextGetUser(ctx); ok { - // the favorite flag is specific to the user, so we need to incorporate the userid - if uid := u.GetId(); uid != nil { - fa := fmt.Sprintf("%s%s@%s", favPrefix, uid.GetOpaqueId(), uid.GetIdp()) - if val, err := xattr.Get(np, fa); err == nil { - appctx.GetLogger(ctx).Debug(). - Str("np", np). - Str("favorite", string(val)). - Str("username", u.GetUsername()). - Msg("found favorite flag") - favorite = string(val) + mdKeysMap := make(map[string]struct{}) + for _, k := range mdKeys { + mdKeysMap[k] = struct{}{} + } + + var returnAllKeys bool + if _, ok := mdKeysMap["*"]; len(mdKeys) == 0 || ok { + returnAllKeys = true + } + + metadata := map[string]string{} + + favoriteKey := "http://owncloud.org/ns/favorite" + if _, ok := mdKeysMap[favoriteKey]; returnAllKeys || ok { + favorite := "" + if u, ok := user.ContextGetUser(ctx); ok { + // the favorite flag is specific to the user, so we need to incorporate the userid + if uid := u.GetId(); uid != nil { + fa := fmt.Sprintf("%s%s@%s", favPrefix, uid.GetOpaqueId(), uid.GetIdp()) + if val, err := xattr.Get(np, fa); err == nil { + appctx.GetLogger(ctx).Debug(). + Str("np", np). + Str("favorite", string(val)). + Str("username", u.GetUsername()). + Msg("found favorite flag") + favorite = string(val) + } + } else { + appctx.GetLogger(ctx).Error().Err(errtypes.UserRequired("userrequired")).Msg("user has no id") } } else { - appctx.GetLogger(ctx).Error().Err(errtypes.UserRequired("userrequired")).Msg("user has no id") + appctx.GetLogger(ctx).Error().Err(errtypes.UserRequired("userrequired")).Msg("error getting user from ctx") } - } else { - appctx.GetLogger(ctx).Error().Err(errtypes.UserRequired("userrequired")).Msg("error getting user from ctx") + metadata[favoriteKey] = favorite } - metadata := map[string]string{} list, err := xattr.List(np) if err == nil { for _, entry := range list { @@ -447,7 +461,10 @@ func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, np st continue } if val, err := xattr.Get(np, entry); err == nil { - metadata[entry[len(mdPrefix):]] = string(val) + k := entry[len(mdPrefix):] + if _, ok := mdKeysMap[k]; returnAllKeys || ok { + metadata[k] = string(val) + } } else { appctx.GetLogger(ctx).Error().Err(err). Str("entry", entry). @@ -458,7 +475,6 @@ func (fs *ocfs) convertToResourceInfo(ctx context.Context, fi os.FileInfo, np st appctx.GetLogger(ctx).Error().Err(err).Msg("error getting list of extended attributes") } - metadata["http://owncloud.org/ns/favorite"] = favorite return &provider.ResourceInfo{ Id: &provider.ResourceId{OpaqueId: id}, Path: fn, @@ -1293,7 +1309,7 @@ func (fs *ocfs) Move(ctx context.Context, oldRef, newRef *provider.Reference) (e return nil } -func (fs *ocfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) { +func (fs *ocfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { np, err := fs.resolve(ctx, ref) if err != nil { return nil, errors.Wrap(err, "ocfs: error resolving reference") @@ -1308,12 +1324,12 @@ func (fs *ocfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider.R } c := fs.pool.Get() defer c.Close() - m := fs.convertToResourceInfo(ctx, md, np, c) + m := fs.convertToResourceInfo(ctx, md, np, c, mdKeys) return m, nil } -func (fs *ocfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) { +func (fs *ocfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { np, err := fs.resolve(ctx, ref) if err != nil { return nil, errors.Wrap(err, "ocfs: error resolving reference") @@ -1333,7 +1349,7 @@ func (fs *ocfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]*pro defer c.Close() for i := range mds { p := path.Join(np, mds[i].Name()) - m := fs.convertToResourceInfo(ctx, mds[i], p, c) + m := fs.convertToResourceInfo(ctx, mds[i], p, c, mdKeys) finfos = append(finfos, m) } return finfos, nil diff --git a/pkg/storage/fs/s3/s3.go b/pkg/storage/fs/s3/s3.go index 9f861693be..a943fdb948 100644 --- a/pkg/storage/fs/s3/s3.go +++ b/pkg/storage/fs/s3/s3.go @@ -448,7 +448,7 @@ func (fs *s3FS) Move(ctx context.Context, oldRef, newRef *provider.Reference) er return nil } -func (fs *s3FS) GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) { +func (fs *s3FS) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { log := appctx.GetLogger(ctx) fn, err := fs.resolve(ctx, ref) @@ -511,7 +511,7 @@ func (fs *s3FS) GetMD(ctx context.Context, ref *provider.Reference) (*provider.R return fs.normalizeHead(ctx, output, fn), nil } -func (fs *s3FS) ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) { +func (fs *s3FS) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { fn, err := fs.resolve(ctx, ref) if err != nil { return nil, errors.Wrap(err, "error resolving ref") diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 1481d06321..98063df41b 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -34,8 +34,8 @@ type FS interface { CreateDir(ctx context.Context, fn string) error Delete(ctx context.Context, ref *provider.Reference) error Move(ctx context.Context, oldRef, newRef *provider.Reference) error - GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) - ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) + GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) + ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) InitiateUpload(ctx context.Context, ref *provider.Reference, uploadLength int64, metadata map[string]string) (string, error) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error Download(ctx context.Context, ref *provider.Reference) (io.ReadCloser, error) diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index 11c3035dc5..956bdcb78f 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -500,7 +500,7 @@ func (fs *eosfs) ListGrants(ctx context.Context, ref *provider.Reference) ([]*pr return grantList, nil } -func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) { +func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { u, err := getUser(ctx) if err != nil { return nil, err @@ -517,7 +517,7 @@ func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider. // if path is home we need to add in the response any shadow folder in the shadow homedirectory. if fs.conf.EnableHome { if fs.isShareFolder(ctx, p) { - return fs.getMDShareFolder(ctx, p) + return fs.getMDShareFolder(ctx, p, mdKeys) } } @@ -532,7 +532,7 @@ func (fs *eosfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider. return fi, nil } -func (fs *eosfs) getMDShareFolder(ctx context.Context, p string) (*provider.ResourceInfo, error) { +func (fs *eosfs) getMDShareFolder(ctx context.Context, p string, mdKeys []string) (*provider.ResourceInfo, error) { u, err := getUser(ctx) if err != nil { return nil, err @@ -551,7 +551,7 @@ func (fs *eosfs) getMDShareFolder(ctx context.Context, p string) (*provider.Reso return fs.convertToFileReference(ctx, eosFileInfo), nil } -func (fs *eosfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) { +func (fs *eosfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { log := appctx.GetLogger(ctx) u, err := getUser(ctx) if err != nil { diff --git a/pkg/storage/utils/localfs/localfs.go b/pkg/storage/utils/localfs/localfs.go index c77d6cfa76..d4a056a9ab 100644 --- a/pkg/storage/utils/localfs/localfs.go +++ b/pkg/storage/utils/localfs/localfs.go @@ -246,13 +246,13 @@ func (fs *localfs) isShareFolderChild(ctx context.Context, p string) bool { return len(vals) > 1 && vals[1] != "" } -func (fs *localfs) normalize(ctx context.Context, fi os.FileInfo, fn string) (*provider.ResourceInfo, error) { +func (fs *localfs) normalize(ctx context.Context, fi os.FileInfo, fn string, mdKeys []string) (*provider.ResourceInfo, error) { fp := fs.unwrap(ctx, path.Join("/", fn)) owner, err := getUser(ctx) if err != nil { return nil, err } - metadata, err := fs.retrieveArbitraryMetadata(ctx, fn) + metadata, err := fs.retrieveArbitraryMetadata(ctx, fn, mdKeys) if err != nil { return nil, err } @@ -276,8 +276,8 @@ func (fs *localfs) normalize(ctx context.Context, fi os.FileInfo, fn string) (*p return md, nil } -func (fs *localfs) convertToFileReference(ctx context.Context, fi os.FileInfo, fn string) (*provider.ResourceInfo, error) { - info, err := fs.normalize(ctx, fi, fn) +func (fs *localfs) convertToFileReference(ctx context.Context, fi os.FileInfo, fn string, mdKeys []string) (*provider.ResourceInfo, error) { + info, err := fs.normalize(ctx, fi, fn, mdKeys) if err != nil { return nil, err } @@ -297,14 +297,22 @@ func getResourceType(isDir bool) provider.ResourceType { return provider.ResourceType_RESOURCE_TYPE_FILE } -func (fs *localfs) retrieveArbitraryMetadata(ctx context.Context, fn string) (*provider.ArbitraryMetadata, error) { +func (fs *localfs) retrieveArbitraryMetadata(ctx context.Context, fn string, mdKeys []string) (*provider.ArbitraryMetadata, error) { md, err := fs.getMetadata(ctx, fn) if err != nil { return nil, errors.Wrap(err, "localfs: error listing metadata") } var mdKey, mdVal string - metadata := provider.ArbitraryMetadata{ - Metadata: map[string]string{}, + metadata := map[string]string{} + + mdKeysMap := make(map[string]struct{}) + for _, k := range mdKeys { + mdKeysMap[k] = struct{}{} + } + + var returnAllKeys bool + if _, ok := mdKeysMap["*"]; len(mdKeys) == 0 || ok { + returnAllKeys = true } for md.Next() { @@ -312,9 +320,13 @@ func (fs *localfs) retrieveArbitraryMetadata(ctx context.Context, fn string) (*p if err != nil { return nil, errors.Wrap(err, "localfs: error scanning db rows") } - metadata.Metadata[mdKey] = mdVal + if _, ok := mdKeysMap[mdKey]; returnAllKeys || ok { + metadata[mdKey] = mdVal + } } - return &metadata, nil + return &provider.ArbitraryMetadata{ + Metadata: metadata, + }, nil } // GetPathByID returns the path pointed by the file id @@ -750,7 +762,7 @@ func (fs *localfs) moveReferences(ctx context.Context, oldName, newName string) return nil } -func (fs *localfs) GetMD(ctx context.Context, ref *provider.Reference) (*provider.ResourceInfo, error) { +func (fs *localfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { fn, err := fs.resolve(ctx, ref) if err != nil { return nil, errors.Wrap(err, "localfs: error resolving ref") @@ -758,7 +770,7 @@ func (fs *localfs) GetMD(ctx context.Context, ref *provider.Reference) (*provide if !fs.conf.DisableHome { if fs.isShareFolder(ctx, fn) { - return fs.getMDShareFolder(ctx, fn) + return fs.getMDShareFolder(ctx, fn, mdKeys) } } @@ -771,10 +783,10 @@ func (fs *localfs) GetMD(ctx context.Context, ref *provider.Reference) (*provide return nil, errors.Wrap(err, "localfs: error stating "+fn) } - return fs.normalize(ctx, md, fn) + return fs.normalize(ctx, md, fn, mdKeys) } -func (fs *localfs) getMDShareFolder(ctx context.Context, p string) (*provider.ResourceInfo, error) { +func (fs *localfs) getMDShareFolder(ctx context.Context, p string, mdKeys []string) (*provider.ResourceInfo, error) { fn := fs.wrapReferences(ctx, p) md, err := os.Stat(fn) @@ -786,24 +798,24 @@ func (fs *localfs) getMDShareFolder(ctx context.Context, p string) (*provider.Re } if fs.isShareFolderRoot(ctx, p) { - return fs.normalize(ctx, md, fn) + return fs.normalize(ctx, md, fn, mdKeys) } - return fs.convertToFileReference(ctx, md, fn) + return fs.convertToFileReference(ctx, md, fn, mdKeys) } -func (fs *localfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]*provider.ResourceInfo, error) { +func (fs *localfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { fn, err := fs.resolve(ctx, ref) if err != nil { return nil, errors.Wrap(err, "localfs: error resolving ref") } if fn == "/" { - homeFiles, err := fs.listFolder(ctx, fn) + homeFiles, err := fs.listFolder(ctx, fn, mdKeys) if err != nil { return nil, err } if !fs.conf.DisableHome { - sharedReferences, err := fs.listShareFolderRoot(ctx, fn) + sharedReferences, err := fs.listShareFolderRoot(ctx, fn, mdKeys) if err != nil { return nil, err } @@ -813,17 +825,17 @@ func (fs *localfs) ListFolder(ctx context.Context, ref *provider.Reference) ([]* } if fs.isShareFolderRoot(ctx, fn) { - return fs.listShareFolderRoot(ctx, fn) + return fs.listShareFolderRoot(ctx, fn, mdKeys) } if fs.isShareFolderChild(ctx, fn) { return nil, errtypes.PermissionDenied("localfs: error listing folders inside the shared folder, only file references are stored inside") } - return fs.listFolder(ctx, fn) + return fs.listFolder(ctx, fn, mdKeys) } -func (fs *localfs) listFolder(ctx context.Context, fn string) ([]*provider.ResourceInfo, error) { +func (fs *localfs) listFolder(ctx context.Context, fn string, mdKeys []string) ([]*provider.ResourceInfo, error) { fn = fs.wrap(ctx, fn) @@ -837,7 +849,7 @@ func (fs *localfs) listFolder(ctx context.Context, fn string) ([]*provider.Resou finfos := []*provider.ResourceInfo{} for _, md := range mds { - info, err := fs.normalize(ctx, md, path.Join(fn, md.Name())) + info, err := fs.normalize(ctx, md, path.Join(fn, md.Name()), mdKeys) if err == nil { finfos = append(finfos, info) } @@ -845,7 +857,7 @@ func (fs *localfs) listFolder(ctx context.Context, fn string) ([]*provider.Resou return finfos, nil } -func (fs *localfs) listShareFolderRoot(ctx context.Context, home string) ([]*provider.ResourceInfo, error) { +func (fs *localfs) listShareFolderRoot(ctx context.Context, home string, mdKeys []string) ([]*provider.ResourceInfo, error) { fn := fs.wrapReferences(ctx, home) @@ -862,9 +874,9 @@ func (fs *localfs) listShareFolderRoot(ctx context.Context, home string) ([]*pro var info *provider.ResourceInfo var err error if fs.isShareFolderRoot(ctx, path.Join("/", md.Name())) { - info, err = fs.normalize(ctx, md, path.Join(fn, md.Name())) + info, err = fs.normalize(ctx, md, path.Join(fn, md.Name()), mdKeys) } else { - info, err = fs.convertToFileReference(ctx, md, path.Join(fn, md.Name())) + info, err = fs.convertToFileReference(ctx, md, path.Join(fn, md.Name()), mdKeys) } if err == nil { finfos = append(finfos, info)