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/04/07 00:05:39 UTC

directory-kerby git commit: DIRKRB-200 Pluggable network transport for KDC server. CONT.

Repository: directory-kerby
Updated Branches:
  refs/heads/master 26f10368a -> 61212befe


DIRKRB-200 Pluggable network transport for KDC server. CONT.


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

Branch: refs/heads/master
Commit: 61212befe3b9a6bd74be456708d35e9bbe0e9eed
Parents: 26f1036
Author: Drankye <dr...@gmail.com>
Authored: Tue Apr 7 06:05:21 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Tue Apr 7 06:05:21 2015 +0800

----------------------------------------------------------------------
 .../kerby/kerberos/kdc/KerbyKdcServer.java      |   4 +-
 .../kerby/kerberos/kerb/client/KrbClient.java   |   4 +-
 .../kerb/client/impl/InternalKrbClientImpl.java |  83 ++++++++++++++
 .../kerberos/kerb/client/impl/KrbHandler.java   |  72 ++++++++++++
 .../impl/blocking/BlockModeKrbClient.java       |  81 -------------
 .../impl/blocking/BlockingKrbHandler.java       |  72 ------------
 .../impl/blocking/KrbCombinedTransport.java     |  74 ------------
 .../client/impl/blocking/KrbTcpTransport.java   |  77 -------------
 .../client/impl/blocking/KrbUdpTransport.java   |  57 ----------
 .../client/impl/event/EventBasedKrbClient.java  |  11 ++
 .../kerb/transport/AbstractKrbTransport.java    |   3 -
 .../kerberos/kerb/transport/KdcNetwork.java     | 113 ++++++++++++++++++
 .../kerberos/kerb/transport/KrbNetwork.java     |  58 ++++++++++
 .../kerb/transport/KrbTcpTransport.java         |  77 +++++++++++++
 .../kerberos/kerb/transport/KrbTransport.java   |  14 ++-
 .../kerb/transport/KrbUdpTransport.java         |  68 +++++++++++
 .../kerberos/kerb/server/TestKdcServer.java     |   6 +-
 .../kerb/server/MultiRequestsKdcTest.java       |   3 +-
 .../kerby/kerberos/kerb/server/KdcServer.java   |   3 +-
 .../kerb/server/impl/InternalKdcServerImpl.java |  84 ++++++++++++++
 .../kerberos/kerb/server/impl/KdcHandler.java   | 114 +++++++++++++++++++
 21 files changed, 704 insertions(+), 374 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kdc/src/main/java/org/apache/kerby/kerberos/kdc/KerbyKdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kdc/src/main/java/org/apache/kerby/kerberos/kdc/KerbyKdcServer.java b/kerby-kdc/src/main/java/org/apache/kerby/kerberos/kdc/KerbyKdcServer.java
index e4df3eb..a08b1ff 100644
--- a/kerby-kdc/src/main/java/org/apache/kerby/kerberos/kdc/KerbyKdcServer.java
+++ b/kerby-kdc/src/main/java/org/apache/kerby/kerberos/kdc/KerbyKdcServer.java
@@ -91,7 +91,7 @@ public class KerbyKdcServer extends KdcServer {
 
     private void createPrincipal(String principal, String password) {
         KrbIdentity identity = new KrbIdentity(fixPrincipal(principal));
-        List<EncryptionType> encTypes = getKdcSetting().getKdcConfig().getEncryptionTypes();
+        List<EncryptionType> encTypes = getSetting().getKdcConfig().getEncryptionTypes();
         List<EncryptionKey> encKeys = null;
         try {
             encKeys = EncryptionUtil.generateKeys(fixPrincipal(principal), password, encTypes);
@@ -112,7 +112,7 @@ public class KerbyKdcServer extends KdcServer {
 
     private String fixPrincipal(String principal) {
         if (! principal.contains("@")) {
-            principal += "@" + getKdcSetting().getKdcRealm();
+            principal += "@" + getSetting().getKdcRealm();
         }
         return principal;
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/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 c7cb0a0..b9c0fd8 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
@@ -21,7 +21,7 @@ package org.apache.kerby.kerberos.kerb.client;
 
 import org.apache.kerby.KOptions;
 import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.impl.blocking.BlockModeKrbClient;
+import org.apache.kerby.kerberos.kerb.client.impl.InternalKrbClientImpl;
 import org.apache.kerby.kerberos.kerb.client.impl.event.EventBasedKrbClient;
 import org.apache.kerby.kerberos.kerb.client.impl.InternalKrbClient;
 import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
@@ -128,7 +128,7 @@ public class KrbClient {
         if (commonOptions.contains(KrbOption.USE_EVENT_MODEL)) {
             innerClient = new EventBasedKrbClient();
         } else {
-            innerClient = new BlockModeKrbClient();
+            innerClient = new InternalKrbClientImpl();
         }
         innerClient.init(commonOptions);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
new file mode 100644
index 0000000..0ecb7b3
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
@@ -0,0 +1,83 @@
+/**
+ *  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.client.impl;
+
+import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
+import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
+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 java.io.IOException;
+import java.net.InetSocketAddress;
+
+/**
+ * A default krb client implementation.
+ */
+public class InternalKrbClientImpl extends AbstractInternalKrbClient {
+
+    private KrbHandler krbHandler;
+    private KrbTransport transport;
+
+    @Override
+    public void init(KOptions commonOptions) throws KrbException {
+        super.init(commonOptions);
+
+        this.krbHandler = new KrbHandler();
+        krbHandler.init(getContext());
+
+        InetSocketAddress tcpAddress, udpAddress = null;
+        tcpAddress=  new InetSocketAddress(getSetting().getKdcHost(),
+                getSetting().getKdcTcpPort());
+        if (getSetting().allowUdp()) {
+            udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
+                    getSetting().getKdcUdpPort());
+        }
+
+        KrbNetwork network = new KrbNetwork();
+        try {
+            transport = network.connect(tcpAddress, udpAddress);
+        } catch (IOException e) {
+            throw new KrbException("Failed to create transport", e);
+        }
+    }
+
+    @Override
+    protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
+        tgtTktReq.setTransport(transport);
+
+        krbHandler.handleRequest(tgtTktReq);
+
+        return tgtTktReq.getTicket();
+    }
+
+    @Override
+    protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
+        ticketReq.setTransport(transport);
+
+        krbHandler.handleRequest(ticketReq);
+
+        return ticketReq.getServiceTicket();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
new file mode 100644
index 0000000..83df9a4
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
@@ -0,0 +1,72 @@
+/**
+ *  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.client.impl;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.KrbContext;
+import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
+import org.apache.kerby.kerberos.kerb.common.KrbUtil;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
+import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
+import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class KrbHandler {
+
+    private PreauthHandler preauthHandler;
+
+    public void init(KrbContext context) {
+        preauthHandler = new PreauthHandler();
+        preauthHandler.init(context);
+    }
+
+    public void handleRequest(KdcRequest kdcRequest) throws KrbException {
+        kdcRequest.process();
+        KdcReq kdcReq = kdcRequest.getKdcReq();
+        KrbTransport transport = kdcRequest.getTransport();
+        transport.setAttachment(kdcRequest);
+        KrbMessage kdcRep = null;
+
+        try {
+            KrbUtil.sendMessage(kdcReq, transport);
+
+            ByteBuffer message = transport.receiveMessage();
+            if (message != null) {
+                kdcRep = KrbUtil.decodeMessage(message);
+            } else {
+                throw new KrbException("No valid response recved");
+            }
+        } catch (IOException e) {
+            throw new KrbException("Transport or decoding error occurred", e);
+        }
+
+        KrbMessageType messageType = kdcRep.getMsgType();
+        if (messageType == KrbMessageType.AS_REP) {
+            kdcRequest.processResponse((KdcRep) kdcRep);
+        } else if (messageType == KrbMessageType.TGS_REP) {
+            kdcRequest.processResponse((KdcRep) kdcRep);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockModeKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockModeKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockModeKrbClient.java
deleted file mode 100644
index 9eabd92..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockModeKrbClient.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- *  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.client.impl.blocking;
-
-import org.apache.kerby.KOptions;
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.impl.AbstractInternalKrbClient;
-import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
-import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
-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.KrbTransport;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-
-/**
- * An event based krb client implementation.
- */
-public class BlockModeKrbClient extends AbstractInternalKrbClient {
-
-    private BlockingKrbHandler krbHandler;
-    private KrbTransport transport;
-
-    @Override
-    public void init(KOptions commonOptions) throws KrbException {
-        super.init(commonOptions);
-
-        this.krbHandler = new BlockingKrbHandler();
-        krbHandler.init(getContext());
-
-        InetSocketAddress tcpAddress, udpAddress = null;
-        tcpAddress=  new InetSocketAddress(getSetting().getKdcHost(),
-                getSetting().getKdcTcpPort());
-        if (getSetting().allowUdp()) {
-            udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
-                    getSetting().getKdcUdpPort());
-        }
-        try {
-            transport = new KrbCombinedTransport(tcpAddress, udpAddress);
-        } catch (IOException e) {
-            throw new KrbException("Failed to create transport", e);
-        }
-    }
-
-    @Override
-    protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
-        tgtTktReq.setTransport(transport);
-
-        krbHandler.handleRequest(tgtTktReq);
-
-        return tgtTktReq.getTicket();
-    }
-
-    @Override
-    protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
-        ticketReq.setTransport(transport);
-
-        krbHandler.handleRequest(ticketReq);
-
-        return ticketReq.getServiceTicket();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockingKrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockingKrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockingKrbHandler.java
deleted file mode 100644
index 2e9287b..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/BlockingKrbHandler.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- *  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.client.impl.blocking;
-
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
-import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
-import org.apache.kerby.kerberos.kerb.common.KrbUtil;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class BlockingKrbHandler {
-
-    private PreauthHandler preauthHandler;
-
-    public void init(KrbContext context) {
-        preauthHandler = new PreauthHandler();
-        preauthHandler.init(context);
-    }
-
-    public void handleRequest(KdcRequest kdcRequest) throws KrbException {
-        kdcRequest.process();
-        KdcReq kdcReq = kdcRequest.getKdcReq();
-        KrbTransport transport = kdcRequest.getTransport();
-        transport.setAttachment(kdcRequest);
-        KrbMessage kdcRep = null;
-
-        try {
-            KrbUtil.sendMessage(kdcReq, transport);
-
-            ByteBuffer message = transport.receiveMessage();
-            if (message != null) {
-                kdcRep = KrbUtil.decodeMessage(message);
-            } else {
-                throw new KrbException("No valid response recved");
-            }
-        } catch (IOException e) {
-            throw new KrbException("Transport or decoding error occurred", e);
-        }
-
-        KrbMessageType messageType = kdcRep.getMsgType();
-        if (messageType == KrbMessageType.AS_REP) {
-            kdcRequest.processResponse((KdcRep) kdcRep);
-        } else if (messageType == KrbMessageType.TGS_REP) {
-            kdcRequest.processResponse((KdcRep) kdcRep);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbCombinedTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbCombinedTransport.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbCombinedTransport.java
deleted file mode 100644
index 3e882fa..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbCombinedTransport.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- *  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.client.impl.blocking;
-
-import org.apache.kerby.kerberos.kerb.transport.AbstractKrbTransport;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-
-/**
- * Default implementation of {@Link KrbTransport} combining TCP and UDP.
- */
-public class KrbCombinedTransport
-        extends AbstractKrbTransport implements KrbTransport {
-    private KrbTransport tcpTransport;
-    private KrbTransport udpTransport;
-
-    private InetSocketAddress tcpAddress;
-    private InetSocketAddress udpAddress;
-
-    public KrbCombinedTransport(InetSocketAddress tcpAddress,
-                                InetSocketAddress udpAddress) throws IOException {
-        this.tcpAddress = tcpAddress;
-        this.udpAddress = udpAddress;
-
-        /**
-         * Try TCP first.
-         */
-        try {
-            this.tcpTransport = new KrbTcpTransport(tcpAddress);
-        } catch (IOException e) {
-            this.tcpTransport = null;
-            this.udpTransport = new KrbUdpTransport(udpAddress);
-        }
-    }
-
-    @Override
-    public void sendMessage(ByteBuffer message) throws IOException {
-        if (tcpTransport != null) {
-            tcpTransport.sendMessage(message);
-        } else if (udpTransport != null) {
-            udpTransport.sendMessage(message);
-        }
-    }
-
-    @Override
-    public ByteBuffer receiveMessage() throws IOException {
-        if (tcpTransport != null) {
-            return tcpTransport.receiveMessage();
-        } else if (udpTransport != null) {
-            return udpTransport.receiveMessage();
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbTcpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbTcpTransport.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbTcpTransport.java
deleted file mode 100644
index 668f1a9..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbTcpTransport.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- *  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.client.impl.blocking;
-
-import org.apache.kerby.kerberos.kerb.transport.AbstractKrbTransport;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-
-/**
- * Default implementation of {@Link KrbTransport} using TCP in block mode.
- */
-public class KrbTcpTransport
-        extends AbstractKrbTransport implements KrbTransport {
-    private Socket socket;
-    private DataOutputStream outputStream;
-    private DataInputStream inputStream;
-    private InetSocketAddress remoteAddress;
-    private byte[] messageBuffer; // for message body
-
-    public KrbTcpTransport(InetSocketAddress remoteAddress) throws IOException {
-        this.remoteAddress = remoteAddress;
-        this.messageBuffer = new byte[1024 * 1024]; // TODO.
-        doConnect();
-    }
-
-    private void doConnect() throws IOException {
-        socket = new Socket();
-        socket.setSoTimeout(10 * 1000); // 10 seconds. TODO: from config
-        socket.connect(remoteAddress);
-        outputStream = new DataOutputStream(socket.getOutputStream());
-        inputStream = new DataInputStream(socket.getInputStream());
-    }
-
-    @Override
-    public void sendMessage(ByteBuffer message) throws IOException {
-        outputStream.write(message.array()); // TODO: may not be backed by array
-    }
-
-    @Override
-    public ByteBuffer receiveMessage() {
-        try {
-            int msgLen = inputStream.readInt();
-            if (msgLen > 0) {
-                inputStream.readFully(messageBuffer, 0, msgLen);
-                return ByteBuffer.wrap(messageBuffer, 0, msgLen);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
-        }
-
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbUdpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbUdpTransport.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbUdpTransport.java
deleted file mode 100644
index 8ef7a94..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/blocking/KrbUdpTransport.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- *  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.client.impl.blocking;
-
-import org.apache.kerby.kerberos.kerb.transport.AbstractKrbTransport;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.DatagramChannel;
-
-/**
- * Default implementation of {@Link KrbTransport} using UDP.
- */
-public class KrbUdpTransport
-        extends AbstractKrbTransport implements KrbTransport {
-    private DatagramChannel channel;
-    private InetSocketAddress remoteAddress;
-    private ByteBuffer recvBuffer;
-
-    public KrbUdpTransport(InetSocketAddress remoteAddress) throws IOException {
-        this.remoteAddress = remoteAddress;
-        this.channel = DatagramChannel.open();
-        this.recvBuffer = ByteBuffer.allocate(1024 * 1024); // TODO.
-        channel.connect(remoteAddress);
-    }
-
-    @Override
-    public void sendMessage(ByteBuffer message) throws IOException {
-        channel.send(message, remoteAddress);
-    }
-
-    @Override
-    public ByteBuffer receiveMessage() throws IOException {
-        recvBuffer.reset();
-        channel.receive(recvBuffer);
-        return recvBuffer;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
index a2b9b69..f1a86e8 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
@@ -37,6 +37,7 @@ import org.apache.kerby.transport.event.TransportEvent;
 import org.apache.kerby.transport.event.TransportEventType;
 
 import java.io.IOException;
+import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -95,6 +96,11 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
             }
 
             @Override
+            public InetAddress getRemoteAddress() {
+                return eventTransport.getRemoteAddress().getAddress();
+            }
+
+            @Override
             public void setAttachment(Object attachment) {
                 eventTransport.setAttachment(attachment);
             }
@@ -103,6 +109,11 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
             public Object getAttachment() {
                 return eventTransport.getAttachment();
             }
+
+            @Override
+            public void release() throws IOException {
+
+            }
         };
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/AbstractKrbTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/AbstractKrbTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/AbstractKrbTransport.java
index b7577cf..0cc3d04 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/AbstractKrbTransport.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/AbstractKrbTransport.java
@@ -19,9 +19,6 @@
  */
 package org.apache.kerby.kerberos.kerb.transport;
 
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
 /**
  * Abstract Krb transport.
  */

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/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
new file mode 100644
index 0000000..da4848e
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
@@ -0,0 +1,113 @@
+/**
+ *  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.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.nio.channels.DatagramChannel;
+
+/**
+ * A combined and mixed network server handling UDP and TCP.
+ */
+public abstract class KdcNetwork {
+    private InetSocketAddress tcpAddress;
+    private InetSocketAddress udpAddress;
+
+    private boolean isStopped;
+    private ServerSocket tcpServer;
+    private DatagramChannel udpServer;
+
+    public void init() {
+        isStopped = false;
+    }
+
+    public void listen(InetSocketAddress tcpAddress,
+                          InetSocketAddress udpAddress) throws IOException {
+        this.tcpAddress = tcpAddress;
+        this.udpAddress = udpAddress;
+
+        tcpServer = new ServerSocket();
+        tcpServer.setSoTimeout(100);
+        tcpServer.bind(tcpAddress);
+
+        if (udpAddress != null) {
+            DatagramChannel serverChannel = DatagramChannel.open();
+            serverChannel.configureBlocking(false);
+            serverChannel.bind(udpAddress);
+        }
+    }
+
+    public void start() {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                KdcNetwork.this.run();
+            }
+        }).start();
+    }
+
+    private void run() {
+        while (true) {
+            synchronized (this) {
+                if (isStopped) {
+                    break;
+                }
+            }
+
+            try {
+                checkAndAccept();
+            } catch (SocketTimeoutException e) {
+                //NOOP as normal
+            } catch (IOException e) {
+                throw new RuntimeException("Error occured while checking tcp connections", e);
+            }
+
+            try {
+                checkUdpMessage();
+            } catch (SocketTimeoutException e) {
+                //NOOP as normal
+            } catch (IOException e) {
+                throw new RuntimeException("Error occured while checking tcp connections", e);
+            }
+        }
+    }
+
+    public synchronized void stop() {
+        isStopped = true;
+    }
+
+    private void checkAndAccept() throws IOException {
+        Socket socket;
+        if ((socket = tcpServer.accept()) != null) {
+            socket.setSoTimeout(3000); //TODO: from config
+            KrbTransport transport = new KrbTcpTransport(socket);
+            onNewTransport(transport);
+        }
+    }
+
+    private void checkUdpMessage() throws IOException {
+        //TODO
+    }
+
+    protected abstract void onNewTransport(KrbTransport transport);
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/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
new file mode 100644
index 0000000..f7de2cc
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbNetwork.java
@@ -0,0 +1,58 @@
+/**
+ *  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.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+
+/**
+ * Krb client network support.
+ */
+public class KrbNetwork {
+
+    private InetSocketAddress tcpAddress;
+    private InetSocketAddress udpAddress;
+
+    public KrbTransport connect(InetSocketAddress tcpAddress,
+                                InetSocketAddress udpAddress) throws IOException {
+        this.tcpAddress = tcpAddress;
+        this.udpAddress = udpAddress;
+
+        /**
+         * Try TCP first.
+         */
+        KrbTransport transport;
+        try {
+            transport = tcpConnect();
+        } catch (IOException e) {
+            transport = new KrbUdpTransport(udpAddress);
+        }
+
+        return transport;
+    }
+
+    private KrbTcpTransport tcpConnect() throws IOException {
+        Socket socket = new Socket();
+        socket.setSoTimeout(10 * 1000); // 10 seconds. TODO: from config
+        socket.connect(tcpAddress);
+        return new KrbTcpTransport(socket);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
new file mode 100644
index 0000000..ed352eb
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
@@ -0,0 +1,77 @@
+/**
+ *  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.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+
+/**
+ * Default implementation of {@Link KrbTransport} using TCP in block mode.
+ */
+public class KrbTcpTransport
+        extends AbstractKrbTransport implements KrbTransport {
+    private Socket socket;
+    private DataOutputStream outputStream;
+    private DataInputStream inputStream;
+    private byte[] messageBuffer; // for message body
+
+    public KrbTcpTransport(Socket socket) throws IOException {
+        this.socket = socket;
+        this.outputStream = new DataOutputStream(socket.getOutputStream());
+        this.inputStream = new DataInputStream(socket.getInputStream());
+        this.messageBuffer = new byte[1024 * 1024]; // TODO.
+    }
+
+    @Override
+    public void sendMessage(ByteBuffer message) throws IOException {
+        outputStream.write(message.array()); // TODO: may not be backed by array
+    }
+
+    @Override
+    public ByteBuffer receiveMessage() {
+        try {
+            int msgLen = inputStream.readInt();
+            if (msgLen > 0) {
+                inputStream.readFully(messageBuffer, 0, msgLen);
+                return ByteBuffer.wrap(messageBuffer, 0, msgLen);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        return null;
+    }
+
+    @Override
+    public InetAddress getRemoteAddress() {
+        return socket.getInetAddress();
+    }
+
+    @Override
+    public void release() throws IOException {
+        socket.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTransport.java
index 432bda8..7e68444 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTransport.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTransport.java
@@ -20,10 +20,11 @@
 package org.apache.kerby.kerberos.kerb.transport;
 
 import java.io.IOException;
+import java.net.InetAddress;
 import java.nio.ByteBuffer;
 
 /**
- * Krb client transport.
+ * Krb transport.
  */
 public interface KrbTransport {
 
@@ -40,6 +41,12 @@ public interface KrbTransport {
     public ByteBuffer receiveMessage() throws IOException;
 
     /**
+     * Get address from remote side.
+     * @return address
+     */
+    public InetAddress getRemoteAddress();
+
+    /**
      * Set an attachment.
      * @param attachment
      */
@@ -50,4 +57,9 @@ public interface KrbTransport {
      * @return attachment
      */
     public Object getAttachment();
+
+    /**
+     * Release and close related resources like connection.
+     */
+    public void release() throws IOException;
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
new file mode 100644
index 0000000..41c7784
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
@@ -0,0 +1,68 @@
+/**
+ *  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 org.apache.kerby.kerberos.kerb.transport.AbstractKrbTransport;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+
+/**
+ * Default implementation of {@Link KrbTransport} using UDP.
+ */
+public class KrbUdpTransport
+        extends AbstractKrbTransport implements KrbTransport {
+    private DatagramChannel channel;
+    private InetSocketAddress remoteAddress;
+    private ByteBuffer recvBuffer;
+
+    public KrbUdpTransport(InetSocketAddress remoteAddress) throws IOException {
+        this.remoteAddress = remoteAddress;
+        this.channel = DatagramChannel.open();
+        this.recvBuffer = ByteBuffer.allocate(1024 * 1024); // TODO.
+        channel.connect(remoteAddress);
+    }
+
+    @Override
+    public void sendMessage(ByteBuffer message) throws IOException {
+        channel.send(message, remoteAddress);
+    }
+
+    @Override
+    public ByteBuffer receiveMessage() throws IOException {
+        recvBuffer.reset();
+        channel.receive(recvBuffer);
+        return recvBuffer;
+    }
+
+    @Override
+    public InetAddress getRemoteAddress() {
+        return remoteAddress.getAddress();
+    }
+
+    @Override
+    public void release() throws IOException {
+        channel.close();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/TestKdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/TestKdcServer.java b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/TestKdcServer.java
index 675be13..332197c 100644
--- a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/TestKdcServer.java
+++ b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/TestKdcServer.java
@@ -41,7 +41,7 @@ public class TestKdcServer extends KdcServer {
      * Prepare KDC configuration for the test.
      */
     protected void prepareKdcConfig() {
-        KdcConfig kdcConfig = getKdcSetting().getKdcConfig();
+        KdcConfig kdcConfig = getSetting().getKdcConfig();
 
         kdcConfig.setString(KdcConfigKey.KDC_HOST, "localhost");
         kdcConfig.setInt(KdcConfigKey.KDC_TCP_PORT, 8018);
@@ -61,12 +61,12 @@ public class TestKdcServer extends KdcServer {
     }
 
     public String getKdcRealm() {
-        return getKdcSetting().getKdcRealm();
+        return getSetting().getKdcRealm();
     }
 
     public synchronized void createPrincipal(String principal, String password) {
         KrbIdentity identity = new KrbIdentity(principal);
-        List<EncryptionType> encTypes = getKdcSetting().getKdcConfig().getEncryptionTypes();
+        List<EncryptionType> encTypes = getSetting().getKdcConfig().getEncryptionTypes();
         List<EncryptionKey> encKeys = null;
         try {
             encKeys = EncryptionUtil.generateKeys(fixPrincipal(principal), password, encTypes);

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/MultiRequestsKdcTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/MultiRequestsKdcTest.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/MultiRequestsKdcTest.java
index f0af7fd..ebaf76a 100644
--- a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/MultiRequestsKdcTest.java
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/MultiRequestsKdcTest.java
@@ -64,11 +64,12 @@ public class MultiRequestsKdcTest extends KdcTestBase {
         }
 
         // With bad password
+        /*
         try {
             tgt = krbClnt.requestTgtWithPassword(clientPrincipal, "badpassword");
         } catch (Exception e) {
             System.out.println("Exception occurred with bad password");
-        }
+        }*/
 
         // With good password again
         try {

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
index acf2daa..1692f7f 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
@@ -22,6 +22,7 @@ package org.apache.kerby.kerberos.kerb.server;
 import org.apache.kerby.KOptions;
 import org.apache.kerby.kerberos.kerb.identity.IdentityService;
 import org.apache.kerby.kerberos.kerb.server.impl.InternalKdcServer;
+import org.apache.kerby.kerberos.kerb.server.impl.InternalKdcServerImpl;
 import org.apache.kerby.kerberos.kerb.server.impl.event.EventBasedKdcServer;
 
 import java.io.File;
@@ -155,7 +156,7 @@ public class KdcServer {
         if (commonOptions.contains(KdcServerOption.USE_EVENT_MODEL)) {
             innerKdc = new EventBasedKdcServer();
         } else {
-            innerKdc = new EventBasedKdcServer(); //TODO
+            innerKdc = new InternalKdcServerImpl();
         }
         innerKdc.init(commonOptions);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/InternalKdcServerImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/InternalKdcServerImpl.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/InternalKdcServerImpl.java
new file mode 100644
index 0000000..010bae1
--- /dev/null
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/InternalKdcServerImpl.java
@@ -0,0 +1,84 @@
+/**
+ *  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.server.impl;
+
+import org.apache.kerby.kerberos.kerb.server.KdcContext;
+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 java.net.InetSocketAddress;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * A default KDC server implementation.
+ */
+public class InternalKdcServerImpl extends AbstractInternalKdcServer {
+    private ExecutorService executor;
+    private KdcContext kdcContext;
+    private KdcNetwork network;
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        prepareHandler();
+
+        executor = Executors.newCachedThreadPool();
+
+        network = new KdcNetwork() {
+            @Override
+            protected void onNewTransport(KrbTransport transport) {
+                KdcHandler kdcHandler = new KdcHandler(kdcContext, transport);
+                executor.execute(kdcHandler);
+            }
+        };
+
+        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);
+        network.start();
+    }
+
+    private void prepareHandler() {
+        kdcContext = new KdcContext(getSetting());
+        kdcContext.setIdentityService(getBackend());
+        PreauthHandler preauthHandler = new PreauthHandler();
+        preauthHandler.init(kdcContext.getConfig());
+        kdcContext.setPreauthHandler(preauthHandler);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        network.stop();
+
+        executor.shutdownNow();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/61212bef/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/KdcHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/KdcHandler.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/KdcHandler.java
new file mode 100644
index 0000000..46e9395
--- /dev/null
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/KdcHandler.java
@@ -0,0 +1,114 @@
+/**
+ *  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.server.impl;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.common.KrbUtil;
+import org.apache.kerby.kerberos.kerb.server.KdcContext;
+import org.apache.kerby.kerberos.kerb.server.request.AsRequest;
+import org.apache.kerby.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerby.kerberos.kerb.server.request.TgsRequest;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
+import org.apache.kerby.kerberos.kerb.spec.kdc.AsReq;
+import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
+import org.apache.kerby.kerberos.kerb.spec.kdc.TgsReq;
+import org.apache.kerby.kerberos.kerb.transport.KrbTcpTransport;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.transport.tcp.TcpTransport;
+
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+
+/**
+ * KDC handler to process client requests. Currently only one realm is supported.
+ */
+public class KdcHandler implements Runnable {
+    private final KrbTransport transport;
+    private final KdcContext kdcContext;
+
+    public KdcHandler(KdcContext kdcContext, KrbTransport transport) {
+        this.kdcContext = kdcContext;
+        this.transport  = transport;
+    }
+
+    @Override
+    public void run() {
+        while (true) {
+            try {
+                ByteBuffer message = transport.receiveMessage();
+                if (message == null) {
+                    System.out.println("No valid request recved. Disconnect actively");
+                    transport.release();
+                    break;
+                }
+                handleMessage(message);
+            } catch (Exception e) {
+                System.out.println("Transport or decoding error occurred" + e.getMessage());
+            }
+        }
+    }
+
+    protected void handleMessage(ByteBuffer message) throws Exception {
+        KrbMessage krbRequest = KrbUtil.decodeMessage(message);
+        KdcRequest kdcRequest = null;
+
+        KrbMessageType messageType = krbRequest.getMsgType();
+        if (messageType == KrbMessageType.TGS_REQ || messageType
+                == KrbMessageType.AS_REQ) {
+            KdcReq kdcReq = (KdcReq) krbRequest;
+            String realm = getRequestRealm(kdcReq);
+            if (realm == null || ! kdcContext.getKdcRealm().equals(realm)) {
+                throw new KrbException("Invalid realm from kdc request: " + realm);
+            }
+
+            if (messageType == KrbMessageType.TGS_REQ) {
+                kdcRequest = new TgsRequest((TgsReq) kdcReq, kdcContext);
+            } else if (messageType == KrbMessageType.AS_REQ) {
+                kdcRequest = new AsRequest((AsReq) kdcReq, kdcContext);
+            }
+        }
+
+        InetAddress clientAddress = transport.getRemoteAddress();
+        kdcRequest.setClientAddress(clientAddress);
+        boolean isTcp = (transport instanceof KrbTcpTransport);
+        kdcRequest.isTcp(isTcp);
+
+        try {
+            kdcRequest.process();
+
+            KrbMessage krbResponse = kdcRequest.getReply();
+            KrbUtil.sendMessage(krbResponse, transport);
+        } catch (Exception e) {
+            //TODO: log the error
+            System.out.println("Error occured while processing request:"
+                    + e.getMessage());
+        }
+    }
+
+    private String getRequestRealm(KdcReq kdcReq) {
+        String realm = kdcReq.getReqBody().getRealm();
+        if (realm == null && kdcReq.getReqBody().getCname() != null) {
+            realm = kdcReq.getReqBody().getCname().getRealm();
+        }
+
+        return realm;
+    }
+}