Hi SSHD team,
Not sure if this is a bug or not, but when I instantiate a new FileSystem
using the VirtualFileSystemFactory and RootedFileSystemProvider, as a user
on the box, I am able to mkdir and get/put files in parent (i.e.
non-subpath) paths of the supposed "root" if I do something like
sftp> pwd
Remote working directory: /
$ put ../thisismyfile
It seems like the resolveLocalPath which is supposed to throw an
InvalidPathException if the path is not a proper subpath of the rooted file
system needs to normalize the path in addition to doing it's nullity
checks. I was able to prevent this behavior by doing something like this,
but not sure if this is the best approach.
Any guidance/explanation would be appreciated. Thanks.
public class FixedRootedFileSystemProvider extends RootedFileSystemProvider {
private static final Logger LOG =
LoggerFactory.getLogger(FixedRootedFileSystemProvider.class);
public FixedRootedFileSystemProvider() { super(); }
@Override
protected Path resolveLocalPath(RootedPath path) {
Path resolvedLocalPath = super.resolveLocalPath(path);
return validateParent(path, resolvedLocalPath);
}
private Path validateParent(RootedPath path, Path localPath) throws
InvalidPathException {
RootedFileSystem rfs = path.getFileSystem();
Path root = rfs.getRoot();
if
(!localPath.toAbsolutePath().normalize().startsWith(root.toAbsolutePath().normalize()))
{ //i.e. is not a REAL subpath
LOG.info("{} is not a subpath of the root FS path " +
root.toAbsolutePath().normalize(),
localPath.toAbsolutePath().normalize());
throw new InvalidPathException(localPath.toString(), "Invalid path");
}
return localPath;
}
}