From eca3b95c3ebce621ab80cf625f3d2ff295715aba Mon Sep 17 00:00:00 2001 From: Kenneth Date: Sat, 27 Dec 2025 20:25:54 +0000 Subject: [PATCH] fix: resolving path for shared item leaks parent info when an item is shared, their path should stop at the closest directory that is shared. eg if file c is in shared dir b which is in private dir a, its public facing path should be b/c, not a/b/c. internally, the real path is still a/b/c. --- apps/backend/internal/virtualfs/path.go | 7 ++++--- apps/backend/internal/virtualfs/vfs.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/backend/internal/virtualfs/path.go b/apps/backend/internal/virtualfs/path.go index dd59f79..bf9d497 100644 --- a/apps/backend/internal/virtualfs/path.go +++ b/apps/backend/internal/virtualfs/path.go @@ -33,9 +33,10 @@ const absolutePathWithPublicIDQuery = `WITH RECURSIVE path AS ( SELECT n.id, n.parent_id, n.name, n.public_id, p.depth + 1 FROM vfs_nodes n JOIN path p ON n.id = p.parent_id + WHERE p.id != ? ) SELECT name, public_id FROM path -WHERE EXISTS (SELECT 1 FROM path WHERE parent_id IS NULL) +WHERE EXISTS (SELECT 1 FROM path WHERE id = ?) ORDER BY depth DESC;` // Path represents a path to a node. @@ -67,9 +68,9 @@ func buildPathFromNodeID(ctx context.Context, db bun.IDB, nodeID uuid.UUID) (str return JoinPath(path...), nil } -func buildNoteAbsolutePath(ctx context.Context, db bun.IDB, node *Node) (Path, error) { +func buildNodeAbsolutePath(ctx context.Context, db bun.IDB, node *Node, rootID uuid.UUID) (Path, error) { var segments []PathSegment - err := db.NewRaw(absolutePathWithPublicIDQuery, node.ID).Scan(ctx, &segments) + err := db.NewRaw(absolutePathWithPublicIDQuery, node.ID, rootID, rootID).Scan(ctx, &segments) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, ErrNodeNotFound diff --git a/apps/backend/internal/virtualfs/vfs.go b/apps/backend/internal/virtualfs/vfs.go index d1deaf2..15a55ea 100644 --- a/apps/backend/internal/virtualfs/vfs.go +++ b/apps/backend/internal/virtualfs/vfs.go @@ -823,7 +823,7 @@ func (vfs *VirtualFS) RealPath(ctx context.Context, db bun.IDB, node *Node, scop } else if !ok { return nil, ErrAccessDenied } - return buildNoteAbsolutePath(ctx, db, node) + return buildNodeAbsolutePath(ctx, db, node, scope.RootNodeID) } func (vfs *VirtualFS) PermanentlyDeleteFiles(ctx context.Context, db bun.IDB, nodes []*Node, scope *Scope) error {