Skip to content

Commit 22de9b2

Browse files
committed
Merge branch 'master' into 3.0.0
2 parents b900b2d + 22b9b07 commit 22de9b2

4 files changed

Lines changed: 53 additions & 39 deletions

File tree

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
<required.java.version>[${java.sdk.version},)</required.java.version>
9393

9494
<groovy.version>4.0.17</groovy.version>
95-
<bouncycastle.version>1.81</bouncycastle.version>
95+
<bouncycastle.version>1.82</bouncycastle.version>
9696
<!-- NOTE: upgrading slf4j beyond this version causes
9797
9898
Execution verify-style of goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check failed.: NullPointerException
@@ -215,7 +215,7 @@
215215
<plugin>
216216
<groupId>org.owasp</groupId>
217217
<artifactId>dependency-check-maven</artifactId>
218-
<version>12.1.3</version>
218+
<version>12.1.6</version>
219219
<!-- see https://jeremylong.github.io/DependencyCheck/dependency-check-maven/configuration.html -->
220220
<configuration>
221221
<!-- see https://github.com/jeremylong/DependencyCheck/issues/1394 -->
@@ -269,7 +269,7 @@
269269
<dependency>
270270
<groupId>com.google.errorprone</groupId>
271271
<artifactId>error_prone_core</artifactId>
272-
<version>2.41.0</version>
272+
<version>2.42.0</version>
273273
</dependency>
274274
</dependencies>
275275
</plugin>

sshd-common/src/main/java/org/apache/sshd/client/config/hosts/KnownHostEntry.java

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.io.InputStream;
2525
import java.io.InputStreamReader;
2626
import java.io.Reader;
27-
import java.io.StreamCorruptedException;
2827
import java.net.URL;
2928
import java.nio.charset.StandardCharsets;
3029
import java.nio.file.Files;
@@ -34,12 +33,13 @@
3433
import java.util.Collections;
3534
import java.util.List;
3635

37-
import org.apache.sshd.common.config.ConfigFileReaderSupport;
3836
import org.apache.sshd.common.config.keys.PublicKeyEntry;
3937
import org.apache.sshd.common.util.GenericUtils;
4038
import org.apache.sshd.common.util.ValidateUtils;
4139
import org.apache.sshd.common.util.io.input.NoCloseInputStream;
4240
import org.apache.sshd.common.util.io.input.NoCloseReader;
41+
import org.slf4j.Logger;
42+
import org.slf4j.LoggerFactory;
4343

4444
/**
4545
* Contains a representation of an entry in the <code>known_hosts</code> file
@@ -58,6 +58,8 @@ public class KnownHostEntry extends HostPatternsHolder {
5858
*/
5959
public static final String STD_HOSTS_FILENAME = "known_hosts";
6060

61+
private static final Logger LOG = LoggerFactory.getLogger(KnownHostEntry.class);
62+
6163
private static final class LazyDefaultConfigFileHolder {
6264
private static final Path HOSTS_FILE = PublicKeyEntry.getDefaultKeysFolderPath().resolve(STD_HOSTS_FILENAME);
6365

@@ -181,17 +183,6 @@ public static List<KnownHostEntry> readKnownHostEntries(BufferedReader rdr) thro
181183
if (GenericUtils.isEmpty(line)) {
182184
continue;
183185
}
184-
185-
int pos = line.indexOf(ConfigFileReaderSupport.COMMENT_CHAR);
186-
if (pos == 0) {
187-
continue;
188-
}
189-
190-
if (pos > 0) {
191-
line = line.substring(0, pos);
192-
line = line.trim();
193-
}
194-
195186
try {
196187
KnownHostEntry entry = parseKnownHostEntry(line);
197188
if (entry == null) {
@@ -202,9 +193,8 @@ public static List<KnownHostEntry> readKnownHostEntries(BufferedReader rdr) thro
202193
entries = new ArrayList<>();
203194
}
204195
entries.add(entry);
205-
} catch (RuntimeException | Error e) { // TODO consider consulting a user callback
206-
throw new StreamCorruptedException("Failed (" + e.getClass().getSimpleName() + ") to parse line #"
207-
+ lineNumber + " '" + line + "': " + e.getMessage());
196+
} catch (RuntimeException e) { // TODO consider consulting a user callback
197+
LOG.warn("Invalid known_hosts line #" + lineNumber + " '" + line + "': " + e.getMessage());
208198
}
209199
}
210200

@@ -216,43 +206,50 @@ public static List<KnownHostEntry> readKnownHostEntries(BufferedReader rdr) thro
216206
}
217207

218208
public static KnownHostEntry parseKnownHostEntry(String line) {
219-
return parseKnownHostEntry(GenericUtils.isEmpty(line) ? null : new KnownHostEntry(), line);
220-
}
221-
222-
public static <E extends KnownHostEntry> E parseKnownHostEntry(E entry, String data) {
223-
String line = GenericUtils.replaceWhitespaceAndTrim(data);
224-
if (GenericUtils.isEmpty(line) || (line.charAt(0) == PublicKeyEntry.COMMENT_CHAR)) {
225-
return entry;
209+
if (line == null) {
210+
return null;
211+
}
212+
String tmp = GenericUtils.replaceWhitespaceAndTrim(line);
213+
int i = tmp.indexOf(PublicKeyEntry.COMMENT_CHAR);
214+
if (i >= 0) {
215+
tmp = tmp.substring(0, i).trim();
216+
}
217+
if (GenericUtils.isEmpty(tmp)) {
218+
return null;
226219
}
227220

221+
KnownHostEntry entry = new KnownHostEntry();
228222
entry.setConfigLine(line);
229223

230-
if (line.charAt(0) == MARKER_INDICATOR) {
231-
int pos = line.indexOf(' ');
232-
ValidateUtils.checkTrue(pos > 0, "Missing marker name end delimiter in line=%s", data);
233-
ValidateUtils.checkTrue(pos > 1, "No marker name after indicator in line=%s", data);
234-
entry.setMarker(line.substring(1, pos));
235-
line = line.substring(pos + 1).trim();
224+
if (tmp.charAt(0) == MARKER_INDICATOR) {
225+
int pos = tmp.indexOf(' ');
226+
ValidateUtils.checkTrue(pos > 0, "Missing marker name end delimiter in line=%s", line);
227+
ValidateUtils.checkTrue(pos > 1, "No marker name after indicator in line=%s", line);
228+
entry.setMarker(tmp.substring(1, pos));
229+
tmp = tmp.substring(pos + 1).trim();
236230
} else {
237231
entry.setMarker(null);
238232
}
239233

240-
int pos = line.indexOf(' ');
241-
ValidateUtils.checkTrue(pos > 0, "Missing host patterns end delimiter in line=%s", data);
242-
String hostPattern = line.substring(0, pos);
243-
line = line.substring(pos + 1).trim();
234+
int pos = tmp.indexOf(' ');
235+
ValidateUtils.checkTrue(pos > 0, "Missing host patterns end delimiter in line=%s", line);
236+
String hostPattern = tmp.substring(0, pos);
237+
tmp = tmp.substring(pos + 1).trim();
244238

245239
if (hostPattern.charAt(0) == KnownHostHashValue.HASHED_HOST_DELIMITER) {
246240
KnownHostHashValue hash = ValidateUtils.checkNotNull(KnownHostHashValue.parse(hostPattern),
247-
"Failed to extract host hash value from line=%s", data);
241+
"Failed to extract host hash value from line=%s", line);
248242
entry.setHashedEntry(hash);
249243
entry.setPatterns(null);
250244
} else {
251245
entry.setHashedEntry(null);
252246
entry.setPatterns(parsePatterns(GenericUtils.split(hostPattern, ',')));
253247
}
254248
PublicKeyEntry key = PublicKeyEntry.parsePublicKeyEntry(
255-
ValidateUtils.checkNotNullAndNotEmpty(line, "No valid key entry recovered from line=%s", data));
249+
ValidateUtils.checkNotNullAndNotEmpty(tmp, "No valid key entry recovered from line=%s", line));
250+
if (key == null) {
251+
return null;
252+
}
256253
entry.setKeyEntry(key);
257254
return entry;
258255
}

sshd-contrib/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
<dependency>
9999
<groupId>org.assertj</groupId>
100100
<artifactId>assertj-core</artifactId>
101-
<version>3.27.5</version>
101+
<version>3.27.6</version>
102102
<scope>test</scope>
103103
</dependency>
104104
</dependencies>

sshd-core/src/test/java/org/apache/sshd/client/keyverifier/KnownHostsUnsupportedKeysTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,23 @@ void unknownExistingKey() throws Exception {
7070
assertTrue(invokeVerifier(verifier, new SshdSocketAddress("127.0.0.1", 2222), key));
7171
}
7272

73+
@Test
74+
void invalidLineIgnored() throws Exception {
75+
Path knownHosts = tmp.resolve("known_hosts");
76+
String entry
77+
= "[127.0.0.1]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCbZVVpqEHGLNWMqMeyU1VbWb91XteoamVcgpy4yxNVbZffb5IDdbo1ons/y9KAhcub6LZeLrvXzVUZbXCZiUkg=";
78+
List<String> lines = new ArrayList<>();
79+
lines.add(entry + entry);
80+
lines.add(entry);
81+
Files.write(knownHosts, lines);
82+
KnownHostsServerKeyVerifier verifier = new KnownHostsServerKeyVerifier(RejectAllServerKeyVerifier.INSTANCE, knownHosts);
83+
KnownHostEntry knownHost = KnownHostEntry.parseKnownHostEntry(lines.get(1));
84+
PublicKeyEntry keyEntry = knownHost.getKeyEntry();
85+
assertNotNull(keyEntry);
86+
PublicKey key = keyEntry.resolvePublicKey(null, PublicKeyEntryResolver.FAILING);
87+
assertTrue(invokeVerifier(verifier, new SshdSocketAddress("127.0.0.1", 2222), key));
88+
}
89+
7390
@Test
7491
void unknownNewKey() throws Exception {
7592
KeyPair kp = CommonTestSupportUtils.generateKeyPair(KeyUtils.RSA_ALGORITHM, 1024);

0 commit comments

Comments
 (0)