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