[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mina-commits
Subject:    [mina-sshd] branch master updated: Propagate SCP file transfer ACK data to ScpTransferListener befor
From:       lgoldstein () apache ! org
Date:       2020-12-04 15:34:50
Message-ID: 160709609092.8770.17638887225806095781 () gitbox ! apache ! org
[Download RAW message or body]

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 270caaa  Propagate SCP file transfer ACK data to ScpTransferListener before \
validating it 270caaa is described below

commit 270caaafdbfddfba05f0b8de2ed69b237b557f54
Author: Lyor Goldstein <lgoldstein@apache.org>
AuthorDate: Fri Dec 4 17:34:17 2020 +0200

    Propagate SCP file transfer ACK data to ScpTransferListener before validating it
---
 CHANGES.md                                         |  1 +
 .../org/apache/sshd/cli/client/ScpCommandMain.java | 11 ++++++++++-
 .../java/org/apache/sshd/scp/common/ScpHelper.java | 22 +++++++++++++++++-----
 .../sshd/scp/common/ScpTransferEventListener.java  | 19 +++++++++++++++++++
 .../sshd/scp/client/AbstractScpTestSupport.java    | 10 ++++++++++
 5 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 0f0d63c..12357d2 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -33,6 +33,7 @@ or `-key-file` command line option.
 * [SSHD-1079](https://issues.apache.org/jira/browse/SSHD-1079) Experimental async \
                mode on the local port forwarder
 * [SSHD-1086](https://issues.apache.org/jira/browse/SSHD-1086) Added SFTP aware \
                directory scanning helper classes
 * [SSHD-1089](https://issues.apache.org/jira/browse/SSHD-1089) Added wrappers for \
one-time single session usage of SFTP/SCP clients +* Propagate SCP file transfer ACK \
data to ScpTransferListener before validating it.  
 ## Behavioral changes and enhancements
 
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/client/ScpCommandMain.java \
b/sshd-cli/src/main/java/org/apache/sshd/cli/client/ScpCommandMain.java index \
                cfaf2d8..3990cd9 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/client/ScpCommandMain.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/client/ScpCommandMain.java
@@ -54,6 +54,7 @@ import org.apache.sshd.scp.client.ScpRemote2RemoteTransferHelper;
 import org.apache.sshd.scp.client.ScpRemote2RemoteTransferListener;
 import org.apache.sshd.scp.common.ScpLocation;
 import org.apache.sshd.scp.common.ScpTransferEventListener;
+import org.apache.sshd.scp.common.helpers.ScpAckInfo;
 import org.apache.sshd.scp.common.helpers.ScpReceiveDirCommandDetails;
 import org.apache.sshd.scp.common.helpers.ScpReceiveFileCommandDetails;
 import org.apache.sshd.scp.common.helpers.ScpTimestampCommandDetails;
@@ -241,7 +242,7 @@ public class ScpCommandMain extends SshClientCliSupport {
 
     /* -------------------------------------------------------------------------------- \
*/  
-    @SuppressWarnings("checkstyle:ParameterNumber")
+    @SuppressWarnings({ "checkstyle:ParameterNumber", "checkstyle:anoninnerlength" \
})  public static void xferLocalToRemote(
             BufferedReader stdin, PrintStream stdout, PrintStream stderr, String[] \
                args,
             ScpLocation source, ScpLocation target, Collection<Option> options,
@@ -285,6 +286,14 @@ public class ScpCommandMain extends SshClientCliSupport {
                         logEvent("endFileEvent", session, op, file, length, perms, \
thrown);  }
 
+                    @Override
+                    public void handleFileEventAckInfo(
+                            Session session, FileOperation op, Path file, long \
length, +                            Set<PosixFilePermission> perms, ScpAckInfo \
ackInfo) +                            throws IOException {
+                        logEvent("ackInfo(" + ackInfo + ")", session, op, file, \
length, perms, null); +                    }
+
                     private void logEvent(
                             String name, Session session, FileOperation op, Path \
                file, long length,
                             Collection<PosixFilePermission> perms, Throwable thrown) \
                {
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java \
b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java index \
                5db850c..a22bdcb 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpHelper.java
@@ -354,12 +354,13 @@ public class ScpHelper extends AbstractLoggingBean implements \
SessionHolder<Sess  Session session = getSession();
         String name = details.getName();
         Set<PosixFilePermission> perms = details.getPermissions();
+        Path file;
         try (InputStream is = new LimitInputStream(this.in, length);
              OutputStream os = resolver.resolveTargetStream(session, name, length, \
perms,  IoUtils.EMPTY_OPEN_OPTIONS)) {
             sendOk();
 
-            Path file = resolver.getEventListenerFilePath();
+            file = resolver.getEventListenerFilePath();
             listener.startFileEvent(session, FileOperation.RECEIVE, file, length, \
perms);  try {
                 IoUtils.copy(is, os, bufSize);
@@ -379,7 +380,7 @@ public class ScpHelper extends AbstractLoggingBean implements \
SessionHolder<Sess  if (debugEnabled) {
             log.debug("receiveStream({})[{}] ACK={}", this, resolver, ackInfo);
         }
-        validateAckReplyCode("receiveStream", resolver, ackInfo);
+        validateFileOperationAckReplyCode(header, session, FileOperation.RECEIVE, \
file, length, perms, ackInfo);  }
 
     public String readLine() throws IOException {
@@ -564,8 +565,9 @@ public class ScpHelper extends AbstractLoggingBean implements \
SessionHolder<Sess  validateAckReplyCode(cmd, resolver, ackInfo);
 
         Session session = getSession();
+        Path path;
         try (InputStream in = resolver.resolveSourceStream(session, fileSize, perms, \
                IoUtils.EMPTY_OPEN_OPTIONS)) {
-            Path path = resolver.getEventListenerFilePath();
+            path = resolver.getEventListenerFilePath();
             listener.startFileEvent(session, FileOperation.SEND, path, fileSize, \
perms);  try {
                 IoUtils.copy(in, out, bufSize);
@@ -582,7 +584,8 @@ public class ScpHelper extends AbstractLoggingBean implements \
SessionHolder<Sess  if (debugEnabled) {
             log.debug("sendStream({})[{}] command='{}' ACK={}", this, resolver, cmd, \
ackInfo);  }
-        validateAckReplyCode("sendStream", resolver, ackInfo);
+
+        validateFileOperationAckReplyCode(cmd, session, FileOperation.SEND, path, \
fileSize, perms, ackInfo);  }
 
     protected void validateOperationReadyCode(String command, Object location, \
ScpAckInfo ackInfo) @@ -590,6 +593,14 @@ public class ScpHelper extends \
AbstractLoggingBean implements SessionHolder<Sess  validateCommandStatusCode(command, \
location, ackInfo, false);  }
 
+    protected void validateFileOperationAckReplyCode(
+            String command, Session session, FileOperation op, Path file,
+            long fileSize, Set<PosixFilePermission> perms, ScpAckInfo ackInfo)
+            throws IOException {
+        listener.handleFileEventAckInfo(session, op, file, fileSize, perms, \
ackInfo); +        validateAckReplyCode(command, file, ackInfo);
+    }
+
     protected void validateAckReplyCode(String command, Object location, ScpAckInfo \
ackInfo)  throws IOException {
         validateCommandStatusCode(command, location, ackInfo, false);
@@ -695,7 +706,8 @@ public class ScpHelper extends AbstractLoggingBean implements \
SessionHolder<Sess  if (debugEnabled) {
             log.debug("sendDir({})[{}] 'E' command ACK={}", this, path, ackInfo);
         }
-        validateAckReplyCode(ScpDirEndCommandDetails.HEADER, path, ackInfo);
+
+        validateAckReplyCode(cmd, path, ackInfo);
     }
 
     protected ScpAckInfo sendAcknowledgedCommand(String cmd) throws IOException {
diff --git a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpTransferEventListener.java \
b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpTransferEventListener.java \
                index dc685f4..2cf9996 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpTransferEventListener.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/scp/common/ScpTransferEventListener.java
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.util.SshdEventListener;
+import org.apache.sshd.scp.common.helpers.ScpAckInfo;
 
 /**
  * Can be registered in order to receive events about SCP transfers
@@ -78,6 +79,24 @@ public interface ScpTransferEventListener extends \
SshdEventListener {  }
 
     /**
+     * Called after {@link #endFileEvent(Session, FileOperation, Path, long, Set, \
Throwable)} if no exception was thrown +     * and the peer's ACK was successfully \
read +     *
+     * @param  session     The client/server {@link Session} through which the \
transfer is being executed +     * @param  op          The {@link FileOperation}
+     * @param  file        The <U>local</U> referenced file {@link Path}
+     * @param  length      Size (in bytes) of transferred data
+     * @param  perms       A {@link Set} of {@link PosixFilePermission}s to be \
applied once transfer is complete +     * @param  ackInfo     The {@link ScpAckInfo} \
received after a file transfer - <U>before</U> validating it +     * @throws \
IOException If failed to handle the event +     */
+    default void handleFileEventAckInfo(
+            Session session, FileOperation op, Path file, long length, \
Set<PosixFilePermission> perms, ScpAckInfo ackInfo) +            throws IOException {
+        // ignored
+    }
+
+    /**
      * @param  session     The client/server {@link Session} through which the \
                transfer is being executed
      * @param  op          The {@link FileOperation}
      * @param  file        The <U>local</U> referenced folder {@link Path}
diff --git a/sshd-scp/src/test/java/org/apache/sshd/scp/client/AbstractScpTestSupport.java \
b/sshd-scp/src/test/java/org/apache/sshd/scp/client/AbstractScpTestSupport.java index \
                317e1f5..80bd14c 100644
--- a/sshd-scp/src/test/java/org/apache/sshd/scp/client/AbstractScpTestSupport.java
+++ b/sshd-scp/src/test/java/org/apache/sshd/scp/client/AbstractScpTestSupport.java
@@ -32,6 +32,7 @@ import org.apache.sshd.common.file.FileSystemFactory;
 import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.scp.common.ScpTransferEventListener;
+import org.apache.sshd.scp.common.helpers.ScpAckInfo;
 import org.apache.sshd.scp.server.ScpCommandFactory;
 import org.apache.sshd.server.SshServer;
 import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
@@ -45,6 +46,7 @@ import org.junit.Before;
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
 public abstract class AbstractScpTestSupport extends BaseTestSupport {
+    @SuppressWarnings("checkstyle:anoninnerlength")
     protected static final ScpTransferEventListener DEBUG_LISTENER = new \
ScpTransferEventListener() {  @Override
         public void startFolderEvent(
@@ -70,6 +72,14 @@ public abstract class AbstractScpTestSupport extends \
                BaseTestSupport {
             logEvent("endFileEvent", s, op, file, true, length, perms, thrown);
         }
 
+        @Override
+        public void handleFileEventAckInfo(
+                Session session, FileOperation op, Path file, long length,
+                Set<PosixFilePermission> perms, ScpAckInfo ackInfo)
+                throws IOException {
+            logEvent("ackInfo(" + ackInfo + ")", session, op, file, true, length, \
perms, null); +        }
+
         private void logEvent(
                 String type, Session s, FileOperation op, Path path, boolean isFile,
                 long length, Collection<PosixFilePermission> perms, Throwable t) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic