You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by gn...@apache.org on 2015/03/18 11:59:14 UTC

mina-sshd git commit: [SSHD-429] Take into account local file separator when sending/receiving files via SCP

Repository: mina-sshd
Updated Branches:
  refs/heads/master 2cd0ebbaf -> 0639c7c0b


[SSHD-429] Take into account local file separator when sending/receiving files via SCP

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

Branch: refs/heads/master
Commit: 0639c7c0b645db20529ab57299e030584d24cfdd
Parents: 2cd0ebb
Author: Guillaume Nodet <gn...@apache.org>
Authored: Wed Mar 18 11:57:27 2015 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Mar 18 11:57:27 2015 +0100

----------------------------------------------------------------------
 .../org/apache/sshd/common/scp/ScpHelper.java   | 27 +++++++++++++++-----
 .../apache/sshd/server/command/ScpCommand.java  |  2 +-
 .../src/test/java/org/apache/sshd/ScpTest.java  | 20 ++++++++++-----
 3 files changed, 34 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0639c7c0/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java b/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
index 0583928..7c8897c 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/scp/ScpHelper.java
@@ -42,6 +42,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.scp.ScpTransferEventListener.FileOperation;
 import org.apache.sshd.common.util.DirectoryScanner;
+import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.IoUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -265,10 +266,14 @@ public class ScpHelper {
         } else {
             throw new IOException("Can not write to " + path);
         }
-        if (Files.exists(file) && Files.isDirectory(file)) {
-            throw new IOException("File is a directory: " + file);
-        } else if (Files.exists(file) && !Files.isWritable(file)) {
-            throw new IOException("Can not write to file: " + file);
+
+        if (Files.exists(file)) {
+            if (Files.isDirectory(file)) {
+                throw new IOException("File is a directory: " + file);
+            }
+            if (!Files.isWritable(file)) {
+                throw new IOException("Can not write to file: " + file);
+            }
         }
 
         try (
@@ -335,7 +340,7 @@ public class ScpHelper {
                 }
                 String[] included = new DirectoryScanner(basedir, pattern).scan();
                 for (String path : included) {
-                    Path file = resolveLocalPath(basedir + "/" + path);
+                    Path file = resolveLocalPath(basedir, path);
                     if (Files.isRegularFile(file)) {
                         sendFile(file, preserve, bufferSize);
                     } else if (Files.isDirectory(file)) {
@@ -357,7 +362,7 @@ public class ScpHelper {
                     basedir = pattern.substring(0, lastSep);
                     pattern = pattern.substring(lastSep + 1);
                 }
-                Path file = resolveLocalPath(basedir + "/" + pattern);
+                Path file = resolveLocalPath(basedir, pattern);
                 if (!Files.exists(file)) {
                     throw new IOException(file + ": no such file or directory");
                 }
@@ -376,7 +381,15 @@ public class ScpHelper {
         }
     }
 
-    protected Path resolveLocalPath(String path) {
+    public Path resolveLocalPath(String basedir, String subpath) {
+        if (GenericUtils.isEmpty(basedir)) {
+            return resolveLocalPath(subpath);
+        } else {
+            return resolveLocalPath(basedir + "/" + subpath);
+        }
+    }
+
+    public Path resolveLocalPath(String path) {
         String localPath = (path == null) ? null : path.replace('/', File.separatorChar);
         return fileSystem.getPath(localPath);
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0639c7c0/sshd-core/src/main/java/org/apache/sshd/server/command/ScpCommand.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/command/ScpCommand.java b/sshd-core/src/main/java/org/apache/sshd/server/command/ScpCommand.java
index ade3866..f8d3635 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/command/ScpCommand.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/command/ScpCommand.java
@@ -212,7 +212,7 @@ public class ScpCommand implements Command, Runnable, FileSystemAware {
         ScpHelper helper = new ScpHelper(in, out, fileSystem, listener);
         try {
             if (optT) {
-                helper.receive(fileSystem.getPath(path), optR, optD, optP, receiveBufferSize);
+                helper.receive(helper.resolveLocalPath(path), optR, optD, optP, receiveBufferSize);
             } else if (optF) {
                 helper.send(Collections.singletonList(path), optR, optP, sendBufferSize);
             } else {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/0639c7c0/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/ScpTest.java b/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
index 7b33ca1..f6b6ae2 100644
--- a/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/ScpTest.java
@@ -122,15 +122,21 @@ public class ScpTest extends BaseTest {
 
                     File root = new File("target/scp");
                     Utils.deleteRecursive(root);
-                    assertHierarchyTargetFolderExists(new File(root, "local"));
+
+                    File localDir = assertHierarchyTargetFolderExists(new File(root, "local"));
                     assertTrue("Root folder not created", root.exists());
 
-                    writeFile(new File("target/scp/local/out.txt"), data);
-                    assertHierarchyTargetFolderExists(new File(root, "remote"));
-                    scp.upload(new File("target/scp/local/out.txt").getAbsolutePath(), "/" + new File("target/scp/remote/out.txt").getAbsolutePath().replace(File.separatorChar, '/'));
-                    assertFileLength(new File("target/scp/remote/out.txt"), data.length(), 5000);
-                    scp.upload(new File("target/scp/local/out.txt").getAbsolutePath(), new File("target/scp/remote/out2.txt").getAbsolutePath());
-                    assertFileLength(new File("target/scp/remote/out2.txt"), data.length(), 5000);
+                    File localFile = new File(localDir, "out.txt");
+                    writeFile(localFile, data);
+
+                    File remoteDir = assertHierarchyTargetFolderExists(new File(root, "remote"));
+                    File remoteFile = new File(remoteDir, "out.txt");
+                    scp.upload(localFile.getAbsolutePath(), remoteFile.getAbsolutePath().replace(File.separatorChar, '/'));
+                    assertFileLength(remoteFile, data.length(), 5000);
+
+                    File secondRemote = new File(remoteDir, "out2.txt");
+                    scp.upload(localFile.getAbsolutePath(), secondRemote.getAbsolutePath().replace(File.separatorChar, '/'));
+                    assertFileLength(secondRemote, data.length(), 5000);
                 }
             } finally {
                 client.stop();