Skip to content
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions api/src/org/labkey/vfs/FileSystemLike.java
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,38 @@ static File toFile(FileLike f)
return p.toFile();
}

// Converts an absolute URI to a relative one if it's within the base URI.
// If fileURI is outside rootURI, the result remains fileURI/unchanged.
// Examples:
// root "/a/b/c/", file "/x/y/z.txt" -> "/x/y/z.txt"
// root "/a/b/c/", file "/a/b/c/d.txt" -> "d.txt"
static URI getRelativeURI(URI rootURI, URI fileURI)
{
return rootURI.relativize(fileURI);
}

static FileLike resolveChildWithRelativeURI(URI rootURI, URI fileURI)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the use case for having a rootURI w/o already having a FileSystemLike? e.g. where did root come from? (e.g. PipeRoot can return FileSystemLike objects)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good questions! Intent was to pass rootURI created using FileSystemLike, now realized it is redundant. Please see my updates, let me know what you think! Thanks!

{
URI relativeURI = getRelativeURI(rootURI, fileURI);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can use URIUtil.relativize() here, rather than introduce a new method.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point, now removed


// If the relative URI is absolute or remains unchanged, it means relativize failed and the file is outside the root directory.
if (relativeURI.isAbsolute() || relativeURI.equals(fileURI))
{
throw new IllegalArgumentException("File '" + fileURI.getPath() + "' is outside the root '" + rootURI.getPath() + "'");
}

FileLike allowedRoot = new FileSystemLike.Builder(rootURI).root();

//explicitly check whether the given file path is within the allowed root directory
if (allowedRoot.getFileSystem().isDescendant(allowedRoot, fileURI))
{
return allowedRoot.resolveChild(relativeURI.getPath());
}
else
{
throw new IllegalArgumentException("File '" + relativeURI.getPath() + "' is not a descendant of '" + rootURI.getPath() + "'");
}
}

/* More efficient version of wrap when many files may be from the same directory */
static List<FileLike> wrapFiles(List<File> files)
Expand Down