From 022bcae0f81b8e0fbcb47d9cd2160d6b0e76a5eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 14:45:36 +0000 Subject: [PATCH] build(deps): bump github.com/opencloud-eu/reva/v2 Bumps [github.com/opencloud-eu/reva/v2](https://github.com/opencloud-eu/reva) from 2.46.4-0.20260615073558-209c2cd3b52b to 2.46.4. - [Release notes](https://github.com/opencloud-eu/reva/releases) - [Changelog](https://github.com/opencloud-eu/reva/blob/v2.46.4/CHANGELOG.md) - [Commits](https://github.com/opencloud-eu/reva/commits/v2.46.4) --- updated-dependencies: - dependency-name: github.com/opencloud-eu/reva/v2 dependency-version: 2.46.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 +- .../http/services/archiver/handler.go | 68 +-------------- .../reva/v2/pkg/conversions/role.go | 38 -------- .../v2/pkg/storage/fs/posix/ignore/ignore.go | 86 ++++++++++++------- .../v2/pkg/storage/fs/posix/lookup/lookup.go | 7 +- .../pkg/storage/fs/posix/trashbin/trashbin.go | 12 +-- .../pkg/storage/fs/posix/tree/assimilation.go | 6 +- .../reva/v2/pkg/storage/fs/posix/tree/tree.go | 15 +++- .../storage/fs/posix/tree/watcher_darwin.go | 23 +---- .../storage/pkg/decomposedfs/decomposedfs.go | 6 +- .../storage/pkg/decomposedfs/lookup/lookup.go | 2 + .../v2/pkg/storage/pkg/decomposedfs/spaces.go | 4 +- .../pkg/decomposedfs/tree/propagator/async.go | 8 +- .../pkg/storage/pkg/decomposedfs/tree/tree.go | 1 + .../storage/utils/decomposedfs/tree/tree.go | 1 + vendor/modules.txt | 2 +- 17 files changed, 106 insertions(+), 179 deletions(-) diff --git a/go.mod b/go.mod index 6eed43e3bc..2e8301df6d 100644 --- a/go.mod +++ b/go.mod @@ -64,7 +64,7 @@ require ( github.com/open-policy-agent/opa v1.17.1 github.com/opencloud-eu/icap-client v0.0.0-20250930132611-28a2afe62d89 github.com/opencloud-eu/libre-graph-api-go v1.0.8-0.20260310090739-853d972b282d - github.com/opencloud-eu/reva/v2 v2.46.4-0.20260615073558-209c2cd3b52b + github.com/opencloud-eu/reva/v2 v2.46.4 github.com/opensearch-project/opensearch-go/v4 v4.6.0 github.com/orcaman/concurrent-map v1.0.0 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index 81020cf62c..2aa211219c 100644 --- a/go.sum +++ b/go.sum @@ -949,8 +949,8 @@ github.com/opencloud-eu/icap-client v0.0.0-20250930132611-28a2afe62d89 h1:W1ms+l github.com/opencloud-eu/icap-client v0.0.0-20250930132611-28a2afe62d89/go.mod h1:vigJkNss1N2QEceCuNw/ullDehncuJNFB6mEnzfq9UI= github.com/opencloud-eu/libre-graph-api-go v1.0.8-0.20260310090739-853d972b282d h1:JcqGDiyrcaQwVyV861TUyQgO7uEmsjkhfm7aQd84dOw= github.com/opencloud-eu/libre-graph-api-go v1.0.8-0.20260310090739-853d972b282d/go.mod h1:pzatilMEHZFT3qV7C/X3MqOa3NlRQuYhlRhZTL+hN6Q= -github.com/opencloud-eu/reva/v2 v2.46.4-0.20260615073558-209c2cd3b52b h1:ejmGkLVlWauUkcnXYbSr7dY1a59dUdkKHOvzeGpwwgE= -github.com/opencloud-eu/reva/v2 v2.46.4-0.20260615073558-209c2cd3b52b/go.mod h1:RoFQt+u7edxwzHr1IZ2Y6VaDinMiRPQupAvMBy3WVmE= +github.com/opencloud-eu/reva/v2 v2.46.4 h1:Klq3UzPLDgwzyGV4NsmbvlaoEvx9pn5xzcC49PObzOc= +github.com/opencloud-eu/reva/v2 v2.46.4/go.mod h1:RoFQt+u7edxwzHr1IZ2Y6VaDinMiRPQupAvMBy3WVmE= github.com/opencloud-eu/secure v0.0.0-20260312082735-b6f5cb2244e4 h1:l2oB/RctH+t8r7QBj5p8thfEHCM/jF35aAY3WQ3hADI= github.com/opencloud-eu/secure v0.0.0-20260312082735-b6f5cb2244e4/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= diff --git a/vendor/github.com/opencloud-eu/reva/v2/internal/http/services/archiver/handler.go b/vendor/github.com/opencloud-eu/reva/v2/internal/http/services/archiver/handler.go index d665de7da1..49aa40e8d8 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/internal/http/services/archiver/handler.go +++ b/vendor/github.com/opencloud-eu/reva/v2/internal/http/services/archiver/handler.go @@ -23,8 +23,6 @@ import ( "errors" "fmt" "net/http" - "path" - "strings" "time" "regexp" @@ -36,7 +34,6 @@ import ( "github.com/gdexlab/go-render/render" "github.com/go-viper/mapstructure/v2" "github.com/opencloud-eu/reva/v2/internal/http/services/archiver/manager" - "github.com/opencloud-eu/reva/v2/internal/http/services/owncloud/ocdav/net" "github.com/opencloud-eu/reva/v2/pkg/errtypes" "github.com/opencloud-eu/reva/v2/pkg/rgrpc/todo/pool" "github.com/opencloud-eu/reva/v2/pkg/rhttp" @@ -203,56 +200,6 @@ func (s *svc) allAllowed(paths []string) error { } */ -// resourceName resolves the name of a single resource so the archive can be named after it instead -// of the generic "download". It returns an empty string on any failure, so the caller keeps the -// default name. The name is sanitized via sanitizeArchiveName. -func (s *svc) resourceName(ctx context.Context, id *provider.ResourceId) (string, error) { - gatewayClient, err := s.gatewaySelector.Next() - if err != nil { - s.log.Debug().Err(err).Msg("archiver: could not select gateway to resolve the archive name, using the default") - return "", err - } - - res, err := gatewayClient.Stat(ctx, &provider.StatRequest{ - Ref: &provider.Reference{ResourceId: id}, - }) - if err != nil { - s.log.Debug().Err(err).Msg("archiver: stat failed while resolving the archive name, using the default") - return "", err - } - if code := res.GetStatus().GetCode(); code != rpc.Code_CODE_OK { - s.log.Debug().Str("code", code.String()).Msg("archiver: stat returned non-OK while resolving the archive name, using the default") - return "", fmt.Errorf("stat returned non-OK code %s", code.String()) - } - - name := res.GetInfo().GetName() - if name == "" { - name = path.Base(res.GetInfo().GetPath()) - } - return sanitizeArchiveName(name), nil -} - -// sanitizeArchiveName removes characters that would break the Content-Disposition header (CR, LF, -// double quote) or let the name act as a path (slash, backslash), plus all control characters -// (C0, DEL and C1). It returns an empty string if nothing usable is left. -func sanitizeArchiveName(name string) string { - name = strings.Map(func(r rune) rune { - switch { - case r == '"', r == '\\', r == '/': - return -1 - case r < 0x20 || (r >= 0x7f && r <= 0x9f): - return -1 - default: - return r - } - }, name) - name = strings.TrimSpace(name) - if name == "." || name == ".." { - return "" - } - return name -} - func (s *svc) writeHTTPError(rw http.ResponseWriter, err error) { s.log.Error().Msg(err.Error()) @@ -304,20 +251,7 @@ func (s *svc) Handler() http.Handler { return } - // Name the archive after the resource when a single one was requested, instead of the - // generic "download". The name must be resolved here, before the body is streamed: the - // Content-Disposition header below is written before CreateZip/CreateTar run, so the name - // the walker resolves while building the archive would come too late. - // See https://github.com/opencloud-eu/reva/issues/308 archName := s.config.Name - if len(resources) == 1 { - if name, err := s.resourceName(ctx, resources[0]); name != "" && err == nil { - archName = name - } else { - s.log.Debug().Err(err).Msg("could not resolve the archive name, using the default") - archName = "download" - } - } if format == "tar" { archName += ".tar" } else { @@ -326,7 +260,7 @@ func (s *svc) Handler() http.Handler { s.log.Debug().Msg("Requested the following resources to archive: " + render.Render(resources)) - rw.Header().Set(net.HeaderContentDisposistion, net.ContentDispositionAttachment(archName)) + rw.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", archName)) rw.Header().Set("Content-Transfer-Encoding", "binary") // create the archive diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/conversions/role.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/conversions/role.go index 239387426d..508b091c4e 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/conversions/role.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/conversions/role.go @@ -37,16 +37,12 @@ type Role struct { const ( // RoleViewer grants non-editor role on a resource. RoleViewer = "viewer" - // RoleViewerWithVersions grants non-editor role on a resource including list versions. - RoleViewerWithVersions = "viewer-with-versions" // RoleViewerListGrants grants non-editor role on a resource. RoleViewerListGrants = "viewer-list-grants" // RoleSpaceViewer grants non-editor role on a space. RoleSpaceViewer = "spaceviewer" // RoleEditor grants editor permission on a resource, including folders. RoleEditor = "editor" - // RoleEditorWithVersions grants editor permission on a resource, including folders and list/restore versions - RoleEditorWithVersions = "editor-with-versions" // RoleEditorListGrants grants editor permission on a resource, including folders. RoleEditorListGrants = "editor-list-grants" // RoleSpaceEditor grants editor permission on a space. @@ -55,8 +51,6 @@ const ( RoleSpaceEditorWithoutVersions = "spaceeditor-without-versions" // RoleFileEditor grants editor permission on a single file. RoleFileEditor = "file-editor" - // RoleFileEditorWithVersions grants editor permission on a single file, including list/restore versions. - RoleFileEditorWithVersions = "file-editor-with-versions" // RoleFileEditorListGrants grants editor permission on a single file. RoleFileEditorListGrants = "file-editor-list-grants" // RoleCoowner grants co-owner permissions on a resource. @@ -169,24 +163,18 @@ func RoleFromName(name string) *Role { return NewDeniedRole() case RoleViewer: return NewViewerRole() - case RoleViewerWithVersions: - return NewViewerWithVersionsRole() case RoleViewerListGrants: return NewViewerListGrantsRole() case RoleSpaceViewer: return NewSpaceViewerRole() case RoleEditor: return NewEditorRole() - case RoleEditorWithVersions: - return NewEditorWithVersionsRole() case RoleEditorListGrants: return NewEditorListGrantsRole() case RoleSpaceEditor: return NewSpaceEditorRole() case RoleFileEditor: return NewFileEditorRole() - case RoleFileEditorWithVersions: - return NewFileEditorWithVersionsRole() case RoleFileEditorListGrants: return NewFileEditorListGrantsRole() case RoleUploader: @@ -237,14 +225,6 @@ func NewViewerRole() *Role { } } -// NewViewerWithVersionsRole creates a viewer role which enables listing of file versions -func NewViewerWithVersionsRole() *Role { - role := NewViewerRole() - role.Name = RoleViewerWithVersions - role.cS3ResourcePermissions.ListFileVersions = true - return role -} - // NewViewerListGrantsRole creates a viewer role. `sharing` indicates if sharing permission should be added func NewViewerListGrantsRole() *Role { role := NewViewerRole() @@ -298,15 +278,6 @@ func NewEditorListGrantsRole() *Role { return role } -// NewEditorWithVersionsRole creates an editor role including list/restore versions. `sharing` indicates if sharing permission should be added -func NewEditorWithVersionsRole() *Role { - role := NewEditorRole() - role.Name = RoleEditorWithVersions - role.cS3ResourcePermissions.ListFileVersions = true - role.cS3ResourcePermissions.RestoreFileVersion = true - return role -} - // NewSpaceEditorRole creates an editor role func NewSpaceEditorRole() *Role { return &Role{ @@ -379,15 +350,6 @@ func NewFileEditorListGrantsRole() *Role { return role } -// NewFileEditorWithVersionsRole creates a file-editor role including list/restore versions -func NewFileEditorWithVersionsRole() *Role { - role := NewFileEditorRole() - role.Name = RoleFileEditorWithVersions - role.cS3ResourcePermissions.ListFileVersions = true - role.cS3ResourcePermissions.RestoreFileVersion = true - return role -} - // NewCoownerRole creates a coowner role. func NewCoownerRole() *Role { return &Role{ diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore/ignore.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore/ignore.go index 5b3ee51c8c..9322df781d 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore/ignore.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore/ignore.go @@ -7,10 +7,21 @@ import ( "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/blobstore" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/lookup" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/options" + "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/propagator" "github.com/opencloud-eu/reva/v2/pkg/storage/utils/templates" "github.com/rs/zerolog" ) +const ( + // The needles include the separator at the beginning to avoid matching internal dir names in substrings + // The end segment boundary is checked in isInternalDir + trashNeedle = needle(string(filepath.Separator) + lookup.TrashDir) + metadataNeedle = needle(string(filepath.Separator) + lookup.MetadataDir) + tmpNeedle = needle(string(filepath.Separator) + blobstore.TMPDir) +) + +type needle string + // Ignorer handles checking if paths should be ignored in posix operations type Ignorer struct { options *options.Options @@ -31,37 +42,27 @@ func NewIgnorer(options *options.Options, log *zerolog.Logger) *Ignorer { // IsIgnored checking if paths should be ignored in posix operations func (i *Ignorer) IsIgnored(path string) bool { - return IsLockFile(path) || IsTrash(path) || i.IsUpload(path) || i.IsInternal(path) || i.IsRootPath(path) || i.IsSpaceRoot(path) + return i.IsChanges(path) || + i.IsIndex(path) || + IsLockFile(path) || + i.IsTrash(path) || + i.IsMetadata(path) || + i.IsTemporary(path) || + i.IsUpload(path) || + i.IsRootPath(path) || + i.IsSpaceRoot(path) } -func (i *Ignorer) IsUpload(path string) bool { - return strings.HasPrefix(path, i.options.UploadDirectory) +func (i *Ignorer) IsChanges(path string) bool { + return strings.HasPrefix(path, filepath.Join(i.options.Root, propagator.ChangesDir)) } func (i *Ignorer) IsIndex(path string) bool { - return strings.HasPrefix(path, filepath.Join(i.options.Root, "indexes")) -} - -func (i *Ignorer) IsChanges(path string) bool { - return strings.HasPrefix(path, filepath.Join(i.options.Root, "changes")) + return strings.HasPrefix(path, filepath.Join(i.options.Root, lookup.IndexesDir)) } -func (i *Ignorer) IsTemporary(path string) bool { - if filepath.IsAbs(path) { - tmpDirPattern := filepath.Join(i.options.Root, "*", "*", blobstore.TMPDir) - isTempDir, err := filepath.Match(tmpDirPattern, path) - if err != nil { - i.log.Error().Err(err).Str("pattern", tmpDirPattern).Str("path", path).Msg("error matching temporary path") - return false - } - isTempParentDir, err := filepath.Match(tmpDirPattern, filepath.Dir(path)) - if err != nil { - i.log.Error().Err(err).Str("pattern", tmpDirPattern).Str("path", filepath.Dir(path)).Msg("error matching temporary path") - return false - } - return isTempDir || isTempParentDir - } - return path == blobstore.TMPDir || filepath.Dir(path) == blobstore.TMPDir +func (i *Ignorer) IsUpload(path string) bool { + return strings.HasPrefix(path, i.options.UploadDirectory) } func (i *Ignorer) IsRootPath(path string) bool { @@ -75,14 +76,39 @@ func (i *Ignorer) IsSpaceRoot(path string) bool { return parent == i.personalSpacesRoot || parent == i.projectSpacesRoot } -func (i *Ignorer) IsInternal(path string) bool { - return i.IsIndex(path) || strings.Contains(path, lookup.MetadataDir) || i.IsTemporary(path) || i.IsChanges(path) -} - func IsLockFile(path string) bool { return strings.HasSuffix(path, ".flock") || strings.HasSuffix(path, ".mlock") } -func IsTrash(path string) bool { - return strings.HasSuffix(path, ".trashinfo") || strings.HasSuffix(path, ".trashitem") || strings.Contains(path, ".Trash") +func (i *Ignorer) IsMetadata(path string) bool { + return i.isInternalDir(path, metadataNeedle) +} + +func (i *Ignorer) IsTemporary(path string) bool { + return i.isInternalDir(path, tmpNeedle) +} + +func (i *Ignorer) IsTrash(path string) bool { + return i.isInternalDir(path, trashNeedle) +} + +// isInternalDir checks if the path contains the match dir and that the match lives +// in the space root, e.g. "/storage/users/user1/.metadata/file" -> match is ".metadata", +// parent dir is "/storage/users/user1" which is a space root, so this would return true +func (i *Ignorer) isInternalDir(path string, match needle) bool { + idx := strings.Index(path, string(match)) + if idx <= 0 { + return false + } + + // must end at a segment boundary (end of path or separator) + if length := idx + len(match); length != len(path) && path[length] != filepath.Separator { + return false + } + + // get the path of the parent dir, e.g. "/a/match" -> index of "match" is 3 + // so parentPath is path[:2] -> "/a" + parentPath := path[:idx-1] + + return len(parentPath) > 0 && i.IsSpaceRoot(parentPath) } diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/lookup/lookup.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/lookup/lookup.go index ea508407e4..2289e24e22 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/lookup/lookup.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/lookup/lookup.go @@ -34,6 +34,7 @@ import ( "github.com/opencloud-eu/reva/v2/pkg/errtypes" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/idcache" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/options" + dfslookup "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/lookup" "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/metadata" "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/metadata/prefixes" "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/node" @@ -48,7 +49,11 @@ import ( var tracer trace.Tracer -const MetadataDir = ".oc-nodes" +const ( + IndexesDir = dfslookup.IndexesDir + MetadataDir = ".oc-nodes" + TrashDir = ".Trash" +) var _spaceTypePersonal = "personal" var _spaceTypeProject = "project" diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/trashbin/trashbin.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/trashbin/trashbin.go index a4b78d7020..9c54909dc0 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/trashbin/trashbin.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/trashbin/trashbin.go @@ -145,7 +145,7 @@ func (tb *Trashbin) Setup(fs storage.FS) error { } func trashRootForNode(n *node.Node) string { - return filepath.Join(n.SpaceRoot.InternalPath(), ".Trash") + return filepath.Join(n.SpaceRoot.InternalPath(), lookup.TrashDir) } func (tb *Trashbin) MoveToTrash(ctx context.Context, n *node.Node, path string) error { @@ -192,7 +192,7 @@ func (tb *Trashbin) ListRecycle(ctx context.Context, spaceID string, key, relati _, span := tracer.Start(ctx, "ListRecycle") defer span.End() - trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), ".Trash") + trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), lookup.TrashDir) base := filepath.Join(trashRoot, "files") var originalPath string @@ -304,7 +304,7 @@ func (tb *Trashbin) RestoreRecycleItem(ctx context.Context, spaceID string, key, _, span := tracer.Start(ctx, "RestoreRecycleItem") defer span.End() - trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), ".Trash") + trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), lookup.TrashDir) trashPath := filepath.Clean(filepath.Join(trashRoot, "files", key+".trashitem", relativePath)) restorePath := "" @@ -377,7 +377,7 @@ func (tb *Trashbin) PurgeRecycleItem(ctx context.Context, spaceID, key, relative _, span := tracer.Start(ctx, "PurgeRecycleItem") defer span.End() - trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), ".Trash") + trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), lookup.TrashDir) trashPath := filepath.Clean(filepath.Join(trashRoot, "files", key+".trashitem", relativePath)) type item struct { @@ -522,7 +522,7 @@ func (tb *Trashbin) EmptyRecycle(ctx context.Context, spaceID string) error { _, span := tracer.Start(ctx, "EmptyRecycle") defer span.End() - trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), ".Trash") + trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), lookup.TrashDir) filesRoot := filepath.Join(trashRoot, "files") entries, err := os.ReadDir(filesRoot) @@ -582,7 +582,7 @@ func (tb *Trashbin) EmptyRecycle(ctx context.Context, spaceID string) error { func (tb *Trashbin) IsEmpty(ctx context.Context, spaceID string) bool { _, span := tracer.Start(ctx, "HasTrashedItems") defer span.End() - trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), ".Trash", "info") + trashRoot := filepath.Join(tb.lu.InternalPath(spaceID, spaceID), lookup.TrashDir, "info") trash, err := os.Open(filepath.Clean(trashRoot)) if err != nil { // there is no trash for this space, so no trashed items diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/assimilation.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/assimilation.go index 0162ca1dcc..7628f4b722 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/assimilation.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/assimilation.go @@ -41,7 +41,6 @@ import ( "github.com/opencloud-eu/reva/v2/pkg/errtypes" "github.com/opencloud-eu/reva/v2/pkg/events" - "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/watcher" "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/metadata" "github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/metadata/prefixes" @@ -898,10 +897,7 @@ func (t *Tree) WarmupIDCache(root string, assimilate, onlyDirty bool) error { } // skip irrelevant files - if t.Ignorer.IsInternal(path) || - ignore.IsLockFile(path) || - ignore.IsTrash(path) || - t.Ignorer.IsUpload(path) { + if !t.Ignorer.IsSpaceRoot(path) && t.Ignorer.IsIgnored(path) { if info.IsDir() { return filepath.SkipDir } diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/tree.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/tree.go index 8d9a55c813..a788c18d3e 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/tree.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/tree.go @@ -326,6 +326,10 @@ func (t *Tree) GetMD(_ context.Context, n *node.Node) (os.FileInfo, error) { // TouchFile creates a new empty file func (t *Tree) TouchFile(ctx context.Context, n *node.Node, markprocessing bool, mtime string) error { + if t.Ignorer.IsIgnored(filepath.Join(n.ParentPath(), n.Name)) { + return errtypes.PermissionDenied(n.ID) + } + if n.Exists { if markprocessing { return n.SetXattr(ctx, prefixes.StatusPrefix, []byte(node.ProcessingStatus)) @@ -566,7 +570,7 @@ func (t *Tree) ListFolder(ctx context.Context, n *node.Node) ([]*node.Node, erro g.Go(func() error { defer close(work) for _, name := range names { - if t.Ignorer.IsInternal(name) || ignore.IsLockFile(name) || ignore.IsTrash(name) { + if t.Ignorer.IsIgnored(filepath.Join(dir, name)) { continue } @@ -758,6 +762,10 @@ func (t *Tree) ResolveSpaceIDIndexEntry(spaceID string) (string, error) { // InitNewNode initializes a new node func (t *Tree) InitNewNode(ctx context.Context, n *node.Node, fsize uint64) (metadata.UnlockFunc, error) { + if t.Ignorer.IsIgnored(filepath.Join(n.ParentPath(), n.Name)) { + return nil, errtypes.PermissionDenied(n.ID) + } + _, span := tracer.Start(ctx, "InitNewNode") defer span.End() // create folder structure (if needed) @@ -804,6 +812,10 @@ func (t *Tree) InitNewNode(ctx context.Context, n *node.Node, fsize uint64) (met // TODO check if node exists? func (t *Tree) createDirNode(ctx context.Context, n *node.Node) (err error) { + if t.Ignorer.IsIgnored(filepath.Join(n.ParentPath(), n.Name)) { + return errtypes.PermissionDenied(n.ID) + } + ctx, span := tracer.Start(ctx, "createDirNode") defer span.End() @@ -850,6 +862,7 @@ func (t *Tree) createDirNode(ctx context.Context, n *node.Node) (err error) { attributes := n.NodeMetadata(ctx) attributes[prefixes.MTimeAttr] = []byte(mtime.UTC().Format(time.RFC3339Nano)) attributes[prefixes.IDAttr] = []byte(n.ID) + attributes[prefixes.SpaceIDAttr] = []byte(n.SpaceID) attributes[prefixes.TreesizeAttr] = []byte("0") // initialize as empty, TODO why bother? if it is not set we could treat it as 0? if t.options.TreeTimeAccounting || t.options.TreeSizeAccounting { diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/watcher_darwin.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/watcher_darwin.go index 9fc424d724..3aca2fae95 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/watcher_darwin.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/tree/watcher_darwin.go @@ -12,7 +12,6 @@ import ( "github.com/fsnotify/fsnotify" "github.com/rs/zerolog" - "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/ignore" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/options" "github.com/opencloud-eu/reva/v2/pkg/storage/fs/posix/watcher" ) @@ -43,7 +42,7 @@ func NewWatcher(tree *Tree, o *options.Options, log *zerolog.Logger) (*FSnotifyW // add takes care of adding watches for root and its subpaths. func (w *FSnotifyWatcher) add(fsWatcher *fsnotify.Watcher, root string) error { // Check if the root is ignored before walking the tree - if isPathIgnored(w.tree, root) { + if w.tree.Ignorer.IsIgnored(root) { return nil } @@ -53,7 +52,7 @@ func (w *FSnotifyWatcher) add(fsWatcher *fsnotify.Watcher, root string) error { } // skip ignored paths or files - if isPathIgnored(w.tree, p) || !d.IsDir() { + if w.tree.Ignorer.IsIgnored(p) || !d.IsDir() { return nil } @@ -99,7 +98,7 @@ func (w *FSnotifyWatcher) handleEvent(fsWatcher *fsnotify.Watcher, event fsnotif isWrite := event.Op&fsnotify.Write != 0 isKnownEvent := isCreate || isRemove || isRename || isWrite - isIgnored := isPathIgnored(w.tree, event.Name) + isIgnored := w.tree.Ignorer.IsIgnored(event.Name) // filter out unwanted events if isIgnored || !isKnownEvent { @@ -209,19 +208,3 @@ func isSubpath(root, p string) bool { return rel != "." && !strings.HasPrefix(rel, "..") } - -// isIgnored checks if the path is ignored by its tree. -func isPathIgnored(tree *Tree, path string) bool { - - isLockFile := ignore.IsLockFile(path) - isTrash := ignore.IsTrash(path) - isUpload := tree.isUpload(path) - isInternal := tree.isInternal(path) - - // ask the tree if the path is internal or ignored - return path == "" || - isLockFile || - isTrash || - isUpload || - isInternal -} diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/decomposedfs.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/decomposedfs.go index 22e3021a6c..9ed963dc26 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/decomposedfs.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/decomposedfs.go @@ -206,17 +206,17 @@ func New(o *options.Options, aspects aspects.Aspects, log *zerolog.Logger) (stor if o.LockCycleDurationFactor != 0 { filelocks.SetLockCycleDurationFactor(o.LockCycleDurationFactor) } - userSpaceIndex := spaceidindex.New(filepath.Join(o.Root, "indexes"), "by-user-id") + userSpaceIndex := spaceidindex.New(filepath.Join(o.Root, lookup.IndexesDir), "by-user-id") err = userSpaceIndex.Init() if err != nil { return nil, err } - groupSpaceIndex := spaceidindex.New(filepath.Join(o.Root, "indexes"), "by-group-id") + groupSpaceIndex := spaceidindex.New(filepath.Join(o.Root, lookup.IndexesDir), "by-group-id") err = groupSpaceIndex.Init() if err != nil { return nil, err } - spaceTypeIndex := spaceidindex.New(filepath.Join(o.Root, "indexes"), "by-type") + spaceTypeIndex := spaceidindex.New(filepath.Join(o.Root, lookup.IndexesDir), "by-type") err = spaceTypeIndex.Init() if err != nil { return nil, err diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/lookup/lookup.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/lookup/lookup.go index b24ac8e037..bafc23fdae 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/lookup/lookup.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/lookup/lookup.go @@ -45,6 +45,8 @@ var tracer trace.Tracer const ( _spaceTypePersonal = "personal" + + IndexesDir = "indexes" ) func init() { diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/spaces.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/spaces.go index 0942cc3ee2..d18093bfc6 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/spaces.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/spaces.go @@ -1147,8 +1147,8 @@ func canDeleteSpace(ctx context.Context, spaceID string, typ string, purge bool, return errtypes.PermissionDenied("user is not allowed to delete a personal space") } - // space managers are allowed to disable and delete their project spaces - if rp, err := p.AssemblePermissions(ctx, n); err == nil && permissions.IsManager(rp) { + // space managers are allowed to disable their project spaces + if rp, err := p.AssemblePermissions(ctx, n); err == nil && !purge && permissions.IsManager(rp) { return nil } diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/propagator/async.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/propagator/async.go index 19f97c42cc..dfa57a7b44 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/propagator/async.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/propagator/async.go @@ -37,6 +37,10 @@ import ( "github.com/vmihailenco/msgpack/v5" ) +const ( + ChangesDir = "changes" +) + var _propagationGracePeriod = 3 * time.Minute type PropagationNode interface { @@ -80,7 +84,7 @@ func NewAsyncPropagator(treeSizeAccounting, treeTimeAccounting bool, o options.A return } - changesDirPath := filepath.Join(p.lookup.InternalRoot(), "changes") + changesDirPath := filepath.Join(p.lookup.InternalRoot(), ChangesDir) doSleep := false // switch to not sleep on the first iteration for { if doSleep { @@ -426,5 +430,5 @@ func (p AsyncPropagator) propagate(ctx context.Context, pn PropagationNode, reca } func (p AsyncPropagator) changesPath(spaceID, nodeID, filename string) string { - return filepath.Join(p.lookup.InternalRoot(), "changes", spaceID[0:2], spaceID+":"+nodeID, filename) + return filepath.Join(p.lookup.InternalRoot(), ChangesDir, spaceID[0:2], spaceID+":"+nodeID, filename) } diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/tree.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/tree.go index c718b3f163..8f5daa41df 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/tree.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/pkg/decomposedfs/tree/tree.go @@ -845,6 +845,7 @@ func (t *Tree) createDirNode(ctx context.Context, n *node.Node) (err error) { } attributes := n.NodeMetadata(ctx) + attributes[prefixes.SpaceIDAttr] = []byte(n.SpaceID) attributes[prefixes.TreesizeAttr] = []byte("0") // initialize as empty, TODO why bother? if it is not set we could treat it as 0? if t.options.TreeTimeAccounting || t.options.TreeSizeAccounting { attributes[prefixes.PropagationAttr] = []byte("1") // mark the node for propagation diff --git a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/utils/decomposedfs/tree/tree.go b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/utils/decomposedfs/tree/tree.go index 6fdf2df3c5..7b08a7b97c 100644 --- a/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/utils/decomposedfs/tree/tree.go +++ b/vendor/github.com/opencloud-eu/reva/v2/pkg/storage/utils/decomposedfs/tree/tree.go @@ -867,6 +867,7 @@ func (t *Tree) createDirNode(ctx context.Context, n *node.Node) (err error) { } attributes := n.NodeMetadata(ctx) + attributes[prefixes.SpaceIDAttr] = []byte(n.SpaceID) attributes[prefixes.TreesizeAttr] = []byte("0") // initialize as empty, TODO why bother? if it is not set we could treat it as 0? if t.options.TreeTimeAccounting || t.options.TreeSizeAccounting { attributes[prefixes.PropagationAttr] = []byte("1") // mark the node for propagation diff --git a/vendor/modules.txt b/vendor/modules.txt index b15cb1e871..06185c186e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1364,7 +1364,7 @@ github.com/opencloud-eu/icap-client # github.com/opencloud-eu/libre-graph-api-go v1.0.8-0.20260310090739-853d972b282d ## explicit; go 1.18 github.com/opencloud-eu/libre-graph-api-go -# github.com/opencloud-eu/reva/v2 v2.46.4-0.20260615073558-209c2cd3b52b +# github.com/opencloud-eu/reva/v2 v2.46.4 ## explicit; go 1.25.0 github.com/opencloud-eu/reva/v2/cmd/revad/internal/grace github.com/opencloud-eu/reva/v2/cmd/revad/runtime