commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Syed Aqeel Ashiq (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (VFS-651) SftpFileSystem Should not switch to root directory when not absolutely needed
Date Thu, 15 Feb 2018 12:50:03 GMT

     [ https://issues.apache.org/jira/browse/VFS-651?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Syed Aqeel Ashiq updated VFS-651:
---------------------------------
    Description: 
Consider a user X only has read/write access to let's say /sftp and /sftp/abc directory on
a sftp server. And default directory for user is /sftp
In this case, we have to set userDirIsRoot to false, and thus vfs will try to switch to root
directory, which will fail due to lack of read permission.

Consider following code:

{code:java}
  public void uploadFile(String localFilePath) throws FileSystemException {    
    FileSystemManager manager = VFS.getManager();
    FileObject localFile = manager.resolveFile(localFilePath);

    FileSystemOptions opts = new FileSystemOptions();
    SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false); // I set it to
false, because user default dir is /sftp and it is obviously not root directory. As a workaround,
If I set it to true, it will work after also tweaking with the file path while resolving a
file, but semantics will be wrong, since the user directory is not root.

    SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 90000);

    String remoteFilePath = "sftp://myuser:mypass@myurl.sftpexample.com/sftp/abc/abc.txt";
    FileObject remoteFile = manager.resolveFile(remoteFilePath, opts); // Exception at this
line. Because this line tries to switch to root directory of sftp file system, which fails
due to lack of read permission on root directory. Switching to root directory is not needed
here at all. This is bug, although it works in most scenarios, since most of times, permissions
are available.
    remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
  }
{code}


This is the underlying code responsible in

{code:java}
org.apache.commons.vfs.provider.sftp.SftpFileSystem
{code}
:
{code:java}
Boolean userDirIsRoot = SftpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(getFileSystemOptions());
String workingDirectory = getRootName().getPath();
if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
{
    try {
        channel.cd(workingDirectory); 
    } catch (SftpException e) {
        throw new FileSystemException("vfs.provider.sftp/change-work-directory.error", workingDirectory);
    }
}{code}

It purposelessly switches to root directory of filesystem. There is a fair use-case that root
directory doesn't have read access.

*Possible Fix:* It should not switch to root directory, rather it should switch to actual
final directory. This approach would be the safest. E.g. if the needed directory is '/sftp/abc'
then it can switch to that directory in above code, rather than switching to root.

Please also see related SO question:
https://stackoverflow.com/questions/48709971/why-apache-vfs-sftp-tries-to-switch-to-root-directory-even-when-not-needed

  was:
Consider a user X only has read/write access to let's say /sftp and /sftp/abc directory on
a sftp server. And default directory for user is /sftp
In this case, we have to set userDirIsRoot to false, and thus vfs will try to switch to root
directory, which will fail due to lack of read permission.

Consider following code:

{code:java}
  public void uploadFile(String localFilePath) throws FileSystemException {    
    FileSystemManager manager = VFS.getManager();
    FileObject localFile = manager.resolveFile(localFilePath);

    FileSystemOptions opts = new FileSystemOptions();
    SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false); // I set it to
false, because user default dir is /sftp and it is obviously not root directory. As a workaround,
If I set it to true, it will work after also tweaking with the file path while resolving a
file, but semantics will be wrong, since the user directory is not root.

    SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 90000);

    String remoteFilePath = "sftp://myuser:mypass@myurl.sftpexample.com/sftp/abc/abc.txt";
    FileObject remoteFile = manager.resolveFile(remoteFilePath, opts); // Exception at this
line
    remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
  }
{code}


This is the underlying code responsible in

{code:java}
org.apache.commons.vfs.provider.sftp.SftpFileSystem
{code}
:
{code:java}
Boolean userDirIsRoot = SftpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(getFileSystemOptions());
String workingDirectory = getRootName().getPath();
if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
{
    try {
        channel.cd(workingDirectory); 
    } catch (SftpException e) {
        throw new FileSystemException("vfs.provider.sftp/change-work-directory.error", workingDirectory);
    }
}{code}

It purposelessly switches to root directory of filesystem. There is a fair use-case that root
directory doesn't have read access.

*Possible Fix:* It should not switch to root directory, rather it should switch to actual
final directory. This approach would be the safest. E.g. if the needed directory is '/sftp/abc'
then it can switch to that directory in above code, rather than switching to root.

Please also see related SO question:
https://stackoverflow.com/questions/48709971/why-apache-vfs-sftp-tries-to-switch-to-root-directory-even-when-not-needed


> SftpFileSystem Should not switch to root directory when not absolutely needed
> -----------------------------------------------------------------------------
>
>                 Key: VFS-651
>                 URL: https://issues.apache.org/jira/browse/VFS-651
>             Project: Commons VFS
>          Issue Type: Bug
>    Affects Versions: 2.0
>            Reporter: Syed Aqeel Ashiq
>            Priority: Major
>             Fix For: 2.3
>
>
> Consider a user X only has read/write access to let's say /sftp and /sftp/abc directory
on a sftp server. And default directory for user is /sftp
> In this case, we have to set userDirIsRoot to false, and thus vfs will try to switch
to root directory, which will fail due to lack of read permission.
> Consider following code:
> {code:java}
>   public void uploadFile(String localFilePath) throws FileSystemException {    
>     FileSystemManager manager = VFS.getManager();
>     FileObject localFile = manager.resolveFile(localFilePath);
>     FileSystemOptions opts = new FileSystemOptions();
>     SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false); // I set
it to false, because user default dir is /sftp and it is obviously not root directory. As
a workaround, If I set it to true, it will work after also tweaking with the file path while
resolving a file, but semantics will be wrong, since the user directory is not root.
>     SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 90000);
>     String remoteFilePath = "sftp://myuser:mypass@myurl.sftpexample.com/sftp/abc/abc.txt";
>     FileObject remoteFile = manager.resolveFile(remoteFilePath, opts); // Exception at
this line. Because this line tries to switch to root directory of sftp file system, which
fails due to lack of read permission on root directory. Switching to root directory is not
needed here at all. This is bug, although it works in most scenarios, since most of times,
permissions are available.
>     remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
>   }
> {code}
> This is the underlying code responsible in
> {code:java}
> org.apache.commons.vfs.provider.sftp.SftpFileSystem
> {code}
> :
> {code:java}
> Boolean userDirIsRoot = SftpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(getFileSystemOptions());
> String workingDirectory = getRootName().getPath();
> if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
{
>     try {
>         channel.cd(workingDirectory); 
>     } catch (SftpException e) {
>         throw new FileSystemException("vfs.provider.sftp/change-work-directory.error",
workingDirectory);
>     }
> }{code}
> It purposelessly switches to root directory of filesystem. There is a fair use-case that
root directory doesn't have read access.
> *Possible Fix:* It should not switch to root directory, rather it should switch to actual
final directory. This approach would be the safest. E.g. if the needed directory is '/sftp/abc'
then it can switch to that directory in above code, rather than switching to root.
> Please also see related SO question:
> https://stackoverflow.com/questions/48709971/why-apache-vfs-sftp-tries-to-switch-to-root-directory-even-when-not-needed



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message