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 <alex-sher...@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