You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Andrew Franklin (JIRA)" <ji...@apache.org> on 2011/06/29 01:40:28 UTC
[jira] [Updated] (VFS-179) Traversal of directory tree with
FileSelector fails with symbolic links in SFTP
[ https://issues.apache.org/jira/browse/VFS-179?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrew Franklin updated VFS-179:
--------------------------------
Description:
It seems to me that when using the FileSelector to traverse a directory tree using SFTP, a symbolic link will return as type File (even when the link points to a directory), which will result in the directory node not being followed.
By using a mechanism similar to that of FtpFileObject this can be resolved with the following...
{noformat}
protected FileType doGetType() throws Exception
{
if (attrs == null)
{
statSelf();
}
if (attrs == null)
{
return FileType.IMAGINARY;
}
if ((attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS) == 0)
{
throw new FileSystemException( "vfs.provider.sftp/unknown-permissions.error");
}
if(attrs.isLink())
{
return getLinkDestination().getType();
}
else if (attrs.isDir())
{
return FileType.FOLDER;
}
else
{
return FileType.FILE;
}
}
/**
* Return the destination of this file object if it's a symbolic link
* @return FileObject representing the linked to location
*/
private FileObject getLinkDestination() throws Exception
{
if (linkDestination == null)
{
final String path = fileSystem.getChannel().readlink( relPath );
FileName relativeTo = getName().getParent();
if (relativeTo == null)
{
relativeTo = getName();
}
FileName linkDestinationName = getFileSystem().getFileSystemManager().resolveName(relativeTo, path);
linkDestination = getFileSystem().resolveFile(linkDestinationName);
}
return linkDestination;
}
{noformat}
was:
It seems to me that when using the FileSelector to traverse a directory tree using SFTP, a symbolic link will return as type File (even when the link points to a directory), which will result in the directory node not being followed.
By using a mechanism similar to that of FtpFileObject this can be resolved with the following...
/**
* Determines the type of this file, returns null if the file does not
* exist.
*/
protected FileType doGetType() throws Exception
{
if (attrs == null)
{
statSelf();
}
if (attrs == null)
{
return FileType.IMAGINARY;
}
if ((attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS) == 0)
{
throw new FileSystemException(
"vfs.provider.sftp/unknown-permissions.error");
}
if(attrs.isLink())
{
return getLinkDestination().getType();
}
else if (attrs.isDir())
{
return FileType.FOLDER;
}
else
{
return FileType.FILE;
}
}
/**
* Return the destination of this file object if it's a symbolic link
* @return FileObject representing the linked to location
*/
private FileObject getLinkDestination() throws Exception
{
if (linkDestination == null)
{
final String path = fileSystem.getChannel().readlink( relPath );
FileName relativeTo = getName().getParent();
if (relativeTo == null)
{
relativeTo = getName();
}
FileName linkDestinationName = getFileSystem().getFileSystemManager().resolveName(relativeTo, path);
linkDestination = getFileSystem().resolveFile(linkDestinationName);
}
return linkDestination;
}
> Traversal of directory tree with FileSelector fails with symbolic links in SFTP
> -------------------------------------------------------------------------------
>
> Key: VFS-179
> URL: https://issues.apache.org/jira/browse/VFS-179
> Project: Commons VFS
> Issue Type: Bug
> Reporter: Andrew Franklin
> Attachments: VFS-179.patch
>
>
> It seems to me that when using the FileSelector to traverse a directory tree using SFTP, a symbolic link will return as type File (even when the link points to a directory), which will result in the directory node not being followed.
> By using a mechanism similar to that of FtpFileObject this can be resolved with the following...
> {noformat}
> protected FileType doGetType() throws Exception
> {
> if (attrs == null)
> {
> statSelf();
> }
> if (attrs == null)
> {
> return FileType.IMAGINARY;
> }
> if ((attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS) == 0)
> {
> throw new FileSystemException( "vfs.provider.sftp/unknown-permissions.error");
> }
> if(attrs.isLink())
> {
> return getLinkDestination().getType();
> }
> else if (attrs.isDir())
> {
> return FileType.FOLDER;
> }
> else
> {
> return FileType.FILE;
> }
> }
> /**
> * Return the destination of this file object if it's a symbolic link
> * @return FileObject representing the linked to location
> */
> private FileObject getLinkDestination() throws Exception
> {
> if (linkDestination == null)
> {
> final String path = fileSystem.getChannel().readlink( relPath );
> FileName relativeTo = getName().getParent();
> if (relativeTo == null)
> {
> relativeTo = getName();
> }
> FileName linkDestinationName = getFileSystem().getFileSystemManager().resolveName(relativeTo, path);
> linkDestination = getFileSystem().resolveFile(linkDestinationName);
> }
> return linkDestination;
> }
> {noformat}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira