You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tw...@apache.org on 2021/05/29 19:23:20 UTC

[mina-sshd] branch master updated: SSHD-1164 - fixed parsing of sshd_config "Host" lines

This is an automated email from the ASF dual-hosted git repository.

twolf 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 267887a  SSHD-1164 - fixed parsing of sshd_config "Host" lines
267887a is described below

commit 267887a816cd66379b9079de09f41c3c6fa61fa7
Author: Alex Sherwin <al...@users.noreply.github.com>
AuthorDate: Fri May 14 22:28:36 2021 -0400

    SSHD-1164 - fixed parsing of sshd_config "Host" lines
    
    This makes it more lenient where there is > 1 space between Host line
    values
---
 .../sshd/client/config/hosts/HostConfigEntry.java  |  2 ++
 .../org/apache/sshd/common/util/GenericUtils.java  | 41 ++++++++++++++++++++++
 .../apache/sshd/common/util/GenericUtilsTest.java  | 26 ++++++++++++++
 .../hosts/testReadMultipleHostPatterns.config.txt  |  2 +-
 4 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/HostConfigEntry.java b/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/HostConfigEntry.java
index 60927de..ad8a604 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/HostConfigEntry.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/hosts/HostConfigEntry.java
@@ -898,6 +898,8 @@ public class HostConfigEntry extends HostPatternsHolder implements MutableUserHo
             List<String> valsList = parseConfigValue(value);
 
             if (HOST_CONFIG_PROP.equalsIgnoreCase(key)) {
+                // parseConfigValue may result in entries that are empty strings if > 1 space is used between values
+                valsList = GenericUtils.filterToNotBlank(valsList);
                 if (GenericUtils.isEmpty(valsList)) {
                     throw new StreamCorruptedException("Missing host pattern(s) at line " + lineNumber + ": " + line);
                 }
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java b/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
index 11da272..445bcbe 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/util/GenericUtils.java
@@ -196,6 +196,47 @@ public final class GenericUtils {
         return !isEmpty(cs);
     }
 
+    /**
+     * <p>
+     * Checks if a CharSequence is empty (""), null or whitespace only.
+     * </p>
+     *
+     * <p>
+     * Whitespace is defined by {@link Character#isWhitespace(char)}.
+     * </p>
+     *
+     * <pre>
+     * GenericUtils.isBlank(null)      = true
+     * GenericUtils.isBlank("")        = true
+     * GenericUtils.isBlank(" ")       = true
+     * GenericUtils.isBlank("bob")     = false
+     * GenericUtils.isBlank("  bob  ") = false
+     * </pre>
+     *
+     * @param  cs the CharSequence to check, may be null
+     * @return    {@code true} if the CharSequence is null, empty or whitespace only
+     */
+    public static boolean isBlank(final CharSequence cs) {
+        int strLen = cs != null ? cs.length() : 0;
+        if (cs == null || strLen == 0) {
+            return true;
+        }
+        for (int i = 0; i < strLen; i++) {
+            if (!Character.isWhitespace(cs.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static boolean isNotBlank(final CharSequence cs) {
+        return !isBlank(cs);
+    }
+
+    public static List<String> filterToNotBlank(final List<String> values) {
+        return values.stream().filter(GenericUtils::isNotBlank).collect(Collectors.toList());
+    }
+
     public static int indexOf(CharSequence cs, char c) {
         int len = length(cs);
         for (int pos = 0; pos < len; pos++) {
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/util/GenericUtilsTest.java b/sshd-common/src/test/java/org/apache/sshd/common/util/GenericUtilsTest.java
index ce64af1..acceb34 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/util/GenericUtilsTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/util/GenericUtilsTest.java
@@ -42,6 +42,32 @@ public class GenericUtilsTest extends JUnitTestSupport {
     }
 
     @Test
+    public void testIsBlank() {
+        assertTrue(GenericUtils.isBlank(null));
+        assertTrue(GenericUtils.isBlank(""));
+        assertTrue(GenericUtils.isBlank(" "));
+        assertFalse(GenericUtils.isBlank("a"));
+        assertFalse(GenericUtils.isBlank(" a "));
+    }
+
+    @Test
+    public void testFilterToNotBlank() {
+        assertEquals(Collections.emptyList(), GenericUtils.filterToNotBlank(Arrays.asList((String) null)));
+        assertEquals(Collections.emptyList(), GenericUtils.filterToNotBlank(Arrays.asList("")));
+        assertEquals(Collections.emptyList(), GenericUtils.filterToNotBlank(Arrays.asList(" ")));
+        assertEquals(Arrays.asList("a"), GenericUtils.filterToNotBlank(Arrays.asList("a")));
+        assertEquals(Arrays.asList("a", "b"), GenericUtils.filterToNotBlank(Arrays.asList("a", "b")));
+        assertEquals(Arrays.asList("a"), GenericUtils.filterToNotBlank(Arrays.asList("a", "")));
+        assertEquals(Arrays.asList("a"), GenericUtils.filterToNotBlank(Arrays.asList("a", " ")));
+        assertEquals(Arrays.asList("a"), GenericUtils.filterToNotBlank(Arrays.asList("a", "  ")));
+        assertEquals(Arrays.asList("a"), GenericUtils.filterToNotBlank(Arrays.asList("a", null)));
+        assertEquals(Arrays.asList("a", "b"), GenericUtils.filterToNotBlank(Arrays.asList("a", null, "b")));
+        assertEquals(Arrays.asList("a", "b"), GenericUtils.filterToNotBlank(Arrays.asList("a", "", "b")));
+        assertEquals(Arrays.asList("a", "b"), GenericUtils.filterToNotBlank(Arrays.asList("a", " ", "b")));
+        assertEquals(Arrays.asList("a", "b"), GenericUtils.filterToNotBlank(Arrays.asList("a", "  ", "b")));
+    }
+
+    @Test
     public void testSplitAndJoin() {
         List<String> expected = Collections.unmodifiableList(
                 Arrays.asList(
diff --git a/sshd-common/src/test/resources/org/apache/sshd/client/config/hosts/testReadMultipleHostPatterns.config.txt b/sshd-common/src/test/resources/org/apache/sshd/client/config/hosts/testReadMultipleHostPatterns.config.txt
index 0f5edcb..2096448 100644
--- a/sshd-common/src/test/resources/org/apache/sshd/client/config/hosts/testReadMultipleHostPatterns.config.txt
+++ b/sshd-common/src/test/resources/org/apache/sshd/client/config/hosts/testReadMultipleHostPatterns.config.txt
@@ -1,5 +1,5 @@
 # Same configuration duplicated in multiple configuration entries
-Host *.github.com *.apache.org 10.*.*.*
+Host *.github.com *.apache.org  10.*.*.*
     User mina-sshd
     Port 443
     HostName 7.3.6.5