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 2018/02/22 13:32:11 UTC

mina-sshd git commit: [SSHD-730] Fix normalization problem with links

Repository: mina-sshd
Updated Branches:
  refs/heads/master f8a3e7299 -> 16fae05ab


[SSHD-730] Fix normalization problem with links


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

Branch: refs/heads/master
Commit: 16fae05ab9b474f601ec44652c589df345b54ff3
Parents: f8a3e72
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Feb 22 13:26:15 2018 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Feb 22 13:26:28 2018 +0100

----------------------------------------------------------------------
 .../apache/sshd/common/util/SelectorUtils.java  | 67 +-------------------
 .../sftp/AbstractSftpSubsystemHelper.java       | 14 +---
 .../sshd/common/util/SelectorUtilsTest.java     |  7 --
 3 files changed, 4 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/16fae05a/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
index 7fa1927..53bca90 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
+++ b/sshd-core/src/main/java/org/apache/sshd/common/util/SelectorUtils.java
@@ -533,72 +533,7 @@ public final class SelectorUtils {
         return ret;
     }
 
-    /**
-     * Normalizes the path by removing '.', '..' and double separators (e.g. '//')
-     *
-     * @param path      Original path - ignored if {@code null}/empty
-     * @param separator The separator used for the path components
-     * @return normalized path
-     */
-    public static String normalizePath(String path, String separator) {
-        if (GenericUtils.isEmpty(path)) {
-            return path;
-        }
-
-        boolean startsWithSeparator = path.startsWith(separator);
-        List<String> tokens = tokenizePath(path, separator);
-        int removedDots = 0;
-        // clean up
-        for (int i = tokens.size() - 1; i >= 0; i--) {
-            String t = tokens.get(i);
-            if (GenericUtils.isEmpty(t)) {
-                tokens.remove(i);
-            } else if (t.equals(".")) {
-                tokens.remove(i);
-                removedDots++;
-            } else if (t.equals("..")) {
-                tokens.remove(i);
-                removedDots++;
-                if (i >= 1) {
-                    tokens.remove(--i);
-                    removedDots++;
-                }
-            }
-        }
-
-        if (GenericUtils.isEmpty(tokens)) {
-            if (removedDots > 0) {
-                return "";  // had some "." and ".." after which we remained with no path
-            } else {
-                return separator;   // it was all separators
-            }
-        }
-
-        // serialize
-        StringBuilder buffer = new StringBuilder(path.length());
-        for (int index = 0; index < tokens.size(); index++) {
-            String token = tokens.get(index);
-            if (index == 0) {
-                if (startsWithSeparator) {
-                    buffer.append(separator);
-                } else if (OsUtils.isWin32() && isWindowsDriveSpecified(token)) {
-                    buffer.append(separator);
-                }
-            } else {
-                buffer.append(separator);
-            }
-            buffer.append(token);
-
-            // for root Windows drive we need to return "C:/" or we get errors from the local file system
-            if ((tokens.size() == 1) && OsUtils.isWin32() && isWindowsDriveSpecified(token)) {
-                buffer.append(separator);
-            }
-        }
-
-        return buffer.toString();
-    }
-
-    /**
+    /**   /**
      * Converts a path to one matching the target file system by applying the
      * &quot;slashification&quot; rules, converting it to a local path and
      * then translating its separator to the target file system one (if different

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/16fae05a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
index 2e043fb..262bd05 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/subsystem/sftp/AbstractSftpSubsystemHelper.java
@@ -1786,13 +1786,11 @@ public abstract class AbstractSftpSubsystemHelper
     protected void sendLink(Buffer buffer, int id, String link) throws IOException {
         //in case we are running on Windows
         String unixPath = link.replace(File.separatorChar, '/');
-        //normalize the given path, use *nix style separator
-        String normalizedPath = SelectorUtils.normalizePath(unixPath, "/");
 
         buffer.putByte((byte) SftpConstants.SSH_FXP_NAME);
         buffer.putInt(id);
         buffer.putInt(1);   // one response
-        buffer.putString(normalizedPath);
+        buffer.putString(unixPath);
 
         /*
          * As per the spec (https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.10):
@@ -1803,7 +1801,7 @@ public abstract class AbstractSftpSubsystemHelper
         Map<String, Object> attrs = Collections.emptyMap();
         int version = getVersion();
         if (version == SftpConstants.SFTP_V3) {
-            buffer.putString(SftpHelper.getLongName(normalizedPath, attrs));
+            buffer.putString(SftpHelper.getLongName(unixPath, attrs));
         }
 
         writeAttrs(buffer, attrs);
@@ -1819,16 +1817,10 @@ public abstract class AbstractSftpSubsystemHelper
         String originalPath = f.toString();
         //in case we are running on Windows
         String unixPath = originalPath.replace(File.separatorChar, '/');
-        //normalize the given path, use *nix style separator
-        String normalizedPath = SelectorUtils.normalizePath(unixPath, "/");
-        if (normalizedPath.length() == 0) {
-            normalizedPath = "/";
-        }
-        buffer.putString(normalizedPath);
+        buffer.putString(unixPath);
 
         int version = getVersion();
         if (version == SftpConstants.SFTP_V3) {
-            f = resolveFile(normalizedPath);
             buffer.putString(getLongName(f, getShortName(f), attrs));
         }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/16fae05a/sshd-core/src/test/java/org/apache/sshd/common/util/SelectorUtilsTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/util/SelectorUtilsTest.java b/sshd-core/src/test/java/org/apache/sshd/common/util/SelectorUtilsTest.java
index 5106614..1c56379 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/util/SelectorUtilsTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/util/SelectorUtilsTest.java
@@ -141,11 +141,4 @@ public class SelectorUtilsTest extends BaseTestSupport {
         }
     }
 
-    @Test
-    public void testNormalizeWindowsPath() {
-        Assume.assumeTrue("Not tested on Windows", OsUtils.isWin32());
-        String path = detectTargetFolder().toString().replace(File.separatorChar, '/');
-        String actual = SelectorUtils.normalizePath(path, "/");
-        assertEquals("Mismatched result", "/" + path, actual);
-    }
 }