From 9a724be5b3c762f4845a802adc5f535c83473469 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 10 May 2021 11:24:37 +0200 Subject: [PATCH] [SSHD-525] Server side implementation of posix-rename@openssh.com --- CHANGES.md | 2 +- .../server/AbstractSftpSubsystemHelper.java | 24 ++++++++++- .../helpers/OpenSSHExtensionsTest.java | 41 +++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 751f15bd5..b2d5345a4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,7 +21,7 @@ ## Minor code helpers -* [SSHD-525](https://issues.apache.org/jira/browse/SSHD-525) Added support for SFTP **client-side** ["posix-rename@openssh.com" +* [SSHD-525](https://issues.apache.org/jira/browse/SSHD-525) Added support for SFTP `posix-rename@openssh.com` extension](http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL?rev=1.28&content-type=text/x-cvsweb-markup) - see section 3.3 * [SSHD-1083](https://issues.apache.org/jira/browse/SSHD-1083) Relaxed required `Nio2Connector/Acceptor` required constructor arguments * [SSHD-1085](https://issues.apache.org/jira/browse/SSHD-1085) Added `CliLogger` + more verbosity on `SshClientMain` diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java index 05f6e7417..d2d2c5a68 100644 --- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java +++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/server/AbstractSftpSubsystemHelper.java @@ -99,6 +99,7 @@ import org.apache.sshd.sftp.common.extensions.openssh.FsyncExtensionParser; import org.apache.sshd.sftp.common.extensions.openssh.HardLinkExtensionParser; import org.apache.sshd.sftp.common.extensions.openssh.LSetStatExtensionParser; +import org.apache.sshd.sftp.common.extensions.openssh.PosixRenameExtensionParser; /** * @author Apache MINA SSHD Project @@ -130,7 +131,8 @@ NavigableMapBuilder. builder() Arrays.asList( new OpenSSHExtension(FsyncExtensionParser.NAME, "1"), new OpenSSHExtension(HardLinkExtensionParser.NAME, "1"), - new OpenSSHExtension(LSetStatExtensionParser.NAME, "1"))); + new OpenSSHExtension(LSetStatExtensionParser.NAME, "1"), + new OpenSSHExtension(PosixRenameExtensionParser.NAME, "1"))); public static final List DEFAULT_OPEN_SSH_EXTENSIONS_NAMES = Collections.unmodifiableList( NamedResource.getNameList(DEFAULT_OPEN_SSH_EXTENSIONS)); @@ -1226,6 +1228,23 @@ protected void doRename(int id, String oldPath, String newPath, Collection " + file3Path); + } catch (SftpException e) { + assertEquals("Mismatched status for failed rename of " + file2Path + " => " + file3Path, + SftpConstants.SSH_FX_NO_SUCH_FILE, e.getStatus()); + } + + try (OutputStream os = sftp.write(file2Path, SftpClient.MIN_WRITE_BUFFER_SIZE)) { + os.write("h".getBytes(StandardCharsets.UTF_8)); + } + + rename.posixRename(file1Path, file2Path); + } + } + @Test public void testFsync() throws IOException { Path targetPath = detectTargetFolder();