[
https://issues.apache.org/jira/browse/SSHD-1188?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Peters updated SSHD-1188:
--------------------------------
Affects Version/s: 2.7.0
> OpenMode and CopyMode is not honored as expected in version > 4 of SFTP api
> ---------------------------------------------------------------------------
>
> Key: SSHD-1188
> URL: https://issues.apache.org/jira/browse/SSHD-1188
> Project: MINA SSHD
> Issue Type: Bug
> Affects Versions: 2.5.1, 2.7.0
> Reporter: Martin Peters
> Priority: Major
>
> When calling
> {code:java}
> sftpClient.write(remoteFileName, OpenMode.Create, OpenMode.Write,
> OpenMode.Exclusive);{code}
> I expect the operation to succeed if no file with that name exists and fail
> if a file with that name exists. This works as expected when using a
> SftpVersionSelector to force version 3 or 4. Version 5 or 6 will overwrite
> the existing file.
>
> Similarly I expect the line below to fail when newName already exists.
> {code:java}
> sftpClient.rename(oldName, newName);
> {code}
> This works as expected in version 3 or 4. In version 5 or 6 the existing file
> is overwritten.
> I expect the following line which is not supported in version 3 or 4 to fail
> when the newName file already exists when using 5 or 6 but it still
> overwrites any existing file:
> {code:java}
> sftpClient.rename(oldName, newName, CopyMode.Atomic);
> {code}
>
> I'm using 2.5 but issue seems to be the same in 2.7.
>
> I have tested this using apache mina server & client, including a quick and
> dirty test to demonstrate the OpenMode issue:
> {code:java}
> import static org.junit.Assert.assertEquals;
> import static org.junit.Assert.assertFalse;
> import java.io.IOException;
> import java.time.Duration;
> import java.util.Collections;
> import java.util.HashMap;
> import java.util.Map;
> import org.apache.sshd.client.SshClient;
> import org.apache.sshd.client.session.ClientSession;
> import org.apache.sshd.client.subsystem.sftp.SftpClient;
> import org.apache.sshd.client.subsystem.sftp.SftpClientFactory;
> import org.apache.sshd.client.subsystem.sftp.SftpVersionSelector;
> import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
> import org.apache.sshd.server.SshServer;
> import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
> import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory;
> import org.junit.Before;
> import org.junit.Rule;
> import org.junit.Test;
> import org.junit.rules.TemporaryFolder;
> public class BugMVP {
> @Rule
> public TemporaryFolder testFolder = new TemporaryFolder();
> private static final String USERNAME = "username";
> private static final String PASSWORD = "password";
> private SshServer sshd;
> @Before
> public void prepare() throws IOException {
> Map<String, String> roots = new HashMap<>();
> roots.put(USERNAME, testFolder.getRoot().getAbsolutePath());
> sshd = SshServer.setUpDefaultServer();
> sshd.setFileSystemFactory(new
> VirtualFileSystemFactory(testFolder.getRoot().toPath()));
> sshd.setPort(42414);
> sshd.setSubsystemFactories(Collections.singletonList(new
> SftpSubsystemFactory()));
> sshd.setKeyPairProvider(new
> SimpleGeneratorHostKeyProvider(testFolder.newFile("hostkey.ser").toPath()));
> sshd.setPasswordAuthenticator((username, password, session) ->
> username.equals(USERNAME) && password.equals(PASSWORD));
> sshd.start();
> testFolder.newFolder("somefolder");
> testFolder.newFile("somefolder/foo.bar");
> }
> @Test
> public void testUploadingFileUsingDefaultVersion6_shouldFail() throws
> IOException {
> SshClient client = SshClient.setUpDefaultClient();
> client.start();
> ClientSession clientSession = client.connect(USERNAME, "localhost",
> 42414)
> .verify(Duration.ofSeconds(10))
> .getSession();
> clientSession.addPasswordIdentity(PASSWORD);
> clientSession.auth().verify(Duration.ofSeconds(10));
> SftpClientFactory factory = SftpClientFactory.instance();
> SftpClient sftpClient = factory.createSftpClient(clientSession);
> try (sftpClient; clientSession) {
> sftpClient.write("somefolder/foo.bar", SftpClient.OpenMode.Write,
> SftpClient.OpenMode.Create, SftpClient.OpenMode.Exclusive);
> assertFalse(true);
> } catch (IOException e){
> assertEquals("File/Directory already exists",e.getMessage());
> }
> }
> @Test
> public void testUploadingFileUsingV4_shouldFail() throws IOException {
> SshClient client = SshClient.setUpDefaultClient();
> client.start();
> ClientSession clientSession = client.connect(USERNAME, "localhost",
> 42414)
> .verify(Duration.ofSeconds(10))
> .getSession();
> clientSession.addPasswordIdentity(PASSWORD);
> clientSession.auth().verify(Duration.ofSeconds(10));
> SftpVersionSelector versionSelector = (session, initial, current,
> available) -> {
> return 4;
> };
> SftpClientFactory factory = SftpClientFactory.instance();
> SftpClient sftpClient = factory.createSftpClient(clientSession,
> versionSelector);
> try (sftpClient; clientSession) {
> sftpClient.write("somefolder/foo.bar", SftpClient.OpenMode.Write,
> SftpClient.OpenMode.Create, SftpClient.OpenMode.Exclusive);
> assertFalse(true);
> } catch (IOException e){
> assertEquals("File/Directory already exists",e.getMessage());
> }
> }
> }
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]