commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Franklin (JIRA)" <j...@apache.org>
Subject [jira] Updated: (VFS-179) Traversal of directory tree with FileSelector fails with symbolic links in FTP & SFTP
Date Thu, 25 Oct 2007 04:18:50 GMT

     [ 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...

	/**
	 * 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;
	}

  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.

For SFTP it seems that changing doGetType to explicitly deal with the link as FILE_OR_FOLDER
seems to fix the issue. I'm not sure whether this would have any negative side effects...?

	/**
	 * 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");
		}
		// A symbolic link might be a file or folder
		if(attrs.isLink())
		{
			return FileType.FILE_OR_FOLDER; 
		}
		else if (attrs.isDir())
		{
			return FileType.FOLDER;
		}
		else
		{
			return FileType.FILE;
		}
	}


> Traversal of directory tree with FileSelector fails with symbolic links in FTP &
SFTP
> -------------------------------------------------------------------------------------
>
>                 Key: VFS-179
>                 URL: https://issues.apache.org/jira/browse/VFS-179
>             Project: Commons VFS
>          Issue Type: Bug
>            Reporter: Andrew Franklin
>
> 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;
> 	}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message