You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/07/02 00:23:48 UTC

[2/2] directory-kerby git commit: Network transport related improvements, addressing DIRKRB-313, 314, and 315

Network transport related improvements, addressing DIRKRB-313, 314, and 315


Project: http://git-wip-us.apache.org/repos/asf/directory-kerby/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerby/commit/bb6cce19
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerby/tree/bb6cce19
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerby/diff/bb6cce19

Branch: refs/heads/master
Commit: bb6cce191204a7d7acdc95aa37ef0e5877ece5fc
Parents: 27cda2b
Author: drankye <ka...@intel.com>
Authored: Thu Jul 2 06:23:23 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Thu Jul 2 06:23:23 2015 +0800

----------------------------------------------------------------------
 .../kerby/kerberos/kerb/client/ClientUtil.java  | 26 +++++++++++++++
 .../kerby/kerberos/kerb/client/KrbClient.java   |  9 ++++++
 .../kerberos/kerb/client/KrbConfigKey.java      |  4 +--
 .../kerby/kerberos/kerb/client/KrbSetting.java  | 33 ++++++++++++++++++++
 .../client/impl/DefaultInternalKrbClient.java   | 16 +++-------
 .../kerb/client/KrbClientSettingTest.java       |  4 ++-
 .../kerberos/kerb/transport/KdcNetwork.java     | 19 +++++------
 .../kerberos/kerb/transport/KrbNetwork.java     | 20 +++++-------
 .../kerberos/kerb/transport/TransportPair.java  | 30 ++++++++++++++++++
 .../kerby/kerberos/kerb/server/KdcSetting.java  | 33 ++++++++++++++++++++
 .../kerby/kerberos/kerb/server/KdcUtil.java     | 26 +++++++++++++++
 .../impl/DefaultInternalKdcServerImpl.java      | 14 +++------
 12 files changed, 186 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/ClientUtil.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/ClientUtil.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/ClientUtil.java
index c6244f5..cface81 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/ClientUtil.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/ClientUtil.java
@@ -20,9 +20,11 @@
 package org.apache.kerby.kerberos.kerb.client;
 
 import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.util.Map;
 
 public final class ClientUtil {
@@ -93,4 +95,28 @@ public final class ClientUtil {
 
         return krbConfig;
     }
+
+    /**
+     * Get KDC network transport addresses according to krb client setting.
+     * @param setting
+     * @return UDP and TCP addresses pair
+     * @throws KrbException
+     */
+    public static TransportPair getTransportPair(
+            KrbSetting setting) throws KrbException {
+        TransportPair result = new TransportPair();
+
+        int tcpPort = setting.checkGetKdcTcpPort();
+        if (tcpPort > 0) {
+            result.tcpAddress = new InetSocketAddress(
+                    setting.getKdcHost(), tcpPort);
+        }
+        int udpPort = setting.checkGetKdcUdpPort();
+        if (udpPort > 0) {
+            result.udpAddress = new InetSocketAddress(
+                    setting.getKdcHost(), udpPort);
+        }
+
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
index bcd55d2..9905a50 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
@@ -93,7 +93,11 @@ public class KrbClient {
      * @param kdcTcpPort
      */
     public void setKdcTcpPort(int kdcTcpPort) {
+        if (kdcTcpPort < 1) {
+            throw new IllegalArgumentException("Invalid port");
+        }
         commonOptions.add(KrbOption.KDC_TCP_PORT, kdcTcpPort);
+        setAllowTcp(true);
     }
 
     /**
@@ -111,12 +115,17 @@ public class KrbClient {
     public void setAllowTcp(boolean allowTcp) {
         commonOptions.add(KrbOption.ALLOW_TCP, allowTcp);
     }
+
     /**
      * Set KDC udp port. Only makes sense when allowUdp is set.
      * @param kdcUdpPort
      */
     public void setKdcUdpPort(int kdcUdpPort) {
+        if (kdcUdpPort < 1) {
+            throw new IllegalArgumentException("Invalid port");
+        }
         commonOptions.add(KrbOption.KDC_UDP_PORT, kdcUdpPort);
+        setAllowUdp(true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbConfigKey.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbConfigKey.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbConfigKey.java
index 75478a7..00c5afa 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbConfigKey.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbConfigKey.java
@@ -25,8 +25,8 @@ public enum KrbConfigKey implements SectionConfigKey {
     KRB_DEBUG(true),
     KDC_HOST("localhost"),
     KDC_PORT(),
-    KDC_ALLOW_UDP(true),
-    KDC_ALLOW_TCP(true),
+    KDC_ALLOW_UDP(false),
+    KDC_ALLOW_TCP(false),
     KDC_UDP_PORT(),
     KDC_TCP_PORT(),
     KDC_DOMAIN("example.com"),

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbSetting.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbSetting.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbSetting.java
index da99df0..f1a51b2 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbSetting.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbSetting.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.client;
 
 import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbException;
 
 /**
  * Krb client setting that combines common options and client config.
@@ -58,6 +59,38 @@ public class KrbSetting {
         return kdcHost;
     }
 
+    /**
+     * Check kdc tcp setting and see if any bad.
+     * @return valid tcp port or -1 if not allowTcp
+     * @throws KrbException
+     */
+    public int checkGetKdcTcpPort() throws KrbException {
+        if (allowTcp()) {
+            int kdcPort = getKdcTcpPort();
+            if (kdcPort < 1) {
+                throw new KrbException("KDC tcp port isn't set or configured");
+            }
+            return kdcPort;
+        }
+        return -1;
+    }
+
+    /**
+     * Check kdc udp setting and see if any bad.
+     * @return valid udp port or -1 if not allowUdp
+     * @throws KrbException
+     */
+    public int checkGetKdcUdpPort() throws KrbException {
+        if (allowUdp()) {
+            int kdcPort = getKdcUdpPort();
+            if (kdcPort < 1) {
+                throw new KrbException("KDC udp port isn't set or configured");
+            }
+            return kdcPort;
+        }
+        return -1;
+    }
+
     public int getKdcTcpPort() {
         int tcpPort = commonOptions.getIntegerOption(KrbOption.KDC_TCP_PORT);
         if (tcpPort > 0) {

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
index 93cc890..2570510 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.client.impl;
 
 import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.ClientUtil;
 import org.apache.kerby.kerberos.kerb.client.KrbSetting;
 import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
 import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
@@ -27,9 +28,9 @@ import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
 import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
 import org.apache.kerby.kerberos.kerb.transport.KrbNetwork;
 import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 
 import java.io.IOException;
-import java.net.InetSocketAddress;
 
 /**
  * A default krb client implementation.
@@ -50,20 +51,11 @@ public class DefaultInternalKrbClient extends AbstractInternalKrbClient {
         this.krbHandler = new DefaultKrbHandler();
         krbHandler.init(getContext());
 
-        InetSocketAddress tcpAddress = null, udpAddress = null;
-        if (getSetting().allowTcp()) {
-            tcpAddress = new InetSocketAddress(getSetting().getKdcHost(),
-                    getSetting().getKdcTcpPort());
-        }
-        if (getSetting().allowUdp()) {
-            udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
-                    getSetting().getKdcUdpPort());
-        }
-
+        TransportPair tpair = ClientUtil.getTransportPair(getSetting());
         KrbNetwork network = new KrbNetwork();
         network.setSocketTimeout(getSetting().getTimeout());
         try {
-            transport = network.connect(tcpAddress, udpAddress);
+            transport = network.connect(tpair);
         } catch (IOException e) {
             throw new KrbException("Failed to create transport", e);
         }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/KrbClientSettingTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/KrbClientSettingTest.java b/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/KrbClientSettingTest.java
index 6ccf8bd..e90d3bb 100644
--- a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/KrbClientSettingTest.java
+++ b/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/KrbClientSettingTest.java
@@ -32,12 +32,14 @@ public class KrbClientSettingTest {
 
         krbClient.setKdcHost("localhost");
         krbClient.setKdcRealm("TEST2.COM");
-        krbClient.setAllowUdp(false);
         krbClient.setKdcTcpPort(12345);
 
         KrbSetting krbSetting = krbClient.getSetting();
         assertThat(krbSetting.getKdcHost()).isEqualTo("localhost");
+        assertThat(krbSetting.allowTcp()).isEqualTo(true);
         assertThat(krbSetting.getKdcTcpPort()).isEqualTo(12345);
+        assertThat(krbSetting.allowUdp()).isEqualTo(false);
+        assertThat(krbSetting.getKdcUdpPort()).isEqualTo(-1);
         assertThat(krbSetting.getKdcRealm()).isEqualTo("TEST2.COM");
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
index 57dea73..661e1e5 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
@@ -37,8 +37,7 @@ public abstract class KdcNetwork {
     protected final static int MAX_MESSAGE_SIZE = 65507;
     private final static int KDC_TCP_TRANSPORT_TIMEOUT = 3 * 1000;
     private final static int KDC_TCP_SERVER_TIMEOUT = 100;
-    private InetSocketAddress tcpAddress;
-    private InetSocketAddress udpAddress;
+    private TransportPair tpair;
     private boolean isStopped;
     private ServerSocket tcpServer;
     private DatagramChannel udpServer;
@@ -50,19 +49,17 @@ public abstract class KdcNetwork {
         isStopped = false;
     }
 
-    public void listen(InetSocketAddress tcpAddress,
-                          InetSocketAddress udpAddress) throws IOException {
-        this.tcpAddress = tcpAddress;
-        this.udpAddress = udpAddress;
+    public void listen(TransportPair tpair) throws IOException {
+        this.tpair = tpair;
 
         tcpServer = new ServerSocket();
         tcpServer.setSoTimeout(KDC_TCP_SERVER_TIMEOUT);
-        tcpServer.bind(tcpAddress);
+        tcpServer.bind(tpair.tcpAddress);
 
-        if (udpAddress != null) {
+        if (tpair.udpAddress != null) {
             udpServer = DatagramChannel.open();
             udpServer.configureBlocking(false);
-            udpServer.bind(udpAddress);
+            udpServer.bind(tpair.udpAddress);
             recvBuffer = ByteBuffer.allocate(MAX_MESSAGE_SIZE);
         }
     }
@@ -84,7 +81,7 @@ public abstract class KdcNetwork {
                 }
             }
 
-            if (this.tcpAddress != null) {
+            if (tpair.tcpAddress != null) {
                 try {
                     checkAndAccept();
                 } catch (SocketTimeoutException e) { //NOPMD
@@ -94,7 +91,7 @@ public abstract class KdcNetwork {
                 }
             }
 
-            if (this.udpAddress != null) {
+            if (tpair.udpAddress != null) {
                 try {
                     checkUdpMessage();
                 } catch (SocketTimeoutException e) { //NOPMD

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java
index 1c5aded..62e0a43 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java
@@ -20,7 +20,6 @@
 package org.apache.kerby.kerberos.kerb.transport;
 
 import java.io.IOException;
-import java.net.InetSocketAddress;
 import java.net.Socket;
 
 /**
@@ -30,28 +29,25 @@ import java.net.Socket;
 public class KrbNetwork {
 
     private int socketTimeout = 10 * 1000;
-    private InetSocketAddress tcpAddress;
-    private InetSocketAddress udpAddress;
+    private TransportPair tpair;
 
-    public KrbTransport connect(InetSocketAddress tcpAddress,
-                                InetSocketAddress udpAddress) throws IOException {
-        this.tcpAddress = tcpAddress;
-        this.udpAddress = udpAddress;
+    public KrbTransport connect(TransportPair tpair) throws IOException {
+        this.tpair = tpair;
 
         /**
          * Try TCP first.
          */
         KrbTransport transport = null;
-        if (tcpAddress != null) {
+        if (tpair.tcpAddress != null) {
             try {
                 transport = tcpConnect();
             } catch (IOException e) {
-                if (udpAddress != null) {
-                    transport = new KrbUdpTransport(udpAddress);
+                if (tpair.udpAddress != null) {
+                    transport = new KrbUdpTransport(tpair.udpAddress);
                 }
             }
         } else {
-            transport = new KrbUdpTransport(udpAddress);
+            transport = new KrbUdpTransport(tpair.udpAddress);
         }
 
         if (transport == null) {
@@ -64,7 +60,7 @@ public class KrbNetwork {
     private KrbTcpTransport tcpConnect() throws IOException {
         Socket socket = new Socket();
         socket.setSoTimeout(socketTimeout);
-        socket.connect(tcpAddress);
+        socket.connect(tpair.tcpAddress);
         return new KrbTcpTransport(socket);
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/TransportPair.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/TransportPair.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/TransportPair.java
new file mode 100644
index 0000000..335a781
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/TransportPair.java
@@ -0,0 +1,30 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.transport;
+
+import java.net.InetSocketAddress;
+
+/**
+ * Transport TCP and UDP port pair
+ */
+public class TransportPair {
+    public InetSocketAddress tcpAddress;
+    public InetSocketAddress udpAddress;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcSetting.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcSetting.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcSetting.java
index 64df7cf..920c5a0 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcSetting.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcSetting.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.server;
 
 import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbException;
 
 /**
  * KDC setting that combines startup options and kdc config.
@@ -65,6 +66,38 @@ public class KdcSetting {
         return kdcHost;
     }
 
+    /**
+     * Check kdc tcp setting and see if any bad.
+     * @return valid tcp port or -1 if not allowTcp
+     * @throws org.apache.kerby.kerberos.kerb.KrbException
+     */
+    public int checkGetKdcTcpPort() throws KrbException {
+        if (allowTcp()) {
+            int kdcPort = getKdcTcpPort();
+            if (kdcPort < 1) {
+                throw new KrbException("KDC tcp port isn't set or configured");
+            }
+            return kdcPort;
+        }
+        return -1;
+    }
+
+    /**
+     * Check kdc udp setting and see if any bad.
+     * @return valid udp port or -1 if not allowUdp
+     * @throws KrbException
+     */
+    public int checkGetKdcUdpPort() throws KrbException {
+        if (allowUdp()) {
+            int kdcPort = getKdcUdpPort();
+            if (kdcPort < 1) {
+                throw new KrbException("KDC udp port isn't set or configured");
+            }
+            return kdcPort;
+        }
+        return -1;
+    }
+
     public int getKdcTcpPort() {
         int tcpPort = startupOptions.getIntegerOption(KdcServerOption.KDC_TCP_PORT);
         if (tcpPort < 1) {

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcUtil.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcUtil.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcUtil.java
index 4157fd1..158f05c 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcUtil.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcUtil.java
@@ -22,9 +22,11 @@ package org.apache.kerby.kerberos.kerb.server;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.identity.backend.IdentityBackend;
 import org.apache.kerby.kerberos.kerb.identity.backend.MemoryIdentityBackend;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.InetSocketAddress;
 
 /**
  * KDC side utilities.
@@ -96,4 +98,28 @@ public final class KdcUtil {
         backend.initialize();
         return backend;
     }
+
+    /**
+     * Get KDC network transport addresses according to KDC setting.
+     * @param setting
+     * @return UDP and TCP addresses pair
+     * @throws KrbException
+     */
+    public static TransportPair getTransportPair(
+            KdcSetting setting) throws KrbException {
+        TransportPair result = new TransportPair();
+
+        int tcpPort = setting.checkGetKdcTcpPort();
+        if (tcpPort > 0) {
+            result.tcpAddress = new InetSocketAddress(
+                    setting.getKdcHost(), tcpPort);
+        }
+        int udpPort = setting.checkGetKdcUdpPort();
+        if (udpPort > 0) {
+            result.udpAddress = new InetSocketAddress(
+                    setting.getKdcHost(), udpPort);
+        }
+
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/bb6cce19/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServerImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServerImpl.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServerImpl.java
index 2e55e83..8b61d8e 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServerImpl.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServerImpl.java
@@ -21,11 +21,12 @@ package org.apache.kerby.kerberos.kerb.server.impl;
 
 import org.apache.kerby.kerberos.kerb.server.KdcContext;
 import org.apache.kerby.kerberos.kerb.server.KdcSetting;
+import org.apache.kerby.kerberos.kerb.server.KdcUtil;
 import org.apache.kerby.kerberos.kerb.server.preauth.PreauthHandler;
 import org.apache.kerby.kerberos.kerb.transport.KdcNetwork;
 import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 
-import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -58,15 +59,8 @@ public class DefaultInternalKdcServerImpl extends AbstractInternalKdcServer {
         };
 
         network.init();
-
-        InetSocketAddress tcpAddress, udpAddress = null;
-        tcpAddress = new InetSocketAddress(getSetting().getKdcHost(),
-                getSetting().getKdcTcpPort());
-        if (getSetting().allowUdp()) {
-            udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
-                    getSetting().getKdcUdpPort());
-        }
-        network.listen(tcpAddress, udpAddress);
+        TransportPair tpair = KdcUtil.getTransportPair(getSetting());
+        network.listen(tpair);
         network.start();
     }