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 2018/11/27 07:39:12 UTC

mina-sshd git commit: Re-provide expected SCP byte count transfer and permissions when invoking 'ScpFileOpener#openRead/openWrite'

Repository: mina-sshd
Updated Branches:
  refs/heads/master 0de416b82 -> fd99d339d


Re-provide expected SCP byte count transfer and permissions when invoking 'ScpFileOpener#openRead/openWrite'


Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/fd99d339
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/fd99d339
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/fd99d339

Branch: refs/heads/master
Commit: fd99d339d7f631d34e2e521e4013963bbfaf6839
Parents: 0de416b
Author: Lyor Goldstein <lg...@apache.org>
Authored: Tue Nov 27 09:07:39 2018 +0200
Committer: Lyor Goldstein <lg...@apache.org>
Committed: Tue Nov 27 09:39:06 2018 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |  4 ++-
 README.md                                       | 35 +++++++++++++++++---
 .../client/scp/DefaultScpStreamResolver.java    | 11 ++++--
 .../apache/sshd/common/scp/ScpFileOpener.java   | 12 +++++--
 .../org/apache/sshd/common/scp/ScpHelper.java   |  5 +--
 .../common/scp/ScpSourceStreamResolver.java     |  7 +++-
 .../scp/helpers/DefaultScpFileOpener.java       | 18 ++++++----
 .../LocalFileScpSourceStreamResolver.java       |  6 ++--
 .../LocalFileScpTargetStreamResolver.java       | 15 ++++++---
 .../org/apache/sshd/client/scp/ScpTest.java     | 18 ++++++----
 10 files changed, 98 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 4daa2c7..2e44d00 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -79,7 +79,9 @@ and moved to `PublicKeyEntry` class.
 
 * All methods `ScpTransferEventListener` accept an extra `Session` parameter indicating the SSH client/server
 session context for the listener's invocation.
-    * Same applies for `ScpFileOpener`
+    * Same applies for `ScpFileOpener` and `ScpReceiveLineHandler`
+
+* Re-provide expected SCP byte count transfer and permissions when invoking `ScpFileOpener#openRead/openWrite`
 
 ## Behavioral changes and enhancements
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 529308c..14e8c88 100644
--- a/README.md
+++ b/README.md
@@ -762,17 +762,42 @@ A default `ScpClientCreator` instance is provided as part of the module - see `S
 As part of the `ScpClientCreator`, the SCP module also uses a `ScpFileOpener` instance in order to access
 the local files. The default implementation simply opens an [InputStream](https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html)
 or [OutputStream](https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html) on the requested local path. However,
-the user may replace it and intercept the calls - e.g., for logging, for wrapping/filtering the streams, etc... The user may
-attach a default opener that will be automatically attached to **all** clients created unless specifically overridden:
+the user may replace it and intercept the calls - e.g., for logging, monitoring transfer progess, wrapping/filtering the streams, etc...
+The user may attach a default opener that will be automatically attached to **all** clients created unless specifically overridden:
 
 ```java
 
+/**
+ * Example of using a non-default opener for monitoring and reporting on transfer progress
+ */
+public class ScpTransferProgressMonitor extends DefaultScpFileOpener {
+    public static ScpTransferProgressMonitor MONITOR = new ScpTransferProgressMonitor();
+
+    public ScpTransferProgressMonitor() {
+        super();
+    }
+
+    @Override
+    public InputStream openRead(
+            Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
+        return new MyProgressReportingInputStream(super.openRead(session, file, size, permissions, options), size /* how much is expected */);
+    }
+
+    @Override
+    public OutputStream openWrite(
+            Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
+        return new MyProgressReportingOutputStream(super.openWrite(session, file, size, permissions, options), size /* how much is expected */);
+    }
+}
+
 ClientSession session = ... obtain an instance ...
 ScpClientCreator creator = ... obtain an instance ...
-creator.setScpFileOpener(new MySuperDuperOpener());
+creator.setScpFileOpener(ScpTransferProgressMonitor.INSTANCE);
 
-ScpClient client1 = creator.createScpClient(session);   // <<== automatically uses MySuperDuperOpener
-ScpClient client2 = creator.createScpClient(session, new SomeOtherOpener());   // <<== uses SomeOtherOpener instead of MySuperDuperOpener
+ScpClient client1 = creator.createScpClient(session);   // <<== automatically uses ScpTransferProgressMonitor
+ScpClient client2 = creator.createScpClient(session, new SomeOtherOpener());   // <<== uses SomeOtherOpener instead of ScpTransferProgressMonitor
 
 ```
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/client/scp/DefaultScpStreamResolver.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/client/scp/DefaultScpStreamResolver.java b/sshd-scp/src/main/java/org/apache/sshd/client/scp/DefaultScpStreamResolver.java
index e6362b8..a7bd8ac 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/client/scp/DefaultScpStreamResolver.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/client/scp/DefaultScpStreamResolver.java
@@ -24,6 +24,7 @@ import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.attribute.PosixFilePermission;
 import java.util.Collection;
+import java.util.Set;
 
 import org.apache.sshd.common.scp.ScpSourceStreamResolver;
 import org.apache.sshd.common.scp.ScpTimestamp;
@@ -38,10 +39,12 @@ public class DefaultScpStreamResolver implements ScpSourceStreamResolver {
     private final Collection<PosixFilePermission> perms;
     private final ScpTimestamp time;
     private final long size;
-    private final java.io.InputStream local;
+    private final InputStream local;
     private final String cmd;
 
-    public DefaultScpStreamResolver(String name, Path mockPath, Collection<PosixFilePermission> perms, ScpTimestamp time, long size, InputStream local, String cmd) {
+    public DefaultScpStreamResolver(
+            String name, Path mockPath, Collection<PosixFilePermission> perms,
+            ScpTimestamp time, long size, InputStream local, String cmd) {
         this.name = name;
         this.mockPath = mockPath;
         this.perms = perms;
@@ -77,7 +80,9 @@ public class DefaultScpStreamResolver implements ScpSourceStreamResolver {
     }
 
     @Override
-    public InputStream resolveSourceStream(Session session, OpenOption... options) throws IOException {
+    public InputStream resolveSourceStream(
+            Session session, long length, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
         return local;
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpFileOpener.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpFileOpener.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpFileOpener.java
index 61b696a..3496b46 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpFileOpener.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpFileOpener.java
@@ -268,11 +268,15 @@ public interface ScpFileOpener {
      *
      * @param session The {@link Session} requesting the access
      * @param file The requested local file {@link Path}
+     * @param size The expected transfer bytes count
+     * @param permissions The requested file permissions
      * @param options The {@link OpenOption}s - may be {@code null}/empty
      * @return The open {@link InputStream} never {@code null}
      * @throws IOException If failed to open the file
      */
-    InputStream openRead(Session session, Path file, OpenOption... options) throws IOException;
+    InputStream openRead(
+        Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+            throws IOException;
 
     ScpSourceStreamResolver createScpSourceStreamResolver(Session session, Path path) throws IOException;
 
@@ -281,11 +285,15 @@ public interface ScpFileOpener {
      *
      * @param session The {@link Session} requesting the access
      * @param file The requested local file {@link Path}
+     * @param size The expected transfer byte count
+     * @param permissions The requested file permissions
      * @param options The {@link OpenOption}s - may be {@code null}/empty
      * @return The open {@link OutputStream} never {@code null}
      * @throws IOException If failed to open the file
      */
-    OutputStream openWrite(Session session, Path file, OpenOption... options) throws IOException;
+    OutputStream openWrite(
+        Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+            throws IOException;
 
     ScpTargetStreamResolver createScpTargetStreamResolver(Session session, Path path) throws IOException;
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpHelper.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
index 6e98a4f..e51d2f4 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
@@ -328,7 +328,8 @@ public class ScpHelper extends AbstractLoggingBean implements SessionHolder<Sess
 
         try (
                 InputStream is = new LimitInputStream(this.in, length);
-                OutputStream os = resolver.resolveTargetStream(getSession(), name, length, perms)
+                OutputStream os = resolver.resolveTargetStream(
+                    getSession(), name, length, perms, IoUtils.EMPTY_OPEN_OPTIONS)
         ) {
             ack();
 
@@ -553,7 +554,7 @@ public class ScpHelper extends AbstractLoggingBean implements SessionHolder<Sess
         validateAckReplyCode(cmd, resolver, readyCode, false);
 
         Session session = getSession();
-        try (InputStream in = resolver.resolveSourceStream(session)) {
+        try (InputStream in = resolver.resolveSourceStream(session, fileSize, perms, IoUtils.EMPTY_OPEN_OPTIONS)) {
             Path path = resolver.getEventListenerFilePath();
             listener.startFileEvent(session, FileOperation.SEND, path, fileSize, perms);
             try {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpSourceStreamResolver.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpSourceStreamResolver.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpSourceStreamResolver.java
index feeecbc..01a15bd 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpSourceStreamResolver.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/ScpSourceStreamResolver.java
@@ -25,6 +25,7 @@ import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.attribute.PosixFilePermission;
 import java.util.Collection;
+import java.util.Set;
 
 import org.apache.sshd.common.session.Session;
 
@@ -65,9 +66,13 @@ public interface ScpSourceStreamResolver {
 
     /**
      * @param session The {@link Session} through which file is transmitted
+     * @param fileSize The expected transfer byte count
+     * @param permissions The requested file permissions
      * @param options The {@link OpenOption}s may be {@code null}/empty
      * @return The {@link InputStream} containing the data to be uploaded
      * @throws IOException If failed to create the stream
      */
-    InputStream resolveSourceStream(Session session, OpenOption... options) throws IOException;
+    InputStream resolveSourceStream(
+        Session session, long fileSize, Set<PosixFilePermission> permissions, OpenOption... options)
+            throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/DefaultScpFileOpener.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/DefaultScpFileOpener.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/DefaultScpFileOpener.java
index 7516e8c..e0fd39c 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/DefaultScpFileOpener.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/DefaultScpFileOpener.java
@@ -25,7 +25,9 @@ import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
+import java.nio.file.attribute.PosixFilePermission;
 import java.util.Arrays;
+import java.util.Set;
 
 import org.apache.sshd.common.scp.ScpFileOpener;
 import org.apache.sshd.common.scp.ScpSourceStreamResolver;
@@ -44,20 +46,24 @@ public class DefaultScpFileOpener extends AbstractLoggingBean implements ScpFile
     }
 
     @Override
-    public InputStream openRead(Session session, Path file, OpenOption... options) throws IOException {
+    public InputStream openRead(
+            Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
         if (log.isDebugEnabled()) {
-            log.debug("openRead({}) file={}, options={}",
-                      session, file, Arrays.toString(options));
+            log.debug("openRead({}) size={}, permissions={}, file={}, options={}",
+                  session, size, permissions, file, Arrays.toString(options));
         }
 
         return Files.newInputStream(file, options);
     }
 
     @Override
-    public OutputStream openWrite(Session session, Path file, OpenOption... options) throws IOException {
+    public OutputStream openWrite(
+            Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
         if (log.isDebugEnabled()) {
-            log.debug("openWrite({}) file={}, options={}",
-                      session, file, Arrays.toString(options));
+            log.debug("openWrite({}) size={}, permissions={}, file={}, options={}",
+                  session, size, permissions, file, Arrays.toString(options));
         }
 
         return Files.newOutputStream(file, options);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpSourceStreamResolver.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpSourceStreamResolver.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpSourceStreamResolver.java
index cdc47c6..2c57d26 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpSourceStreamResolver.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpSourceStreamResolver.java
@@ -87,8 +87,10 @@ public class LocalFileScpSourceStreamResolver extends AbstractLoggingBean implem
     }
 
     @Override
-    public InputStream resolveSourceStream(Session session, OpenOption... options) throws IOException {
-        return opener.openRead(session, getEventListenerFilePath(), options);
+    public InputStream resolveSourceStream(
+            Session session, long length, Set<PosixFilePermission> permissions, OpenOption... options)
+                throws IOException {
+        return opener.openRead(session, getEventListenerFilePath(), length, permissions, options);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpTargetStreamResolver.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpTargetStreamResolver.java b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpTargetStreamResolver.java
index 6b57443..b40ea79 100644
--- a/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpTargetStreamResolver.java
+++ b/sshd-scp/src/main/java/org/apache/sshd/common/scp/helpers/LocalFileScpTargetStreamResolver.java
@@ -62,8 +62,9 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
     }
 
     @Override
-    public OutputStream resolveTargetStream(Session session, String name, long length,
-            Set<PosixFilePermission> perms, OpenOption... options) throws IOException {
+    public OutputStream resolveTargetStream(
+            Session session, String name, long length, Set<PosixFilePermission> perms, OpenOption... options)
+                throws IOException {
         if (file != null) {
             throw new StreamCorruptedException("resolveTargetStream(" + name + ")[" + perms + "] already resolved: " + file);
         }
@@ -110,7 +111,7 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
             log.trace("resolveTargetStream(" + name + "): " + file);
         }
 
-        return opener.openWrite(session, file, options);
+        return opener.openWrite(session, file, length, perms, options);
     }
 
     @Override
@@ -123,7 +124,9 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
     }
 
     @Override
-    public void postProcessReceivedData(String name, boolean preserve, Set<PosixFilePermission> perms, ScpTimestamp time) throws IOException {
+    public void postProcessReceivedData(
+            String name, boolean preserve, Set<PosixFilePermission> perms, ScpTimestamp time)
+                throws IOException {
         if (file == null) {
             throw new StreamCorruptedException("postProcessReceivedData(" + name + ")[" + perms + "] No currently resolved data");
         }
@@ -133,7 +136,9 @@ public class LocalFileScpTargetStreamResolver extends AbstractLoggingBean implem
         }
     }
 
-    protected void updateFileProperties(String name, Path path, Set<PosixFilePermission> perms, ScpTimestamp time) throws IOException {
+    protected void updateFileProperties(
+            String name, Path path, Set<PosixFilePermission> perms, ScpTimestamp time)
+                throws IOException {
         boolean traceEnabled = log.isTraceEnabled();
         if (traceEnabled) {
             log.trace("updateFileProperties(" + name + ")[" + path + "] permissions: " + perms);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/fd99d339/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
----------------------------------------------------------------------
diff --git a/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java b/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
index 62f6a3e..2611fff 100644
--- a/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
+++ b/sshd-scp/src/test/java/org/apache/sshd/client/scp/ScpTest.java
@@ -745,17 +745,23 @@ public class ScpTest extends BaseTestSupport {
             }
 
             @Override
-            public InputStream openRead(Session session, Path file, OpenOption... options) throws IOException {
+            public InputStream openRead(
+                    Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                        throws IOException {
                 int count = readCount.incrementAndGet();
-                outputDebugMessage("openRead(%s)[%s] count=%d", session, file, count);
-                return super.openRead(session, file, options);
+                outputDebugMessage("openRead(%s)[size=%d][%s] permissions=%s: count=%d",
+                    session, size, file, permissions, count);
+                return super.openRead(session, file, size, permissions, options);
             }
 
             @Override
-            public OutputStream openWrite(Session session, Path file, OpenOption... options) throws IOException {
+            public OutputStream openWrite(
+                    Session session, Path file, long size, Set<PosixFilePermission> permissions, OpenOption... options)
+                        throws IOException {
                 int count = writeCount.incrementAndGet();
-                outputDebugMessage("openWrite(%s)[%s] count=%d", session, file, count);
-                return super.openWrite(session, file, options);
+                outputDebugMessage("openWrite(%s)[size=%d][%s] permissions=%s: count=%d",
+                    session, size, file, permissions, count);
+                return super.openWrite(session, file, size, permissions, options);
             }
         }