You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2021/01/14 16:52:23 UTC

[mina-sshd] branch master updated: [SSHD-525] Added support for sftp client posix rename

This is an automated email from the ASF dual-hosted git repository.

lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git


The following commit(s) were added to refs/heads/master by this push:
     new 498bf10  [SSHD-525] Added support for sftp client posix rename
498bf10 is described below

commit 498bf10e58d47d2899fe42c3dda4074b2ec63ca8
Author: =?UTF-8?q?Christian=20Schou=20J=C3=B8dal?= <CS...@telenor.dk>
AuthorDate: Thu Jan 14 18:45:19 2021 +0200

    [SSHD-525] Added support for sftp client posix rename
---
 CHANGES.md                                         |  2 +
 .../extensions/BuiltinSftpClientExtensions.java    | 10 +++++
 .../openssh/OpenSSHPosixRenameExtension.java       | 31 ++++++++++++++
 .../helpers/OpenSSHPosixRenameExtensionImpl.java   | 48 ++++++++++++++++++++++
 4 files changed, 91 insertions(+)

diff --git a/CHANGES.md b/CHANGES.md
index b2bc036..feaa362 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -21,6 +21,8 @@
 * [SSHD-1109](https://issues.apache.org/jira/browse/SSHD-1109) Provide full slf4j logger capabilities to CliLogger + use it in all CLI classes
 * [SSHD-1110](https://issues.apache.org/jira/browse/SSHD-1110) Replace `Class#newInstance()` calls with `Class#getDefaultConstructor().newInstance()`
 * [SSHD-1111](https://issues.apache.org/jira/browse/SSHD-1111) Fixed SshClientCliSupport compression option detection
+* [SSHD-525] Added support for SFTP **client-side** ["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
 
 ## Behavioral changes and enhancements
 
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java
index 3a0a293..4e15251 100644
--- a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/BuiltinSftpClientExtensions.java
@@ -35,15 +35,18 @@ import org.apache.sshd.sftp.client.extensions.helpers.MD5FileExtensionImpl;
 import org.apache.sshd.sftp.client.extensions.helpers.MD5HandleExtensionImpl;
 import org.apache.sshd.sftp.client.extensions.helpers.SpaceAvailableExtensionImpl;
 import org.apache.sshd.sftp.client.extensions.openssh.OpenSSHFsyncExtension;
+import org.apache.sshd.sftp.client.extensions.openssh.OpenSSHPosixRenameExtension;
 import org.apache.sshd.sftp.client.extensions.openssh.OpenSSHStatHandleExtension;
 import org.apache.sshd.sftp.client.extensions.openssh.OpenSSHStatPathExtension;
 import org.apache.sshd.sftp.client.extensions.openssh.helpers.OpenSSHFsyncExtensionImpl;
+import org.apache.sshd.sftp.client.extensions.openssh.helpers.OpenSSHPosixRenameExtensionImpl;
 import org.apache.sshd.sftp.client.extensions.openssh.helpers.OpenSSHStatHandleExtensionImpl;
 import org.apache.sshd.sftp.client.extensions.openssh.helpers.OpenSSHStatPathExtensionImpl;
 import org.apache.sshd.sftp.common.SftpConstants;
 import org.apache.sshd.sftp.common.extensions.ParserUtils;
 import org.apache.sshd.sftp.common.extensions.openssh.FstatVfsExtensionParser;
 import org.apache.sshd.sftp.common.extensions.openssh.FsyncExtensionParser;
+import org.apache.sshd.sftp.common.extensions.openssh.PosixRenameExtensionParser;
 import org.apache.sshd.sftp.common.extensions.openssh.StatVfsExtensionParser;
 
 /**
@@ -119,6 +122,13 @@ public enum BuiltinSftpClientExtensions implements SftpClientExtensionFactory {
                 SftpClient client, RawSftpClient raw, Map<String, byte[]> extensions, Map<String, ?> parsed) {
             return new OpenSSHStatPathExtensionImpl(client, raw, extensions);
         }
+    },
+    OPENSSH_POSIX_RENAME(PosixRenameExtensionParser.NAME, OpenSSHPosixRenameExtension.class) {
+        @Override // co-variant return
+        public OpenSSHPosixRenameExtension create(
+                SftpClient client, RawSftpClient raw, Map<String, byte[]> extensions, Map<String, ?> parsed) {
+            return new OpenSSHPosixRenameExtensionImpl(client, raw, extensions);
+        }
     };
 
     public static final Set<BuiltinSftpClientExtensions> VALUES
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/OpenSSHPosixRenameExtension.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/OpenSSHPosixRenameExtension.java
new file mode 100644
index 0000000..92533f6
--- /dev/null
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/OpenSSHPosixRenameExtension.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sshd.sftp.client.extensions.openssh;
+
+import java.io.IOException;
+
+import org.apache.sshd.sftp.client.extensions.SftpClientExtension;
+
+/**
+ * Implements the &quot;posix-rename@openssh.com&quot; extension
+ */
+public interface OpenSSHPosixRenameExtension extends SftpClientExtension {
+    void posixRename(String oldPath, String newPath) throws IOException;
+}
diff --git a/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHPosixRenameExtensionImpl.java b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHPosixRenameExtensionImpl.java
new file mode 100644
index 0000000..f75ee4c
--- /dev/null
+++ b/sshd-sftp/src/main/java/org/apache/sshd/sftp/client/extensions/openssh/helpers/OpenSSHPosixRenameExtensionImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sshd.sftp.client.extensions.openssh.helpers;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.sshd.common.util.buffer.Buffer;
+import org.apache.sshd.sftp.client.RawSftpClient;
+import org.apache.sshd.sftp.client.SftpClient;
+import org.apache.sshd.sftp.client.extensions.helpers.AbstractSftpClientExtension;
+import org.apache.sshd.sftp.client.extensions.openssh.OpenSSHPosixRenameExtension;
+import org.apache.sshd.sftp.common.extensions.openssh.PosixRenameExtensionParser;
+
+/**
+ * @author <a href="mailto:chr.joedal@gmail.com">Christian Schou Jødal</a>
+ */
+public class OpenSSHPosixRenameExtensionImpl extends AbstractSftpClientExtension implements OpenSSHPosixRenameExtension {
+    public OpenSSHPosixRenameExtensionImpl(SftpClient client, RawSftpClient raw, Map<String, byte[]> extensions) {
+        super(PosixRenameExtensionParser.NAME, client, raw, extensions);
+    }
+
+    @Override
+    public void posixRename(String oldPath, String newPath) throws IOException {
+        Buffer buffer = getCommandBuffer(Integer.BYTES + oldPath.length() + newPath.length());
+        putTarget(buffer, oldPath);
+        putTarget(buffer, newPath);
+
+        checkExtendedReplyBuffer(receive(sendExtendedCommand(buffer)));
+    }
+}