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);
}
}