[ 
https://issues.apache.org/jira/browse/VFS-651?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16366859#comment-16366859
 ] 

Otto Fowler commented on VFS-651:
---------------------------------

Oh, tweaking.  Right.

I'm sorry [~aqeel613], I'm not a committer or even a contributor on this 
project.  I use it on my apache project and saw your mail on the list and was 
curious so I thought I would take a look.

As far as I can see it is working as designed.  It makes sense to me for a file 
system to work like this, but if this where just a sftp client maybe it would 
be different.

Maybe someone who participated in the design will be able to explain the 
reasons better than what I can say just from going through the code and 
documentation.

> 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:myp...@myurl.sftpexample.com/sftp/abc/abc.txt";;
>     // Exception at the following line
>     FileObject remoteFile = manager.resolveFile(remoteFilePath, opts);
>     // Exception at the line above line. Because this line tries to switch to 
>     // root directory of sftp file system, whichfails 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)

Reply via email to