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/13 00:59:09 UTC

directory-kerby git commit: Refactored internal implementations for KrbClient and KdcServer with more tests added

Repository: directory-kerby
Updated Branches:
  refs/heads/master 0633ad96c -> 8f312e5b3


Refactored internal implementations for KrbClient and KdcServer with more tests added


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

Branch: refs/heads/master
Commit: 8f312e5b3aec6ddd5739ad7b7ab1ef605950f347
Parents: 0633ad9
Author: Drankye <dr...@gmail.com>
Authored: Mon Apr 13 06:58:49 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Mon Apr 13 06:58:49 2015 +0800

----------------------------------------------------------------------
 .../kerberos/kerb/client/InternalKrbClient.java | 69 ++++++++++++++++
 .../kerby/kerberos/kerb/client/KrbClient.java   |  5 +-
 .../kerby/kerberos/kerb/client/KrbHandler.java  | 82 +++++++++++++++++++
 .../client/impl/AbstractInternalKrbClient.java  |  5 +-
 .../client/impl/DefaultInternalKrbClient.java   | 83 +++++++++++++++++++
 .../kerb/client/impl/DefaultKrbHandler.java     | 58 ++++++++++++++
 .../kerb/client/impl/InternalKrbClient.java     | 69 ----------------
 .../kerb/client/impl/InternalKrbClientImpl.java | 83 -------------------
 .../kerberos/kerb/client/impl/KrbHandler.java   | 72 -----------------
 .../client/impl/event/EventBasedKrbClient.java  | 48 ++---------
 .../kerb/client/impl/event/EventKrbHandler.java | 50 +++++-------
 .../kerb/client/request/KdcRequest.java         | 11 ++-
 .../kerb/common/KrbStreamingDecoder.java        |  2 +-
 .../kerby/kerberos/kerb/common/KrbUtil.java     | 79 ------------------
 .../kerb/transport/KrbTcpTransport.java         | 15 ++--
 .../kerby/kerberos/kerb/server/KdcTestBase.java | 28 ++++++-
 .../kerb/server/KdcTestUsingEventClient.java    | 35 ++++++++
 .../kerb/server/KdcTestUsingEventKdc.java       | 35 ++++++++
 .../kerby/kerberos/kerb/server/KdcHandler.java  | 15 +++-
 .../kerby/kerberos/kerb/server/KdcServer.java   |  4 +-
 .../server/impl/DefaultInternalKdcServer.java   | 84 ++++++++++++++++++++
 .../kerby/transport/tcp/DecodingCallback.java   |  2 +-
 .../kerby/transport/tcp/TcpTransport.java       |  8 +-
 .../kerby/event/network/TestNetworkBase.java    |  2 +-
 .../org/apache/kerby/event/tcp/TestTcpBase.java |  2 +-
 25 files changed, 534 insertions(+), 412 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
new file mode 100644
index 0000000..b772599
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
@@ -0,0 +1,69 @@
+/**
+ *  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;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.client.KrbSetting;
+import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
+import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
+
+/**
+ * An internal krb client interface.
+ */
+public interface InternalKrbClient {
+
+    /**
+     * Init with all the necessary options.
+     * @param options
+     */
+    public void init(KOptions options) throws KrbException;
+
+    /**
+     * Get krb client settings.
+     * @return setting
+     */
+    public KrbSetting getSetting();
+
+    /**
+     * Request a Ticket Granting Ticket.
+     * @param requestOptions
+     * @return a TGT
+     * @throws KrbException
+     */
+    public TgtTicket requestTgtTicket(KOptions requestOptions) throws KrbException;
+
+    /**
+     * Request a service ticket using a TGT.
+     * @return service ticket
+     * @throws KrbException
+     */
+    public ServiceTicket requestServiceTicketWithTgt(TgtTicket tgt,
+                                              String serverPrincipal) throws KrbException;
+
+    /**
+     * Request a service ticket using an Access Token.
+     * @return service ticket
+     * @throws KrbException
+     */
+    public ServiceTicket requestServiceTicketWithAccessToken(AuthToken token,
+                                              String serverPrincipal) throws KrbException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/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 0bdd19d..70c38f7 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,9 +21,8 @@ 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.InternalKrbClientImpl;
+import org.apache.kerby.kerberos.kerb.client.impl.DefaultInternalKrbClient;
 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;
 import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
 import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
@@ -128,7 +127,7 @@ public class KrbClient {
         if (commonOptions.contains(KrbOption.USE_EVENT_MODEL)) {
             innerClient = new EventBasedKrbClient();
         } else {
-            innerClient = new InternalKrbClientImpl();
+            innerClient = new DefaultInternalKrbClient();
         }
         innerClient.init(commonOptions);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
new file mode 100644
index 0000000..f65e855
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
@@ -0,0 +1,82 @@
+/**
+ *  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;
+
+import org.apache.kerby.kerberos.kerb.KrbCodec;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
+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 java.io.IOException;
+import java.nio.ByteBuffer;
+
+public abstract class KrbHandler {
+
+    private KrbContext context;
+    private PreauthHandler preauthHandler;
+
+    public void init(KrbContext context) {
+        this.context = context;
+        preauthHandler = new PreauthHandler();
+        preauthHandler.init(context);
+    }
+
+    public void handleRequest(KdcRequest kdcRequest) throws KrbException {
+        kdcRequest.process();
+        KdcReq kdcReq = kdcRequest.getKdcReq();
+
+        int bodyLen = kdcReq.encodingLength();
+        ByteBuffer requestMessage = ByteBuffer.allocate(bodyLen + 4);
+        requestMessage.putInt(bodyLen);
+        kdcReq.encode(requestMessage);
+        requestMessage.flip();
+
+        try {
+            sendMessage(kdcRequest, requestMessage);
+        } catch (IOException e) {
+            throw new KrbException("sending message failed", e);
+        }
+    }
+
+    public void onResponseMessage(
+            KdcRequest kdcRequest, ByteBuffer responseMessage) throws KrbException {
+
+        KrbMessage kdcRep = null;
+        try {
+            kdcRep = KrbCodec.decodeMessage(responseMessage);
+        } catch (IOException e) {
+            throw new KrbException("Krb decoding message failed", e);
+        }
+
+        KrbMessageType messageType = kdcRep.getMsgType();
+        if (messageType == KrbMessageType.AS_REP) {
+            kdcRequest.processResponse((KdcRep) kdcRep);
+        } else if (messageType == KrbMessageType.TGS_REP) {
+            kdcRequest.processResponse((KdcRep) kdcRep);
+        }
+    }
+
+    protected abstract void sendMessage(KdcRequest kdcRequest,
+                                        ByteBuffer requestMessage) throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
index 97f498b..4356073 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
@@ -21,10 +21,7 @@ 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.KrbConfig;
-import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.KrbOption;
-import org.apache.kerby.kerberos.kerb.client.KrbSetting;
+import org.apache.kerby.kerberos.kerb.client.*;
 import org.apache.kerby.kerberos.kerb.client.request.*;
 import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
 import org.apache.kerby.kerberos.kerb.spec.base.PrincipalName;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/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
new file mode 100644
index 0000000..212cd82
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.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 DefaultInternalKrbClient extends AbstractInternalKrbClient {
+
+    private DefaultKrbHandler krbHandler;
+    private KrbTransport transport;
+
+    @Override
+    public void init(KOptions commonOptions) throws KrbException {
+        super.init(commonOptions);
+
+        this.krbHandler = new DefaultKrbHandler();
+        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.setSessionData(transport);
+
+        krbHandler.handleRequest(tgtTktReq);
+
+        return tgtTktReq.getTicket();
+    }
+
+    @Override
+    protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
+        ticketReq.setSessionData(transport);
+
+        krbHandler.handleRequest(ticketReq);
+
+        return ticketReq.getServiceTicket();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java
new file mode 100644
index 0000000..ee80372
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.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.client.impl;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.KrbContext;
+import org.apache.kerby.kerberos.kerb.client.KrbHandler;
+import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class DefaultKrbHandler extends KrbHandler {
+
+    public void init(KrbContext context) {
+        super.init(context);
+    }
+
+    @Override
+    public void handleRequest(KdcRequest kdcRequest) throws KrbException {
+        KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
+        transport.setAttachment(kdcRequest);
+
+        super.handleRequest(kdcRequest);
+        ByteBuffer receivedMessage = null;
+        try {
+            receivedMessage = transport.receiveMessage();
+        } catch (IOException e) {
+            throw new KrbException("Receiving response message failed", e);
+        }
+        super.onResponseMessage(kdcRequest, receivedMessage);
+    }
+
+    @Override
+    protected void sendMessage(KdcRequest kdcRequest,
+                               ByteBuffer requestMessage) throws IOException {
+        KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
+        transport.sendMessage(requestMessage);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
deleted file mode 100644
index 4dcf50e..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
+++ /dev/null
@@ -1,69 +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;
-
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.KOptions;
-import org.apache.kerby.kerberos.kerb.client.KrbSetting;
-import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
-import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
-import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
-
-/**
- * An internal krb client interface.
- */
-public interface InternalKrbClient {
-
-    /**
-     * Init with all the necessary options.
-     * @param options
-     */
-    public void init(KOptions options) throws KrbException;
-
-    /**
-     * Get krb client settings.
-     * @return setting
-     */
-    public KrbSetting getSetting();
-
-    /**
-     * Request a Ticket Granting Ticket.
-     * @param requestOptions
-     * @return a TGT
-     * @throws KrbException
-     */
-    public TgtTicket requestTgtTicket(KOptions requestOptions) throws KrbException;
-
-    /**
-     * Request a service ticket using a TGT.
-     * @return service ticket
-     * @throws KrbException
-     */
-    public ServiceTicket requestServiceTicketWithTgt(TgtTicket tgt,
-                                              String serverPrincipal) throws KrbException;
-
-    /**
-     * Request a service ticket using an Access Token.
-     * @return service ticket
-     * @throws KrbException
-     */
-    public ServiceTicket requestServiceTicketWithAccessToken(AuthToken token,
-                                              String serverPrincipal) throws KrbException;
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/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
deleted file mode 100644
index 0ecb7b3..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
+++ /dev/null
@@ -1,83 +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;
-
-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/8f312e5b/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
deleted file mode 100644
index 83df9a4..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.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;
-
-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/8f312e5b/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 f1a86e8..525dfb6 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
@@ -30,15 +30,11 @@ import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
 import org.apache.kerby.kerberos.kerb.common.KrbStreamingDecoder;
 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 org.apache.kerby.transport.Network;
 import org.apache.kerby.transport.Transport;
 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;
 
@@ -50,8 +46,7 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
     private EventKrbHandler krbHandler;
     private EventHub eventHub;
     private EventWaiter eventWaiter;
-    private Transport eventTransport;
-    private KrbTransport transport;
+    private Transport transport;
 
     @Override
     public void init(KOptions commonOptions) throws KrbException {
@@ -82,44 +77,13 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
                     getSetting().getKdcUdpPort());
         }
         final Event event = eventWaiter.waitEvent(TransportEventType.NEW_TRANSPORT);
-        eventTransport = ((TransportEvent) event).getTransport();
-
-        transport = new KrbTransport() {
-            @Override
-            public void sendMessage(ByteBuffer message) throws IOException {
-                eventTransport.sendMessage(message);
-            }
-
-            @Override
-            public ByteBuffer receiveMessage() throws IOException {
-                return null; // NOOP, should not be here, since event based.
-            }
-
-            @Override
-            public InetAddress getRemoteAddress() {
-                return eventTransport.getRemoteAddress().getAddress();
-            }
-
-            @Override
-            public void setAttachment(Object attachment) {
-                eventTransport.setAttachment(attachment);
-            }
-
-            @Override
-            public Object getAttachment() {
-                return eventTransport.getAttachment();
-            }
-
-            @Override
-            public void release() throws IOException {
-
-            }
-        };
+        transport = ((TransportEvent) event).getTransport();
     }
 
     @Override
     protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
-        tgtTktReq.setTransport(transport);
+        tgtTktReq.setSessionData(transport);
+        transport.setAttachment(tgtTktReq);
 
         eventHub.dispatch(KrbClientEvent.createTgtIntentEvent(tgtTktReq));
         Event resultEvent;
@@ -136,7 +100,8 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
 
     @Override
     protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
-        ticketReq.setTransport(transport);
+        ticketReq.setSessionData(transport);
+        transport.setAttachment(ticketReq);
 
         eventHub.dispatch(KrbClientEvent.createTktIntentEvent(ticketReq));
         Event resultEvent;
@@ -150,5 +115,4 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
 
         return tgsResponse.getServiceTicket();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
index f7c7642..e2a6dbd 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
@@ -23,30 +23,32 @@ import org.apache.kerby.event.AbstractEventHandler;
 import org.apache.kerby.event.Event;
 import org.apache.kerby.event.EventType;
 import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.client.KrbHandler;
 import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
 import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
 import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
-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 org.apache.kerby.transport.Transport;
 import org.apache.kerby.transport.event.MessageEvent;
 import org.apache.kerby.transport.event.TransportEventType;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public class EventKrbHandler extends AbstractEventHandler {
 
-    private KrbContext context;
-    private PreauthHandler preauthHandler;
+    private KrbHandler innerHandler;
+
 
     public void init(KrbContext context) {
-        this.context = context;
-        preauthHandler = new PreauthHandler();
-        preauthHandler.init(context);
+        this.innerHandler = new KrbHandler() {
+            @Override
+            protected void sendMessage(KdcRequest kdcRequest,
+                                       ByteBuffer requestMessage) throws IOException {
+                Transport transport = (Transport) kdcRequest.getSessionData();
+                transport.sendMessage(requestMessage);
+            }
+        };
+        innerHandler.init(context);
     }
 
     @Override
@@ -65,32 +67,20 @@ public class EventKrbHandler extends AbstractEventHandler {
         if (eventType == KrbClientEventType.TGT_INTENT ||
                 eventType == KrbClientEventType.TKT_INTENT) {
             KdcRequest kdcRequest = (KdcRequest) event.getEventData();
-            handleKdcRequest(kdcRequest);
+            innerHandler.handleRequest(kdcRequest);
         } else if (event.getEventType() == TransportEventType.INBOUND_MESSAGE) {
             handleMessage((MessageEvent) event);
         }
     }
 
-    protected void handleKdcRequest(KdcRequest kdcRequest) throws Exception {
-        kdcRequest.process();
-        KdcReq kdcReq = kdcRequest.getKdcReq();
-        KrbTransport transport = kdcRequest.getTransport();
-        transport.setAttachment(kdcRequest);
-        KrbUtil.sendMessage(kdcReq, transport);
-    }
-
     protected void handleMessage(MessageEvent event) throws Exception {
-        ByteBuffer message = event.getMessage();
-        KrbMessage kdcRep = KrbUtil.decodeMessageOld(message);
+        ByteBuffer receivedMessage = event.getMessage();
 
-        KrbMessageType messageType = kdcRep.getMsgType();
-        if (messageType == KrbMessageType.AS_REP) {
-            KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
-            kdcRequest.processResponse((KdcRep) kdcRep);
+        KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
+        innerHandler.onResponseMessage(kdcRequest, receivedMessage);
+        if (AsRequest.class.isAssignableFrom(kdcRequest.getClass())) {
             dispatch(KrbClientEvent.createTgtResultEvent((AsRequest) kdcRequest));
-        } else if (messageType == KrbMessageType.TGS_REP) {
-            KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
-            kdcRequest.processResponse((KdcRep) kdcRep);
+        } else if (TgsRequest.class.isAssignableFrom(kdcRequest.getClass())) {
             dispatch(KrbClientEvent.createTktResultEvent((TgsRequest) kdcRequest));
         }
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
index 1a5570d..8cf328b 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
@@ -33,7 +33,6 @@ import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
 import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
 import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReqBody;
 import org.apache.kerby.kerberos.kerb.spec.pa.PaDataType;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -47,7 +46,7 @@ import java.util.Map;
  */
 public abstract class KdcRequest {
     private KrbContext context;
-    private KrbTransport transport;
+    private Object sessionData;
 
     private KOptions krbOptions;
     private PrincipalName serverPrincipal;
@@ -75,12 +74,12 @@ public abstract class KdcRequest {
         this.fastContext = new KrbFastContext();
     }
 
-    public void setTransport(KrbTransport transport) {
-        this.transport = transport;
+    public void setSessionData(Object sessionData) {
+        this.sessionData = sessionData;
     }
 
-    public KrbTransport getTransport() {
-        return this.transport;
+    public Object getSessionData() {
+        return this.sessionData;
     }
 
     public void setKrbOptions(KOptions options) {

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
index 82015ee..a647bf0 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
@@ -31,7 +31,7 @@ public class KrbStreamingDecoder implements StreamingDecoder {
         if (streamingBuffer.remaining() >= 4) {
             int len = streamingBuffer.getInt();
             if (streamingBuffer.remaining() >= len) {
-                callback.onMessageComplete(len + 4);
+                callback.onMessageComplete(len + 4, 4); //Remove the prefix length
             } else {
                 callback.onMoreDataNeeded(len + 4);
             }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
deleted file mode 100644
index ad461ba..0000000
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
+++ /dev/null
@@ -1,79 +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.common;
-
-import org.apache.kerby.kerberos.kerb.KrbCodec;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-import org.apache.kerby.transport.Transport;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class KrbUtil {
-
-    public static void sendMessage(KrbMessage message,
-                                   KrbTransport transport) throws IOException {
-        int bodyLen = message.encodingLength();
-        ByteBuffer buffer = ByteBuffer.allocate(bodyLen + 4);
-        buffer.putInt(bodyLen);
-        message.encode(buffer);
-        buffer.flip();
-        transport.sendMessage(buffer);
-    }
-
-    /**
-     * To be cleaned up
-     * @param message
-     * @param transport
-     * @throws IOException
-     */
-    public static void sendMessageOld(KrbMessage message,
-                                   Transport transport) throws IOException {
-        int bodyLen = message.encodingLength();
-        ByteBuffer buffer = ByteBuffer.allocate(bodyLen + 4);
-        buffer.putInt(bodyLen);
-        message.encode(buffer);
-        buffer.flip();
-        transport.sendMessage(buffer);
-    }
-
-    /**
-     * To be cleaned.
-     * @param message
-     * @return
-     * @throws IOException
-     */
-    public static KrbMessage decodeMessageOld(ByteBuffer message) throws IOException {
-        int bodyLen = message.getInt();
-        assert (message.remaining() >= bodyLen);
-
-        KrbMessage krbMessage = KrbCodec.decodeMessage(message);
-
-        return krbMessage;
-    }
-
-    public static KrbMessage decodeMessage(ByteBuffer message) throws IOException {
-        KrbMessage krbMessage = KrbCodec.decodeMessage(message);
-
-        return krbMessage;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/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
index 7760965..610a63d 100644
--- 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
@@ -50,16 +50,11 @@ public class KrbTcpTransport
     }
 
     @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;
+    public ByteBuffer receiveMessage() throws IOException {
+        int msgLen = inputStream.readInt();
+        if (msgLen > 0) {
+            inputStream.readFully(messageBuffer, 0, msgLen);
+            return ByteBuffer.wrap(messageBuffer, 0, msgLen);
         }
 
         return null;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
index b0e0214..8f38b0e 100644
--- a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
+++ b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
@@ -52,13 +52,23 @@ public abstract class KdcTestBase {
             udpPort = getServerPort();
         }
 
-        setUpKkdcServer();
+        setUpKdcServer();
 
         setUpClient();
         createPrincipals();
     }
 
     /**
+     * Prepare KrbClient startup options and config.
+     * @throws Exception
+     */
+    protected void prepareKrbClient() throws Exception {
+        if (useEventModelClient()) {
+            krbClnt.useEventModel();
+        }
+    }
+
+    /**
      * Prepare KDC startup options and config.
      * @throws Exception
      */
@@ -67,13 +77,26 @@ public abstract class KdcTestBase {
         if (tcpPort > 0) {
             kdcServer.setKdcTcpPort(tcpPort);
         }
+
         kdcServer.setAllowUdp(allowUdp());
         if (udpPort > 0) {
             kdcServer.setKdcUdpPort(udpPort);
         }
+
+        if (useEventModelKdc()) {
+            kdcServer.useEventModel();
+        }
+    }
+
+    protected boolean useEventModelKdc() {
+        return false;
+    }
+
+    protected boolean useEventModelClient() {
+        return false;
     }
 
-    protected void setUpKkdcServer() throws Exception {
+    protected void setUpKdcServer() throws Exception {
         kdcServer = new TestKdcServer();
         prepareKdcServer();
         kdcServer.init();
@@ -85,6 +108,7 @@ public abstract class KdcTestBase {
 
     protected void setUpClient() throws Exception {
         krbClnt = new KrbClient();
+        prepareKrbClient();
 
         krbClnt.setKdcHost(hostname);
         if (tcpPort > 0) {

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
new file mode 100644
index 0000000..5e906de
--- /dev/null
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
@@ -0,0 +1,35 @@
+/**
+ *  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;
+
+import org.junit.Test;
+
+public class KdcTestUsingEventClient extends KdcTest {
+
+    @Override
+    protected boolean useEventModelClient() {
+        return false;
+    }
+
+    @Test
+    public void testKdc() throws Exception {
+        performKdcTest();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
new file mode 100644
index 0000000..99a1aad
--- /dev/null
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
@@ -0,0 +1,35 @@
+/**
+ *  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;
+
+import org.junit.Test;
+
+public class KdcTestUsingEventKdc extends KdcTest {
+
+    @Override
+    protected boolean useEventModelKdc() {
+        return false;
+    }
+
+    @Test
+    public void testKdc() throws Exception {
+        performKdcTest();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
index 95ec7f0..909b232 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
@@ -19,8 +19,8 @@
  */
 package org.apache.kerby.kerberos.kerb.server;
 
+import org.apache.kerby.kerberos.kerb.KrbCodec;
 import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.common.KrbUtil;
 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;
@@ -30,6 +30,7 @@ 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 java.io.IOException;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
 
@@ -43,9 +44,15 @@ public class KdcHandler {
         this.kdcContext = kdcContext;
     }
 
-    public ByteBuffer handleMessage(ByteBuffer message, boolean isTcp,
-                                       InetAddress remoteAddress) throws Exception {
-        KrbMessage krbRequest = KrbUtil.decodeMessage(message);
+    public ByteBuffer handleMessage(ByteBuffer receivedMessage, boolean isTcp,
+                                       InetAddress remoteAddress) throws KrbException {
+        KrbMessage krbRequest = null;
+        try {
+            krbRequest = KrbCodec.decodeMessage(receivedMessage);
+        } catch (IOException e) {
+            throw new KrbException("Krb decoding message failed", e);
+        }
+
         KdcRequest kdcRequest = null;
 
         KrbMessageType messageType = krbRequest.getMsgType();

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/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 ff3e22e..5161b23 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
@@ -21,7 +21,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.DefaultInternalKdcServerImpl;
+import org.apache.kerby.kerberos.kerb.server.impl.DefaultInternalKdcServer;
 import org.apache.kerby.kerberos.kerb.server.impl.event.EventBasedKdcServer;
 
 import java.io.File;
@@ -169,7 +169,7 @@ public class KdcServer {
         } else if (commonOptions.contains(KdcServerOption.USE_EVENT_MODEL)) {
             innerKdc = new EventBasedKdcServer();
         } else {
-            innerKdc = new DefaultInternalKdcServerImpl();
+            innerKdc = new DefaultInternalKdcServer();
         }
         innerKdc.init(commonOptions);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java
new file mode 100644
index 0000000..a4561c3
--- /dev/null
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.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 DefaultInternalKdcServer 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) {
+                DefaultKdcHandler kdcHandler = new DefaultKdcHandler(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/8f312e5b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
index 8b8c352..4dd179a 100644
--- a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
+++ b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
@@ -24,7 +24,7 @@ public interface DecodingCallback {
     /**
      * OK, enough data is ready, a message can be out
      */
-    public void onMessageComplete(int messageLength);
+    public void onMessageComplete(int messageLength, int adjustOffset);
 
     /**
      * Need more data to be available

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
index c09d393..57705ca 100644
--- a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
+++ b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
@@ -69,7 +69,7 @@ public class TcpTransport extends Transport {
         private ByteBuffer streamingBuffer;
 
         @Override
-        public void onMessageComplete(int messageLength) {
+        public void onMessageComplete(int messageLength, int adjustOffset) {
             ByteBuffer message = null;
 
             int remaining = streamingBuffer.remaining();
@@ -85,7 +85,11 @@ public class TcpTransport extends Transport {
             }
 
             if (message != null) {
-                dispatcher.dispatch(MessageEvent.createInboundMessageEvent(TcpTransport.this, message));
+                if (adjustOffset > 0) {
+                    message.position(message.position() + adjustOffset);
+                }
+                dispatcher.dispatch(MessageEvent.createInboundMessageEvent(
+                        TcpTransport.this, message));
             }
         }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
index 9a0562c..2ef7241 100644
--- a/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
+++ b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
@@ -54,7 +54,7 @@ public class TestNetworkBase {
             public void decode(ByteBuffer streamingBuffer, DecodingCallback callback) {
                 int expectedMessageLength = TEST_MESSAGE.getBytes().length;
                 if (streamingBuffer.remaining() >= expectedMessageLength) {
-                    callback.onMessageComplete(expectedMessageLength);
+                    callback.onMessageComplete(expectedMessageLength, -1);
                 } else {
                     callback.onMoreDataNeeded(expectedMessageLength);
                 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
index c4c2d55..ed060ef 100644
--- a/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
+++ b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
@@ -52,7 +52,7 @@ public class TestTcpBase {
             public void decode(ByteBuffer streamingBuffer, DecodingCallback callback) {
                 int expectedMessageLength = TEST_MESSAGE.getBytes().length;
                 if (streamingBuffer.remaining() >= expectedMessageLength) {
-                    callback.onMessageComplete(expectedMessageLength);
+                    callback.onMessageComplete(expectedMessageLength, -1);
                 } else {
                     callback.onMoreDataNeeded(expectedMessageLength);
                 }