From 151f0cb82bacb678a4d0ff6eed4a04aacf1efa2e Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Fri, 3 Jul 2020 20:43:00 +0200 Subject: [PATCH] Add a test for upstream bug SSHD-1028 SSHD-1028:[1] server doesn't close server-side sessions properly when client disconnects. [1] https://issues.apache.org/jira/projects/SSHD/issues/SSHD-1028 Change-Id: I0d67f49e35abe8375cb1370a494dc01d0fb2c9b1 Signed-off-by: Thomas Wolf --- .../jgit/junit/ssh/SshTestGitServer.java | 12 ++++++++ .../META-INF/MANIFEST.MF | 2 ++ .../jgit/transport/sshd/ApacheSshTest.java | 29 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java index 03e285582..9aa4afcef 100644 --- a/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java +++ b/org.eclipse.jgit.junit.ssh/src/org/eclipse/jgit/junit/ssh/SshTestGitServer.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Map; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.PropertyResolverUtils; @@ -297,6 +298,17 @@ public void enableKeyboardInteractiveAuthentication() { DefaultKeyboardInteractiveAuthenticator.INSTANCE); } + /** + * Retrieves the server's property map. This is a live map; changing it + * affects the server. + * + * @return a live map of the server's properties + * @since 5.9 + */ + public Map getProperties() { + return server.getProperties(); + } + /** * Starts the test server, listening on a random port. * diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF index 3bcd02f27..c4ffda999 100644 --- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF @@ -15,6 +15,8 @@ Import-Package: org.apache.sshd.client.config.hosts;version="[2.4.0,2.5.0)", org.apache.sshd.common.session;version="[2.4.0,2.5.0)", org.apache.sshd.common.util.net;version="[2.4.0,2.5.0)", org.apache.sshd.common.util.security;version="[2.4.0,2.5.0)", + org.apache.sshd.server;version="[2.4.0,2.5.0)", + org.eclipse.jgit.api;version="[5.9.0,5.10.0)", org.eclipse.jgit.api.errors;version="[5.9.0,5.10.0)", org.eclipse.jgit.internal.transport.sshd.proxy;version="[5.9.0,5.10.0)", org.eclipse.jgit.junit;version="[5.9.0,5.10.0)", diff --git a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java index bfee04219..1b2f7f32f 100644 --- a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java +++ b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshTest.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.stream.Collectors; import org.apache.sshd.client.config.hosts.KnownHostEntry; +import org.apache.sshd.server.ServerFactoryManager; +import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.junit.ssh.SshTestBase; import org.eclipse.jgit.lib.Constants; @@ -175,4 +177,31 @@ public void testHugePreamble() throws Exception { defaultCloneDir, null, "IdentityFile " + privateKey1.getAbsolutePath()); } + + /** + * Test for SSHD-1028. If the server doesn't close sessions, the second + * fetch will fail. Occurs on sshd 2.5.[01]. + * + * @throws Exception + * on errors + * @see SSHD-1028 + */ + @Test + public void testPushWithSessionLimit() throws Exception { + server.getProperties().put(ServerFactoryManager.MAX_CONCURRENT_SESSIONS, + Integer.valueOf(2)); + File localClone = cloneWith("ssh://localhost/doesntmatter", + defaultCloneDir, null, // + "Host localhost", // + "HostName localhost", // + "Port " + testPort, // + "User " + TEST_USER, // + "IdentityFile " + privateKey1.getAbsolutePath()); + // Fetch a couple of times + try (Git git = Git.open(localClone)) { + git.fetch().call(); + git.fetch().call(); + } + } }