Skip to content

Commit 090d766

Browse files
authored
[Kerberos] Find if port is available before using it for Kdc server (#36192)
If the randomly selected port was already in use the Kerberos tests would fail. This commit adds check to see if the network port is available and if not continue to find one for KDC server. If it does not find port after 100 retries it throws an exception. Closes #34261
1 parent 3272538 commit 090d766

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

x-pack/qa/evil-tests/src/test/java/org/elasticsearch/xpack/security/authc/kerberos/SimpleKdcLdapServer.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.apache.kerby.kerberos.kerb.client.KrbConfig;
1414
import org.apache.kerby.kerberos.kerb.server.KdcConfigKey;
1515
import org.apache.kerby.kerberos.kerb.server.SimpleKdcServer;
16-
import org.apache.kerby.util.NetworkUtil;
1716
import org.apache.logging.log4j.LogManager;
1817
import org.apache.logging.log4j.Logger;
1918
import org.elasticsearch.ExceptionsHelper;
@@ -22,6 +21,9 @@
2221
import org.elasticsearch.test.ESTestCase;
2322

2423
import java.io.IOException;
24+
import java.net.DatagramSocket;
25+
import java.net.InetAddress;
26+
import java.net.ServerSocket;
2527
import java.nio.charset.StandardCharsets;
2628
import java.nio.file.Files;
2729
import java.nio.file.Path;
@@ -31,6 +33,8 @@
3133
import java.util.Locale;
3234
import java.util.concurrent.TimeUnit;
3335

36+
import javax.net.ServerSocketFactory;
37+
3438
/**
3539
* Utility wrapper around Apache {@link SimpleKdcServer} backed by Unboundid
3640
* {@link InMemoryDirectoryServer}.<br>
@@ -127,14 +131,14 @@ private void prepareKdcServerAndStart() throws Exception {
127131
simpleKdc.setWorkDir(workDir.toFile());
128132
simpleKdc.setKdcHost(host);
129133
simpleKdc.setKdcRealm(realm);
130-
if (kdcPort == 0) {
131-
kdcPort = NetworkUtil.getServerPort();
132-
}
133134
if (transport != null) {
134-
if (transport.trim().equals("TCP")) {
135+
if (kdcPort == 0) {
136+
kdcPort = getServerPort(transport);
137+
}
138+
if (transport.trim().equalsIgnoreCase("TCP")) {
135139
simpleKdc.setKdcTcpPort(kdcPort);
136140
simpleKdc.setAllowUdp(false);
137-
} else if (transport.trim().equals("UDP")) {
141+
} else if (transport.trim().equalsIgnoreCase("UDP")) {
138142
simpleKdc.setKdcUdpPort(kdcPort);
139143
simpleKdc.setAllowTcp(false);
140144
} else {
@@ -221,4 +225,21 @@ public Void run() throws Exception {
221225
logger.info("SimpleKdcServer stoppped.");
222226
}
223227

228+
private static int getServerPort(String transport) {
229+
if (transport != null && transport.trim().equalsIgnoreCase("TCP")) {
230+
try (ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(0, 1,
231+
InetAddress.getByName("127.0.0.1"))) {
232+
return serverSocket.getLocalPort();
233+
} catch (Exception ex) {
234+
throw new RuntimeException("Failed to get a TCP server socket point");
235+
}
236+
} else if (transport != null && transport.trim().equalsIgnoreCase("UDP")) {
237+
try (DatagramSocket socket = new DatagramSocket(0, InetAddress.getByName("127.0.0.1"))) {
238+
return socket.getLocalPort();
239+
} catch (Exception ex) {
240+
throw new RuntimeException("Failed to get a UDP server socket point");
241+
}
242+
}
243+
throw new IllegalArgumentException("Invalid transport: " + transport);
244+
}
224245
}

0 commit comments

Comments
 (0)